mbed TLS v2.14.1
|
Multi-precision integer library. More...
Go to the source code of this file.
Data Structures | |
struct | mbedtls_mpi |
MPI structure. More... | |
Typedefs | |
typedef int32_t | mbedtls_mpi_sint |
typedef uint32_t | mbedtls_mpi_uint |
typedef uint64_t | mbedtls_t_udbl |
typedef struct mbedtls_mpi | mbedtls_mpi |
MPI structure. More... | |
Enumerations | |
enum | mbedtls_mpi_gen_prime_flag_t { MBEDTLS_MPI_GEN_PRIME_FLAG_DH = 0x0001, MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR = 0x0002 } |
Flags for mbedtls_mpi_gen_prime() More... | |
Functions | |
void | mbedtls_mpi_init (mbedtls_mpi *X) |
Initialize one MPI (make internal references valid) This just makes it ready to be set or freed, but does not define a value for the MPI. More... | |
void | mbedtls_mpi_free (mbedtls_mpi *X) |
Unallocate one MPI. More... | |
int | mbedtls_mpi_grow (mbedtls_mpi *X, size_t nblimbs) |
Enlarge to the specified number of limbs. More... | |
int | mbedtls_mpi_shrink (mbedtls_mpi *X, size_t nblimbs) |
Resize down, keeping at least the specified number of limbs. More... | |
int | mbedtls_mpi_copy (mbedtls_mpi *X, const mbedtls_mpi *Y) |
Copy the contents of Y into X. More... | |
void | mbedtls_mpi_swap (mbedtls_mpi *X, mbedtls_mpi *Y) |
Swap the contents of X and Y. More... | |
int | mbedtls_mpi_safe_cond_assign (mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign) |
Safe conditional assignement X = Y if assign is 1. More... | |
int | mbedtls_mpi_safe_cond_swap (mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign) |
Safe conditional swap X <-> Y if swap is 1. More... | |
int | mbedtls_mpi_lset (mbedtls_mpi *X, mbedtls_mpi_sint z) |
Set value from integer. More... | |
int | mbedtls_mpi_get_bit (const mbedtls_mpi *X, size_t pos) |
Get a specific bit from X. More... | |
int | mbedtls_mpi_set_bit (mbedtls_mpi *X, size_t pos, unsigned char val) |
Set a bit of X to a specific value of 0 or 1. More... | |
size_t | mbedtls_mpi_lsb (const mbedtls_mpi *X) |
Return the number of zero-bits before the least significant '1' bit. More... | |
size_t | mbedtls_mpi_bitlen (const mbedtls_mpi *X) |
Return the number of bits up to and including the most significant '1' bit'. More... | |
size_t | mbedtls_mpi_size (const mbedtls_mpi *X) |
Return the total size in bytes. More... | |
int | mbedtls_mpi_read_string (mbedtls_mpi *X, int radix, const char *s) |
Import from an ASCII string. More... | |
int | mbedtls_mpi_write_string (const mbedtls_mpi *X, int radix, char *buf, size_t buflen, size_t *olen) |
Export into an ASCII string. More... | |
int | mbedtls_mpi_read_file (mbedtls_mpi *X, int radix, FILE *fin) |
Read MPI from a line in an opened file. More... | |
int | mbedtls_mpi_write_file (const char *p, const mbedtls_mpi *X, int radix, FILE *fout) |
Write X into an opened file, or stdout if fout is NULL. More... | |
int | mbedtls_mpi_read_binary (mbedtls_mpi *X, const unsigned char *buf, size_t buflen) |
Import X from unsigned binary data, big endian. More... | |
int | mbedtls_mpi_write_binary (const mbedtls_mpi *X, unsigned char *buf, size_t buflen) |
Export X into unsigned binary data, big endian. Always fills the whole buffer, which will start with zeros if the number is smaller. More... | |
int | mbedtls_mpi_shift_l (mbedtls_mpi *X, size_t count) |
Left-shift: X <<= count. More... | |
int | mbedtls_mpi_shift_r (mbedtls_mpi *X, size_t count) |
Right-shift: X >>= count. More... | |
int | mbedtls_mpi_cmp_abs (const mbedtls_mpi *X, const mbedtls_mpi *Y) |
Compare unsigned values. More... | |
int | mbedtls_mpi_cmp_mpi (const mbedtls_mpi *X, const mbedtls_mpi *Y) |
Compare signed values. More... | |
int | mbedtls_mpi_cmp_int (const mbedtls_mpi *X, mbedtls_mpi_sint z) |
Compare signed values. More... | |
int | mbedtls_mpi_add_abs (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Unsigned addition: X = |A| + |B|. More... | |
int | mbedtls_mpi_sub_abs (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Unsigned subtraction: X = |A| - |B|. More... | |
int | mbedtls_mpi_add_mpi (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Signed addition: X = A + B. More... | |
int | mbedtls_mpi_sub_mpi (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Signed subtraction: X = A - B. More... | |
int | mbedtls_mpi_add_int (mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b) |
Signed addition: X = A + b. More... | |
int | mbedtls_mpi_sub_int (mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b) |
Signed subtraction: X = A - b. More... | |
int | mbedtls_mpi_mul_mpi (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Baseline multiplication: X = A * B. More... | |
int | mbedtls_mpi_mul_int (mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b) |
Baseline multiplication: X = A * b. More... | |
int | mbedtls_mpi_div_mpi (mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Division by mbedtls_mpi: A = Q * B + R. More... | |
int | mbedtls_mpi_div_int (mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b) |
Division by int: A = Q * b + R. More... | |
int | mbedtls_mpi_mod_mpi (mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Modulo: R = A mod B. More... | |
int | mbedtls_mpi_mod_int (mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b) |
Modulo: r = A mod b. More... | |
int | mbedtls_mpi_exp_mod (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR) |
Sliding-window exponentiation: X = A^E mod N. More... | |
int | mbedtls_mpi_fill_random (mbedtls_mpi *X, size_t size, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng) |
Fill an MPI X with size bytes of random. More... | |
int | mbedtls_mpi_gcd (mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B) |
Greatest common divisor: G = gcd(A, B) More... | |
int | mbedtls_mpi_inv_mod (mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N) |
Modular inverse: X = A^-1 mod N. More... | |
MBEDTLS_DEPRECATED int | mbedtls_mpi_is_prime (const mbedtls_mpi *X, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng) |
Miller-Rabin primality test with error probability of 2-80 More... | |
int | mbedtls_mpi_is_prime_ext (const mbedtls_mpi *X, int rounds, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng) |
Miller-Rabin primality test. More... | |
int | mbedtls_mpi_gen_prime (mbedtls_mpi *X, size_t nbits, int flags, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng) |
Prime number generation. More... | |
int | mbedtls_mpi_self_test (int verbose) |
Checkup routine. More... | |
Multi-precision integer library.
Definition in file bignum.h.
#define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 |
#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 |
#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 |
#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C |
#define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 |
#define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 |
#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A |
#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E |
#define MBEDTLS_MPI_CHK | ( | f | ) | do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) |
#define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE ) |
#define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS ) |
#define MBEDTLS_MPI_MAX_SIZE 1024 |
#define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) |
#define MBEDTLS_MPI_WINDOW_SIZE 6 |
typedef struct mbedtls_mpi mbedtls_mpi |
MPI structure.
typedef int32_t mbedtls_mpi_sint |
typedef uint32_t mbedtls_mpi_uint |
typedef uint64_t mbedtls_t_udbl |
Flags for mbedtls_mpi_gen_prime()
Each of these flags is a constraint on the result X returned by mbedtls_mpi_gen_prime().
Enumerator | |
---|---|
MBEDTLS_MPI_GEN_PRIME_FLAG_DH |
(X-1)/2 is prime too |
MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR |
lower error rate from 2-80 to 2-128 |
int mbedtls_mpi_add_abs | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Unsigned addition: X = |A| + |B|.
X | Destination MPI |
A | Left-hand MPI |
B | Right-hand MPI |
int mbedtls_mpi_add_int | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
mbedtls_mpi_sint | b | ||
) |
Signed addition: X = A + b.
X | Destination MPI |
A | Left-hand MPI |
b | The integer value to add |
int mbedtls_mpi_add_mpi | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Signed addition: X = A + B.
X | Destination MPI |
A | Left-hand MPI |
B | Right-hand MPI |
size_t mbedtls_mpi_bitlen | ( | const mbedtls_mpi * | X | ) |
Return the number of bits up to and including the most significant '1' bit'.
Note: Thus also the one-based index of the most significant '1' bit
X | MPI to use |
int mbedtls_mpi_cmp_abs | ( | const mbedtls_mpi * | X, |
const mbedtls_mpi * | Y | ||
) |
Compare unsigned values.
X | Left-hand MPI |
Y | Right-hand MPI |
int mbedtls_mpi_cmp_int | ( | const mbedtls_mpi * | X, |
mbedtls_mpi_sint | z | ||
) |
Compare signed values.
X | Left-hand MPI |
z | The integer value to compare to |
int mbedtls_mpi_cmp_mpi | ( | const mbedtls_mpi * | X, |
const mbedtls_mpi * | Y | ||
) |
Compare signed values.
X | Left-hand MPI |
Y | Right-hand MPI |
int mbedtls_mpi_copy | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | Y | ||
) |
Copy the contents of Y into X.
X | Destination MPI. It is enlarged if necessary. |
Y | Source MPI. |
int mbedtls_mpi_div_int | ( | mbedtls_mpi * | Q, |
mbedtls_mpi * | R, | ||
const mbedtls_mpi * | A, | ||
mbedtls_mpi_sint | b | ||
) |
Division by int: A = Q * b + R.
Q | Destination MPI for the quotient |
R | Destination MPI for the rest value |
A | Left-hand MPI |
b | Integer to divide by |
int mbedtls_mpi_div_mpi | ( | mbedtls_mpi * | Q, |
mbedtls_mpi * | R, | ||
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Division by mbedtls_mpi: A = Q * B + R.
Q | Destination MPI for the quotient |
R | Destination MPI for the rest value |
A | Left-hand MPI |
B | Right-hand MPI |
int mbedtls_mpi_exp_mod | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | E, | ||
const mbedtls_mpi * | N, | ||
mbedtls_mpi * | _RR | ||
) |
Sliding-window exponentiation: X = A^E mod N.
X | Destination MPI |
A | Left-hand MPI |
E | Exponent MPI |
N | Modular MPI |
_RR | Speed-up MPI used for recalculations |
int mbedtls_mpi_fill_random | ( | mbedtls_mpi * | X, |
size_t | size, | ||
int(*)(void *, unsigned char *, size_t) | f_rng, | ||
void * | p_rng | ||
) |
Fill an MPI X with size bytes of random.
X | Destination MPI |
size | Size in bytes |
f_rng | RNG function |
p_rng | RNG parameter |
void mbedtls_mpi_free | ( | mbedtls_mpi * | X | ) |
Unallocate one MPI.
X | One MPI to unallocate. |
int mbedtls_mpi_gcd | ( | mbedtls_mpi * | G, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Greatest common divisor: G = gcd(A, B)
G | Destination MPI |
A | Left-hand MPI |
B | Right-hand MPI |
int mbedtls_mpi_gen_prime | ( | mbedtls_mpi * | X, |
size_t | nbits, | ||
int | flags, | ||
int(*)(void *, unsigned char *, size_t) | f_rng, | ||
void * | p_rng | ||
) |
Prime number generation.
X | Destination MPI |
nbits | Required size of X in bits ( 3 <= nbits <= MBEDTLS_MPI_MAX_BITS ) |
flags | Mask of flags of type mbedtls_mpi_gen_prime_flag_t |
f_rng | RNG function |
p_rng | RNG parameter |
int mbedtls_mpi_get_bit | ( | const mbedtls_mpi * | X, |
size_t | pos | ||
) |
Get a specific bit from X.
X | MPI to use |
pos | Zero-based index of the bit in X |
int mbedtls_mpi_grow | ( | mbedtls_mpi * | X, |
size_t | nblimbs | ||
) |
Enlarge to the specified number of limbs.
This function does nothing if the MPI is already large enough.
X | MPI to grow |
nblimbs | The target number of limbs |
void mbedtls_mpi_init | ( | mbedtls_mpi * | X | ) |
Initialize one MPI (make internal references valid) This just makes it ready to be set or freed, but does not define a value for the MPI.
X | One MPI to initialize. |
int mbedtls_mpi_inv_mod | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | N | ||
) |
Modular inverse: X = A^-1 mod N.
X | Destination MPI |
A | Left-hand MPI |
N | Right-hand MPI |
MBEDTLS_DEPRECATED int mbedtls_mpi_is_prime | ( | const mbedtls_mpi * | X, |
int(*)(void *, unsigned char *, size_t) | f_rng, | ||
void * | p_rng | ||
) |
Miller-Rabin primality test with error probability of 2-80
X | MPI to check |
f_rng | RNG function |
p_rng | RNG parameter |
int mbedtls_mpi_is_prime_ext | ( | const mbedtls_mpi * | X, |
int | rounds, | ||
int(*)(void *, unsigned char *, size_t) | f_rng, | ||
void * | p_rng | ||
) |
Miller-Rabin primality test.
X
is potentially generated by an adversary, for example when validating cryptographic parameters that you didn't generate yourself and that are supposed to be prime, then rounds
should be at least the half of the security strength of the cryptographic algorithm. On the other hand, if X
is chosen uniformly or non-adversially (as is the case when mbedtls_mpi_gen_prime calls this function), then rounds
can be much lower.X | MPI to check |
rounds | Number of bases to perform Miller-Rabin primality test for. The probability of returning 0 on a composite is at most 2-2*rounds . |
f_rng | RNG function |
p_rng | RNG parameter |
size_t mbedtls_mpi_lsb | ( | const mbedtls_mpi * | X | ) |
Return the number of zero-bits before the least significant '1' bit.
Note: Thus also the zero-based index of the least significant '1' bit
X | MPI to use |
int mbedtls_mpi_lset | ( | mbedtls_mpi * | X, |
mbedtls_mpi_sint | z | ||
) |
Set value from integer.
X | MPI to set |
z | Value to use |
int mbedtls_mpi_mod_int | ( | mbedtls_mpi_uint * | r, |
const mbedtls_mpi * | A, | ||
mbedtls_mpi_sint | b | ||
) |
Modulo: r = A mod b.
r | Destination mbedtls_mpi_uint |
A | Left-hand MPI |
b | Integer to divide by |
int mbedtls_mpi_mod_mpi | ( | mbedtls_mpi * | R, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Modulo: R = A mod B.
R | Destination MPI for the rest value |
A | Left-hand MPI |
B | Right-hand MPI |
int mbedtls_mpi_mul_int | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
mbedtls_mpi_uint | b | ||
) |
Baseline multiplication: X = A * b.
X | Destination MPI |
A | Left-hand MPI |
b | The unsigned integer value to multiply with |
int mbedtls_mpi_mul_mpi | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Baseline multiplication: X = A * B.
X | Destination MPI |
A | Left-hand MPI |
B | Right-hand MPI |
int mbedtls_mpi_read_binary | ( | mbedtls_mpi * | X, |
const unsigned char * | buf, | ||
size_t | buflen | ||
) |
Import X from unsigned binary data, big endian.
X | Destination MPI |
buf | Input buffer |
buflen | Input buffer size |
int mbedtls_mpi_read_file | ( | mbedtls_mpi * | X, |
int | radix, | ||
FILE * | fin | ||
) |
Read MPI from a line in an opened file.
X | Destination MPI |
radix | Input numeric base |
fin | Input file handle |
The function returns 0 on an empty line.
Leading whitespaces are ignored, as is a '0x' prefix for radix 16.
int mbedtls_mpi_read_string | ( | mbedtls_mpi * | X, |
int | radix, | ||
const char * | s | ||
) |
Import from an ASCII string.
X | Destination MPI |
radix | Input numeric base |
s | Null-terminated string buffer |
int mbedtls_mpi_safe_cond_assign | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | Y, | ||
unsigned char | assign | ||
) |
Safe conditional assignement X = Y if assign is 1.
X | MPI to conditionally assign to |
Y | Value to be assigned |
assign | 1: perform the assignment, 0: keep X's original value |
int mbedtls_mpi_safe_cond_swap | ( | mbedtls_mpi * | X, |
mbedtls_mpi * | Y, | ||
unsigned char | assign | ||
) |
Safe conditional swap X <-> Y if swap is 1.
X | First mbedtls_mpi value |
Y | Second mbedtls_mpi value |
assign | 1: perform the swap, 0: keep X and Y's original values |
int mbedtls_mpi_self_test | ( | int | verbose | ) |
Checkup routine.
int mbedtls_mpi_set_bit | ( | mbedtls_mpi * | X, |
size_t | pos, | ||
unsigned char | val | ||
) |
Set a bit of X to a specific value of 0 or 1.
X | MPI to use |
pos | Zero-based index of the bit in X |
val | The value to set the bit to (0 or 1) |
int mbedtls_mpi_shift_l | ( | mbedtls_mpi * | X, |
size_t | count | ||
) |
Left-shift: X <<= count.
X | MPI to shift |
count | Amount to shift |
int mbedtls_mpi_shift_r | ( | mbedtls_mpi * | X, |
size_t | count | ||
) |
Right-shift: X >>= count.
X | MPI to shift |
count | Amount to shift |
int mbedtls_mpi_shrink | ( | mbedtls_mpi * | X, |
size_t | nblimbs | ||
) |
Resize down, keeping at least the specified number of limbs.
If X
is smaller than nblimbs
, it is resized up instead.
X | MPI to shrink |
nblimbs | The minimum number of limbs to keep |
size_t mbedtls_mpi_size | ( | const mbedtls_mpi * | X | ) |
Return the total size in bytes.
X | MPI to use |
int mbedtls_mpi_sub_abs | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Unsigned subtraction: X = |A| - |B|.
X | Destination MPI |
A | Left-hand MPI |
B | Right-hand MPI |
int mbedtls_mpi_sub_int | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
mbedtls_mpi_sint | b | ||
) |
Signed subtraction: X = A - b.
X | Destination MPI |
A | Left-hand MPI |
b | The integer value to subtract |
int mbedtls_mpi_sub_mpi | ( | mbedtls_mpi * | X, |
const mbedtls_mpi * | A, | ||
const mbedtls_mpi * | B | ||
) |
Signed subtraction: X = A - B.
X | Destination MPI |
A | Left-hand MPI |
B | Right-hand MPI |
void mbedtls_mpi_swap | ( | mbedtls_mpi * | X, |
mbedtls_mpi * | Y | ||
) |
Swap the contents of X and Y.
X | First MPI value |
Y | Second MPI value |
int mbedtls_mpi_write_binary | ( | const mbedtls_mpi * | X, |
unsigned char * | buf, | ||
size_t | buflen | ||
) |
Export X into unsigned binary data, big endian. Always fills the whole buffer, which will start with zeros if the number is smaller.
X | Source MPI |
buf | Output buffer |
buflen | Output buffer size |
int mbedtls_mpi_write_file | ( | const char * | p, |
const mbedtls_mpi * | X, | ||
int | radix, | ||
FILE * | fout | ||
) |
Write X into an opened file, or stdout if fout is NULL.
p | Prefix, can be NULL |
X | Source MPI |
radix | Output numeric base |
fout | Output file handle (can be NULL) |
int mbedtls_mpi_write_string | ( | const mbedtls_mpi * | X, |
int | radix, | ||
char * | buf, | ||
size_t | buflen, | ||
size_t * | olen | ||
) |
Export into an ASCII string.
X | Source MPI |
radix | Output numeric base |
buf | Buffer to write the string to |
buflen | Length of buf |
olen | Length of the string written, including final NUL byte |