文件
PazeSSH/tests/dbg_modexp.c
T
JGZYES 3e8a5442fa 实现 TLS 1.3 PSK 会话恢复,构建输出移至 bin/ 并新增 standalone/psftp 命令
TLS 1.3 PSK 会话恢复: NewSessionTicket 签发/解析、ticket+binder 校验、selected_identity 回选、恢复握手免证书(pazessl -sess_in/-sess_out 端到端验证); 构建脚本输出 bin/ 并支持独立命令与 psftp; 修复 SFTP 二进制传输与 copy_id -P; 补充 tests/ 调试与 verify_tls
2026-08-13 19:30:07 +08:00

78 行
3.1 KiB
C

/* dbg_modexp.c —— 验证 modexp(费马小定理) 与 3G 输出点的曲线方程
* 1) 对若干 a: a^(p-1) ≡ 1 (mod p)
* 2) 程序算出的 3G(x,y) 是否满足 y^2 = x^3-3x+b */
#include "paze/p256.h"
#include "paze/bignum.h"
#include <stdio.h>
#include <string.h>
static int on_curve(const uint8_t xb[32], const uint8_t yb[32]) {
paze_bn_t p, b, x, y, lhs, rhs, x3, three, t;
paze_p256_load_p(&p);
paze_bn_from_bytes(&b, (const uint8_t *)"\x5a\xc6\x35\xd8\xaa\x3a\x93\xe7\xb3\xeb\xbd\x55\x76\x98\x86\xbc\x65\x1d\x06\xb0\xcc\x53\xb0\xf6\x3b\xce\x3c\x3e\x27\xd2\x60\x4b", 32);
paze_bn_from_bytes(&x, xb, 32);
paze_bn_from_bytes(&y, yb, 32);
paze_bn_modmul(&lhs, &y, &y, &p);
paze_bn_modmul(&x3, &x, &x, &p);
paze_bn_modmul(&rhs, &x3, &x, &p);
paze_bn_set_u32(&three, 3);
paze_bn_modmul(&t, &three, &x, &p);
paze_bn_modsub(&rhs, &rhs, &t, &p);
paze_bn_modadd(&rhs, &rhs, &b, &p);
return paze_bn_cmp(&lhs, &rhs) == 0;
}
int main(void) {
paze_bn_t p;
paze_p256_load_p(&p);
/* 费马小定理: a^(p-1) mod p == 1, 对若干小 a */
paze_bn_t pm1, e, a, r;
paze_bn_set_u32(&pm1, 1);
paze_bn_sub(&pm1, &p, &pm1);
int ok = 1;
uint32_t bases[] = {2, 3, 5, 7, 12345, 987654321u};
for (size_t i = 0; i < sizeof(bases)/sizeof(bases[0]); i++) {
paze_bn_set_u32(&a, bases[i]);
paze_bn_modexp(&r, &a, &pm1, &p);
if (!paze_bn_is_one(&r)) {
printf("fermat FAIL base=%u\n", bases[i]);
char h[300]; paze_bn_to_hex(&r, h, sizeof(h)); printf(" got %s\n", h);
ok = 0;
}
}
printf("fermat all ok: %d\n", ok);
/* 验证 modexp 求逆: 2^(p-2) * 2 mod p == 1 */
paze_bn_t pm2, inv2;
paze_bn_set_u32(&pm2, 2);
paze_bn_sub(&pm2, &p, &pm2);
paze_bn_set_u32(&a, 2);
paze_bn_modexp(&inv2, &a, &pm2, &p);
paze_bn_modmul(&r, &inv2, &a, &p);
printf("2 * 2^(p-2) == 1: %d\n", paze_bn_is_one(&r));
/* 程序 3G 输出是否在曲线上 */
static const uint8_t G3_X[32] = {
0x8c,0xd3,0x9e,0x9a,0xb8,0xd6,0xb7,0x99,0x2b,0x43,0x46,0xc3,0x6b,0x8e,0xf6,0x2e,
0x90,0x70,0x64,0xac,0x2c,0x13,0xa4,0xa6,0xef,0x42,0xc7,0xcd,0x5e,0xe7,0x82,0x77
};
static const uint8_t G3_Y[32] = {
0xfc,0x56,0xb2,0x48,0xa5,0x52,0xa1,0x16,0x9e,0xc4,0x0e,0xf0,0xf6,0xb1,0x6d,0xc3,
0xb4,0x97,0x61,0x7e,0xa8,0xcc,0x86,0x66,0x2f,0x2c,0x56,0xa5,0x9d,0xe2,0x8a,0x5a
};
printf("3G(got) on curve: %d\n", on_curve(G3_X, G3_Y));
/* 真实 3G 参考值(如果它在曲线上,说明 got 是错的) */
static const uint8_t R3_X[32] = {
0x5e,0xcb,0xe4,0xd1,0xa6,0x33,0x0a,0x44,0xc8,0xf7,0xef,0x95,0x1d,0x4b,0xf1,0x65,
0xe6,0xc6,0xb7,0x21,0xef,0xad,0xa9,0x85,0xfb,0x41,0x66,0x1b,0xc6,0xe7,0xfd,0x6c
};
static const uint8_t R3_Y[32] = {
0x87,0x34,0x64,0x0c,0x49,0x98,0xff,0x7e,0x37,0x4b,0x06,0xce,0x1a,0x64,0xa2,0xec,
0xd8,0x2a,0xb0,0x36,0x38,0x4f,0xb8,0x3d,0x9a,0x79,0xb1,0x27,0xa2,0x7d,0x50,0x32
};
printf("3G(reference) on curve: %d\n", on_curve(R3_X, R3_Y));
return 0;
}