micro-ECC for mbed, ported from GCC version from Github,

Dependents:   mbed_microECC Wallet_v1

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?

UserRevisionLine numberNew 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_ */