Skip to content

Commit ff889f7

Browse files
committed
Field storage type
1 parent 7137be8 commit ff889f7

File tree

6 files changed

+134
-0
lines changed

6 files changed

+134
-0
lines changed

src/field.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,14 @@ static void secp256k1_fe_get_hex(char *r64, const secp256k1_fe_t *a);
110110
/** Convert a 64-character hexadecimal string to a field element. */
111111
static int secp256k1_fe_set_hex(secp256k1_fe_t *r, const char *a64);
112112

113+
/** Convert a field element to the storage type. */
114+
static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t*);
115+
116+
/** Convert a field element back from the storage type. */
117+
static void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t*);
118+
113119
/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */
114120
static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag);
121+
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag);
115122

116123
#endif

src/field_10x26.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,10 @@ typedef struct {
3737
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))}
3838
#endif
3939

40+
typedef struct {
41+
uint32_t n[8];
42+
} secp256k1_fe_storage_t;
43+
44+
#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}
45+
4046
#endif

src/field_10x26_impl.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,4 +1083,47 @@ static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int fl
10831083
#endif
10841084
}
10851085

1086+
static inline void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) {
1087+
uint32_t mask0 = flag + ~((uint32_t)0), mask1 = ~mask0;
1088+
r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);
1089+
r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);
1090+
r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
1091+
r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
1092+
r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);
1093+
r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1);
1094+
r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1);
1095+
r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1);
1096+
}
1097+
1098+
static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) {
1099+
#ifdef VERIFY
1100+
VERIFY_CHECK(a->normalized);
1101+
#endif
1102+
r->n[0] = a->n[0] | a->n[1] << 26;
1103+
r->n[1] = a->n[1] >> 6 | a->n[2] << 20;
1104+
r->n[2] = a->n[2] >> 12 | a->n[3] << 14;
1105+
r->n[3] = a->n[3] >> 18 | a->n[4] << 8;
1106+
r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28;
1107+
r->n[5] = a->n[6] >> 4 | a->n[7] << 22;
1108+
r->n[6] = a->n[7] >> 10 | a->n[8] << 16;
1109+
r->n[7] = a->n[8] >> 16 | a->n[9] << 10;
1110+
}
1111+
1112+
static inline void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) {
1113+
r->n[0] = a->n[0] & 0x3FFFFFFUL;
1114+
r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL);
1115+
r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL);
1116+
r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL);
1117+
r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL);
1118+
r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL;
1119+
r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL);
1120+
r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL);
1121+
r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL);
1122+
r->n[9] = a->n[7] >> 10;
1123+
#ifdef VERIFY
1124+
r->magnitude = 1;
1125+
r->normalized = 1;
1126+
#endif
1127+
}
1128+
10861129
#endif

src/field_5x52.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,15 @@ typedef struct {
3232
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))}
3333
#endif
3434

35+
typedef struct {
36+
uint64_t n[4];
37+
} secp256k1_fe_storage_t;
38+
39+
#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \
40+
(d0) | ((uint64_t)(d1)) << 32, \
41+
(d2) | ((uint64_t)(d3)) << 32, \
42+
(d4) | ((uint64_t)(d5)) << 32, \
43+
(d6) | ((uint64_t)(d7)) << 32 \
44+
}}
45+
3546
#endif

src/field_5x52_impl.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,4 +413,34 @@ static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int fl
413413
#endif
414414
}
415415

416+
static inline void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) {
417+
uint64_t mask0 = flag + ~((uint64_t)0), mask1 = ~mask0;
418+
r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);
419+
r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);
420+
r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
421+
r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
422+
}
423+
424+
static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) {
425+
#ifdef VERIFY
426+
VERIFY_CHECK(a->normalized);
427+
#endif
428+
r->n[0] = a->n[0] | a->n[1] << 52;
429+
r->n[1] = a->n[1] >> 12 | a->n[2] << 40;
430+
r->n[2] = a->n[2] >> 24 | a->n[3] << 28;
431+
r->n[3] = a->n[3] >> 36 | a->n[4] << 16;
432+
}
433+
434+
static inline void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) {
435+
r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL;
436+
r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL);
437+
r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL);
438+
r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL);
439+
r->n[4] = a->n[3] >> 16;
440+
#ifdef VERIFY
441+
r->magnitude = 1;
442+
r->normalized = 1;
443+
#endif
444+
}
445+
416446
#endif

src/tests.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,42 @@ int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) {
627627
return check_fe_equal(&x, &one);
628628
}
629629

630+
void run_field_convert(void) {
631+
static const unsigned char b32[32] = {
632+
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
633+
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
634+
0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
635+
0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40
636+
};
637+
static const char *c64 = "0001020304050607111213141516171822232425262728293334353637383940";
638+
static const secp256k1_fe_storage_t fes = SECP256K1_FE_STORAGE_CONST(
639+
0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
640+
0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
641+
);
642+
static const secp256k1_fe_t fe = SECP256K1_FE_CONST(
643+
0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,
644+
0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL
645+
);
646+
secp256k1_fe_t fe2;
647+
unsigned char b322[32];
648+
char c642[64];
649+
secp256k1_fe_storage_t fes2;
650+
/* Check conversions to fe. */
651+
CHECK(secp256k1_fe_set_b32(&fe2, b32));
652+
CHECK(secp256k1_fe_equal_var(&fe, &fe2));
653+
CHECK(secp256k1_fe_set_hex(&fe2, c64));
654+
CHECK(secp256k1_fe_equal_var(&fe, &fe2));
655+
secp256k1_fe_from_storage(&fe2, &fes);
656+
CHECK(secp256k1_fe_equal_var(&fe, &fe2));
657+
/* Check conversion from fe. */
658+
secp256k1_fe_get_b32(b322, &fe);
659+
CHECK(memcmp(b322, b32, 32) == 0);
660+
secp256k1_fe_get_hex(c642, &fe);
661+
CHECK(memcmp(c642, c64, 64) == 0);
662+
secp256k1_fe_to_storage(&fes2, &fe);
663+
CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0);
664+
}
665+
630666
void run_field_misc(void) {
631667
const unsigned char f32_5[32] = {
632668
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -1668,6 +1704,7 @@ int main(int argc, char **argv) {
16681704
run_field_inv_var();
16691705
run_field_inv_all_var();
16701706
run_field_misc();
1707+
run_field_convert();
16711708
run_sqr();
16721709
run_sqrt();
16731710

0 commit comments

Comments
 (0)