文件
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

87 行
2.6 KiB
C

/* dbg_mod.c —— 模运算一致性验证
* 性质: (a-b mod p) + b ≡ a (mod p); (a*b mod p) 交换律/结合律
* 用确定性伪随机输入 (xorshift) */
#include "paze/p256.h"
#include "paze/bignum.h"
#include <stdio.h>
#include <string.h>
static uint32_t xr = 0x12345678u;
static uint32_t rnd(void) {
xr ^= xr << 13; xr ^= xr >> 17; xr ^= xr << 5;
return xr;
}
int main(void) {
paze_bn_t p;
paze_p256_load_p(&p);
int fails = 0;
/* 构造随机数 a,b < p */
for (int iter = 0; iter < 200; iter++) {
paze_bn_t a, b, r, t, chk;
uint8_t ab[32], bb[32];
for (int i = 0; i < 32; i++) {
ab[i] = (uint8_t)rnd();
bb[i] = (uint8_t)rnd();
}
/* 截断确保 < p: 高 2 字节限制 */
ab[0] = (uint8_t)(ab[0] & 0x7F);
bb[0] = (uint8_t)(bb[0] & 0x7F);
paze_bn_from_bytes(&a, ab, 32);
paze_bn_from_bytes(&b, bb, 32);
/* modsub: r = a-b; 验证 r + b == a (mod p) */
paze_bn_modsub(&r, &a, &b, &p);
paze_bn_modadd(&chk, &r, &b, &p);
if (paze_bn_cmp(&chk, &a) != 0) {
printf("modsub fail iter=%d\n", iter);
fails++;
break;
}
/* modmul: a*b == b*a */
paze_bn_modmul(&r, &a, &b, &p);
paze_bn_modmul(&t, &b, &a, &p);
if (paze_bn_cmp(&r, &t) != 0) {
printf("modmul commut fail iter=%d\n", iter);
fails++;
break;
}
/* modmul 结合律: (a*b)*c == a*(b*c) */
paze_bn_t c;
uint8_t cb[32];
for (int i = 0; i < 32; i++) cb[i] = (uint8_t)rnd();
cb[0] &= 0x7F;
paze_bn_from_bytes(&c, cb, 32);
paze_bn_modmul(&t, &r, &c, &p);
paze_bn_modmul(&chk, &b, &c, &p);
paze_bn_modmul(&chk, &a, &chk, &p);
if (paze_bn_cmp(&r, &chk) != 0 && paze_bn_cmp(&t, &chk) != 0) {
/* 比较 (a*b)*c 与 a*(b*c) */
if (paze_bn_cmp(&t, &chk) != 0) {
printf("modmul assoc fail iter=%d\n", iter);
fails++;
break;
}
}
}
printf("mod tests fails=%d\n", fails);
/* 专门测试边界值 */
paze_bn_t a, b, r, chk;
paze_bn_set_u32(&a, 1);
paze_bn_set_u32(&b, 2);
paze_bn_modsub(&r, &a, &b, &p); /* 1-2 = p-1 */
paze_bn_t pm1;
paze_bn_set_u32(&pm1, 1);
paze_bn_sub(&pm1, &p, &pm1);
printf("1-2 == p-1: %d\n", paze_bn_cmp(&r, &pm1) == 0);
/* modmul 大数边界: (p-1)*(p-1) mod p == 1 */
paze_bn_modmul(&r, &pm1, &pm1, &p);
printf("(p-1)^2 == 1: %d\n", paze_bn_is_one(&r));
return 0;
}