os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 9ad099d9ada7dc701a181d2fe3ef9ae1fd8367a7
parent 9acc9c83345f5029d4de384ae52960085a26e96c
Author: erai <erai@omiltem.net>
Date:   Sun, 19 May 2024 16:44:55 -0400

Add x25519

Diffstat:
Med25519.c | 507++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Med25519_test.c | 98++++++++++++++++++++++++++++---------------------------------------------------
Msha256.c | 3---
Ax25519_test.c | 35+++++++++++++++++++++++++++++++++++
4 files changed, 547 insertions(+), 96 deletions(-)

diff --git a/ed25519.c b/ed25519.c @@ -1,8 +1,10 @@ +// https://www.rfc-editor.org/rfc/rfc7748 // https://www.rfc-editor.org/rfc/rfc8032 // p = 2**255 - 19 // = 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed // = 57896044618658097711785492504343953926634992332820282019728792003956564819949 -// order = 2**252 + 0x14def9dea2f79cd65812631a5cf5d3ed +// order +// L = 2**252 + 0x14def9dea2f79cd65812631a5cf5d3ed // = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed // = 7237005577332262213973186563042994240857116359379907606001950938285454250989 // cofactor = 8 @@ -52,6 +54,14 @@ struct _ed25519_point { y: _ed25519_limb; } +struct _x25519_block { + _x0: int; + _x1: int; + _x2: int; + _x3: int; + _x4: int; +} + ed25519_reduce(r: *int) { var c: int; var k: int; @@ -94,14 +104,17 @@ ed25519_add(r: *int, a: *int, b: *int) { ed25519_sub(r: *int, a: *int, b: *int) { var c: int; - c = 1 + a[0] + (-19 & (-1 >> 32)) + (~b[0] & (-1 >> 32)); r[0] = c & (-1 >> 32); c = c >> 32; - c = c + a[1] + (-1 >> 32) + (~b[1] & (-1 >> 32)); r[1] = c & (-1 >> 32); c = c >> 32; - c = c + a[2] + (-1 >> 32) + (~b[2] & (-1 >> 32)); r[2] = c & (-1 >> 32); c = c >> 32; - c = c + a[3] + (-1 >> 32) + (~b[3] & (-1 >> 32)); r[3] = c & (-1 >> 32); c = c >> 32; - c = c + a[4] + (-1 >> 32) + (~b[4] & (-1 >> 32)); r[4] = c & (-1 >> 32); c = c >> 32; - c = c + a[5] + (-1 >> 32) + (~b[5] & (-1 >> 32)); r[5] = c & (-1 >> 32); c = c >> 32; - c = c + a[6] + (-1 >> 32) + (~b[6] & (-1 >> 32)); r[6] = c & (-1 >> 32); c = c >> 32; - c = c + a[7] + (-1 >> 33) + (~b[7] & (-1 >> 32)); r[7] = c & (-1 >> 33); + + c = 1 + a[0] + (-19 & (-1 >> 32)) + (b[0] ^ (-1 >> 32)); r[0] = c & (-1 >> 32); c = c >> 32; + c = c + a[1] + (-1 >> 32) + (b[1] ^ (-1 >> 32)); r[1] = c & (-1 >> 32); c = c >> 32; + c = c + a[2] + (-1 >> 32) + (b[2] ^ (-1 >> 32)); r[2] = c & (-1 >> 32); c = c >> 32; + c = c + a[3] + (-1 >> 32) + (b[3] ^ (-1 >> 32)); r[3] = c & (-1 >> 32); c = c >> 32; + c = c + a[4] + (-1 >> 32) + (b[4] ^ (-1 >> 32)); r[4] = c & (-1 >> 32); c = c >> 32; + c = c + a[5] + (-1 >> 32) + (b[5] ^ (-1 >> 32)); r[5] = c & (-1 >> 32); c = c >> 32; + c = c + a[6] + (-1 >> 32) + (b[6] ^ (-1 >> 32)); r[6] = c & (-1 >> 32); c = c >> 32; + c = c + a[7] + (-1 >> 33) + (b[7] ^ (-1 >> 32)); r[7] = c & (-1 >> 32); c = c >> 32; + + ed25519_reduce(r); } ed25519_mul(r: *int, a: *int, b: *int) { @@ -209,7 +222,8 @@ ed25519_inv(r: *int, a: *int) { } } -ed25519_select(r: *int, a: *int, b: *int, k: int) { +ed25519_selectl(r: *int, a: *int, b: *int, k: int) { + k = -(k & 1); r[0] = (a[0] & ~k) | (b[0] & k); r[1] = (a[1] & ~k) | (b[1] & k); r[2] = (a[2] & ~k) | (b[2] & k); @@ -218,14 +232,17 @@ ed25519_select(r: *int, a: *int, b: *int, k: int) { r[5] = (a[5] & ~k) | (b[5] & k); r[6] = (a[6] & ~k) | (b[6] & k); r[7] = (a[7] & ~k) | (b[7] & k); - r[8] = (a[8] & ~k) | (b[8] & k); - r[9] = (a[9] & ~k) | (b[9] & k); - r[10] = (a[10] & ~k) | (b[10] & k); - r[11] = (a[11] & ~k) | (b[11] & k); - r[12] = (a[12] & ~k) | (b[12] & k); - r[13] = (a[13] & ~k) | (b[13] & k); - r[14] = (a[14] & ~k) | (b[14] & k); - r[15] = (a[15] & ~k) | (b[15] & k); +} + +ed25519_zero(r: *int) { + r[0] = 0; + r[1] = 0; + r[2] = 0; + r[3] = 0; + r[4] = 0; + r[5] = 0; + r[6] = 0; + r[7] = 0; } ed25519_one(r: *int) { @@ -239,6 +256,28 @@ ed25519_one(r: *int) { r[7] = 0; } +ed25519_d(d: *int) { + d[7] = (0x5203 << 16) | 0x6cee; + d[6] = (0x2b6f << 16) | 0xfe73; + d[5] = (0x8cc7 << 16) | 0x4079; + d[4] = (0x7779 << 16) | 0xe898; + d[3] = (0x0070 << 16) | 0x0a4d; + d[2] = (0x4141 << 16) | 0xd8ab; + d[1] = (0x75eb << 16) | 0x4dca; + d[0] = (0x1359 << 16) | 0x78a3; +} + +ed25519_a(a: *int) { + a[7] = 0; + a[6] = 0; + a[5] = 0; + a[4] = 0; + a[3] = 0; + a[2] = 0; + a[1] = 0; + a[0] = 486662; +} + //// x1 * y2 + x2 * y1 y1 * y2 - a * x1 * x2 //// x3 = ---------------------------, y3 = --------------------------- //// 1 + d * x1 * x2 * y1 * y2 1 - d * x1 * x2 * y1 * y2 @@ -269,14 +308,7 @@ ed25519_pa(r: *int, a: *int, b: * int) { dxy2 = &_dxy2.x0; d = &_d.x0; - d[7] = (0x5203 << 16) | 0x6cee; - d[6] = (0x2b6f << 16) | 0xfe73; - d[5] = (0x8cc7 << 16) | 0x4079; - d[4] = (0x7779 << 16) | 0xe898; - d[3] = (0x0070 << 16) | 0x0a4d; - d[2] = (0x4141 << 16) | 0xd8ab; - d[1] = (0x75eb << 16) | 0x4dca; - d[0] = (0x1359 << 16) | 0x78a3; + ed25519_d(d); ed25519_mul(y1y2, &a[8], &b[8]); ed25519_mul(x1x2, a, b); @@ -311,8 +343,8 @@ ed25519_pk(r: *int, a: *int, k: *int) { var i: int; var j: int; - b = (&_b):*int; - c = (&_c):*int; + b = &_b.x.x0; + c = &_c.x.x0; b[0] = a[0] & (-1 >> 32); r[0] = 0; b[1] = a[1] & (-1 >> 32); r[1] = 0; @@ -342,7 +374,8 @@ ed25519_pk(r: *int, a: *int, k: *int) { } ed25519_pa(r, r, r); ed25519_pa(c, r, b); - ed25519_select(r, r, c, -((e >> 31) & 1)); + ed25519_selectl(r, r, c, -((e >> 31) & 1)); + ed25519_selectl(&r[8], &r[8], &c[8], -((e >> 31) & 1)); e = e << 1; j = j + 1; } @@ -354,3 +387,419 @@ ed25519_pk(r: *int, a: *int, k: *int) { i = i - 1; } } + +ed25519_base(p: *int) { + p[7] = (0x2169 << 16) | 0x36d3; + p[6] = (0xcd6e << 16) | 0x53fe; + p[5] = (0xc0a4 << 16) | 0xe231; + p[4] = (0xfdd6 << 16) | 0xdc5c; + p[3] = (0x692c << 16) | 0xc760; + p[2] = (0x9525 << 16) | 0xa7b2; + p[1] = (0xc956 << 16) | 0x2d60; + p[0] = (0x8f25 << 16) | 0xd51a; + p[15] = (0x6666 << 16) | 0x6666; + p[14] = (0x6666 << 16) | 0x6666; + p[13] = (0x6666 << 16) | 0x6666; + p[12] = (0x6666 << 16) | 0x6666; + p[11] = (0x6666 << 16) | 0x6666; + p[10] = (0x6666 << 16) | 0x6666; + p[9] = (0x6666 << 16) | 0x6666; + p[8] = (0x6666 << 16) | 0x6658; +} + +// 2**((p-1)//4) +ed25519_sqrtz(z: *int) { + z[7] = (0x2b83 << 16) | 0x2480; + z[6] = (0x4fc1 << 16) | 0xdf0b; + z[5] = (0x2b4d << 16) | 0x0099; + z[4] = (0x3dfb << 16) | 0xd7a7; + z[3] = (0x2f43 << 16) | 0x1806; + z[2] = (0xad2f << 16) | 0xe478; + z[1] = (0xc4ee << 16) | 0x1b27; + z[0] = (0x4a0e << 16) | 0xa0b0; +} + +// sqrt(x) = x**((p+3)/8) * [1 or 2**((p-1)/4)] +ed25519_sqrt(r: *int, x: *int): int { + var _a: _ed25519_limb; + var _z: _ed25519_limb; + var a: *int; + var z: *int; + var i: int; + + a = &_a.x0; + z = &_z.x0; + + ed25519_one(a); + + i = 0; + loop { + if i == 252 { + break; + } + + ed25519_mul(a, a, a); + + if i != 251 { + ed25519_mul(a, a, x); + } + + i = i + 1; + } + + ed25519_mul(z, a, a); + ed25519_sub(z, z, x); + i = ed25519_zerop(z); + + ed25519_sqrtz(z); + ed25519_mul(z, z, a); + + ed25519_selectl(a, z, a, i); + + ed25519_mul(z, a, a); + ed25519_sub(z, z, x); + + i = ed25519_zerop(z); + + r[0] = a[0]; + r[1] = a[1]; + r[2] = a[2]; + r[3] = a[3]; + r[4] = a[4]; + r[5] = a[5]; + r[6] = a[6]; + r[7] = a[7]; + + return i; +} + +// x**2 = (1 - y**2) / (d * y**2 - 1) mod p +ed25519_decode(p: *int, src: *byte) { +} + +ed25519_encode(dest: *byte, p: *int) { + dest[0] = p[8]:byte; + dest[1] = (p[8] >> 8):byte; + dest[2] = (p[8] >> 16):byte; + dest[3] = (p[8] >> 24):byte; + dest[4] = p[9]:byte; + dest[5] = (p[9] >> 8):byte; + dest[6] = (p[9] >> 16):byte; + dest[7] = (p[9] >> 24):byte; + dest[8] = p[10]:byte; + dest[9] = (p[10] >> 8):byte; + dest[10] = (p[10] >> 16):byte; + dest[11] = (p[10] >> 24):byte; + dest[12] = p[11]:byte; + dest[13] = (p[11] >> 8):byte; + dest[14] = (p[11] >> 16):byte; + dest[15] = (p[11] >> 24):byte; + dest[16] = p[12]:byte; + dest[17] = (p[12] >> 8):byte; + dest[18] = (p[12] >> 16):byte; + dest[19] = (p[12] >> 24):byte; + dest[20] = p[13]:byte; + dest[21] = (p[13] >> 8):byte; + dest[22] = (p[13] >> 16):byte; + dest[23] = (p[13] >> 24):byte; + dest[24] = p[14]:byte; + dest[25] = (p[14] >> 8):byte; + dest[26] = (p[14] >> 16):byte; + dest[27] = (p[14] >> 24):byte; + dest[28] = p[15]:byte; + dest[29] = (p[15] >> 8):byte; + dest[30] = (p[15] >> 16):byte; + dest[31] = (p[15] >> 24):byte | ((p[0] & 1) << 7):byte; +} + +ed25519_pub(p: *byte, k: *byte) { + // h || prefix = SHA-512(b) + // s = clamp(h) + // A = [s]B + // public key = A +} + +ed25519_sign(k: *byte) { + // h || prefix = SHA-512(b) + // s = clamp(h) + // A = [s]B + // r = SHA-512(prefix || M) + // R = [r]B + // k = SHA-512(R || A || M) + // S = r + k * s mod L + // signature = R || S +} + +ed25519_verify(p: *byte) { + // A = public key + // R || S = signature + // k' = SHA-512(R || A || M) + // [S]B = R + [k']A +} + +ed25519_bi(d: *int) { + d[7] = (0x0f26 << 16) | 0xedf4; + d[6] = (0x60a0 << 16) | 0x06bb; + d[5] = (0xd27b << 16) | 0x08dc; + d[4] = (0x03fc << 16) | 0x4f7e; + d[3] = (0xc5a1 << 16) | 0xd3d1; + d[2] = (0x4b7d << 16) | 0x1a82; + d[1] = (0xcc6e << 16) | 0x04aa; + d[0] = (0xff45 << 16) | 0x7e06; +} + +// u = (1 + y) / (1 - y) +// v = sqrt(-486664) * u / x +cv25519_of_ed25519(uv: *int, xy: *int) { + var _a: _ed25519_limb; + var _b: _ed25519_limb; + var _c: _ed25519_limb; + var _d: _ed25519_limb; + var a: *int; + var b: *int; + var c: *int; + var d: *int; + + a = &_a.x0; + b = &_b.x0; + c = &_c.x0; + d = &_d.x0; + + ed25519_one(a); + ed25519_add(a, a, &xy[8]); + ed25519_one(b); + ed25519_sub(b, b, &xy[8]); + ed25519_inv(b, b); + + ed25519_inv(d, xy); + + ed25519_mul(uv, a, b); + + ed25519_bi(c); + ed25519_mul(c, c, uv); + ed25519_mul(&uv[8], c, d); +} + +// x = sqrt(-486664) * u / v +// y = (u - 1) / (u + 1) +ed25519_of_cv25519(xy: *int, uv: *int) { + var _a: _ed25519_limb; + var _b: _ed25519_limb; + var _c: _ed25519_limb; + var _d: _ed25519_limb; + var a: *int; + var b: *int; + var c: *int; + var d: *int; + + a = &_a.x0; + b = &_b.x0; + c = &_c.x0; + d = &_d.x0; + + ed25519_bi(a); + ed25519_mul(a, a, uv); + ed25519_inv(b, &uv[8]); + + ed25519_one(c); + ed25519_sub(c, uv, c); + ed25519_one(d); + ed25519_add(d, uv, d); + ed25519_inv(d, d); + + ed25519_mul(xy, a, b); + ed25519_mul(&xy[8], c, d); +} + +// cv25519: v**2 = u**3 + a*u**2 + u mod p +x25519_decode(uv: *int, u: *byte): int { + var _v: _ed25519_limb; + var v: *int; + + v = &_v.x0; + + uv[0] = u[0]:int | (u[1]:int << 8) | (u[2]:int << 16) | (u[3]:int << 24); + uv[1] = u[4]:int | (u[5]:int << 8) | (u[6]:int << 16) | (u[7]:int << 24); + uv[2] = u[8]:int | (u[9]:int << 8) | (u[10]:int << 16) | (u[11]:int << 24); + uv[3] = u[12]:int | (u[13]:int << 8) | (u[14]:int << 16) | (u[15]:int << 24); + uv[4] = u[16]:int | (u[17]:int << 8) | (u[18]:int << 16) | (u[19]:int << 24); + uv[5] = u[20]:int | (u[21]:int << 8) | (u[22]:int << 16) | (u[23]:int << 24); + uv[6] = u[24]:int | (u[25]:int << 8) | (u[26]:int << 16) | (u[27]:int << 24); + uv[7] = (u[28]:int | (u[29]:int << 8) | (u[30]:int << 16) | (u[31]:int << 24)) & (-1 >> 33); + + ed25519_reduce(uv); + + ed25519_a(v); + ed25519_add(v, v, uv); + ed25519_mul(v, v, uv); + ed25519_mul(v, v, uv); + ed25519_add(v, v, uv); + + if !ed25519_sqrt(&uv[8], v) { + return 0; + } + + return !ed25519_zerop(&uv[8]); +} + +x25519_encode(u: *byte, uv: *int) { + u[0] = uv[0]:byte; + u[1] = (uv[0] >> 8):byte; + u[2] = (uv[0] >> 16):byte; + u[3] = (uv[0] >> 24):byte; + u[4] = uv[1]:byte; + u[5] = (uv[1] >> 8):byte; + u[6] = (uv[1] >> 16):byte; + u[7] = (uv[1] >> 24):byte; + u[8] = uv[2]:byte; + u[9] = (uv[2] >> 8):byte; + u[10] = (uv[2] >> 16):byte; + u[11] = (uv[2] >> 24):byte; + u[12] = uv[3]:byte; + u[13] = (uv[3] >> 8):byte; + u[14] = (uv[3] >> 16):byte; + u[15] = (uv[3] >> 24):byte; + u[16] = uv[4]:byte; + u[17] = (uv[4] >> 8):byte; + u[18] = (uv[4] >> 16):byte; + u[19] = (uv[4] >> 24):byte; + u[20] = uv[5]:byte; + u[21] = (uv[5] >> 8):byte; + u[22] = (uv[5] >> 16):byte; + u[23] = (uv[5] >> 24):byte; + u[24] = uv[6]:byte; + u[25] = (uv[6] >> 8):byte; + u[26] = (uv[6] >> 16):byte; + u[27] = (uv[6] >> 24):byte; + u[28] = uv[7]:byte; + u[29] = (uv[7] >> 8):byte; + u[30] = (uv[7] >> 16):byte; + u[31] = (uv[7] >> 24):byte; +} + +x25519_base(u: *byte) { + bzero(u, 32); + u[0] = 9:byte; +} + +x25519(uk: *byte, u: *byte, k: *byte): int { + var _uv: _ed25519_point; + var _xy: _ed25519_point; + var _kc: _ed25519_limb; + var uv: *int; + var xy: *int; + var kc: *int; + + uv = &_uv.x.x0; + xy = &_xy.x.x0; + kc = &_kc.x0; + + if !x25519_decode(uv, u) { + return 0; + } + + ed25519_of_cv25519(xy, uv); + ed25519_clamp(kc, k); + ed25519_pk(xy, xy, kc); + cv25519_of_ed25519(uv, xy); + x25519_encode(uk, uv); + return 1; +} + +ed25519_zerop(x: *int): int { + var a: int; + a = x[0] | x[1] | x[2] | x[3] | x[4] | x[5] | x[6] | x[7]; + a = (a >> 32) | a; + a = (a >> 16) | a; + a = (a >> 8) | a; + a = (a >> 4) | a; + a = (a >> 2) | a; + a = (a >> 1) | a; + return (a & 1) ^ 1; +} + +// cv25519: v**2 = u**3 + a*u**2 + u mod p +x25519_check(uv: *int): int { + var _a: _ed25519_limb; + var _b: _ed25519_limb; + var a: *int; + var b: *int; + + a = &_a.x0; + b = &_b.x0; + + ed25519_a(a); + ed25519_mul(b, uv, uv); + ed25519_mul(a, a, b); + ed25519_mul(b, b, uv); + ed25519_add(a, a, b); + ed25519_add(a, a, uv); + + ed25519_mul(b, &uv[8], &uv[8]); + ed25519_sub(a, a, b); + + return ed25519_zerop(a); +} + +// ed25519: -x**2 + y**2 = 1 + d*x**2*y**2 mod p +ed25519_check(xy: *int): int { + var _a: _ed25519_limb; + var _b: _ed25519_limb; + var _c: _ed25519_limb; + var a: *int; + var b: *int; + var c: *int; + + a = &_a.x0; + b = &_b.x0; + c = &_c.x0; + + ed25519_mul(b, xy, xy); + ed25519_mul(c, &xy[8], &xy[8]); + + ed25519_one(a); + ed25519_add(a, a, b); + ed25519_sub(a, a, c); + + ed25519_mul(b, b, c); + ed25519_d(c); + ed25519_mul(b, b, c); + + ed25519_add(a, a, b); + + return ed25519_zerop(a); +} + +ed25519_set_sign(xy: *int, sign: int) { + var _a: _ed25519_limb; + var a: *int; + + a = &_a.x0; + + ed25519_zero(a); + ed25519_sub(a, a, &xy[8]); + + ed25519_selectl(&xy[8], &xy[8], a, ((xy[15] >> 30) ^ sign) & 1); +} + +ed25519_clamp(k: *int, b: *byte) { + k[0] = (b[0]:int | (b[1]:int << 8) | (b[2]:int << 16) | (b[3]:int << 24)) & -8; + k[1] = b[4]:int | (b[5]:int << 8) | (b[6]:int << 16) | (b[7]:int << 24); + k[2] = b[8]:int | (b[9]:int << 8) | (b[10]:int << 16) | (b[11]:int << 24); + k[3] = b[12]:int | (b[13]:int << 8) | (b[14]:int << 16) | (b[15]:int << 24); + k[4] = b[16]:int | (b[17]:int << 8) | (b[18]:int << 16) | (b[19]:int << 24); + k[5] = b[20]:int | (b[21]:int << 8) | (b[22]:int << 16) | (b[23]:int << 24); + k[6] = b[24]:int | (b[25]:int << 8) | (b[26]:int << 16) | (b[27]:int << 24); + k[7] = ((b[28]:int | (b[29]:int << 8) | (b[30]:int << 16) | (b[31]:int << 24)) & (-1 >> 33)) | (1 << 30); +} + +ed25519_fdputl(fd: int, x: *int) { + fdputh32(fd, x[7]); + fdputh32(fd, x[6]); + fdputh32(fd, x[5]); + fdputh32(fd, x[4]); + fdputh32(fd, x[3]); + fdputh32(fd, x[2]); + fdputh32(fd, x[1]); + fdputh32(fd, x[0]); +} diff --git a/ed25519_test.c b/ed25519_test.c @@ -1,65 +1,35 @@ -main(c: int, v: **byte, e: **byte) { - var _r: _ed25519_point; - var _p: _ed25519_point; - var _k: _ed25519_point; - var r: *int; - var p: *int; - var k: *int; - - r = (&_r):*int; - p = (&_p):*int; - k = (&_k):*int; - - bzero(r: *byte, sizeof(_r)); - bzero(p: *byte, sizeof(_p)); - bzero(k: *byte, sizeof(_k)); - - p[7] = (0x2169 << 16) | 0x36d3; - p[6] = (0xcd6e << 16) | 0x53fe; - p[5] = (0xc0a4 << 16) | 0xe231; - p[4] = (0xfdd6 << 16) | 0xdc5c; - p[3] = (0x692c << 16) | 0xc760; - p[2] = (0x9525 << 16) | 0xa7b2; - p[1] = (0xc956 << 16) | 0x2d60; - p[0] = (0x8f25 << 16) | 0xd51a; - - p[15] = (0x6666 << 16) | 0x6666; - p[14] = (0x6666 << 16) | 0x6666; - p[13] = (0x6666 << 16) | 0x6666; - p[12] = (0x6666 << 16) | 0x6666; - p[11] = (0x6666 << 16) | 0x6666; - p[10] = (0x6666 << 16) | 0x6666; - p[9] = (0x6666 << 16) | 0x6666; - p[8] = (0x6666 << 16) | 0x6658; - - k[7] = (0x1000 << 16) | 0x0000; - k[6] = 0; - k[5] = 0; - k[4] = 0; - k[3] = (0x14de << 16) | 0xf9de; - k[2] = (0xa2f7 << 16) | 0x9cd6; - k[1] = (0x5812 << 16) | 0x631a; - k[0] = (0x5cf5 << 16) | 0xd3ed; - - ed25519_pk(r, p, k); - - fdputh32(1, r[7]); - fdputh32(1, r[6]); - fdputh32(1, r[5]); - fdputh32(1, r[4]); - fdputh32(1, r[3]); - fdputh32(1, r[2]); - fdputh32(1, r[1]); - fdputh32(1, r[0]); - fdputc(1, '\n'); - - fdputh32(1, r[15]); - fdputh32(1, r[14]); - fdputh32(1, r[13]); - fdputh32(1, r[12]); - fdputh32(1, r[11]); - fdputh32(1, r[10]); - fdputh32(1, r[9]); - fdputh32(1, r[8]); - fdputc(1, '\n'); +main(argc: int, argv: **byte, envp: **byte) { + var _a: _ed25519_point; + var a: *byte; + var _b: _ed25519_point; + var b: *byte; + var _c: _ed25519_point; + var c: *byte; + var ret: int; + + a = (&_a):*byte; + b = (&_b):*byte; + c = (&_c):*byte; + + assert(unhex(a, "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c") == 32, "unhex"); + assert(unhex(b, "a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + fdxxd(1, c, 32); + + x25519_base(a); + assert(unhex(b, "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + fdxxd(1, c, 32); + + x25519_base(a); + assert(unhex(b, "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + fdxxd(1, c, 32); + + x25519_base(a); + assert(unhex(b, "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + assert(unhex(b, "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a") == 32, "unhex"); + assert(x25519(c, c, b), "decode"); + fdxxd(1, c, 32); } diff --git a/sha256.c b/sha256.c @@ -36,9 +36,6 @@ struct _sha256_digest { d2: int; d3: int; d4: int; - d5: int; - d6: int; - d7: int; } sha256_init(r: *sha256_ctx) { diff --git a/x25519_test.c b/x25519_test.c @@ -0,0 +1,35 @@ +main(argc: int, argv: **byte, envp: **byte) { + var _a: _ed25519_point; + var a: *byte; + var _b: _ed25519_point; + var b: *byte; + var _c: _ed25519_point; + var c: *byte; + var ret: int; + + a = (&_a):*byte; + b = (&_b):*byte; + c = (&_c):*byte; + + assert(unhex(a, "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c") == 32, "unhex"); + assert(unhex(b, "a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + fdxxd(1, c, 32); + + x25519_base(a); + assert(unhex(b, "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + fdxxd(1, c, 32); + + x25519_base(a); + assert(unhex(b, "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + fdxxd(1, c, 32); + + x25519_base(a); + assert(unhex(b, "5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb") == 32, "unhex"); + assert(x25519(c, a, b), "decode"); + assert(unhex(b, "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a") == 32, "unhex"); + assert(x25519(c, c, b), "decode"); + fdxxd(1, c, 32); +}