文件
PazeSSH/tests/dbg_rfc6979.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

80 行
3.0 KiB
C

/* dbg_rfc6979.c —— RFC 6979 A.2.5 P-256/SHA-256 已知向量验证
* d = C9AFA9D845BA75166B5C215767B1D6934E50C3DB36E89B127B8A622B120F6721
* hash("sample") = AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF
* 期望 r = EFD48B2AACB6A8FD1140DD9CD45E81D69D2C877B56AAF991C34D0EA84EAF3716
* s = F7CB1C942D657C41D436C7A1B6E29F65F3E900DBB9AFF4064DC4AB2F843ACDA8 */
#include "paze/ecdsa.h"
#include "paze/p256.h"
#include "paze/bignum.h"
#include <stdio.h>
#include <string.h>
static void hexout(const char *tag, const uint8_t *b, size_t n) {
printf("%s: ", tag);
for (size_t i = 0; i < n; i++) printf("%02x", b[i]);
printf("\n");
}
int main(void) {
static const uint8_t d[32] = {
0xC9,0xAF,0xA9,0xD8,0x45,0xBA,0x75,0x16,0x6B,0x5C,0x21,0x57,0x67,0xB1,0xD6,0x93,
0x4E,0x50,0xC3,0xDB,0x36,0xE8,0x9B,0x12,0x7B,0x8A,0x62,0x2B,0x12,0x0F,0x67,0x21
};
static const uint8_t h[32] = {
0xAF,0x2B,0xDB,0xE1,0xAA,0x9B,0x6E,0xC1,0xE2,0xAD,0xE1,0xD6,0x94,0xF4,0x1F,0xC7,
0x1A,0x83,0x1D,0x02,0x68,0xE9,0x89,0x15,0x62,0x11,0x3D,0x8A,0x62,0xAD,0xD1,0xBF
};
static const uint8_t exp_r[32] = {
0xEF,0xD4,0x8B,0x2A,0xAC,0xB6,0xA8,0xFD,0x11,0x40,0xDD,0x9C,0xD4,0x5E,0x81,0xD6,
0x9D,0x2C,0x87,0x7B,0x56,0xAA,0xF9,0x91,0xC3,0x4D,0x0E,0xA8,0x4E,0xAF,0x37,0x16
};
static const uint8_t exp_s[32] = {
0xF7,0xCB,0x1C,0x94,0x2D,0x65,0x7C,0x41,0xD4,0x36,0xC7,0xA1,0xB6,0xE2,0x9F,0x65,
0xF3,0xE9,0x00,0xDB,0xB9,0xAF,0xF4,0x06,0x4D,0xC4,0xAB,0x2F,0x84,0x3A,0xCD,0xA8
};
paze_ecdsa_priv_t priv;
memset(&priv, 0, sizeof(priv));
memcpy(priv.d, d, 32);
/* 验证 Q = d*G 落在曲线上 */
paze_p256_point_t Q;
paze_status_t st;
paze_p256_scalar_mult(&Q, d, NULL);
uint8_t qb[65];
st = paze_p256_to_affine(&Q, qb, sizeof(qb));
if (st == PAZE_OK) {
paze_p256_point_t back;
st = paze_p256_from_affine(&back, qb, sizeof(qb));
printf("Q on curve: %s\n", st == PAZE_OK ? "yes" : "NO");
hexout("Q", qb + 1, 64);
} else {
printf("Q to_affine failed\n");
}
/* 固定私钥 + 固定 hash,不设 hash_alg 错配 */
uint8_t sig[128]; size_t siglen = sizeof(sig);
st = paze_ecdsa_sign(&priv, PAZE_RSA_HASH_SHA256, h, 32, sig, &siglen);
printf("sign st=%d siglen=%zu\n", st, siglen);
hexout("sig", sig, siglen);
if (st != PAZE_OK) return 1;
paze_bn_t r, s;
st = paze_ecdsa_sig_from_der(&r, &s, sig, siglen);
if (st != PAZE_OK) { printf("from_der failed\n"); return 1; }
uint8_t rbe[32], sbe[32];
paze_bn_to_bytes(&r, rbe, 32);
paze_bn_to_bytes(&s, sbe, 32);
hexout("r", rbe, 32);
hexout("s", sbe, 32);
printf("r match: %d\n", memcmp(rbe, exp_r, 32) == 0);
printf("s match: %d\n", memcmp(sbe, exp_s, 32) == 0);
/* 用向量自验 */
paze_ecdsa_pub_t pub;
pub.Q = Q;
st = paze_ecdsa_verify(&pub, PAZE_RSA_HASH_SHA256, h, 32, sig, siglen);
printf("vector verify: %d\n", st);
return 0;
}