23 #ifndef CRYPTO_BIGNUMBERUTIL_h
24 #define CRYPTO_BIGNUMBERUTIL_h
32 #define BIGNUMBER_LIMB_8BIT 0
33 #define BIGNUMBER_LIMB_16BIT 1
34 #define BIGNUMBER_LIMB_32BIT 0
37 #define BIGNUMBER_LIMB_8BIT 0
38 #define BIGNUMBER_LIMB_16BIT 0
39 #define BIGNUMBER_LIMB_32BIT 1
43 #if BIGNUMBER_LIMB_8BIT
44 typedef uint8_t limb_t;
45 typedef int8_t slimb_t;
46 typedef uint16_t dlimb_t;
47 #elif BIGNUMBER_LIMB_16BIT
48 typedef uint16_t limb_t;
49 typedef int16_t slimb_t;
50 typedef uint32_t dlimb_t;
51 #elif BIGNUMBER_LIMB_32BIT
52 typedef uint32_t limb_t;
53 typedef int32_t slimb_t;
54 typedef uint64_t dlimb_t;
56 #error "limb_t must be 8, 16, or 32 bits in size"
62 static void unpackLE(limb_t *limbs,
size_t count,
63 const uint8_t *bytes,
size_t len);
64 static void unpackBE(limb_t *limbs,
size_t count,
65 const uint8_t *bytes,
size_t len);
66 static void packLE(uint8_t *bytes,
size_t len,
67 const limb_t *limbs,
size_t count);
68 static void packBE(uint8_t *bytes,
size_t len,
69 const limb_t *limbs,
size_t count);
71 static limb_t
add(limb_t *result,
const limb_t *x,
72 const limb_t *y,
size_t size);
73 static limb_t
sub(limb_t *result,
const limb_t *x,
74 const limb_t *y,
size_t size);
75 static void mul(limb_t *result,
const limb_t *x,
size_t xcount,
76 const limb_t *y,
size_t ycount);
77 static void reduceQuick(limb_t *result,
const limb_t *x,
78 const limb_t *y,
size_t size);
80 static limb_t
add_P(limb_t *result,
const limb_t *x,
81 const limb_t *y,
size_t size);
82 static limb_t
sub_P(limb_t *result,
const limb_t *x,
83 const limb_t *y,
size_t size);
84 static void mul_P(limb_t *result,
const limb_t *x,
size_t xcount,
85 const limb_t *y,
size_t ycount);
87 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.