TLS 1.3 PSK 会话恢复: NewSessionTicket 签发/解析、ticket+binder 校验、selected_identity 回选、恢复握手免证书(pazessl -sess_in/-sess_out 端到端验证); 构建脚本输出 bin/ 并支持独立命令与 psftp; 修复 SFTP 二进制传输与 copy_id -P; 补充 tests/ 调试与 verify_tls
80 行
2.4 KiB
C
80 行
2.4 KiB
C
/* dbg_div4.c —— 找出 divmod 最小失败案例 */
|
|
#include "paze/p256.h"
|
|
#include "paze/bignum.h"
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
static int check(const char *tag, const paze_bn_t *a, const paze_bn_t *b) {
|
|
paze_bn_t q, r, prod, chk;
|
|
paze_bn_divmod(&q, &r, a, b);
|
|
paze_bn_mul(&prod, &q, b);
|
|
paze_bn_add(&chk, &prod, &r);
|
|
if (paze_bn_cmp(&chk, a) != 0) {
|
|
printf("%s: FAIL\n", tag);
|
|
char h[800];
|
|
paze_bn_to_hex(&q, h, sizeof(h)); printf(" q=%s\n", h);
|
|
paze_bn_to_hex(&r, h, sizeof(h)); printf(" r=%s\n", h);
|
|
return 1;
|
|
}
|
|
if (paze_bn_cmp(&r, b) >= 0) {
|
|
printf("%s: r>=b FAIL\n", tag);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int main(void) {
|
|
paze_bn_t p, pm1, pm2, a, b, t;
|
|
paze_p256_load_p(&p);
|
|
paze_bn_set_u32(&pm1, 1); paze_bn_sub(&pm1, &p, &pm1);
|
|
paze_bn_set_u32(&pm2, 2); paze_bn_sub(&pm2, &p, &pm2);
|
|
|
|
/* k*p / p == k */
|
|
int fails = 0;
|
|
for (uint32_t k = 2; k <= 20; k++) {
|
|
paze_bn_set_u32(&t, k);
|
|
paze_bn_mul(&a, &t, &p);
|
|
paze_bn_divmod(&t, &b, &a, &p);
|
|
paze_bn_set_u32(&t, 0);
|
|
if (check("k*p/p", &a, &p)) { fails++; break; }
|
|
}
|
|
printf("k*p/p (k=2..20): %s\n", fails ? "FAIL" : "PASS");
|
|
|
|
/* (p-1)*k / p */
|
|
fails = 0;
|
|
for (uint32_t k = 2; k <= 10; k++) {
|
|
paze_bn_set_u32(&t, k);
|
|
paze_bn_mul(&a, &pm1, &t);
|
|
if (check("(p-1)*k/p", &a, &p)) { fails++; break; }
|
|
}
|
|
printf("(p-1)*k/p (k=2..10): %s\n", fails ? "FAIL" : "PASS");
|
|
|
|
/* (p-2)*p + 1 == (p-1)^2 结构 */
|
|
paze_bn_mul(&a, &pm2, &p);
|
|
paze_bn_set_u32(&t, 1);
|
|
paze_bn_add(&a, &a, &t); /* a = (p-2)*p + 1 */
|
|
if (check("(p-2)*p+1 / p", &a, &p)) { fails++; }
|
|
printf("(p-2)*p+1/p: %s\n", fails ? "FAIL" : "PASS");
|
|
|
|
/* a = p^2 (除以 p 应得 p) */
|
|
paze_bn_mul(&a, &p, &p);
|
|
fails = 0;
|
|
if (check("p^2/p", &a, &p)) { fails++; }
|
|
printf("p^2/p: %s\n", fails ? "FAIL" : "PASS");
|
|
|
|
/* a = p^2 + p + 1 */
|
|
paze_bn_add(&a, &a, &p);
|
|
paze_bn_set_u32(&t, 1);
|
|
paze_bn_add(&a, &a, &t);
|
|
if (check("(p^2+p+1)/p", &a, &p)) { fails++; }
|
|
printf("(p^2+p+1)/p: %s\n", fails ? "FAIL" : "PASS");
|
|
|
|
/* a = (p-1)^3 除以 p */
|
|
paze_bn_t a3;
|
|
paze_bn_mul(&a, &pm1, &pm1);
|
|
paze_bn_mul(&a3, &a, &pm1);
|
|
if (check("(p-1)^3/p", &a3, &p)) { fails++; }
|
|
printf("(p-1)^3/p: %s\n", fails ? "FAIL" : "PASS");
|
|
return 0;
|
|
}
|