Coverage Report

Created: 2026-05-16 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/ff-0.13.1/src/lib.rs
Line
Count
Source
1
//! This crate provides traits for working with finite fields.
2
3
#![no_std]
4
#![cfg_attr(docsrs, feature(doc_cfg))]
5
// Catch documentation errors caused by code changes.
6
#![deny(rustdoc::broken_intra_doc_links)]
7
#![forbid(unsafe_code)]
8
9
#[cfg(feature = "alloc")]
10
extern crate alloc;
11
12
mod batch;
13
pub use batch::*;
14
15
pub mod helpers;
16
17
#[cfg(feature = "derive")]
18
#[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
19
pub use ff_derive::PrimeField;
20
21
#[cfg(feature = "bits")]
22
#[cfg_attr(docsrs, doc(cfg(feature = "bits")))]
23
pub use bitvec::view::BitViewSized;
24
25
#[cfg(feature = "bits")]
26
use bitvec::{array::BitArray, order::Lsb0};
27
28
use core::fmt;
29
use core::iter::{Product, Sum};
30
use core::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign};
31
32
use rand_core::RngCore;
33
use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption};
34
35
/// Bit representation of a field element.
36
#[cfg(feature = "bits")]
37
#[cfg_attr(docsrs, doc(cfg(feature = "bits")))]
38
pub type FieldBits<V> = BitArray<V, Lsb0>;
39
40
/// This trait represents an element of a field.
41
pub trait Field:
42
    Sized
43
    + Eq
44
    + Copy
45
    + Clone
46
    + Default
47
    + Send
48
    + Sync
49
    + fmt::Debug
50
    + 'static
51
    + ConditionallySelectable
52
    + ConstantTimeEq
53
    + Neg<Output = Self>
54
    + Add<Output = Self>
55
    + Sub<Output = Self>
56
    + Mul<Output = Self>
57
    + Sum
58
    + Product
59
    + for<'a> Add<&'a Self, Output = Self>
60
    + for<'a> Sub<&'a Self, Output = Self>
61
    + for<'a> Mul<&'a Self, Output = Self>
62
    + for<'a> Sum<&'a Self>
63
    + for<'a> Product<&'a Self>
64
    + AddAssign
65
    + SubAssign
66
    + MulAssign
67
    + for<'a> AddAssign<&'a Self>
68
    + for<'a> SubAssign<&'a Self>
69
    + for<'a> MulAssign<&'a Self>
70
{
71
    /// The zero element of the field, the additive identity.
72
    const ZERO: Self;
73
74
    /// The one element of the field, the multiplicative identity.
75
    const ONE: Self;
76
77
    /// Returns an element chosen uniformly at random using a user-provided RNG.
78
    fn random(rng: impl RngCore) -> Self;
79
80
    /// Returns true iff this element is zero.
81
50.2k
    fn is_zero(&self) -> Choice {
82
50.2k
        self.ct_eq(&Self::ZERO)
83
50.2k
    }
84
85
    /// Returns true iff this element is zero.
86
    ///
87
    /// # Security
88
    ///
89
    /// This method provides **no** constant-time guarantees. Implementors of the
90
    /// `Field` trait **may** optimise this method using non-constant-time logic.
91
    fn is_zero_vartime(&self) -> bool {
92
        self.is_zero().into()
93
    }
94
95
    /// Squares this element.
96
    #[must_use]
97
    fn square(&self) -> Self;
98
99
    /// Cubes this element.
100
    #[must_use]
101
    fn cube(&self) -> Self {
102
        self.square() * self
103
    }
104
105
    /// Doubles this element.
106
    #[must_use]
107
    fn double(&self) -> Self;
108
109
    /// Computes the multiplicative inverse of this element,
110
    /// failing if the element is zero.
111
    fn invert(&self) -> CtOption<Self>;
112
113
    /// Computes:
114
    ///
115
    /// - $(\textsf{true}, \sqrt{\textsf{num}/\textsf{div}})$, if $\textsf{num}$ and
116
    ///   $\textsf{div}$ are nonzero and $\textsf{num}/\textsf{div}$ is a square in the
117
    ///   field;
118
    /// - $(\textsf{true}, 0)$, if $\textsf{num}$ is zero;
119
    /// - $(\textsf{false}, 0)$, if $\textsf{num}$ is nonzero and $\textsf{div}$ is zero;
120
    /// - $(\textsf{false}, \sqrt{G_S \cdot \textsf{num}/\textsf{div}})$, if
121
    ///   $\textsf{num}$ and $\textsf{div}$ are nonzero and $\textsf{num}/\textsf{div}$ is
122
    ///   a nonsquare in the field;
123
    ///
124
    /// where $G_S$ is a non-square.
125
    ///
126
    /// # Warnings
127
    ///
128
    /// - The choice of root from `sqrt` is unspecified.
129
    /// - The value of $G_S$ is unspecified, and cannot be assumed to have any specific
130
    ///   value in a generic context.
131
    fn sqrt_ratio(num: &Self, div: &Self) -> (Choice, Self);
132
133
    /// Equivalent to `Self::sqrt_ratio(self, one())`.
134
    ///
135
    /// The provided method is implemented in terms of [`Self::sqrt_ratio`].
136
    fn sqrt_alt(&self) -> (Choice, Self) {
137
        Self::sqrt_ratio(self, &Self::ONE)
138
    }
139
140
    /// Returns the square root of the field element, if it is
141
    /// quadratic residue.
142
    ///
143
    /// The provided method is implemented in terms of [`Self::sqrt_ratio`].
144
    fn sqrt(&self) -> CtOption<Self> {
145
        let (is_square, res) = Self::sqrt_ratio(self, &Self::ONE);
146
        CtOption::new(res, is_square)
147
    }
148
149
    /// Exponentiates `self` by `exp`, where `exp` is a little-endian order integer
150
    /// exponent.
151
    ///
152
    /// # Guarantees
153
    ///
154
    /// This operation is constant time with respect to `self`, for all exponents with the
155
    /// same number of digits (`exp.as_ref().len()`). It is variable time with respect to
156
    /// the number of digits in the exponent.
157
    fn pow<S: AsRef<[u64]>>(&self, exp: S) -> Self {
158
        let mut res = Self::ONE;
159
        for e in exp.as_ref().iter().rev() {
160
            for i in (0..64).rev() {
161
                res = res.square();
162
                let mut tmp = res;
163
                tmp *= self;
164
                res.conditional_assign(&tmp, (((*e >> i) & 1) as u8).into());
165
            }
166
        }
167
        res
168
    }
169
170
    /// Exponentiates `self` by `exp`, where `exp` is a little-endian order integer
171
    /// exponent.
172
    ///
173
    /// # Guarantees
174
    ///
175
    /// **This operation is variable time with respect to `self`, for all exponent.** If
176
    /// the exponent is fixed, this operation is effectively constant time. However, for
177
    /// stronger constant-time guarantees, [`Field::pow`] should be used.
178
    fn pow_vartime<S: AsRef<[u64]>>(&self, exp: S) -> Self {
179
        let mut res = Self::ONE;
180
        for e in exp.as_ref().iter().rev() {
181
            for i in (0..64).rev() {
182
                res = res.square();
183
184
                if ((*e >> i) & 1) == 1 {
185
                    res.mul_assign(self);
186
                }
187
            }
188
        }
189
190
        res
191
    }
192
}
193
194
/// This represents an element of a non-binary prime field.
195
pub trait PrimeField: Field + From<u64> {
196
    /// The prime field can be converted back and forth into this binary
197
    /// representation.
198
    type Repr: Copy + Default + Send + Sync + 'static + AsRef<[u8]> + AsMut<[u8]>;
199
200
    /// Interpret a string of numbers as a (congruent) prime field element.
201
    /// Does not accept unnecessary leading zeroes or a blank string.
202
    ///
203
    /// # Security
204
    ///
205
    /// This method provides **no** constant-time guarantees.
206
    fn from_str_vartime(s: &str) -> Option<Self> {
207
        if s.is_empty() {
208
            return None;
209
        }
210
211
        if s == "0" {
212
            return Some(Self::ZERO);
213
        }
214
215
        let mut res = Self::ZERO;
216
217
        let ten = Self::from(10);
218
219
        let mut first_digit = true;
220
221
        for c in s.chars() {
222
            match c.to_digit(10) {
223
                Some(c) => {
224
                    if first_digit {
225
                        if c == 0 {
226
                            return None;
227
                        }
228
229
                        first_digit = false;
230
                    }
231
232
                    res.mul_assign(&ten);
233
                    res.add_assign(&Self::from(u64::from(c)));
234
                }
235
                None => {
236
                    return None;
237
                }
238
            }
239
        }
240
241
        Some(res)
242
    }
243
244
    /// Obtains a field element congruent to the integer `v`.
245
    ///
246
    /// For fields where `Self::CAPACITY >= 128`, this is injective and will produce a
247
    /// unique field element.
248
    ///
249
    /// For fields where `Self::CAPACITY < 128`, this is surjective; some field elements
250
    /// will be produced by multiple values of `v`.
251
    ///
252
    /// If you want to deterministically sample a field element representing a value, use
253
    /// [`FromUniformBytes`] instead.
254
    fn from_u128(v: u128) -> Self {
255
        let lower = v as u64;
256
        let upper = (v >> 64) as u64;
257
        let mut tmp = Self::from(upper);
258
        for _ in 0..64 {
259
            tmp = tmp.double();
260
        }
261
        tmp + Self::from(lower)
262
    }
263
264
    /// Attempts to convert a byte representation of a field element into an element of
265
    /// this prime field, failing if the input is not canonical (is not smaller than the
266
    /// field's modulus).
267
    ///
268
    /// The byte representation is interpreted with the same endianness as elements
269
    /// returned by [`PrimeField::to_repr`].
270
    fn from_repr(repr: Self::Repr) -> CtOption<Self>;
271
272
    /// Attempts to convert a byte representation of a field element into an element of
273
    /// this prime field, failing if the input is not canonical (is not smaller than the
274
    /// field's modulus).
275
    ///
276
    /// The byte representation is interpreted with the same endianness as elements
277
    /// returned by [`PrimeField::to_repr`].
278
    ///
279
    /// # Security
280
    ///
281
    /// This method provides **no** constant-time guarantees. Implementors of the
282
    /// `PrimeField` trait **may** optimise this method using non-constant-time logic.
283
    fn from_repr_vartime(repr: Self::Repr) -> Option<Self> {
284
        Self::from_repr(repr).into()
285
    }
286
287
    /// Converts an element of the prime field into the standard byte representation for
288
    /// this field.
289
    ///
290
    /// The endianness of the byte representation is implementation-specific. Generic
291
    /// encodings of field elements should be treated as opaque.
292
    fn to_repr(&self) -> Self::Repr;
293
294
    /// Returns true iff this element is odd.
295
    fn is_odd(&self) -> Choice;
296
297
    /// Returns true iff this element is even.
298
    #[inline(always)]
299
    fn is_even(&self) -> Choice {
300
        !self.is_odd()
301
    }
302
303
    /// Modulus of the field written as a string for debugging purposes.
304
    ///
305
    /// The encoding of the modulus is implementation-specific. Generic users of the
306
    /// `PrimeField` trait should treat this string as opaque.
307
    const MODULUS: &'static str;
308
309
    /// How many bits are needed to represent an element of this field.
310
    const NUM_BITS: u32;
311
312
    /// How many bits of information can be reliably stored in the field element.
313
    ///
314
    /// This is usually `Self::NUM_BITS - 1`.
315
    const CAPACITY: u32;
316
317
    /// Inverse of $2$ in the field.
318
    const TWO_INV: Self;
319
320
    /// A fixed multiplicative generator of `modulus - 1` order. This element must also be
321
    /// a quadratic nonresidue.
322
    ///
323
    /// It can be calculated using [SageMath] as `GF(modulus).primitive_element()`.
324
    ///
325
    /// Implementations of this trait MUST ensure that this is the generator used to
326
    /// derive `Self::ROOT_OF_UNITY`.
327
    ///
328
    /// [SageMath]: https://www.sagemath.org/
329
    const MULTIPLICATIVE_GENERATOR: Self;
330
331
    /// An integer `s` satisfying the equation `2^s * t = modulus - 1` with `t` odd.
332
    ///
333
    /// This is the number of leading zero bits in the little-endian bit representation of
334
    /// `modulus - 1`.
335
    const S: u32;
336
337
    /// The `2^s` root of unity.
338
    ///
339
    /// It can be calculated by exponentiating `Self::MULTIPLICATIVE_GENERATOR` by `t`,
340
    /// where `t = (modulus - 1) >> Self::S`.
341
    const ROOT_OF_UNITY: Self;
342
343
    /// Inverse of [`Self::ROOT_OF_UNITY`].
344
    const ROOT_OF_UNITY_INV: Self;
345
346
    /// Generator of the `t-order` multiplicative subgroup.
347
    ///
348
    /// It can be calculated by exponentiating [`Self::MULTIPLICATIVE_GENERATOR`] by `2^s`,
349
    /// where `s` is [`Self::S`].
350
    const DELTA: Self;
351
}
352
353
/// The subset of prime-order fields such that `(modulus - 1)` is divisible by `N`.
354
///
355
/// If `N` is prime, there will be `N - 1` valid choices of [`Self::ZETA`]. Similarly to
356
/// [`PrimeField::MULTIPLICATIVE_GENERATOR`], the specific choice does not matter, as long
357
/// as the choice is consistent across all uses of the field.
358
pub trait WithSmallOrderMulGroup<const N: u8>: PrimeField {
359
    /// A field element of small multiplicative order $N$.
360
    ///
361
    /// The presence of this element allows you to perform (certain types of)
362
    /// endomorphisms on some elliptic curves.
363
    ///
364
    /// It can be calculated using [SageMath] as
365
    /// `GF(modulus).primitive_element() ^ ((modulus - 1) // N)`.
366
    /// Choosing the element of order $N$ that is smallest, when considered
367
    /// as an integer, may help to ensure consistency.
368
    ///
369
    /// [SageMath]: https://www.sagemath.org/
370
    const ZETA: Self;
371
}
372
373
/// Trait for constructing a [`PrimeField`] element from a fixed-length uniform byte
374
/// array.
375
///
376
/// "Uniform" means that the byte array's contents must be indistinguishable from the
377
/// [discrete uniform distribution]. Suitable byte arrays can be obtained:
378
/// - from a cryptographically-secure randomness source (which makes this constructor
379
///   equivalent to [`Field::random`]).
380
/// - from a cryptographic hash function output, which enables a "random" field element to
381
///   be selected deterministically. This is the primary use case for `FromUniformBytes`.
382
///
383
/// The length `N` of the byte array is chosen by the trait implementer such that the loss
384
/// of uniformity in the mapping from byte arrays to field elements is cryptographically
385
/// negligible.
386
///
387
/// [discrete uniform distribution]: https://en.wikipedia.org/wiki/Discrete_uniform_distribution
388
///
389
/// # Examples
390
///
391
/// ```
392
/// # #[cfg(feature = "derive")] {
393
/// # // Fake this so we don't actually need a dev-dependency on bls12_381.
394
/// # mod bls12_381 {
395
/// #     use ff::{Field, PrimeField};
396
/// #
397
/// #     #[derive(PrimeField)]
398
/// #     #[PrimeFieldModulus = "52435875175126190479447740508185965837690552500527637822603658699938581184513"]
399
/// #     #[PrimeFieldGenerator = "7"]
400
/// #     #[PrimeFieldReprEndianness = "little"]
401
/// #     pub struct Scalar([u64; 4]);
402
/// #
403
/// #     impl ff::FromUniformBytes<64> for Scalar {
404
/// #         fn from_uniform_bytes(_bytes: &[u8; 64]) -> Self {
405
/// #             // Fake impl for doctest
406
/// #             Scalar::ONE
407
/// #         }
408
/// #     }
409
/// # }
410
/// #
411
/// use blake2b_simd::blake2b;
412
/// use bls12_381::Scalar;
413
/// use ff::FromUniformBytes;
414
///
415
/// // `bls12_381::Scalar` implements `FromUniformBytes<64>`, and BLAKE2b (by default)
416
/// // produces a 64-byte hash.
417
/// let hash = blake2b(b"Some message");
418
/// let val = Scalar::from_uniform_bytes(hash.as_array());
419
/// # }
420
/// ```
421
///
422
/// # Implementing `FromUniformBytes`
423
///
424
/// [`Self::from_uniform_bytes`] should always be implemented by interpreting the provided
425
/// byte array as the little endian unsigned encoding of an integer, and then reducing that
426
/// integer modulo the field modulus.
427
///
428
/// For security, `N` must be chosen so that `N * 8 >= Self::NUM_BITS + 128`. A larger
429
/// value of `N` may be chosen for convenience; for example, for a field with a 255-bit
430
/// modulus, `N = 64` is convenient as it matches the output length of several common
431
/// cryptographic hash functions (such as SHA-512 and BLAKE2b).
432
///
433
/// ## Trait design
434
///
435
/// This trait exists because `PrimeField::from_uniform_bytes([u8; N])` cannot currently
436
/// exist (trait methods cannot use associated constants in the const positions of their
437
/// type signature, and we do not want `PrimeField` to require a generic const parameter).
438
/// However, this has the side-effect that `FromUniformBytes` can be implemented multiple
439
/// times for different values of `N`. Most implementations of [`PrimeField`] should only
440
/// need to implement `FromUniformBytes` trait for one value of `N` (chosen following the
441
/// above considerations); if you find yourself needing to implement it multiple times,
442
/// please [let us know about your use case](https://github.com/zkcrypto/ff/issues/new) so
443
/// we can take it into consideration for future evolutions of the `ff` traits.
444
pub trait FromUniformBytes<const N: usize>: PrimeField {
445
    /// Returns a field element that is congruent to the provided little endian unsigned
446
    /// byte representation of an integer.
447
    fn from_uniform_bytes(bytes: &[u8; N]) -> Self;
448
}
449
450
/// This represents the bits of an element of a prime field.
451
#[cfg(feature = "bits")]
452
#[cfg_attr(docsrs, doc(cfg(feature = "bits")))]
453
pub trait PrimeFieldBits: PrimeField {
454
    /// The backing store for a bit representation of a prime field element.
455
    type ReprBits: BitViewSized + Send + Sync;
456
457
    /// Converts an element of the prime field into a little-endian sequence of bits.
458
    fn to_le_bits(&self) -> FieldBits<Self::ReprBits>;
459
460
    /// Returns the bits of the field characteristic (the modulus) in little-endian order.
461
    fn char_le_bits() -> FieldBits<Self::ReprBits>;
462
}
463
464
/// Functions and re-exported crates used by the [`PrimeField`] derive macro.
465
#[cfg(feature = "derive")]
466
#[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
467
pub mod derive {
468
    pub use crate::arith_impl::*;
469
470
    pub use {byteorder, rand_core, subtle};
471
472
    #[cfg(feature = "bits")]
473
    pub use bitvec;
474
}
475
476
#[cfg(feature = "derive")]
477
mod arith_impl {
478
    /// Computes `a - (b + borrow)`, returning the result and the new borrow.
479
    #[inline(always)]
480
    pub const fn sbb(a: u64, b: u64, borrow: u64) -> (u64, u64) {
481
        let ret = (a as u128).wrapping_sub((b as u128) + ((borrow >> 63) as u128));
482
        (ret as u64, (ret >> 64) as u64)
483
    }
484
485
    /// Computes `a + b + carry`, returning the result and the new carry over.
486
    #[inline(always)]
487
    pub const fn adc(a: u64, b: u64, carry: u64) -> (u64, u64) {
488
        let ret = (a as u128) + (b as u128) + (carry as u128);
489
        (ret as u64, (ret >> 64) as u64)
490
    }
491
492
    /// Computes `a + (b * c) + carry`, returning the result and the new carry over.
493
    #[inline(always)]
494
    pub const fn mac(a: u64, b: u64, c: u64, carry: u64) -> (u64, u64) {
495
        let ret = (a as u128) + ((b as u128) * (c as u128)) + (carry as u128);
496
        (ret as u64, (ret >> 64) as u64)
497
    }
498
}