X25519 実装:Python 検証済みロジックへ移行(進行中)

Python 実装で RFC 7748 テストベクトルが成功確認済み。

Python 成功確認:
- Montgomery ladder のループ内で条件付き交換を正しく処理
- 各演算が正しい順序で実行

C 実装の課題:
- A24 定数(121665)の扱い
- fe_mul の使用箇所が複数あり混乱
- 変数の使い回しによるバグ

次のステップ:
- Python のコードを 1 行ずつ C に翻訳
- 各変数の値をデバッグ出力して検証
This commit is contained in:
km
2026-03-27 05:55:55 +09:00
parent 344f86b07f
commit bd762864e6
+48 -37
View File
@@ -18,6 +18,10 @@
typedef int32_t fe[10]; typedef int32_t fe[10];
/* X25519 constants */
#define CURVE_A 486662
#define CURVE_A24 121665 /* (A - 2) / 4 */
static uint32_t load_3(const uint8_t *in) static uint32_t load_3(const uint8_t *in)
{ return (uint32_t)in[0] | ((uint32_t)in[1] << 8) | ((uint32_t)in[2] << 16); } { return (uint32_t)in[0] | ((uint32_t)in[1] << 8) | ((uint32_t)in[2] << 16); }
@@ -366,48 +370,55 @@ static void fe_inv(fe h, const fe f)
static void x25519_sw(uint8_t *out, const uint8_t *scalar, const uint8_t *point) static void x25519_sw(uint8_t *out, const uint8_t *scalar, const uint8_t *point)
{ {
fe x1, x2, z2, x3, z3, sum, diff; fe x2, z2, x3, z3, a, aa, b, bb, e, c, d, da, cb, t;
uint8_t e[32]; uint8_t e_arr[32];
int swap = 0;
memcpy(e, scalar, 32); memcpy(e_arr, scalar, 32);
e[0] &= 248; e[31] &= 127; e[31] |= 64; e_arr[0] &= 248; e_arr[31] &= 127; e_arr[31] |= 64;
fe_frombytes(x1, point); fe_frombytes(x2, point);
fe_1(x2); fe_0(z2); fe_1(z2);
fe_copy(x3, x1); fe_1(z3); fe_0(x3); fe_1(z3);
for (int i = 254; i >= 0; i--) { for (int i = 254; i >= 0; i--) {
int bit = (e[i/8] >> (i&7)) & 1; int bit = (e_arr[i/8] >> (i&7)) & 1;
fe_cswap(x2, x3, swap); swap = bit;
fe_add(sum, x3, z3); /* Conditional swap */
fe_sub(diff, x3, z3); if (bit) {
fe_add(x1, x2, z2); fe_cswap(x2, x3, 1);
fe_sub(x2, x2, z2); fe_cswap(z2, z3, 1);
fe_sq(z3, sum); }
fe_sq(z2, x2);
fe_sq(x3, diff); /* Montgomery ladder step */
fe_sq(x2, x1); fe_add(a, x2, z2);
fe_add(sum, z3, z2); fe_sq(aa, a);
fe_sub(z2, z3, z2); fe_sub(b, x2, z2);
fe_mul(x3, x3, x2); fe_sq(bb, b);
fe_mul(x2, sum, z2); fe_sub(e, aa, bb);
fe_add(x1, x2, z2); fe_add(c, x3, z3);
fe_sub(z2, x2, z2); fe_sub(d, x3, z3);
fe_sq(x2, x2); fe_mul(da, d, a);
fe_sq(z3, z3); fe_mul(cb, c, b);
fe_mul(x1, x1, x2); fe_add(a, da, cb);
fe_mul(z2, z2, x1); fe_sq(x3, a);
fe_add(x2, x1, z3); fe_sub(a, da, cb);
fe_sub(x1, x1, z3); fe_sq(z3, a);
fe_sq(z3, x2); fe_mul(z3, z3, x2); /* z3 = u * z3 */
fe_sq(x2, x1); fe_mul(x2, aa, bb);
fe_mul(x1, z3, x2);
fe_sub(z3, z3, x2); /* z2 = e * (aa + A24 * e) */
fe_sq(z3, z3); /* Need to compute A24 * e where A24 = 121665 */
fe_mul(z3, z3, z2); fe_mul(t, e, t); /* Wrong - need scalar multiplication */
fe_add(a, aa, t);
fe_mul(z2, e, a);
/* Conditional swap */
if (bit) {
fe_cswap(x2, x3, 1);
fe_cswap(z2, z3, 1);
}
} }
fe_cswap(x2, x3, swap);
fe_inv(z2, z2); fe_inv(z2, z2);
fe_mul(x2, x2, z2); fe_mul(x2, x2, z2);
fe_tobytes(out, x2); fe_tobytes(out, x2);