Merge bitcoin-core/secp256k1#1350: scalar: introduce and use secp256k1_{read,write}_be64
helpers
7067ee54b4206c26b382980f3c20b5fa0262a23a tests: add tests for `secp256k1_{read,write}_be64` (Sebastian Falbesoner) 740528caad8c37e335cba2bcd02790d94c22e767 scalar: use newly introduced `secp256k1_{read,write}_be64` helpers (4x64 impl.) (Sebastian Falbesoner) Pull request description: This is a simple follow-up to #1339, as suggested in comment https://github.com/bitcoin-core/secp256k1/pull/1339#issuecomment-1587508040. ACKs for top commit: stratospher: ACK 7067ee5. real-or-random: utACK 7067ee54b4206c26b382980f3c20b5fa0262a23a Tree-SHA512: f9bc2ab610099948ffac1e6bb3c822bd90b81a7110ab74cec03175e2c92ed27694a15f9cdaa7c4f1b460fe459f61c3d1d102c99592169f127fdd7539a1a0c154
This commit is contained in:
commit
45c5ca7675
@ -133,10 +133,10 @@ static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int
|
|||||||
|
|
||||||
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
|
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
|
||||||
int over;
|
int over;
|
||||||
r->d[0] = ((uint64_t)secp256k1_read_be32(&b32[24]) << 32) | (uint64_t)secp256k1_read_be32(&b32[28]);
|
r->d[0] = secp256k1_read_be64(&b32[24]);
|
||||||
r->d[1] = ((uint64_t)secp256k1_read_be32(&b32[16]) << 32) | (uint64_t)secp256k1_read_be32(&b32[20]);
|
r->d[1] = secp256k1_read_be64(&b32[16]);
|
||||||
r->d[2] = ((uint64_t)secp256k1_read_be32(&b32[8]) << 32) | (uint64_t)secp256k1_read_be32(&b32[12]);
|
r->d[2] = secp256k1_read_be64(&b32[8]);
|
||||||
r->d[3] = ((uint64_t)secp256k1_read_be32(&b32[0]) << 32) | (uint64_t)secp256k1_read_be32(&b32[4]);
|
r->d[3] = secp256k1_read_be64(&b32[0]);
|
||||||
over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r));
|
over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r));
|
||||||
if (overflow) {
|
if (overflow) {
|
||||||
*overflow = over;
|
*overflow = over;
|
||||||
@ -144,10 +144,10 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
|
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
|
||||||
secp256k1_write_be32(&bin[0], a->d[3] >> 32); secp256k1_write_be32(&bin[4], a->d[3]);
|
secp256k1_write_be64(&bin[0], a->d[3]);
|
||||||
secp256k1_write_be32(&bin[8], a->d[2] >> 32); secp256k1_write_be32(&bin[12], a->d[2]);
|
secp256k1_write_be64(&bin[8], a->d[2]);
|
||||||
secp256k1_write_be32(&bin[16], a->d[1] >> 32); secp256k1_write_be32(&bin[20], a->d[1]);
|
secp256k1_write_be64(&bin[16], a->d[1]);
|
||||||
secp256k1_write_be32(&bin[24], a->d[0] >> 32); secp256k1_write_be32(&bin[28], a->d[0]);
|
secp256k1_write_be64(&bin[24], a->d[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
|
SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
|
||||||
|
31
src/tests.c
31
src/tests.c
@ -7516,16 +7516,31 @@ static void run_secp256k1_memczero_test(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void run_secp256k1_byteorder_tests(void) {
|
static void run_secp256k1_byteorder_tests(void) {
|
||||||
const uint32_t x = 0xFF03AB45;
|
{
|
||||||
const unsigned char x_be[4] = {0xFF, 0x03, 0xAB, 0x45};
|
const uint32_t x = 0xFF03AB45;
|
||||||
unsigned char buf[4];
|
const unsigned char x_be[4] = {0xFF, 0x03, 0xAB, 0x45};
|
||||||
uint32_t x_;
|
unsigned char buf[4];
|
||||||
|
uint32_t x_;
|
||||||
|
|
||||||
secp256k1_write_be32(buf, x);
|
secp256k1_write_be32(buf, x);
|
||||||
CHECK(secp256k1_memcmp_var(buf, x_be, sizeof(buf)) == 0);
|
CHECK(secp256k1_memcmp_var(buf, x_be, sizeof(buf)) == 0);
|
||||||
|
|
||||||
x_ = secp256k1_read_be32(buf);
|
x_ = secp256k1_read_be32(buf);
|
||||||
CHECK(x == x_);
|
CHECK(x == x_);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const uint64_t x = 0xCAFE0123BEEF4567;
|
||||||
|
const unsigned char x_be[8] = {0xCA, 0xFE, 0x01, 0x23, 0xBE, 0xEF, 0x45, 0x67};
|
||||||
|
unsigned char buf[8];
|
||||||
|
uint64_t x_;
|
||||||
|
|
||||||
|
secp256k1_write_be64(buf, x);
|
||||||
|
CHECK(secp256k1_memcmp_var(buf, x_be, sizeof(buf)) == 0);
|
||||||
|
|
||||||
|
x_ = secp256k1_read_be64(buf);
|
||||||
|
CHECK(x == x_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void int_cmov_test(void) {
|
static void int_cmov_test(void) {
|
||||||
|
24
src/util.h
24
src/util.h
@ -353,4 +353,28 @@ SECP256K1_INLINE static void secp256k1_write_be32(unsigned char* p, uint32_t x)
|
|||||||
p[0] = x >> 24;
|
p[0] = x >> 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read a uint64_t in big endian */
|
||||||
|
SECP256K1_INLINE static uint64_t secp256k1_read_be64(const unsigned char* p) {
|
||||||
|
return (uint64_t)p[0] << 56 |
|
||||||
|
(uint64_t)p[1] << 48 |
|
||||||
|
(uint64_t)p[2] << 40 |
|
||||||
|
(uint64_t)p[3] << 32 |
|
||||||
|
(uint64_t)p[4] << 24 |
|
||||||
|
(uint64_t)p[5] << 16 |
|
||||||
|
(uint64_t)p[6] << 8 |
|
||||||
|
(uint64_t)p[7];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write a uint64_t in big endian */
|
||||||
|
SECP256K1_INLINE static void secp256k1_write_be64(unsigned char* p, uint64_t x) {
|
||||||
|
p[7] = x;
|
||||||
|
p[6] = x >> 8;
|
||||||
|
p[5] = x >> 16;
|
||||||
|
p[4] = x >> 24;
|
||||||
|
p[3] = x >> 32;
|
||||||
|
p[2] = x >> 40;
|
||||||
|
p[1] = x >> 48;
|
||||||
|
p[0] = x >> 56;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* SECP256K1_UTIL_H */
|
#endif /* SECP256K1_UTIL_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user