diff options
| author | J08nY | 2023-10-08 20:57:24 +0200 |
|---|---|---|
| committer | J08nY | 2023-10-08 20:57:24 +0200 |
| commit | 1c2e383d8e8df323b4cebb302869fc15599961a0 (patch) | |
| tree | dfdfbf9a12acd1662cba56b46b30d8337ae81918 /pyecsca/codegen/bn | |
| parent | 71579306e7c63123426e5bda105e3ab850fbbb20 (diff) | |
| download | pyecsca-codegen-1c2e383d8e8df323b4cebb302869fc15599961a0.tar.gz pyecsca-codegen-1c2e383d8e8df323b4cebb302869fc15599961a0.tar.zst pyecsca-codegen-1c2e383d8e8df323b4cebb302869fc15599961a0.zip | |
Add fixed-base multipliers with precomputation.
Diffstat (limited to 'pyecsca/codegen/bn')
| -rw-r--r-- | pyecsca/codegen/bn/bn.c | 48 | ||||
| -rw-r--r-- | pyecsca/codegen/bn/bn.h | 14 |
2 files changed, 54 insertions, 8 deletions
diff --git a/pyecsca/codegen/bn/bn.c b/pyecsca/codegen/bn/bn.c index c3f6d63..148403c 100644 --- a/pyecsca/codegen/bn/bn.c +++ b/pyecsca/codegen/bn/bn.c @@ -594,8 +594,8 @@ exit_k: return result; } -base_t *bn_convert_base(const bn_t *bn, int m) { - base_t *result = NULL; +small_base_t *bn_convert_base_small(const bn_t *bn, int m) { + small_base_t *result = NULL; bn_t k; if (mp_init(&k) != BN_OKAY) { @@ -608,9 +608,9 @@ base_t *bn_convert_base(const bn_t *bn, int m) { goto exit_len; } - result = malloc(sizeof(base_t)); + result = malloc(sizeof(small_base_t)); result->length = len + 1; - result->data = calloc(result->length, sizeof(uint8_t)); + result->data = calloc(result->length, sizeof(int)); result->m = m; int i = 0; @@ -621,7 +621,45 @@ base_t *bn_convert_base(const bn_t *bn, int m) { free(result); goto exit_len; } - result->data[i++] = (uint8_t) val; + result->data[i++] = val; + } + +exit_len: + bn_clear(&k); +exit_k: + return result; +} + +large_base_t *bn_convert_base_large(const bn_t *bn, const bn_t *m) { + large_base_t *result = NULL; + + bn_t k; + if (mp_init(&k) != BN_OKAY) { + goto exit_k; + } + bn_copy(bn, &k); + + int len = 0; + if (mp_log(&k, m, &len) != BN_OKAY) { + goto exit_len; + } + + result = malloc(sizeof(large_base_t)); + result->length = len + 1; + result->data = calloc(result->length, sizeof(bn_t)); + bn_init(&result->m); + bn_copy(m, &result->m); + + int i = 0; + while (!bn_is_0(&k) && !(bn_get_sign(&k) == BN_NEG)) { + bn_init(&result->data[i]); + if (mp_div(&k, m, &k, &result->data[i]) != BN_OKAY) { + free(result->data); + bn_clear(&result->m); + free(result); + goto exit_len; + } + i++; } exit_len: diff --git a/pyecsca/codegen/bn/bn.h b/pyecsca/codegen/bn/bn.h index d5d1e0c..7c25c22 100644 --- a/pyecsca/codegen/bn/bn.h +++ b/pyecsca/codegen/bn/bn.h @@ -65,10 +65,16 @@ typedef struct { } wsliding_t; typedef struct { - uint8_t *data; + int *data; size_t length; int m; -} base_t; +} small_base_t; + +typedef struct { + bn_t *data; + size_t length; + bn_t m; +} large_base_t; void math_init(void); @@ -126,12 +132,14 @@ bn_sign bn_get_sign(const bn_t *one); int bn_get_bit(const bn_t *bn, int which); int bn_bit_length(const bn_t *bn); + wnaf_t *bn_wnaf(const bn_t *bn, int w); wnaf_t *bn_bnaf(const bn_t *bn); wsliding_t *bn_wsliding_ltr(const bn_t *bn, int w); wsliding_t *bn_wsliding_rtl(const bn_t *bn, int w); -base_t *bn_convert_base(const bn_t *bn, int m); +small_base_t *bn_convert_base_small(const bn_t *bn, int m); +large_base_t *bn_convert_base_large(const bn_t *bn, const bn_t *m); #endif //BN_H_
\ No newline at end of file |
