Expand description
§RustCrypto: Cryptographic Big Integers
Pure Rust implementation of a big integer library which has been designed from the ground-up for use in cryptographic applications.
Provides constant-time, no_std
-friendly implementations of modern formulas
using const generics.
§Goals
- Supports
no_std
-friendly const generic stack-allocated big integers. - Constant-time by default. Variable-time functions are explicitly marked as such.
- Leverage what is possible today with const generics on
stable
rust. - Support
const fn
as much as possible with the goal of being able to compute values at compile-time. - Optional heap-allocated
Boxed*
types gated under analloc
feature.
§Security Notes
This crate has been audited by NCC Group with no significant findings. We would like to thank Entropy for funding the audit.
All functions contained in the crate are designed to execute in constant
time unless explicitly specified otherwise (via a *_vartime
name suffix).
This library is not suitable for use on processors with a variable-time multiplication operation (e.g. short circuit on multiply-by-zero / multiply-by-one, such as certain 32-bit PowerPC CPUs and some non-ARM microcontrollers).
§Minimum Supported Rust Version
This crate requires Rust 1.83 at a minimum.
We may change the MSRV in the future, but it will be accompanied by a minor version bump.
§License
Licensed under either of:
at your option.
§Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
§Usage
The core types of crypto-bigint
are as follows:
Uint
: stack-allocated big integer type, const generic around a number ofLimb
s. Type aliases are provided for various sizes, e.g.U128
,U384
,U256
,U2048
,U3072
,U4096
.BoxedUint
: heap-allocated big integer type. Requires thealloc
crate feature is enabled.
Big integer types in this crate use a 32-bit or 64-bit saturated representation, depending on the underlying CPU’s pointer width.
The following types for modular arithmetic are available under the modular
submodule:
modular::ConstMontyForm
: stack-allocated type-safe modular arithmetic using Montgomery form suitable for cases where the modulus is known at compile-time.modular::MontyForm
: stack-allocated modular arithmetic using Montgomery form for cases where the modulus is only known at runtime.modular::BoxedMontyForm
: heap-allocated modular arithmetic using Montgomery form. Requires thealloc
crate feature is enabled.
§const fn
usage
The Uint
type provides a number of const fn
inherent methods which
can be used for initializing and performing arithmetic on big integers in
const contexts:
use crypto_bigint::U256;
// Parse a constant from a big endian hexadecimal string.
pub const MODULUS: U256 =
U256::from_be_hex("ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551");
// Compute `MODULUS` shifted right by 1 at compile time
pub const MODULUS_SHR1: U256 = MODULUS.shr(1);
§Trait-based usage
The Uint
type itself does not implement the standard arithmetic traits
such as Add
, Sub
, Mul
, and Div
.
To use these traits you must first pick a wrapper type which determines
overflow behavior: Wrapping
or Checked
.
§Wrapping arithmetic
use crypto_bigint::{U256, Wrapping};
let a = Wrapping(U256::MAX);
let b = Wrapping(U256::ONE);
let c = a + b;
// `MAX` + 1 wraps back around to zero
assert_eq!(c.0, U256::ZERO);
§Checked arithmetic
use crypto_bigint::{U256, Checked};
let a = Checked::new(U256::ONE);
let b = Checked::new(U256::from(2u8));
let c = a + b;
assert_eq!(c.0.unwrap(), U256::from(3u8))
§Modular arithmetic
This library has initial support for modular arithmetic in the form of the
AddMod
, SubMod
, NegMod
, and MulMod
traits, as well as the
support for the Rem
trait when used with a NonZero
operand.
use crypto_bigint::{AddMod, U256};
// mod 3
let modulus = U256::from(3u8);
// 1 + 1 mod 3 = 2
let a = U256::ONE.add_mod(&U256::ONE, &modulus);
assert_eq!(a, U256::from(2u8));
// 2 + 1 mod 3 = 0
let b = a.add_mod(&U256::ONE, &modulus);
assert_eq!(b, U256::ZERO);
It also supports modular arithmetic over constant moduli using ConstMontyForm
,
and over moduli set at runtime using MontyForm
.
That includes modular exponentiation and multiplicative inverses.
These features are described in the modular
module.
§Random number generation
When the rand_core
or rand
features of this crate are enabled, it’s
possible to generate random numbers using any RNG by using the
Random
trait:
use crypto_bigint::{Random, U256, rand_core::OsRng};
let n = U256::random(&mut OsRng);
§Modular random number generation
The RandomMod
trait supports generating random numbers with a uniform
distribution around a given NonZero
modulus.
use crypto_bigint::{NonZero, RandomMod, U256, rand_core::OsRng};
let modulus = NonZero::new(U256::from(3u8)).unwrap();
let n = U256::random_mod(&mut OsRng, &modulus);
Re-exports§
pub use rand_core;
rand_core
pub use rlp;
rlp
pub use subtle;
pub use zeroize;
zeroize
pub use hybrid_array;
hybrid-array
Modules§
- consts
hybrid-array
- Type aliases for many constants.
- modular
- Modular arithmetic support.
- prelude
- Import prelude for this crate: includes important traits.
Macros§
- const_
monty_ form - Creates a
ConstMontyForm
with the given value for a specific modulus. - impl_
modulus - Implements a modulus with the given name, type, and value, in that specific order. Please
use crypto_bigint::traits::Encoding
to make this work. - nlimbs
- Calculate the number of limbs required to represent the given number of bits.
Structs§
- Boxed
Uint alloc
- Fixed-precision heap-allocated big unsigned integer.
- Checked
- Provides intentionally-checked arithmetic on
T
. - Const
Choice - A boolean value returned by constant-time
const fn
s. - Const
CtOption - An equivalent of
subtle::CtOption
usable in aconst fn
context. - Int
- Stack-allocated big signed integer.
See
Uint
for unsigned integers. - Limb
- Big integers are represented as an array/vector of smaller CPU word-size integers called “limbs”.
- NonZero
- Wrapper type for non-zero integers.
- Odd
- Wrapper type for odd integers.
- Reciprocal
- A pre-calculated reciprocal for division by a single limb.
- Uint
- Stack-allocated big unsigned integer.
- Wrapping
- Provides intentionally-wrapped arithmetic on
T
.
Enums§
- Decode
Error - Possible errors in variable-time integer decoding methods.
- Random
Bits Error rand_core
- Possible errors of the methods in
RandomBits
trait.
Traits§
- AddMod
- Compute
self + rhs mod p
. - Array
Decoding hybrid-array
- Support for decoding a
Array
as a big integer. - Array
Encoding hybrid-array
- Support for encoding a big integer as a
Array
. - BitOps
- Bit counting and bit operations.
- Bounded
- Integers whose representation takes a bounded amount of space.
- Checked
Add - Checked addition.
- Checked
Div - Checked division.
- Checked
Mul - Checked multiplication.
- Checked
Sub - Checked subtraction.
- Concat
- Concatenate two numbers into a “wide” double-width value, using the
hi
value as the most significant portion of the resulting value. - Concat
Mixed - Concatenate two numbers into a “wide” combined-width value, using the
hi
value as the most significant value. - Const
Zero - Defines an associated constant representing the additive identity element
for
Self
. - Constant
Time Select - Trait for types which are conditionally selectable in constant time.
- Constants
- Trait for associating constant values with a type.
- DivRem
Limb - Support for optimized division by a single limb.
- Encoding
- Encoding support.
- Fixed
Integer - Fixed-width integers.
- Gcd
- Compute the greatest common divisor of two integers.
- Integer
- Integer trait: represents common functionality of integer types provided by this crate.
- InvMod
- Compute
1 / self mod p
. - Invert
- Constant-time inversion.
- Inverter
- Trait impl’d by precomputed modular inverters obtained via the
PrecomputeInverter
trait. - Monty
- A representation of an integer optimized for the performance of modular operations.
- MulMod
- Compute
self * rhs mod p
. - Multi
Exponentiate - Performs modular multi-exponentiation using Montgomery’s ladder.
- Multi
Exponentiate Bounded Exp - Performs modular multi-exponentiation using Montgomery’s ladder.
exponent_bits
represents the number of bits to take into account for the exponent. - NegMod
- Compute
-self mod p
. - Pow
- Constant-time exponentiation.
- PowBounded
Exp - Constant-time exponentiation with exponent of a bounded bit size.
- Precompute
Inverter - Obtain a precomputed inverter for efficiently computing modular inversions for a given modulus.
- Random
rand_core
- Random number generation support.
- Random
Bits rand_core
- Random bits generation support.
- Random
Mod rand_core
- Modular random number generation support.
- RemLimb
- Support for optimized division by a single limb.
- RemMixed
- Support for calculating the remainder of two differently sized integers.
- ShlVartime
- Left shifts, variable time in
shift
. - ShrVartime
- Right shifts, variable time in
shift
. - Split
- Split a number in half, returning the least significant half followed by the most significant.
- Split
Mixed - Split a number into parts, returning the least significant part followed by the most significant.
- Square
- Support for optimized squaring
- Square
Assign - Support for optimized squaring in-place
- Square
Root - Support for calucaling square roots.
- SubMod
- Compute
self - rhs mod p
. - Widening
Mul - Widening multiply: returns a value with a number of limbs equal to the sum of the inputs.
- Wrapping
Add - Performs addition that wraps around on overflow.
- Wrapping
Mul - Performs multiplication that wraps around on overflow.
- Wrapping
Neg - Performs a negation that does not panic.
- Wrapping
Shl - Performs a left shift that does not panic.
- Wrapping
Shr - Performs a right shift that does not panic.
- Wrapping
Sub - Performs subtraction that wraps around on overflow.
- Zero
- Zero values.
Type Aliases§
- Byte
Array hybrid-array
- Alias for a byte array whose size is defined by
ArrayEncoding::ByteSize
. - I64
64-bit - Signed bit integer.
- I128
64-bit - Signed bit integer.
- I256
64-bit - Signed bit integer.
- I512
64-bit - Signed bit integer.
- I1024
64-bit - Signed bit integer.
- I2048
64-bit - Signed bit integer.
- I4096
64-bit - Signed bit integer.
- U64
- 64-bit unsigned big integer.
- U128
- 128-bit unsigned big integer.
- U192
- 192-bit unsigned big integer.
- U256
- 256-bit unsigned big integer.
- U320
- 320-bit unsigned big integer.
- U384
- 384-bit unsigned big integer.
- U448
- 448-bit unsigned big integer.
- U512
- 512-bit unsigned big integer.
- U576
- 576-bit unsigned big integer.
- U640
- 640-bit unsigned big integer.
- U704
- 704-bit unsigned big integer.
- U768
- 768-bit unsigned big integer.
- U832
- 832-bit unsigned big integer.
- U896
- 896-bit unsigned big integer.
- U960
- 960-bit unsigned big integer.
- U1024
- 1024-bit unsigned big integer.
- U1088
extra-sizes
- 1088-bit unsigned big integer.
- U1152
extra-sizes
- 1152-bit unsigned big integer.
- U1216
extra-sizes
- 1216-bit unsigned big integer.
- U1280
- 1280-bit unsigned big integer.
- U1344
extra-sizes
- 1344-bit unsigned big integer.
- U1408
extra-sizes
- 1408-bit unsigned big integer.
- U1472
extra-sizes
- 1472-bit unsigned big integer.
- U1536
- 1536-bit unsigned big integer.
- U1600
extra-sizes
- 1600-bit unsigned big integer.
- U1664
extra-sizes
- 1664-bit unsigned big integer.
- U1728
extra-sizes
- 1728-bit unsigned big integer.
- U1792
- 1792-bit unsigned big integer.
- U1856
extra-sizes
- 1856-bit unsigned big integer.
- U1920
extra-sizes
- 1920-bit unsigned big integer.
- U1984
extra-sizes
- 1984-bit unsigned big integer.
- U2048
- 2048-bit unsigned big integer.
- U2112
extra-sizes
- 2112-bit unsigned big integer.
- U2176
extra-sizes
- 2176-bit unsigned big integer.
- U2240
extra-sizes
- 2240-bit unsigned big integer.
- U2304
extra-sizes
- 2304-bit unsigned big integer.
- U2368
extra-sizes
- 2368-bit unsigned big integer.
- U2432
extra-sizes
- 2432-bit unsigned big integer.
- U2496
extra-sizes
- 2496-bit unsigned big integer.
- U2560
extra-sizes
- 2560-bit unsigned big integer.
- U2624
extra-sizes
- 2624-bit unsigned big integer.
- U2688
extra-sizes
- 2688-bit unsigned big integer.
- U2752
extra-sizes
- 2752-bit unsigned big integer.
- U2816
extra-sizes
- 2816-bit unsigned big integer.
- U2880
extra-sizes
- 2880-bit unsigned big integer.
- U2944
extra-sizes
- 2944-bit unsigned big integer.
- U3008
extra-sizes
- 3008-bit unsigned big integer.
- U3072
- 3072-bit unsigned big integer.
- U3136
extra-sizes
- 3136-bit unsigned big integer.
- U3200
extra-sizes
- 3200-bit unsigned big integer.
- U3264
extra-sizes
- 3264-bit unsigned big integer.
- U3328
extra-sizes
- 3328-bit unsigned big integer.
- U3392
extra-sizes
- 3392-bit unsigned big integer.
- U3456
extra-sizes
- 3456-bit unsigned big integer.
- U3520
extra-sizes
- 3520-bit unsigned big integer.
- U3584
- 3584-bit unsigned big integer.
- U3648
extra-sizes
- 3648-bit unsigned big integer.
- U3712
extra-sizes
- 3712-bit unsigned big integer.
- U3776
extra-sizes
- 3776-bit unsigned big integer.
- U3840
extra-sizes
- 3840-bit unsigned big integer.
- U3904
extra-sizes
- 3904-bit unsigned big integer.
- U3968
extra-sizes
- 3968-bit unsigned big integer.
- U4032
extra-sizes
- 4032-bit unsigned big integer.
- U4096
- 4096-bit unsigned big integer.
- U4160
extra-sizes
- 4160-bit unsigned big integer.
- U4224
- 4224-bit unsigned big integer.
- U4288
extra-sizes
- 4288-bit unsigned big integer.
- U4352
- 4352-bit unsigned big integer.
- U4416
extra-sizes
- 4416-bit unsigned big integer.
- U4480
extra-sizes
- 4480-bit unsigned big integer.
- U4544
extra-sizes
- 4544-bit unsigned big integer.
- U4608
extra-sizes
- 4608-bit unsigned big integer.
- U4672
extra-sizes
- 4672-bit unsigned big integer.
- U4736
extra-sizes
- 4736-bit unsigned big integer.
- U4800
extra-sizes
- 4800-bit unsigned big integer.
- U4864
extra-sizes
- 4864-bit unsigned big integer.
- U4928
extra-sizes
- 4928-bit unsigned big integer.
- U4992
extra-sizes
- 4992-bit unsigned big integer.
- U5056
extra-sizes
- 5056-bit unsigned big integer.
- U5120
extra-sizes
- 5120-bit unsigned big integer.
- U5184
extra-sizes
- 5184-bit unsigned big integer.
- U5248
extra-sizes
- 5248-bit unsigned big integer.
- U5312
extra-sizes
- 5312-bit unsigned big integer.
- U5376
extra-sizes
- 5376-bit unsigned big integer.
- U5440
extra-sizes
- 5440-bit unsigned big integer.
- U5504
extra-sizes
- 5504-bit unsigned big integer.
- U5568
extra-sizes
- 5568-bit unsigned big integer.
- U5632
extra-sizes
- 5632-bit unsigned big integer.
- U5696
extra-sizes
- 5696-bit unsigned big integer.
- U5760
extra-sizes
- 5760-bit unsigned big integer.
- U5824
extra-sizes
- 5824-bit unsigned big integer.
- U5888
extra-sizes
- 5888-bit unsigned big integer.
- U5952
extra-sizes
- 5952-bit unsigned big integer.
- U6016
extra-sizes
- 6016-bit unsigned big integer.
- U6080
extra-sizes
- 6080-bit unsigned big integer.
- U6144
- 6144-bit unsigned big integer.
- U6208
extra-sizes
- 6208-bit unsigned big integer.
- U6272
extra-sizes
- 6272-bit unsigned big integer.
- U6336
extra-sizes
- 6336-bit unsigned big integer.
- U6400
extra-sizes
- 6400-bit unsigned big integer.
- U6464
extra-sizes
- 6464-bit unsigned big integer.
- U6528
extra-sizes
- 6528-bit unsigned big integer.
- U6592
extra-sizes
- 6592-bit unsigned big integer.
- U6656
extra-sizes
- 6656-bit unsigned big integer.
- U6720
extra-sizes
- 6720-bit unsigned big integer.
- U6784
extra-sizes
- 6784-bit unsigned big integer.
- U6848
extra-sizes
- 6848-bit unsigned big integer.
- U6912
extra-sizes
- 6912-bit unsigned big integer.
- U6976
extra-sizes
- 6976-bit unsigned big integer.
- U7040
extra-sizes
- 7040-bit unsigned big integer.
- U7104
extra-sizes
- 7104-bit unsigned big integer.
- U7168
extra-sizes
- 7168-bit unsigned big integer.
- U7232
extra-sizes
- 7232-bit unsigned big integer.
- U7296
extra-sizes
- 7296-bit unsigned big integer.
- U7360
extra-sizes
- 7360-bit unsigned big integer.
- U7424
extra-sizes
- 7424-bit unsigned big integer.
- U7488
extra-sizes
- 7488-bit unsigned big integer.
- U7552
extra-sizes
- 7552-bit unsigned big integer.
- U7616
extra-sizes
- 7616-bit unsigned big integer.
- U7680
extra-sizes
- 7680-bit unsigned big integer.
- U7744
extra-sizes
- 7744-bit unsigned big integer.
- U7808
extra-sizes
- 7808-bit unsigned big integer.
- U7872
extra-sizes
- 7872-bit unsigned big integer.
- U7936
extra-sizes
- 7936-bit unsigned big integer.
- U8000
extra-sizes
- 8000-bit unsigned big integer.
- U8064
extra-sizes
- 8064-bit unsigned big integer.
- U8128
extra-sizes
- 8128-bit unsigned big integer.
- U8192
- 8192-bit unsigned big integer.
- U16384
- 16384-bit unsigned big integer.
- U32768
- 32768-bit unsigned big integer.
- Wide
Word - Wide integer type: double the width of
Word
. - Word
- Unsigned integer type that the
Limb
newtype wraps.