micro-ECC for mbed, ported from GCC version from Github,
Dependents: mbed_microECC Wallet_v1
uECC_vli.h@0:b6fdeddc0bc9, 2017-09-07 (annotated)
- Committer:
- allankliu
- Date:
- Thu Sep 07 12:10:11 2017 +0000
- Revision:
- 0:b6fdeddc0bc9
Init version, ported from GCC version of uECC of Github. Assembly optimization for thumb2 is disabled.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
allankliu | 0:b6fdeddc0bc9 | 1 | /* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */ |
allankliu | 0:b6fdeddc0bc9 | 2 | |
allankliu | 0:b6fdeddc0bc9 | 3 | #ifndef _UECC_VLI_H_ |
allankliu | 0:b6fdeddc0bc9 | 4 | #define _UECC_VLI_H_ |
allankliu | 0:b6fdeddc0bc9 | 5 | |
allankliu | 0:b6fdeddc0bc9 | 6 | #include "uECC.h" |
allankliu | 0:b6fdeddc0bc9 | 7 | #include "types.h" |
allankliu | 0:b6fdeddc0bc9 | 8 | |
allankliu | 0:b6fdeddc0bc9 | 9 | /* Functions for raw large-integer manipulation. These are only available |
allankliu | 0:b6fdeddc0bc9 | 10 | if uECC.c is compiled with uECC_ENABLE_VLI_API defined to 1. */ |
allankliu | 0:b6fdeddc0bc9 | 11 | #ifndef uECC_ENABLE_VLI_API |
allankliu | 0:b6fdeddc0bc9 | 12 | #define uECC_ENABLE_VLI_API 0 |
allankliu | 0:b6fdeddc0bc9 | 13 | #endif |
allankliu | 0:b6fdeddc0bc9 | 14 | |
allankliu | 0:b6fdeddc0bc9 | 15 | #ifdef __cplusplus |
allankliu | 0:b6fdeddc0bc9 | 16 | extern "C" |
allankliu | 0:b6fdeddc0bc9 | 17 | { |
allankliu | 0:b6fdeddc0bc9 | 18 | #endif |
allankliu | 0:b6fdeddc0bc9 | 19 | |
allankliu | 0:b6fdeddc0bc9 | 20 | #if uECC_ENABLE_VLI_API |
allankliu | 0:b6fdeddc0bc9 | 21 | |
allankliu | 0:b6fdeddc0bc9 | 22 | void uECC_vli_clear(uECC_word_t *vli, wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 23 | |
allankliu | 0:b6fdeddc0bc9 | 24 | /* Constant-time comparison to zero - secure way to compare long integers */ |
allankliu | 0:b6fdeddc0bc9 | 25 | /* Returns 1 if vli == 0, 0 otherwise. */ |
allankliu | 0:b6fdeddc0bc9 | 26 | uECC_word_t uECC_vli_isZero(const uECC_word_t *vli, wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 27 | |
allankliu | 0:b6fdeddc0bc9 | 28 | /* Returns nonzero if bit 'bit' of vli is set. */ |
allankliu | 0:b6fdeddc0bc9 | 29 | uECC_word_t uECC_vli_testBit(const uECC_word_t *vli, bitcount_t bit); |
allankliu | 0:b6fdeddc0bc9 | 30 | |
allankliu | 0:b6fdeddc0bc9 | 31 | /* Counts the number of bits required to represent vli. */ |
allankliu | 0:b6fdeddc0bc9 | 32 | bitcount_t uECC_vli_numBits(const uECC_word_t *vli, const wordcount_t max_words); |
allankliu | 0:b6fdeddc0bc9 | 33 | |
allankliu | 0:b6fdeddc0bc9 | 34 | /* Sets dest = src. */ |
allankliu | 0:b6fdeddc0bc9 | 35 | void uECC_vli_set(uECC_word_t *dest, const uECC_word_t *src, wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 36 | |
allankliu | 0:b6fdeddc0bc9 | 37 | /* Constant-time comparison function - secure way to compare long integers */ |
allankliu | 0:b6fdeddc0bc9 | 38 | /* Returns one if left == right, zero otherwise */ |
allankliu | 0:b6fdeddc0bc9 | 39 | uECC_word_t uECC_vli_equal(const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 40 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 41 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 42 | |
allankliu | 0:b6fdeddc0bc9 | 43 | /* Constant-time comparison function - secure way to compare long integers */ |
allankliu | 0:b6fdeddc0bc9 | 44 | /* Returns sign of left - right, in constant time. */ |
allankliu | 0:b6fdeddc0bc9 | 45 | cmpresult_t uECC_vli_cmp(const uECC_word_t *left, const uECC_word_t *right, wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 46 | |
allankliu | 0:b6fdeddc0bc9 | 47 | /* Computes vli = vli >> 1. */ |
allankliu | 0:b6fdeddc0bc9 | 48 | void uECC_vli_rshift1(uECC_word_t *vli, wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 49 | |
allankliu | 0:b6fdeddc0bc9 | 50 | /* Computes result = left + right, returning carry. Can modify in place. */ |
allankliu | 0:b6fdeddc0bc9 | 51 | uECC_word_t uECC_vli_add(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 52 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 53 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 54 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 55 | |
allankliu | 0:b6fdeddc0bc9 | 56 | /* Computes result = left - right, returning borrow. Can modify in place. */ |
allankliu | 0:b6fdeddc0bc9 | 57 | uECC_word_t uECC_vli_sub(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 58 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 59 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 60 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 61 | |
allankliu | 0:b6fdeddc0bc9 | 62 | /* Computes result = left * right. Result must be 2 * num_words long. */ |
allankliu | 0:b6fdeddc0bc9 | 63 | void uECC_vli_mult(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 64 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 65 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 66 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 67 | |
allankliu | 0:b6fdeddc0bc9 | 68 | /* Computes result = left^2. Result must be 2 * num_words long. */ |
allankliu | 0:b6fdeddc0bc9 | 69 | void uECC_vli_square(uECC_word_t *result, const uECC_word_t *left, wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 70 | |
allankliu | 0:b6fdeddc0bc9 | 71 | /* Computes result = (left + right) % mod. |
allankliu | 0:b6fdeddc0bc9 | 72 | Assumes that left < mod and right < mod, and that result does not overlap mod. */ |
allankliu | 0:b6fdeddc0bc9 | 73 | void uECC_vli_modAdd(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 74 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 75 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 76 | const uECC_word_t *mod, |
allankliu | 0:b6fdeddc0bc9 | 77 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 78 | |
allankliu | 0:b6fdeddc0bc9 | 79 | /* Computes result = (left - right) % mod. |
allankliu | 0:b6fdeddc0bc9 | 80 | Assumes that left < mod and right < mod, and that result does not overlap mod. */ |
allankliu | 0:b6fdeddc0bc9 | 81 | void uECC_vli_modSub(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 82 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 83 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 84 | const uECC_word_t *mod, |
allankliu | 0:b6fdeddc0bc9 | 85 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 86 | |
allankliu | 0:b6fdeddc0bc9 | 87 | /* Computes result = product % mod, where product is 2N words long. |
allankliu | 0:b6fdeddc0bc9 | 88 | Currently only designed to work for mod == curve->p or curve_n. */ |
allankliu | 0:b6fdeddc0bc9 | 89 | void uECC_vli_mmod(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 90 | uECC_word_t *product, |
allankliu | 0:b6fdeddc0bc9 | 91 | const uECC_word_t *mod, |
allankliu | 0:b6fdeddc0bc9 | 92 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 93 | |
allankliu | 0:b6fdeddc0bc9 | 94 | /* Calculates result = product (mod curve->p), where product is up to |
allankliu | 0:b6fdeddc0bc9 | 95 | 2 * curve->num_words long. */ |
allankliu | 0:b6fdeddc0bc9 | 96 | void uECC_vli_mmod_fast(uECC_word_t *result, uECC_word_t *product, uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 97 | |
allankliu | 0:b6fdeddc0bc9 | 98 | /* Computes result = (left * right) % mod. |
allankliu | 0:b6fdeddc0bc9 | 99 | Currently only designed to work for mod == curve->p or curve_n. */ |
allankliu | 0:b6fdeddc0bc9 | 100 | void uECC_vli_modMult(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 101 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 102 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 103 | const uECC_word_t *mod, |
allankliu | 0:b6fdeddc0bc9 | 104 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 105 | |
allankliu | 0:b6fdeddc0bc9 | 106 | /* Computes result = (left * right) % curve->p. */ |
allankliu | 0:b6fdeddc0bc9 | 107 | void uECC_vli_modMult_fast(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 108 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 109 | const uECC_word_t *right, |
allankliu | 0:b6fdeddc0bc9 | 110 | uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 111 | |
allankliu | 0:b6fdeddc0bc9 | 112 | /* Computes result = left^2 % mod. |
allankliu | 0:b6fdeddc0bc9 | 113 | Currently only designed to work for mod == curve->p or curve_n. */ |
allankliu | 0:b6fdeddc0bc9 | 114 | void uECC_vli_modSquare(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 115 | const uECC_word_t *left, |
allankliu | 0:b6fdeddc0bc9 | 116 | const uECC_word_t *mod, |
allankliu | 0:b6fdeddc0bc9 | 117 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 118 | |
allankliu | 0:b6fdeddc0bc9 | 119 | /* Computes result = left^2 % curve->p. */ |
allankliu | 0:b6fdeddc0bc9 | 120 | void uECC_vli_modSquare_fast(uECC_word_t *result, const uECC_word_t *left, uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 121 | |
allankliu | 0:b6fdeddc0bc9 | 122 | /* Computes result = (1 / input) % mod.*/ |
allankliu | 0:b6fdeddc0bc9 | 123 | void uECC_vli_modInv(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 124 | const uECC_word_t *input, |
allankliu | 0:b6fdeddc0bc9 | 125 | const uECC_word_t *mod, |
allankliu | 0:b6fdeddc0bc9 | 126 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 127 | |
allankliu | 0:b6fdeddc0bc9 | 128 | #if uECC_SUPPORT_COMPRESSED_POINT |
allankliu | 0:b6fdeddc0bc9 | 129 | /* Calculates a = sqrt(a) (mod curve->p) */ |
allankliu | 0:b6fdeddc0bc9 | 130 | void uECC_vli_mod_sqrt(uECC_word_t *a, uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 131 | #endif |
allankliu | 0:b6fdeddc0bc9 | 132 | |
allankliu | 0:b6fdeddc0bc9 | 133 | /* Converts an integer in uECC native format to big-endian bytes. */ |
allankliu | 0:b6fdeddc0bc9 | 134 | void uECC_vli_nativeToBytes(uint8_t *bytes, int num_bytes, const uECC_word_t *native); |
allankliu | 0:b6fdeddc0bc9 | 135 | /* Converts big-endian bytes to an integer in uECC native format. */ |
allankliu | 0:b6fdeddc0bc9 | 136 | void uECC_vli_bytesToNative(uECC_word_t *native, const uint8_t *bytes, int num_bytes); |
allankliu | 0:b6fdeddc0bc9 | 137 | |
allankliu | 0:b6fdeddc0bc9 | 138 | unsigned uECC_curve_num_words(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 139 | unsigned uECC_curve_num_bytes(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 140 | unsigned uECC_curve_num_bits(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 141 | unsigned uECC_curve_num_n_words(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 142 | unsigned uECC_curve_num_n_bytes(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 143 | unsigned uECC_curve_num_n_bits(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 144 | |
allankliu | 0:b6fdeddc0bc9 | 145 | const uECC_word_t *uECC_curve_p(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 146 | const uECC_word_t *uECC_curve_n(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 147 | const uECC_word_t *uECC_curve_G(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 148 | const uECC_word_t *uECC_curve_b(uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 149 | |
allankliu | 0:b6fdeddc0bc9 | 150 | int uECC_valid_point(const uECC_word_t *point, uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 151 | |
allankliu | 0:b6fdeddc0bc9 | 152 | /* Multiplies a point by a scalar. Points are represented by the X coordinate followed by |
allankliu | 0:b6fdeddc0bc9 | 153 | the Y coordinate in the same array, both coordinates are curve->num_words long. Note |
allankliu | 0:b6fdeddc0bc9 | 154 | that scalar must be curve->num_n_words long (NOT curve->num_words). */ |
allankliu | 0:b6fdeddc0bc9 | 155 | void uECC_point_mult(uECC_word_t *result, |
allankliu | 0:b6fdeddc0bc9 | 156 | const uECC_word_t *point, |
allankliu | 0:b6fdeddc0bc9 | 157 | const uECC_word_t *scalar, |
allankliu | 0:b6fdeddc0bc9 | 158 | uECC_Curve curve); |
allankliu | 0:b6fdeddc0bc9 | 159 | |
allankliu | 0:b6fdeddc0bc9 | 160 | /* Generates a random integer in the range 0 < random < top. |
allankliu | 0:b6fdeddc0bc9 | 161 | Both random and top have num_words words. */ |
allankliu | 0:b6fdeddc0bc9 | 162 | int uECC_generate_random_int(uECC_word_t *random, |
allankliu | 0:b6fdeddc0bc9 | 163 | const uECC_word_t *top, |
allankliu | 0:b6fdeddc0bc9 | 164 | wordcount_t num_words); |
allankliu | 0:b6fdeddc0bc9 | 165 | |
allankliu | 0:b6fdeddc0bc9 | 166 | #endif /* uECC_ENABLE_VLI_API */ |
allankliu | 0:b6fdeddc0bc9 | 167 | |
allankliu | 0:b6fdeddc0bc9 | 168 | #ifdef __cplusplus |
allankliu | 0:b6fdeddc0bc9 | 169 | } /* end of extern "C" */ |
allankliu | 0:b6fdeddc0bc9 | 170 | #endif |
allankliu | 0:b6fdeddc0bc9 | 171 | |
allankliu | 0:b6fdeddc0bc9 | 172 | #endif /* _UECC_VLI_H_ */ |