halo2curves/bls12381/
fq.rs
1use core::convert::TryInto;
2
3use halo2derive::impl_field;
4use rand::RngCore;
5use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption};
6
7impl_field!(
8 bls12381_base,
9 Fq,
10 modulus = "1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab",
11 mul_gen = "2",
12 zeta = "1a0111ea397fe699ec02408663d4de85aa0d857d89759ad4897d29650fb85f9b409427eb4f49fffd8bfd00000000aaac",
13 from_uniform = [64, 96],
14 endian = "big",
15);
16
17crate::extend_field_legendre!(Fq);
18crate::impl_binops_calls!(Fq);
19crate::impl_binops_additive!(Fq, Fq);
20crate::impl_binops_multiplicative!(Fq, Fq);
21crate::field_bits!(Fq);
22crate::serialize_deserialize_primefield!(Fq);
23crate::impl_from_u64!(Fq);
24crate::impl_from_bool!(Fq);
25
26use ff::Field;
27
28use crate::ff_ext::ExtField;
29const NEGATIVE_ONE: Fq = Fq::ZERO.sub_const(&Fq::ONE);
30impl ExtField for Fq {
31 const NON_RESIDUE: Self = NEGATIVE_ONE;
32 fn mul_by_nonresidue(&self) -> Self {
33 self.neg()
34 }
35 fn frobenius_map(&mut self, _: usize) {}
36}
37
38#[cfg(test)]
39mod test {
40 use super::*;
41 use crate::{
42 arith_test, constants_test, from_uniform_bytes_test, legendre_test, serde_test, test,
43 };
44
45 constants_test!(Fq);
46
47 arith_test!(Fq);
48 legendre_test!(Fq);
49 test!(arith, Fq, sqrt_test, 1000);
50
51 serde_test!(Fq PrimeFieldBits);
52 from_uniform_bytes_test!(Fq, 1000, L 64, L 96);
53
54 #[test]
55 fn test_fq_mul_nonresidue() {
56 let e = Fq::random(rand_core::OsRng);
57 let a0 = e.mul_by_nonresidue();
58 let a1 = e * Fq::NON_RESIDUE;
59 assert_eq!(a0, a1);
60 }
61}