TLS 1.3 PSK 会话恢复: NewSessionTicket 签发/解析、ticket+binder 校验、selected_identity 回选、恢复握手免证书(pazessl -sess_in/-sess_out 端到端验证); 构建脚本输出 bin/ 并支持独立命令与 psftp; 修复 SFTP 二进制传输与 copy_id -P; 补充 tests/ 调试与 verify_tls
87 行
2.6 KiB
C
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;
|
|
}
|