X25519 optimizations passing tests
Juniper Beatitudes [email protected]
Fri, 09 Jan 2026 16:37:45 -0600
5 files changed,
11 insertions(+),
21 deletions(-)
M
test.c
→
test.c
@@ -18,7 +18,10 @@ = { 0x95, 0xcb, 0xde, 0x94, 0x76, 0xe8, 0x90, 0x7d, 0x7a, 0xad, 0xe4,
0x5c, 0xb4, 0xb8, 0x73, 0xf8, 0x8b, 0x59, 0x5a, 0x68, 0x79, 0x9f, 0xa1, 0x52, 0xe6, 0xf8, 0xf7, 0x64, 0x7a, 0xac, 0x79, 0x57 }; uint8_t actual[sizeof (EXPECTED)]; - tct_x25519 (SCALAR, U, actual); + for (unsigned int i = 0; i < 10000; ++i) + { + tct_x25519 (SCALAR, U, actual); + } for (unsigned int i = 0; i < sizeof (actual); ++i) { printf ("%02x", actual[i]);
M
tinycrypt/portable/chacha20_poly1305.c
→
tinycrypt/portable/chacha20_poly1305.c
@@ -1,8 +1,6 @@
#include <stdbool.h> #include <stdint.h> -#include "tinycrypt/chacha20_poly1305.h" - typedef uint32_t dwpacked __attribute__ ((vector_size (16))); static dwpacked
M
tinycrypt/x86_64_aarch64/x25519.c
→
tinycrypt/x86_64_aarch64/x25519.c
@@ -42,10 +42,7 @@ {
for (unsigned int j = 0; j < 4; ++j) { intermediate[i + j] += (__uint128_t)a_int[i] * (__uint128_t)b_int[j]; - if (i + j < 7) - { - intermediate[i + j + 1] += intermediate[i + j] >> 64; - } + intermediate[i + j + 1] += intermediate[i + j] >> 64; intermediate[i + j] &= 0xffffffffffffffff; } }@@ -77,16 +74,10 @@ for (unsigned int j = i + 1; j < 4; ++j)
{ __uint128_t prod = (__uint128_t)a_int[i] * (__uint128_t)a_int[j]; intermediate[i + j] += prod; - if (i + j < 7) - { - intermediate[i + j + 1] += intermediate[i + j] >> 64; - } + intermediate[i + j + 1] += intermediate[i + j] >> 64; intermediate[i + j] &= 0xffffffffffffffff; intermediate[i + j] += prod; - if (i + j < 7) - { - intermediate[i + j + 1] += intermediate[i + j] >> 64; - } + intermediate[i + j + 1] += intermediate[i + j] >> 64; intermediate[i + j] &= 0xffffffffffffffff; } }@@ -436,16 +427,13 @@ k_int[i] = from_le64 (key + i * 8);
u_int[i] = from_le64 (u + i * 8); u_int[4 + i] = 0x0; } + u_int[3] &= 0x7fffffffffffffff; k_int[0] &= 0xfffffffffffffff8; k_int[3] &= 0x7fffffffffffffff; k_int[3] |= 0x4000000000000000; modp512_postadd (u_int, u_int); - uint64_t A24[4] = { 0x000000000001db41, 0x00, 0x00, 0x00 }; - uint64_t buf[16]; - uint64_t *x2 = buf; - uint64_t *z2 = buf + 4; - uint64_t *x3 = buf + 8; - uint64_t *z3 = buf + 12; + uint64_t A24[4] = { 0x1db41, 0, 0, 0 }; + uint64_t x2[4], z2[4], x3[4], z3[4]; unsigned int swap = 0; for (unsigned int i = 0; i < 4; ++i) {