23 #ifndef CRYPTO_BIGNUMBERUTIL_h
24 #define CRYPTO_BIGNUMBERUTIL_h
31 #define BIGNUMBER_LIMB_8BIT 0
32 #define BIGNUMBER_LIMB_16BIT 1
33 #define BIGNUMBER_LIMB_32BIT 0
36 #if BIGNUMBER_LIMB_8BIT
37 typedef uint8_t limb_t;
38 typedef int8_t slimb_t;
39 typedef uint16_t dlimb_t;
40 #elif BIGNUMBER_LIMB_16BIT
41 typedef uint16_t limb_t;
42 typedef int16_t slimb_t;
43 typedef uint32_t dlimb_t;
44 #elif BIGNUMBER_LIMB_32BIT
45 typedef uint32_t limb_t;
46 typedef int32_t slimb_t;
47 typedef uint64_t dlimb_t;
49 #error "limb_t must be 8, 16, or 32 bits in size"
55 static void unpackLE(limb_t *limbs,
size_t count,
56 const uint8_t *bytes,
size_t len);
57 static void unpackBE(limb_t *limbs,
size_t count,
58 const uint8_t *bytes,
size_t len);
59 static void packLE(uint8_t *bytes,
size_t len,
60 const limb_t *limbs,
size_t count);
61 static void packBE(uint8_t *bytes,
size_t len,
62 const limb_t *limbs,
size_t count);
64 static limb_t
add(limb_t *result,
const limb_t *x,
65 const limb_t *y,
size_t size);
66 static limb_t
sub(limb_t *result,
const limb_t *x,
67 const limb_t *y,
size_t size);
68 static void mul(limb_t *result,
const limb_t *x,
size_t xcount,
69 const limb_t *y,
size_t ycount);
70 static void reduceQuick(limb_t *result,
const limb_t *x,
71 const limb_t *y,
size_t size);
73 static limb_t
add_P(limb_t *result,
const limb_t *x,
74 const limb_t *y,
size_t size);
75 static limb_t
sub_P(limb_t *result,
const limb_t *x,
76 const limb_t *y,
size_t size);
77 static void mul_P(limb_t *result,
const limb_t *x,
size_t xcount,
78 const limb_t *y,
size_t ycount);
80 const limb_t *y,
size_t size);
static void reduceQuick_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Reduces x modulo y using subtraction where y is in program memory.
static limb_t add(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers.
static limb_t sub_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Subtracts one big number from another where one is in program memory.
static void reduceQuick(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Reduces x modulo y using subtraction.
static limb_t sub(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Subtracts one big number from another.
Utilities to assist with implementing big number arithmetic.
static void mul_P(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)
Multiplies two big numbers where one is in program memory.
static void packBE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)
Packs the big-endian byte representation of a big number into a byte array.
static void unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the little-endian byte representation of a big number into a limb array.
static void mul(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)
Multiplies two big numbers.
static void unpackBE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the big-endian byte representation of a big number into a limb array.
static void packLE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)
Packs the little-endian byte representation of a big number into a byte array.
static limb_t add_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers where one of them is in program memory.