Skip to content

Commit fade166

Browse files
authored
Implement HasDefaultTranscript for baby bear u32 degree 4 extension field (#1055)
* implement HasDefaultTranscript for degree 4 baby bear u32 * fix lint * fix clippy
1 parent 762daeb commit fade166

File tree

3 files changed

+80
-7
lines changed

3 files changed

+80
-7
lines changed

crates/crypto/src/fiat_shamir/default_transcript.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,13 @@ mod tests {
7777
use super::*;
7878

7979
use alloc::vec::Vec;
80-
use lambdaworks_math::elliptic_curve::short_weierstrass::curves::bls12_381::default_types::FrField;
80+
use lambdaworks_math::{
81+
elliptic_curve::short_weierstrass::curves::bls12_381::default_types::FrField,
82+
field::fields::fft_friendly::{
83+
babybear_u32::Babybear31PrimeField,
84+
quartic_babybear_u32::Degree4BabyBearU32ExtensionField,
85+
},
86+
};
8187

8288
#[test]
8389
fn basic_challenge() {
@@ -116,4 +122,40 @@ mod tests {
116122
]
117123
);
118124
}
125+
126+
type FE = FieldElement<Babybear31PrimeField>;
127+
type Fp4E = FieldElement<Degree4BabyBearU32ExtensionField>;
128+
129+
#[test]
130+
fn quartic_baby_bear_transcript_distinguish_different_fe() {
131+
let mut transcript_1 = DefaultTranscript::<Degree4BabyBearU32ExtensionField>::default();
132+
transcript_1.append_field_element(&Fp4E::new([
133+
FE::one(),
134+
FE::zero(),
135+
FE::zero(),
136+
FE::zero(),
137+
]));
138+
let sample_1 = transcript_1.sample_field_element();
139+
140+
let mut transcript_2 = DefaultTranscript::<Degree4BabyBearU32ExtensionField>::default();
141+
transcript_2.append_field_element(&Fp4E::new([
142+
FE::zero(),
143+
FE::zero(),
144+
FE::zero(),
145+
FE::one(),
146+
]));
147+
let sample_2 = transcript_2.sample_field_element();
148+
149+
let mut transcript_3 = DefaultTranscript::<Degree4BabyBearU32ExtensionField>::default();
150+
transcript_3.append_field_element(&Fp4E::new([
151+
FE::one(),
152+
FE::zero(),
153+
FE::zero(),
154+
FE::zero(),
155+
]));
156+
let sample_3 = transcript_3.sample_field_element();
157+
158+
assert!(sample_1 != sample_2);
159+
assert!(sample_1 == sample_3);
160+
}
119161
}

crates/math/src/field/fields/fft_friendly/quartic_babybear_u32.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::field::{
22
element::FieldElement,
33
errors::FieldError,
44
fields::fft_friendly::babybear_u32::Babybear31PrimeField,
5-
traits::{IsFFTField, IsField, IsSubFieldOf},
5+
traits::{HasDefaultTranscript, IsFFTField, IsField, IsSubFieldOf},
66
};
77

88
use crate::traits::ByteConversion;
@@ -342,6 +342,39 @@ impl IsFFTField for Degree4BabyBearU32ExtensionField {
342342
];
343343
}
344344

345+
impl HasDefaultTranscript for Degree4BabyBearU32ExtensionField {
346+
fn get_random_field_element_from_rng(rng: &mut impl rand::Rng) -> FieldElement<Self> {
347+
//Babybear Prime p = 2^31 - 2^27 + 1
348+
const MODULUS: u32 = 2013265921;
349+
350+
//Babybear prime needs 31 bits and is represented with 32 bits.
351+
//The mask is used to remove the first bit.
352+
const MASK: u32 = 0x7FFF_FFFF;
353+
354+
let mut sample = [0u8; 4];
355+
356+
let mut coeffs = [
357+
FieldElement::zero(),
358+
FieldElement::zero(),
359+
FieldElement::zero(),
360+
FieldElement::zero(),
361+
];
362+
363+
for coeff in &mut coeffs {
364+
loop {
365+
rng.fill(&mut sample);
366+
let int_sample = u32::from_be_bytes(sample) & MASK;
367+
if int_sample < MODULUS {
368+
*coeff = FieldElement::from(&int_sample);
369+
break;
370+
}
371+
}
372+
}
373+
374+
FieldElement::<Self>::new(coeffs)
375+
}
376+
}
377+
345378
#[cfg(test)]
346379
mod tests {
347380
use super::*;

crates/provers/stark/src/examples/fibonacci_rap.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -305,11 +305,9 @@ pub fn fibonacci_rap_trace<F: IsFFTField>(
305305
let mut trace_cols = vec![fib_seq, fib_permuted];
306306
resize_to_next_power_of_two(&mut trace_cols);
307307

308-
let mut trace = TraceTable::allocate_with_zeros(trace_cols[0].len(), 2, 1, 1);
309-
for i in 0..trace.num_rows() {
310-
trace.set_main(i, 0, trace_cols[0][i].clone());
311-
trace.set_main(i, 1, trace_cols[1][i].clone());
312-
}
308+
let aux_columns = vec![vec![FieldElement::<F>::zero(); trace_cols[0].len()]];
309+
310+
let trace: TraceTable<F, F> = TraceTable::from_columns(trace_cols, aux_columns, 1);
313311

314312
trace
315313
}

0 commit comments

Comments
 (0)