Go to the documentation of this file.
34 #include "../internal.h"
40 #if defined(BORINGSSL_CURVE25519_64BIT)
41 #include "../../third_party/fiat/curve25519_64.h"
43 #include "../../third_party/fiat/curve25519_32.h"
44 #endif // BORINGSSL_CURVE25519_64BIT
69 #if defined(BORINGSSL_CURVE25519_64BIT)
72 #define FE_NUM_LIMBS 5
84 #define assert_fe(f) \
86 for (unsigned _assert_fe_i = 0; _assert_fe_i < 5; _assert_fe_i++) { \
87 assert(f[_assert_fe_i] <= UINT64_C(0x8cccccccccccc)); \
101 #define assert_fe_loose(f) \
103 for (unsigned _assert_fe_i = 0; _assert_fe_i < 5; _assert_fe_i++) { \
104 assert(f[_assert_fe_i] <= UINT64_C(0x1a666666666664)); \
111 #define FE_NUM_LIMBS 10
123 #define assert_fe(f) \
125 for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \
126 assert(f[_assert_fe_i] <= \
127 ((_assert_fe_i & 1) ? 0x2333333u : 0x4666666u)); \
141 #define assert_fe_loose(f) \
143 for (unsigned _assert_fe_i = 0; _assert_fe_i < 10; _assert_fe_i++) { \
144 assert(f[_assert_fe_i] <= \
145 ((_assert_fe_i & 1) ? 0x6999999u : 0xd333332u)); \
149 #endif // BORINGSSL_CURVE25519_64BIT
152 "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe");
156 assert((s[31] & 0x80) == 0);
316 "fe and fe_loose mismatch");
319 #if !defined(OPENSSL_SMALL)
323 #endif // !defined(OPENSSL_SMALL)
334 for (
i = 1;
i < 2; ++
i) {
342 for (
i = 1;
i < 5; ++
i) {
347 for (
i = 1;
i < 10; ++
i) {
352 for (
i = 1;
i < 20; ++
i) {
357 for (
i = 1;
i < 10; ++
i) {
362 for (
i = 1;
i < 50; ++
i) {
367 for (
i = 1;
i < 100; ++
i) {
372 for (
i = 1;
i < 50; ++
i) {
377 for (
i = 1;
i < 5; ++
i) {
397 static const uint8_t zero[32] = {0};
427 for (
i = 1;
i < 2; ++
i) {
435 for (
i = 1;
i < 5; ++
i) {
440 for (
i = 1;
i < 10; ++
i) {
445 for (
i = 1;
i < 20; ++
i) {
450 for (
i = 1;
i < 10; ++
i) {
455 for (
i = 1;
i < 50; ++
i) {
460 for (
i = 1;
i < 100; ++
i) {
465 for (
i = 1;
i < 50; ++
i) {
470 for (
i = 1;
i < 2; ++
i) {
674 fe trX, trY, trZ, trT;
692 fe trX, trY, trZ, trT;
731 for (
i = 0;
i < 15;
i++) {
751 for (
i = 63;
i < 64;
i--) {
753 signed char index = 0;
755 for (j = 0; j < 4; j++) {
756 const uint8_t bit = 1 & (
a[(8 * j) + (
i / 8)] >> (
i & 7));
763 for (j = 1; j < 16; j++) {
778 #if defined(OPENSSL_SMALL)
814 cmov(t, &minust, bnegative);
831 for (
i = 0;
i < 32; ++
i) {
832 e[2 *
i + 0] = (
a[
i] >> 0) & 15;
833 e[2 *
i + 1] = (
a[
i] >> 4) & 15;
839 for (
i = 0;
i < 63; ++
i) {
849 for (
i = 1;
i < 64;
i += 2) {
864 for (
i = 0;
i < 64;
i += 2) {
892 for (
i = 2;
i < 16;
i += 2) {
908 for (
i = 0;
i < 256;
i += 4) {
925 for (j = 0; j < 16; j++) {
939 for (
i = 0;
i < 256; ++
i) {
940 r[
i] = 1 & (
a[
i >> 3] >> (
i & 7));
943 for (
i = 0;
i < 256; ++
i) {
945 for (
b = 1;
b <= 6 &&
i +
b < 256; ++
b) {
947 if (
r[
i] + (
r[
i +
b] <<
b) <= 15) {
950 }
else if (
r[
i] - (
r[
i +
b] <<
b) >= -15) {
952 for (
k =
i +
b;
k < 256; ++
k) {
974 signed char aslide[256];
975 signed char bslide[256];
1012 for (
i = 255;
i >= 0; --
i) {
1013 if (aslide[
i] || bslide[
i]) {
1018 for (;
i >= 0; --
i) {
1021 if (aslide[
i] > 0) {
1024 }
else if (aslide[
i] < 0) {
1029 if (bslide[
i] > 0) {
1032 }
else if (bslide[
i] < 0) {
1100 s11 += s23 * 666643;
1101 s12 += s23 * 470296;
1102 s13 += s23 * 654183;
1103 s14 -= s23 * 997805;
1104 s15 += s23 * 136657;
1105 s16 -= s23 * 683901;
1108 s10 += s22 * 666643;
1109 s11 += s22 * 470296;
1110 s12 += s22 * 654183;
1111 s13 -= s22 * 997805;
1112 s14 += s22 * 136657;
1113 s15 -= s22 * 683901;
1117 s10 += s21 * 470296;
1118 s11 += s21 * 654183;
1119 s12 -= s21 * 997805;
1120 s13 += s21 * 136657;
1121 s14 -= s21 * 683901;
1126 s10 += s20 * 654183;
1127 s11 -= s20 * 997805;
1128 s12 += s20 * 136657;
1129 s13 -= s20 * 683901;
1135 s10 -= s19 * 997805;
1136 s11 += s19 * 136657;
1137 s12 -= s19 * 683901;
1144 s10 += s18 * 136657;
1145 s11 -= s18 * 683901;
1148 carry6 = (s6 + (1 << 20)) >> 21;
1151 carry8 = (
s8 + (1 << 20)) >> 21;
1154 carry10 = (s10 + (1 << 20)) >> 21;
1157 carry12 = (s12 + (1 << 20)) >> 21;
1160 carry14 = (s14 + (1 << 20)) >> 21;
1163 carry16 = (
s16 + (1 << 20)) >> 21;
1167 carry7 = (s7 + (1 << 20)) >> 21;
1170 carry9 = (s9 + (1 << 20)) >> 21;
1173 carry11 = (s11 + (1 << 20)) >> 21;
1176 carry13 = (s13 + (1 << 20)) >> 21;
1179 carry15 = (s15 + (1 << 20)) >> 21;
1188 s10 -= s17 * 683901;
1231 carry0 = (s0 + (1 << 20)) >> 21;
1234 carry2 = (s2 + (1 << 20)) >> 21;
1237 carry4 = (s4 + (1 << 20)) >> 21;
1240 carry6 = (s6 + (1 << 20)) >> 21;
1243 carry8 = (
s8 + (1 << 20)) >> 21;
1246 carry10 = (s10 + (1 << 20)) >> 21;
1250 carry1 = (s1 + (1 << 20)) >> 21;
1253 carry3 = (s3 + (1 << 20)) >> 21;
1256 carry5 = (s5 + (1 << 20)) >> 21;
1259 carry7 = (s7 + (1 << 20)) >> 21;
1262 carry9 = (s9 + (1 << 20)) >> 21;
1265 carry11 = (s11 + (1 << 20)) >> 21;
1307 carry10 = s10 >> 21;
1310 carry11 = s11 >> 21;
1352 carry10 = s10 >> 21;
1358 s[2] = (s0 >> 16) | (s1 << 5);
1361 s[5] = (s1 >> 19) | (s2 << 2);
1363 s[7] = (s2 >> 14) | (s3 << 7);
1366 s[10] = (s3 >> 17) | (s4 << 4);
1369 s[13] = (s4 >> 20) | (s5 << 1);
1371 s[15] = (s5 >> 15) | (s6 << 6);
1374 s[18] = (s6 >> 18) | (s7 << 3);
1379 s[23] = (
s8 >> 16) | (s9 << 5);
1382 s[26] = (s9 >> 19) | (s10 << 2);
1384 s[28] = (s10 >> 14) | (s11 << 7);
1485 s1 =
c1 + a0 *
b1 +
a1 * b0;
1487 s3 = c3 + a0 * b3 +
a1 *
b2 +
a2 *
b1 + a3 * b0;
1488 s4 = c4 + a0 * b4 +
a1 * b3 +
a2 *
b2 + a3 *
b1 + a4 * b0;
1489 s5 = c5 + a0 * b5 +
a1 * b4 +
a2 * b3 + a3 *
b2 + a4 *
b1 + a5 * b0;
1490 s6 = c6 + a0 * b6 +
a1 * b5 +
a2 * b4 + a3 * b3 + a4 *
b2 + a5 *
b1 + a6 * b0;
1491 s7 = c7 + a0 * b7 +
a1 * b6 +
a2 * b5 + a3 * b4 + a4 * b3 + a5 *
b2 +
1493 s8 = c8 + a0 * b8 +
a1 * b7 +
a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 +
1494 a6 *
b2 + a7 *
b1 + a8 * b0;
1495 s9 = c9 + a0 * b9 +
a1 * b8 +
a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 +
1496 a6 * b3 + a7 *
b2 + a8 *
b1 + a9 * b0;
1497 s10 = c10 + a0 * b10 +
a1 * b9 +
a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 +
1498 a6 * b4 + a7 * b3 + a8 *
b2 + a9 *
b1 + a10 * b0;
1499 s11 = c11 + a0 * b11 +
a1 * b10 +
a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 +
1500 a6 * b5 + a7 * b4 + a8 * b3 + a9 *
b2 + a10 *
b1 + a11 * b0;
1501 s12 =
a1 * b11 +
a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 +
1502 a8 * b4 + a9 * b3 + a10 *
b2 + a11 *
b1;
1503 s13 =
a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 +
1504 a9 * b4 + a10 * b3 + a11 *
b2;
1505 s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 +
1506 a10 * b4 + a11 * b3;
1507 s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 +
1509 s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5;
1510 s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6;
1511 s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7;
1512 s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8;
1513 s20 = a9 * b11 + a10 * b10 + a11 * b9;
1514 s21 = a10 * b11 + a11 * b10;
1518 carry0 = (s0 + (1 << 20)) >> 21;
1521 carry2 = (s2 + (1 << 20)) >> 21;
1524 carry4 = (s4 + (1 << 20)) >> 21;
1527 carry6 = (s6 + (1 << 20)) >> 21;
1530 carry8 = (
s8 + (1 << 20)) >> 21;
1533 carry10 = (s10 + (1 << 20)) >> 21;
1536 carry12 = (s12 + (1 << 20)) >> 21;
1539 carry14 = (s14 + (1 << 20)) >> 21;
1542 carry16 = (
s16 + (1 << 20)) >> 21;
1545 carry18 = (s18 + (1 << 20)) >> 21;
1548 carry20 = (s20 + (1 << 20)) >> 21;
1551 carry22 = (s22 + (1 << 20)) >> 21;
1555 carry1 = (s1 + (1 << 20)) >> 21;
1558 carry3 = (s3 + (1 << 20)) >> 21;
1561 carry5 = (s5 + (1 << 20)) >> 21;
1564 carry7 = (s7 + (1 << 20)) >> 21;
1567 carry9 = (s9 + (1 << 20)) >> 21;
1570 carry11 = (s11 + (1 << 20)) >> 21;
1573 carry13 = (s13 + (1 << 20)) >> 21;
1576 carry15 = (s15 + (1 << 20)) >> 21;
1579 carry17 = (s17 + (1 << 20)) >> 21;
1582 carry19 = (s19 + (1 << 20)) >> 21;
1585 carry21 = (s21 + (1 << 20)) >> 21;
1589 s11 += s23 * 666643;
1590 s12 += s23 * 470296;
1591 s13 += s23 * 654183;
1592 s14 -= s23 * 997805;
1593 s15 += s23 * 136657;
1594 s16 -= s23 * 683901;
1597 s10 += s22 * 666643;
1598 s11 += s22 * 470296;
1599 s12 += s22 * 654183;
1600 s13 -= s22 * 997805;
1601 s14 += s22 * 136657;
1602 s15 -= s22 * 683901;
1606 s10 += s21 * 470296;
1607 s11 += s21 * 654183;
1608 s12 -= s21 * 997805;
1609 s13 += s21 * 136657;
1610 s14 -= s21 * 683901;
1615 s10 += s20 * 654183;
1616 s11 -= s20 * 997805;
1617 s12 += s20 * 136657;
1618 s13 -= s20 * 683901;
1624 s10 -= s19 * 997805;
1625 s11 += s19 * 136657;
1626 s12 -= s19 * 683901;
1633 s10 += s18 * 136657;
1634 s11 -= s18 * 683901;
1637 carry6 = (s6 + (1 << 20)) >> 21;
1640 carry8 = (
s8 + (1 << 20)) >> 21;
1643 carry10 = (s10 + (1 << 20)) >> 21;
1646 carry12 = (s12 + (1 << 20)) >> 21;
1649 carry14 = (s14 + (1 << 20)) >> 21;
1652 carry16 = (
s16 + (1 << 20)) >> 21;
1656 carry7 = (s7 + (1 << 20)) >> 21;
1659 carry9 = (s9 + (1 << 20)) >> 21;
1662 carry11 = (s11 + (1 << 20)) >> 21;
1665 carry13 = (s13 + (1 << 20)) >> 21;
1668 carry15 = (s15 + (1 << 20)) >> 21;
1677 s10 -= s17 * 683901;
1720 carry0 = (s0 + (1 << 20)) >> 21;
1723 carry2 = (s2 + (1 << 20)) >> 21;
1726 carry4 = (s4 + (1 << 20)) >> 21;
1729 carry6 = (s6 + (1 << 20)) >> 21;
1732 carry8 = (
s8 + (1 << 20)) >> 21;
1735 carry10 = (s10 + (1 << 20)) >> 21;
1739 carry1 = (s1 + (1 << 20)) >> 21;
1742 carry3 = (s3 + (1 << 20)) >> 21;
1745 carry5 = (s5 + (1 << 20)) >> 21;
1748 carry7 = (s7 + (1 << 20)) >> 21;
1751 carry9 = (s9 + (1 << 20)) >> 21;
1754 carry11 = (s11 + (1 << 20)) >> 21;
1796 carry10 = s10 >> 21;
1799 carry11 = s11 >> 21;
1841 carry10 = s10 >> 21;
1847 s[2] = (s0 >> 16) | (s1 << 5);
1850 s[5] = (s1 >> 19) | (s2 << 2);
1852 s[7] = (s2 >> 14) | (s3 << 7);
1855 s[10] = (s3 >> 17) | (s4 << 4);
1858 s[13] = (s4 >> 20) | (s5 << 1);
1860 s[15] = (s5 >> 15) | (s6 << 6);
1863 s[18] = (s6 >> 18) | (s7 << 3);
1868 s[23] = (
s8 >> 16) | (s9 << 5);
1871 s[26] = (s9 >> 19) | (s10 << 2);
1873 s[28] = (s10 >> 14) | (s11 << 7);
1919 sc_muladd(out_sig + 32, hram, az, nonce);
1927 if ((signature[63] & 224) != 0 ||
1958 for (
size_t i = 3;;
i--) {
1961 }
else if (scopy.u64[
i] <
kOrder[
i]) {
1963 }
else if (
i == 0) {
2009 fe x1, x2, z2, x3, z3, tmp0, tmp1;
2010 fe_loose x2l, z2l, x3l, tmp0l, tmp1l;
2050 unsigned b = 1 & (e[
pos / 8] >> (
pos & 7));
2060 fe_sub(&tmp0l, &x3, &z3);
2061 fe_sub(&tmp1l, &x2, &z2);
2071 fe_sub(&tmp1l, &tmp1, &tmp0);
2075 fe_add(&tmp0l, &tmp0, &z3);
2090 #if defined(BORINGSSL_X25519_NEON)
2091 if (CRYPTO_is_NEON_capable()) {
2116 out_private_key[0] |= ~248;
2117 out_private_key[31] &= ~64;
2118 out_private_key[31] |= ~127;
2124 const uint8_t peer_public_value[32]) {
2125 static const uint8_t kZeros[32] = {0};
2133 #if defined(BORINGSSL_X25519_NEON)
2134 if (CRYPTO_is_NEON_capable()) {
2135 static const uint8_t kMongomeryBasePoint[32] = {9};
2136 x25519_NEON(out_public_value,
private_key, kMongomeryBasePoint);
2157 fe_mul_tlt(&zminusy_inv, &zplusy, &zminusy_inv);
static void fiat_25519_selectznz(uint32_t out1[10], fiat_25519_uint1 arg1, const uint32_t arg2[10], const uint32_t arg3[10])
static void fiat_25519_to_bytes(uint8_t out1[32], const uint32_t arg1[10])
static void fe_sub(fe_loose *h, const fe *f, const fe *g)
static void fiat_25519_carry_mul(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10])
void x25519_ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p)
static void ge_double_scalarmult_vartime(ge_p2 *r, const uint8_t *a, const ge_p3 *A, const uint8_t *b)
static void fe_mul_ttl(fe *h, const fe *f, const fe_loose *g)
static void fe_loose_1(fe_loose *h)
static void fe_cmov(fe_loose *f, const fe_loose *g, fe_limb_t b)
static void fe_loose_0(fe_loose *h)
static int fe_isnonzero(const fe_loose *f)
static void table_select(ge_precomp *t, int pos, signed char b)
static void fe_sq_tl(fe *h, const fe_loose *f)
static const uint8_t seed[20]
static uint8_t equal(signed char b, signed char c)
static void fe_carry(fe *h, const fe_loose *f)
static void fe_mul121666(fe *h, const fe_loose *f)
static int64_t int64_lshift21(int64_t a)
OPENSSL_EXPORT pem_password_cb void * u
static void sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c)
static void cmov(ge_precomp *t, const ge_precomp *u, uint8_t b)
static void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p)
static void fe_mul_tll(fe *h, const fe_loose *f, const fe_loose *g)
static void * OPENSSL_memset(void *dst, int c, size_t n)
static void fe_sq_tt(fe *h, const fe *f)
static void fiat_25519_carry_scmul_121666(uint32_t out1[10], const uint32_t arg1[10])
static void cmov_cached(ge_cached *t, ge_cached *u, uint8_t b)
static void fe_copy_ll(fe_loose *h, const fe_loose *f)
static const scalar kOrder
static void ge_p3_0(ge_p3 *h)
void x25519_sc_reduce(uint8_t s[64])
static void fe_mul_ltt(fe_loose *h, const fe *f, const fe *g)
int X25519(uint8_t out_shared_key[32], const uint8_t private_key[32], const uint8_t peer_public_value[32])
static uint64_t load_3(const uint8_t *in)
static void fe_tobytes(uint8_t s[32], const fe *f)
static void fe_frombytes(fe *h, const uint8_t s[32])
static void ge_p1p1_to_cached(ge_cached *r, const ge_p1p1 *p)
static void fe_add(fe_loose *h, const fe *f, const fe *g)
void x25519_ge_scalarmult_base(ge_p3 *h, const uint8_t a[32])
static const ge_precomp k25519Precomp[32][8]
void ED25519_keypair(uint8_t out_public_key[32], uint8_t out_private_key[64])
unsigned __int64 uint64_t
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
static void fiat_25519_opp(uint32_t out1[10], const uint32_t arg1[10])
void x25519_ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q)
static void fiat_25519_from_bytes(uint32_t out1[10], const uint8_t arg1[32])
void x25519_ge_p3_to_cached(ge_cached *r, const ge_p3 *p)
static uint8_t negative(signed char b)
int x25519_ge_frombytes_vartime(ge_p3 *h, const uint8_t s[32])
#define SHA512_DIGEST_LENGTH
static void fe_mul_llt(fe_loose *h, const fe_loose *f, const fe *g)
static void fe_mul_impl(fe_limb_t out[FE_NUM_LIMBS], const fe_limb_t in1[FE_NUM_LIMBS], const fe_limb_t in2[FE_NUM_LIMBS])
static void fe_frombytes_strict(fe *h, const uint8_t s[32])
static void fe_invert(fe *out, const fe *z)
void x25519_ge_scalarmult_small_precomp(ge_p3 *h, const uint8_t a[32], const uint8_t precomp_table[15 *2 *32])
static void fe_pow22523(fe *out, const fe *z)
static void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q)
OPENSSL_STATIC_ASSERT(sizeof(fe)==sizeof(fe_limb_t) *FE_NUM_LIMBS, "fe_limb_t[FE_NUM_LIMBS] is inconsistent with fe")
int ED25519_sign(uint8_t out_sig[64], const uint8_t *message, size_t message_len, const uint8_t private_key[64])
static void x25519_scalar_mult(uint8_t out[32], const uint8_t scalar[32], const uint8_t point[32])
static void ge_precomp_0(ge_precomp *h)
static void fiat_25519_carry(uint32_t out1[10], const uint32_t arg1[10])
static void ge_cached_0(ge_cached *h)
static void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q)
int ED25519_verify(const uint8_t *message, size_t message_len, const uint8_t signature[64], const uint8_t public_key[32])
static void fiat_25519_carry_square(uint32_t out1[10], const uint32_t arg1[10])
void X25519_public_from_private(uint8_t out_public_value[32], const uint8_t private_key[32])
static void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p)
static void x25519_scalar_mult_generic(uint8_t out[32], const uint8_t scalar[32], const uint8_t point[32])
void x25519_ge_tobytes(uint8_t s[32], const ge_p2 *h)
static int fe_isnegative(const fe *f)
static void fiat_25519_sub(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10])
static void fiat_25519_add(uint32_t out1[10], const uint32_t arg1[10], const uint32_t arg2[10])
#define assert_fe_loose(f)
static void * OPENSSL_memmove(void *dst, const void *src, size_t n)
void x25519_ge_scalarmult(ge_p2 *r, const uint8_t *scalar, const ge_p3 *A)
static void check(upb_inttable *t)
static void fe_sq2_tt(fe *h, const fe *f)
void X25519_keypair(uint8_t out_public_value[32], uint8_t out_private_key[32])
static void fe_copy_lt(fe_loose *h, const fe *f)
void x25519_ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q)
static void fe_loose_invert(fe *out, const fe_loose *z)
void x25519_ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p)
static void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p)
static void slide(signed char *r, const uint8_t *a)
static void fe_mul_tlt(fe *h, const fe_loose *f, const fe *g)
static void fe_mul_ttt(fe *h, const fe *f, const fe *g)
static void ge_p3_tobytes(uint8_t s[32], const ge_p3 *h)
static void fe_copy(fe *h, const fe *f)
void ED25519_keypair_from_seed(uint8_t out_public_key[32], uint8_t out_private_key[64], const uint8_t seed[32])
static uint64_t load_4(const uint8_t *in)
static void fe_neg(fe_loose *h, const fe *f)
static const ge_precomp Bi[8]
static void ge_p2_0(ge_p2 *h)
static void fe_cswap(fe *f, fe *g, fe_limb_t b)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:08