bignum.h File Reference

Multi-precision integer library. More...

`#include "config.h"`
`#include <stddef.h>`
`#include <stdint.h>`
`#include <stdio.h>`
Include dependency graph for bignum.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

## Data Structures

struct | mbedtls_mpi
| MPI structure. More...

## Macros

#define | MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002
| An error occurred while reading from or writing to a file. More...
#define | MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004
| Bad input parameters to function. More...
#define | MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006
| There is an invalid character in the digit string. More...
#define | MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008
| The buffer is too small to write to. More...
#define | MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A
| The input arguments are negative or result in illegal output. More...
#define | MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C
| The input argument for division is zero, which is not allowed. More...
#define | MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E
| The input arguments are not acceptable. More...
#define | MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010
| Memory allocation failed. More...
#define | MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 )
#define | MBEDTLS_MPI_MAX_LIMBS 10000
#define | MBEDTLS_MPI_WINDOW_SIZE 6
| Maximum windows size used. More...
#define | MBEDTLS_MPI_MAX_SIZE 1024
| Maximum number of bytes for usable MPIs. More...
#define | MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE )
| Maximum number of bits for usable MPIs. More...
#define | MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS )
#define | MBEDTLS_LN_2_DIV_LN_10_SCALE100 332
#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_HAVE_INT32
#define | MBEDTLS_HAVE_UDBL

## Typedefs

typedef int32_t | mbedtls_mpi_sint
typedef uint32_t | mbedtls_mpi_uint
typedef uint64_t | mbedtls_t_udbl

## 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 X from 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. 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...
int | mbedtls_mpi_is_prime (const mbedtls_mpi *X, 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 dh_flag, 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...

## Detailed Description

Multi-precision integer library.

Copyright (C) 2006-2015, ARM Limited, All Rights Reserved SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

This file is part of mbed TLS (https://tls.mbed.org)

Definition in file bignum.h.

## Macro Definition Documentation

#define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010

Memory allocation failed.

Definition at line 46 of file bignum.h.

#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004

Bad input parameters to function.

Definition at line 40 of file bignum.h.

#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008

The buffer is too small to write to.

Definition at line 42 of file bignum.h.

#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C

The input argument for division is zero, which is not allowed.

Definition at line 44 of file bignum.h.

#define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002

An error occurred while reading from or writing to a file.

Definition at line 39 of file bignum.h.

#define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006

There is an invalid character in the digit string.

Definition at line 41 of file bignum.h.

#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A

The input arguments are negative or result in illegal output.

Definition at line 43 of file bignum.h.

#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E

The input arguments are not acceptable.

Definition at line 45 of file bignum.h.

#define MBEDTLS_HAVE_INT32

Definition at line 129 of file bignum.h.

#define MBEDTLS_HAVE_UDBL

Definition at line 133 of file bignum.h.

#define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332

Definition at line 100 of file bignum.h.

#define MBEDTLS_MPI_CHK | ( |  | f | ) | do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 )

Definition at line 48 of file bignum.h.

#define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE )

Maximum number of bits for usable MPIs.

Definition at line 79 of file bignum.h.

#define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS )

Definition at line 99 of file bignum.h.

#define MBEDTLS_MPI_MAX_LIMBS 10000

Definition at line 53 of file bignum.h.

#define MBEDTLS_MPI_MAX_SIZE 1024

Maximum number of bytes for usable MPIs.

Definition at line 76 of file bignum.h.

#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 )

Definition at line 101 of file bignum.h.

#define MBEDTLS_MPI_WINDOW_SIZE 6

Maximum windows size used.

Definition at line 65 of file bignum.h.

## Typedef Documentation

typedef int32_t mbedtls_mpi_sint

Definition at line 130 of file bignum.h.

typedef uint32_t mbedtls_mpi_uint

Definition at line 131 of file bignum.h.

typedef uint64_t mbedtls_t_udbl

Definition at line 132 of file bignum.h.

## Function Documentation

int mbedtls_mpi_add_abs | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | const mbedtls_mpi * | B
| ) |  |

Unsigned addition: X = |A| + |B|.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_add_int | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | mbedtls_mpi_sint | b
| ) |  |

Signed addition: X = A + b.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  b | The integer value to add

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_add_mpi | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | const mbedtls_mpi * | B
| ) |  |

Signed addition: X = A + B.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

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

Parameters

  X | MPI to use

int mbedtls_mpi_cmp_abs | ( | const mbedtls_mpi * | X,
|  | const mbedtls_mpi * | Y
| ) |  |

Compare unsigned values.

Parameters

  X | Left-hand MPI
  Y | Right-hand MPI

Returns
  1 if |X| is greater than |Y|, -1 if |X| is lesser than |Y| or 0 if |X| is equal to |Y|

int mbedtls_mpi_cmp_int | ( | const mbedtls_mpi * | X,
|  | mbedtls_mpi_sint | z
| ) |  |

Compare signed values.

Parameters

  X | Left-hand MPI
  z | The integer value to compare to

Returns
  1 if X is greater than z, -1 if X is lesser than z or 0 if X is equal to z

int mbedtls_mpi_cmp_mpi | ( | const mbedtls_mpi * | X,
|  | const mbedtls_mpi * | Y
| ) |  |

Compare signed values.

Parameters

  X | Left-hand MPI
  Y | Right-hand MPI

Returns
  1 if X is greater than Y, -1 if X is lesser than Y or 0 if X is equal to Y

int mbedtls_mpi_copy | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | Y
| ) |  |

Copy the contents of Y into X.

Parameters

  X | Destination MPI
  Y | Source MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

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.

Parameters

  Q | Destination MPI for the quotient
  R | Destination MPI for the rest value
  A | Left-hand MPI
  b | Integer to divide by

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0

Note
  Either Q or R can be NULL.

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.

Parameters

  Q | Destination MPI for the quotient
  R | Destination MPI for the rest value
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0

Note
  Either Q or R can be NULL.

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.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  E | Exponent MPI
  N | Modular MPI
  _RR | Speed-up MPI used for recalculations

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or even or if E is negative

Note
  _RR is used to avoid re-computing R*R mod N across multiple calls, which speeds up things a bit. It can be set to NULL if the extra performance is unneeded.

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.

Parameters

  X | Destination MPI
  size | Size in bytes
  f_rng | RNG function
  p_rng | RNG parameter

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

void mbedtls_mpi_free | ( | mbedtls_mpi * | X | ) |

Unallocate one MPI.

Parameters

  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)

Parameters

  G | Destination MPI
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_gen_prime | ( | mbedtls_mpi * | X,
|  | size_t | nbits,
|  | int | dh_flag,
|  | int(*)(void *, unsigned char *, size_t) | f_rng,
|  | void * | p_rng
| ) |  |

Prime number generation.

Parameters

  X | Destination MPI
  nbits | Required size of X in bits ( 3 <= nbits <= MBEDTLS_MPI_MAX_BITS )
  dh_flag | If 1, then (X-1)/2 will be prime too
  f_rng | RNG function
  p_rng | RNG parameter

Returns
  0 if successful (probably prime), MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_BAD_INPUT_DATA if nbits is < 3

int mbedtls_mpi_get_bit | ( | const mbedtls_mpi * | X,
|  | size_t | pos
| ) |  |

Get a specific bit from X.

Parameters

  X | MPI to use
  pos | Zero-based index of the bit in X

Returns
  Either a 0 or a 1

int mbedtls_mpi_grow | ( | mbedtls_mpi * | X,
|  | size_t | nblimbs
| ) |  |

Enlarge to the specified number of limbs.

Parameters

  X | MPI to grow
  nblimbs | The target number of limbs

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

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.

Parameters

  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.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  N | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or nil MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N

int mbedtls_mpi_is_prime | ( | const mbedtls_mpi * | X,
|  | int(*)(void *, unsigned char *, size_t) | f_rng,
|  | void * | p_rng
| ) |  |

Miller-Rabin primality test.

Parameters

  X | MPI to check
  f_rng | RNG function
  p_rng | RNG parameter

Returns
  0 if successful (probably prime), MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if X is not prime

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

Parameters

  X | MPI to use

int mbedtls_mpi_lset | ( | mbedtls_mpi * | X,
|  | mbedtls_mpi_sint | z
| ) |  |

Set value from integer.

Parameters

  X | MPI to set
  z | Value to use

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_mod_int | ( | mbedtls_mpi_uint * | r,
|  | const mbedtls_mpi * | A,
|  | mbedtls_mpi_sint | b
| ) |  |

Modulo: r = A mod b.

Parameters

  r | Destination mbedtls_mpi_uint
  A | Left-hand MPI
  b | Integer to divide by

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0, MBEDTLS_ERR_MPI_NEGATIVE_VALUE if b < 0

int mbedtls_mpi_mod_mpi | ( | mbedtls_mpi * | R,
|  | const mbedtls_mpi * | A,
|  | const mbedtls_mpi * | B
| ) |  |

Modulo: R = A mod B.

Parameters

  R | Destination MPI for the rest value
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0, MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B < 0

int mbedtls_mpi_mul_int | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | mbedtls_mpi_uint | b
| ) |  |

Baseline multiplication: X = A * b.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  b | The unsigned integer value to multiply with

Note
  b is unsigned

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_mul_mpi | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | const mbedtls_mpi * | B
| ) |  |

Baseline multiplication: X = A * B.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_read_binary | ( | mbedtls_mpi * | X,
|  | const unsigned char * | buf,
|  | size_t | buflen
| ) |  |

Import X from unsigned binary data, big endian.

Parameters

  X | Destination MPI
  buf | Input buffer
  buflen | Input buffer size

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_read_file | ( | mbedtls_mpi * | X,
|  | int | radix,
|  | FILE * | fin
| ) |  |

Read X from an opened file.

Parameters

  X | Destination MPI
  radix | Input numeric base
  fin | Input file handle

Returns
  0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the file read buffer is too small or a MBEDTLS_ERR_MPI_XXX error code

int mbedtls_mpi_read_string | ( | mbedtls_mpi * | X,
|  | int | radix,
|  | const char * | s
| ) |  |

Import from an ASCII string.

Parameters

  X | Destination MPI
  radix | Input numeric base
  s | Null-terminated string buffer

Returns
  0 if successful, or a MBEDTLS_ERR_MPI_XXX error code

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.

Parameters

  X | MPI to conditionally assign to
  Y | Value to be assigned
  assign | 1: perform the assignment, 0: keep X's original value

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,

Note
  This function is equivalent to if( assign ) mbedtls_mpi_copy( X, Y ); except that it avoids leaking any information about whether the assignment was done or not (the above code may leak information through branch prediction and/or memory access patterns analysis).

int mbedtls_mpi_safe_cond_swap | ( | mbedtls_mpi * | X,
|  | mbedtls_mpi * | Y,
|  | unsigned char | assign
| ) |  |

Safe conditional swap X <-> Y if swap is 1.

Parameters

  X | First mbedtls_mpi value
  Y | Second mbedtls_mpi value
  assign | 1: perform the swap, 0: keep X and Y's original values

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,

Note
  This function is equivalent to if( assign ) mbedtls_mpi_swap( X, Y ); except that it avoids leaking any information about whether the assignment was done or not (the above code may leak information through branch prediction and/or memory access patterns analysis).

int mbedtls_mpi_self_test | ( | int | verbose | ) |

Checkup routine.

Returns
  0 if successful, or 1 if the test failed

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.

Note
  Will grow X if necessary to set a bit to 1 in a not yet existing limb. Will not grow if bit should be set to 0

Parameters

  X | MPI to use
  pos | Zero-based index of the bit in X
  val | The value to set the bit to (0 or 1)

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, MBEDTLS_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1

int mbedtls_mpi_shift_l | ( | mbedtls_mpi * | X,
|  | size_t | count
| ) |  |

Left-shift: X <<= count.

Parameters

  X | MPI to shift
  count | Amount to shift

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_shift_r | ( | mbedtls_mpi * | X,
|  | size_t | count
| ) |  |

Right-shift: X >>= count.

Parameters

  X | MPI to shift
  count | Amount to shift

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_shrink | ( | mbedtls_mpi * | X,
|  | size_t | nblimbs
| ) |  |

Resize down, keeping at least the specified number of limbs.

Parameters

  X | MPI to shrink
  nblimbs | The minimum number of limbs to keep

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

size_t mbedtls_mpi_size | ( | const mbedtls_mpi * | X | ) |

Return the total size in bytes.

Parameters

  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|.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B is greater than A

int mbedtls_mpi_sub_int | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | mbedtls_mpi_sint | b
| ) |  |

Signed subtraction: X = A - b.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  b | The integer value to subtract

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

int mbedtls_mpi_sub_mpi | ( | mbedtls_mpi * | X,
|  | const mbedtls_mpi * | A,
|  | const mbedtls_mpi * | B
| ) |  |

Signed subtraction: X = A - B.

Parameters

  X | Destination MPI
  A | Left-hand MPI
  B | Right-hand MPI

Returns
  0 if successful, MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed

void mbedtls_mpi_swap | ( | mbedtls_mpi * | X,
|  | mbedtls_mpi * | Y
| ) |  |

Swap the contents of X and Y.

Parameters

  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.

Parameters

  X | Source MPI
  buf | Output buffer
  buflen | Output buffer size

Returns
  0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough

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.

Parameters

  p | Prefix, can be NULL
  X | Source MPI
  radix | Output numeric base
  fout | Output file handle (can be NULL)

Returns
  0 if successful, or a MBEDTLS_ERR_MPI_XXX error code

Note
  Set fout == NULL to print X on the console.

int mbedtls_mpi_write_string | ( | const mbedtls_mpi * | X,
|  | int | radix,
|  | char * | buf,
|  | size_t | buflen,
|  | size_t * | olen
| ) |  |

Export into an ASCII string.

Parameters

  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

Returns
  0 if successful, or a MBEDTLS_ERR_MPI_XXX error code. *olen is always updated to reflect the amount of data that has (or would have) been written.

Note
  Call this function with buflen = 0 to obtain the minimum required buffer size in *olen.