aboutsummaryrefslogtreecommitdiffhomepage
path: root/pyecsca/codegen/bn
diff options
context:
space:
mode:
authorJ08nY2023-10-08 20:57:24 +0200
committerJ08nY2023-10-08 20:57:24 +0200
commit1c2e383d8e8df323b4cebb302869fc15599961a0 (patch)
treedfdfbf9a12acd1662cba56b46b30d8337ae81918 /pyecsca/codegen/bn
parent71579306e7c63123426e5bda105e3ab850fbbb20 (diff)
downloadpyecsca-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.c48
-rw-r--r--pyecsca/codegen/bn/bn.h14
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