diff --git a/crates/crypto/src/fiat_shamir/default_transcript.rs b/crates/crypto/src/fiat_shamir/default_transcript.rs index 766c84447..4784e1de7 100644 --- a/crates/crypto/src/fiat_shamir/default_transcript.rs +++ b/crates/crypto/src/fiat_shamir/default_transcript.rs @@ -77,7 +77,13 @@ mod tests { use super::*; use alloc::vec::Vec; - use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::default_types::FrField; + use lambdaworks_math::{ + elliptic_curve::short_weierstrass::curves::bls12_381::default_types::FrField, + field::fields::fft_friendly::{ + babybear_u32::Babybear31PrimeField, + quartic_babybear_u32::Degree4BabyBearU32ExtensionField, + }, + }; #[test] fn basic_challenge() { @@ -116,4 +122,40 @@ mod tests { ] ); } + + type FE = FieldElement; + type Fp4E = FieldElement; + + #[test] + fn quartic_baby_bear_transcript_distinguish_different_fe() { + let mut transcript_1 = DefaultTranscript::::default(); + transcript_1.append_field_element(&Fp4E::new([ + FE::one(), + FE::zero(), + FE::zero(), + FE::zero(), + ])); + let sample_1 = transcript_1.sample_field_element(); + + let mut transcript_2 = DefaultTranscript::::default(); + transcript_2.append_field_element(&Fp4E::new([ + FE::zero(), + FE::zero(), + FE::zero(), + FE::one(), + ])); + let sample_2 = transcript_2.sample_field_element(); + + let mut transcript_3 = DefaultTranscript::::default(); + transcript_3.append_field_element(&Fp4E::new([ + FE::one(), + FE::zero(), + FE::zero(), + FE::zero(), + ])); + let sample_3 = transcript_3.sample_field_element(); + + assert!(sample_1 != sample_2); + assert!(sample_1 == sample_3); + } } diff --git a/crates/math/src/field/fields/fft_friendly/quartic_babybear_u32.rs b/crates/math/src/field/fields/fft_friendly/quartic_babybear_u32.rs index 81640818f..571962ac9 100644 --- a/crates/math/src/field/fields/fft_friendly/quartic_babybear_u32.rs +++ b/crates/math/src/field/fields/fft_friendly/quartic_babybear_u32.rs @@ -2,7 +2,7 @@ use crate::field::{ element::FieldElement, errors::FieldError, fields::fft_friendly::babybear_u32::Babybear31PrimeField, - traits::{IsFFTField, IsField, IsSubFieldOf}, + traits::{HasDefaultTranscript, IsFFTField, IsField, IsSubFieldOf}, }; use crate::traits::ByteConversion; @@ -342,6 +342,39 @@ impl IsFFTField for Degree4BabyBearU32ExtensionField { ]; } +impl HasDefaultTranscript for Degree4BabyBearU32ExtensionField { + fn get_random_field_element_from_rng(rng: &mut impl rand::Rng) -> FieldElement { + //Babybear Prime p = 2^31 - 2^27 + 1 + const MODULUS: u32 = 2013265921; + + //Babybear prime needs 31 bits and is represented with 32 bits. + //The mask is used to remove the first bit. + const MASK: u32 = 0x7FFF_FFFF; + + let mut sample = [0u8; 4]; + + let mut coeffs = [ + FieldElement::zero(), + FieldElement::zero(), + FieldElement::zero(), + FieldElement::zero(), + ]; + + for coeff in &mut coeffs { + loop { + rng.fill(&mut sample); + let int_sample = u32::from_be_bytes(sample) & MASK; + if int_sample < MODULUS { + *coeff = FieldElement::from(&int_sample); + break; + } + } + } + + FieldElement::::new(coeffs) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/provers/stark/src/examples/fibonacci_rap.rs b/crates/provers/stark/src/examples/fibonacci_rap.rs index 90581232c..78acefdc5 100644 --- a/crates/provers/stark/src/examples/fibonacci_rap.rs +++ b/crates/provers/stark/src/examples/fibonacci_rap.rs @@ -305,11 +305,9 @@ pub fn fibonacci_rap_trace( let mut trace_cols = vec![fib_seq, fib_permuted]; resize_to_next_power_of_two(&mut trace_cols); - let mut trace = TraceTable::allocate_with_zeros(trace_cols[0].len(), 2, 1, 1); - for i in 0..trace.num_rows() { - trace.set_main(i, 0, trace_cols[0][i].clone()); - trace.set_main(i, 1, trace_cols[1][i].clone()); - } + let aux_columns = vec![vec![FieldElement::::zero(); trace_cols[0].len()]]; + + let trace: TraceTable = TraceTable::from_columns(trace_cols, aux_columns, 1); trace }