CycloneBOOT 2.6.6
Secure Bootloader for ARM Cortex-M MCU
Loading...
Searching...
No Matches
mpi.c File Reference

MPI (Multiple Precision Integer Arithmetic) More...

#include "core/crypto.h"
#include "mpi/mpi.h"
#include "mpi/mpi_misc.h"
#include "debug.h"

Macros

#define TRACE_LEVEL   CRYPTO_TRACE_LEVEL
 

Functions

void mpiInit (Mpi *r)
 Initialize a multiple precision integer.
 
void mpiFree (Mpi *r)
 Release a multiple precision integer.
 
error_t mpiGrow (Mpi *r, uint_t size)
 Adjust the size of multiple precision integer.
 
uint_t mpiGetLength (const Mpi *a)
 Get the actual length in words.
 
uint_t mpiGetByteLength (const Mpi *a)
 Get the actual length in bytes.
 
uint_t mpiGetBitLength (const Mpi *a)
 Get the actual length in bits.
 
error_t mpiSetBitValue (Mpi *r, uint_t index, uint_t value)
 Set the bit value at the specified index.
 
uint_t mpiGetBitValue (const Mpi *a, uint_t index)
 Get the bit value at the specified index.
 
int_t mpiComp (const Mpi *a, const Mpi *b)
 Compare two multiple precision integers.
 
int_t mpiCompInt (const Mpi *a, mpi_sword_t b)
 Compare a multiple precision integer with an integer.
 
int_t mpiCompAbs (const Mpi *a, const Mpi *b)
 Compare the absolute value of two multiple precision integers.
 
error_t mpiCopy (Mpi *r, const Mpi *a)
 Copy a multiple precision integer.
 
error_t mpiSetValue (Mpi *r, mpi_sword_t a)
 Set the value of a multiple precision integer.
 
error_t mpiRand (Mpi *r, uint_t length, const PrngAlgo *prngAlgo, void *prngContext)
 Generate a random value.
 
error_t mpiRandRange (Mpi *r, const Mpi *p, const PrngAlgo *prngAlgo, void *prngContext)
 Generate a random value in the range 1 to p-1.
 
__weak_func error_t mpiCheckProbablePrime (const Mpi *a)
 Test whether a number is probable prime.
 
error_t mpiImport (Mpi *r, const uint8_t *input, size_t length, MpiFormat format)
 Octet string to integer conversion.
 
error_t mpiExport (const Mpi *a, uint8_t *output, size_t length, MpiFormat format)
 Integer to octet string conversion.
 
error_t mpiAdd (Mpi *r, const Mpi *a, const Mpi *b)
 Multiple precision addition.
 
error_t mpiAddInt (Mpi *r, const Mpi *a, mpi_sword_t b)
 Add an integer to a multiple precision integer.
 
error_t mpiSub (Mpi *r, const Mpi *a, const Mpi *b)
 Multiple precision subtraction.
 
error_t mpiSubInt (Mpi *r, const Mpi *a, mpi_sword_t b)
 Subtract an integer from a multiple precision integer.
 
error_t mpiAddAbs (Mpi *r, const Mpi *a, const Mpi *b)
 Helper routine for multiple precision addition.
 
error_t mpiSubAbs (Mpi *r, const Mpi *a, const Mpi *b)
 Helper routine for multiple precision subtraction.
 
error_t mpiShiftLeft (Mpi *r, uint_t n)
 Left shift operation.
 
error_t mpiShiftRight (Mpi *r, uint_t n)
 Right shift operation.
 
__weak_func error_t mpiMul (Mpi *r, const Mpi *a, const Mpi *b)
 Multiple precision multiplication.
 
error_t mpiMulInt (Mpi *r, const Mpi *a, mpi_sword_t b)
 Multiply a multiple precision integer by an integer.
 
error_t mpiDiv (Mpi *q, Mpi *r, const Mpi *a, const Mpi *b)
 Multiple precision division.
 
error_t mpiDivInt (Mpi *q, Mpi *r, const Mpi *a, mpi_sword_t b)
 Divide a multiple precision integer by an integer.
 
error_t mpiMod (Mpi *r, const Mpi *a, const Mpi *p)
 Modulo operation.
 
error_t mpiAddMod (Mpi *r, const Mpi *a, const Mpi *b, const Mpi *p)
 Modular addition.
 
error_t mpiSubMod (Mpi *r, const Mpi *a, const Mpi *b, const Mpi *p)
 Modular subtraction.
 
__weak_func error_t mpiMulMod (Mpi *r, const Mpi *a, const Mpi *b, const Mpi *p)
 Modular multiplication.
 
__weak_func error_t mpiInvMod (Mpi *r, const Mpi *a, const Mpi *p)
 Modular inverse.
 
__weak_func error_t mpiExpMod (Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
 Modular exponentiation.
 
__weak_func error_t mpiExpModFast (Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
 Modular exponentiation (fast calculation)
 
__weak_func error_t mpiExpModRegular (Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
 Modular exponentiation (regular calculation)
 
void mpiDump (FILE *stream, const char_t *prepend, const Mpi *a)
 Display the contents of a multiple precision integer.
 

Detailed Description

MPI (Multiple Precision Integer Arithmetic)

License

SPDX-License-Identifier: GPL-2.0-or-later

Copyright (C) 2021-2026 Oryx Embedded SARL. All rights reserved.

This file is part of CycloneCRYPTO Open.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Author
Oryx Embedded SARL (www.oryx-embedded.com)
Version
2.6.6

Function Documentation

◆ mpiAdd()

error_t mpiAdd ( Mpi *  r,
const Mpi *  a,
const Mpi *  b 
)

Multiple precision addition.

Parameters
[out]rResulting integer R = A + B
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiAddAbs()

error_t mpiAddAbs ( Mpi *  r,
const Mpi *  a,
const Mpi *  b 
)

Helper routine for multiple precision addition.

Parameters
[out]rResulting integer R = |A + B|
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiAddInt()

error_t mpiAddInt ( Mpi *  r,
const Mpi *  a,
mpi_sword_t  b 
)

Add an integer to a multiple precision integer.

Parameters
[out]rResulting integer R = A + B
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiAddMod()

error_t mpiAddMod ( Mpi *  r,
const Mpi *  a,
const Mpi *  b,
const Mpi *  p 
)

Modular addition.

Parameters
[out]rResulting integer R = A + B mod P
[in]aThe first operand A
[in]bThe second operand B
[in]pThe modulus P
Returns
Error code

◆ mpiCheckProbablePrime()

__weak_func error_t mpiCheckProbablePrime ( const Mpi *  a)

Test whether a number is probable prime.

Parameters
[in]aPointer to a multiple precision integer
Returns
Error code

◆ mpiComp()

int_t mpiComp ( const Mpi *  a,
const Mpi *  b 
)

Compare two multiple precision integers.

Parameters
[in]aThe first multiple precision integer to be compared
[in]bThe second multiple precision integer to be compared
Returns
Comparison result

◆ mpiCompAbs()

int_t mpiCompAbs ( const Mpi *  a,
const Mpi *  b 
)

Compare the absolute value of two multiple precision integers.

Parameters
[in]aThe first multiple precision integer to be compared
[in]bThe second multiple precision integer to be compared
Returns
Comparison result

◆ mpiCompInt()

int_t mpiCompInt ( const Mpi *  a,
mpi_sword_t  b 
)

Compare a multiple precision integer with an integer.

Parameters
[in]aMultiple precision integer to be compared
[in]bInteger to be compared
Returns
Comparison result

◆ mpiCopy()

error_t mpiCopy ( Mpi *  r,
const Mpi *  a 
)

Copy a multiple precision integer.

Parameters
[out]rPointer to a multiple precision integer (destination)
[in]aPointer to a multiple precision integer (source)
Returns
Error code

◆ mpiDiv()

error_t mpiDiv ( Mpi *  q,
Mpi *  r,
const Mpi *  a,
const Mpi *  b 
)

Multiple precision division.

Parameters
[out]qThe quotient Q = A / B
[out]rThe remainder R = A mod B
[in]aThe dividend A
[in]bThe divisor B
Returns
Error code

◆ mpiDivInt()

error_t mpiDivInt ( Mpi *  q,
Mpi *  r,
const Mpi *  a,
mpi_sword_t  b 
)

Divide a multiple precision integer by an integer.

Parameters
[out]qThe quotient Q = A / B
[out]rThe remainder R = A mod B
[in]aThe dividend A
[in]bThe divisor B
Returns
Error code

◆ mpiDump()

void mpiDump ( FILE *  stream,
const char_t *  prepend,
const Mpi *  a 
)

Display the contents of a multiple precision integer.

Parameters
[in]streamPointer to a FILE object that identifies an output stream
[in]prependString to prepend to the left of each line
[in]aPointer to a multiple precision integer

◆ mpiExpMod()

__weak_func error_t mpiExpMod ( Mpi *  r,
const Mpi *  a,
const Mpi *  e,
const Mpi *  p 
)

Modular exponentiation.

Parameters
[out]rResulting integer R = A ^ E mod P
[in]aPointer to a multiple precision integer
[in]eExponent
[in]pModulus
Returns
Error code

◆ mpiExpModFast()

__weak_func error_t mpiExpModFast ( Mpi *  r,
const Mpi *  a,
const Mpi *  e,
const Mpi *  p 
)

Modular exponentiation (fast calculation)

Parameters
[out]rResulting integer R = A ^ E mod P
[in]aPointer to a multiple precision integer
[in]eExponent
[in]pModulus
Returns
Error code

◆ mpiExpModRegular()

__weak_func error_t mpiExpModRegular ( Mpi *  r,
const Mpi *  a,
const Mpi *  e,
const Mpi *  p 
)

Modular exponentiation (regular calculation)

Parameters
[out]rResulting integer R = A ^ E mod P
[in]aPointer to a multiple precision integer
[in]eExponent
[in]pModulus
Returns
Error code

◆ mpiExport()

error_t mpiExport ( const Mpi *  a,
uint8_t *  output,
size_t  length,
MpiFormat  format 
)

Integer to octet string conversion.

Converts an integer to an octet string of a specified length

Parameters
[in]aNon-negative integer to be converted
[out]outputOctet string resulting from the conversion
[in]lengthIntended length of the resulting octet string
[in]formatOutput format
Returns
Error code

◆ mpiFree()

void mpiFree ( Mpi *  r)

Release a multiple precision integer.

Parameters
[in,out]rPointer to the multiple precision integer to be freed

◆ mpiGetBitLength()

uint_t mpiGetBitLength ( const Mpi *  a)

Get the actual length in bits.

Parameters
[in]aPointer to a multiple precision integer
Returns
The actual bit count

◆ mpiGetBitValue()

uint_t mpiGetBitValue ( const Mpi *  a,
uint_t  index 
)

Get the bit value at the specified index.

Parameters
[in]aPointer to a multiple precision integer
[in]indexPosition where to read the bit
Returns
The actual bit value

◆ mpiGetByteLength()

uint_t mpiGetByteLength ( const Mpi *  a)

Get the actual length in bytes.

Parameters
[in]aPointer to a multiple precision integer
Returns
The actual byte count

◆ mpiGetLength()

uint_t mpiGetLength ( const Mpi *  a)

Get the actual length in words.

Parameters
[in]aPointer to a multiple precision integer
Returns
The actual length in words

◆ mpiGrow()

error_t mpiGrow ( Mpi *  r,
uint_t  size 
)

Adjust the size of multiple precision integer.

Parameters
[in,out]rA multiple precision integer whose size is to be increased
[in]sizeDesired size in words
Returns
Error code

◆ mpiImport()

error_t mpiImport ( Mpi *  r,
const uint8_t *  input,
size_t  length,
MpiFormat  format 
)

Octet string to integer conversion.

Converts an octet string to a non-negative integer

Parameters
[out]rNon-negative integer resulting from the conversion
[in]inputOctet string to be converted
[in]lengthLength of the octet string
[in]formatInput format
Returns
Error code

◆ mpiInit()

void mpiInit ( Mpi *  r)

Initialize a multiple precision integer.

Parameters
[in,out]rPointer to the multiple precision integer to be initialized

◆ mpiInvMod()

__weak_func error_t mpiInvMod ( Mpi *  r,
const Mpi *  a,
const Mpi *  p 
)

Modular inverse.

Parameters
[out]rResulting integer R = A^-1 mod P
[in]aThe multiple precision integer A
[in]pThe modulus P
Returns
Error code

◆ mpiMod()

error_t mpiMod ( Mpi *  r,
const Mpi *  a,
const Mpi *  p 
)

Modulo operation.

Parameters
[out]rResulting integer R = A mod P
[in]aThe multiple precision integer to be reduced
[in]pThe modulus P
Returns
Error code

◆ mpiMul()

__weak_func error_t mpiMul ( Mpi *  r,
const Mpi *  a,
const Mpi *  b 
)

Multiple precision multiplication.

Parameters
[out]rResulting integer R = A * B
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiMulInt()

error_t mpiMulInt ( Mpi *  r,
const Mpi *  a,
mpi_sword_t  b 
)

Multiply a multiple precision integer by an integer.

Parameters
[out]rResulting integer R = A * B
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiMulMod()

__weak_func error_t mpiMulMod ( Mpi *  r,
const Mpi *  a,
const Mpi *  b,
const Mpi *  p 
)

Modular multiplication.

Parameters
[out]rResulting integer R = A * B mod P
[in]aThe first operand A
[in]bThe second operand B
[in]pThe modulus P
Returns
Error code

◆ mpiRand()

error_t mpiRand ( Mpi *  r,
uint_t  length,
const PrngAlgo *  prngAlgo,
void *  prngContext 
)

Generate a random value.

Parameters
[out]rPointer to a multiple precision integer
[in]lengthDesired length in bits
[in]prngAlgoPRNG algorithm
[in]prngContextPointer to the PRNG context
Returns
Error code

◆ mpiRandRange()

error_t mpiRandRange ( Mpi *  r,
const Mpi *  p,
const PrngAlgo *  prngAlgo,
void *  prngContext 
)

Generate a random value in the range 1 to p-1.

Parameters
[out]rPointer to a multiple precision integer
[in]pThe upper bound of the range
[in]prngAlgoPRNG algorithm
[in]prngContextPointer to the PRNG context
Returns
Error code

◆ mpiSetBitValue()

error_t mpiSetBitValue ( Mpi *  r,
uint_t  index,
uint_t  value 
)

Set the bit value at the specified index.

Parameters
[in]rPointer to a multiple precision integer
[in]indexPosition of the bit to be written
[in]valueBit value
Returns
Error code

◆ mpiSetValue()

error_t mpiSetValue ( Mpi *  r,
mpi_sword_t  a 
)

Set the value of a multiple precision integer.

Parameters
[out]rPointer to a multiple precision integer
[in]aValue to be assigned to the multiple precision integer
Returns
Error code

◆ mpiShiftLeft()

error_t mpiShiftLeft ( Mpi *  r,
uint_t  n 
)

Left shift operation.

Parameters
[in,out]rThe multiple precision integer to be shifted to the left
[in]nThe number of bits to shift
Returns
Error code

◆ mpiShiftRight()

error_t mpiShiftRight ( Mpi *  r,
uint_t  n 
)

Right shift operation.

Parameters
[in,out]rThe multiple precision integer to be shifted to the right
[in]nThe number of bits to shift
Returns
Error code

◆ mpiSub()

error_t mpiSub ( Mpi *  r,
const Mpi *  a,
const Mpi *  b 
)

Multiple precision subtraction.

Parameters
[out]rResulting integer R = A - B
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiSubAbs()

error_t mpiSubAbs ( Mpi *  r,
const Mpi *  a,
const Mpi *  b 
)

Helper routine for multiple precision subtraction.

Parameters
[out]rResulting integer R = |A - B|
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiSubInt()

error_t mpiSubInt ( Mpi *  r,
const Mpi *  a,
mpi_sword_t  b 
)

Subtract an integer from a multiple precision integer.

Parameters
[out]rResulting integer R = A - B
[in]aFirst operand A
[in]bSecond operand B
Returns
Error code

◆ mpiSubMod()

error_t mpiSubMod ( Mpi *  r,
const Mpi *  a,
const Mpi *  b,
const Mpi *  p 
)

Modular subtraction.

Parameters
[out]rResulting integer R = A - B mod P
[in]aThe first operand A
[in]bThe second operand B
[in]pThe modulus P
Returns
Error code