all repos — TinyCrypT @ af632790f00843c1e4a78f385fd8212246c13200

Short and sweet classical cryptographic primitives

X25519 optimizations passing tests
Juniper Beatitudes [email protected]
Fri, 09 Jan 2026 16:37:45 -0600
commit

af632790f00843c1e4a78f385fd8212246c13200

parent

0443981d2543b79cead85cfaf98c05992a4a097f

M flake.nixflake.nix

@@ -63,6 +63,7 @@ packages = with pkgs-persephone; [

ninja meson esp-idf-xtensa + qemu-esp32 clang-tools valgrind bear
M test.ctest.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.ctinycrypt/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.ctinycrypt/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) {