文件

69 行
2.6 KiB
C

/* p256.h —— NIST P-256 (secp256r1) 椭圆曲线
*
* 域算术复用 bignum (mod p),点运算用 Jacobian 坐标。
* 曲线参数: y^2 = x^3 - 3x + b (mod p)
* p = 2^256 - 2^224 + 2^192 + 2^96 - 1
* n = G 的阶
*
* 用于 ECDSA 签名 (TLS 证书) 与 ECDH (TLS 密钥交换)。
*/
#ifndef PAZE_P256_H
#define PAZE_P256_H
#include "paze/paze_types.h"
#include "paze/bignum.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Jacobian 坐标点:(X:Y:Z),仿射 x = X/Z^2, y = Y/Z^3。
* Z=0 表示无穷远点(单位元)。 */
typedef struct {
paze_bn_t X, Y, Z;
} paze_p256_point_t;
/* 域/群阶常量访问(大端字节流,32 字节) */
extern const uint8_t paze_p256_p_be[32]; /* 域素数 p */
extern const uint8_t paze_p256_n_be[32]; /* 群阶 n */
extern const uint8_t paze_p256_gx_be[32]; /* 基点 x */
extern const uint8_t paze_p256_gy_be[32]; /* 基点 y */
/* 加载常量为 bignum */
void paze_p256_load_p(paze_bn_t *p);
void paze_p256_load_n(paze_bn_t *n);
void paze_p256_load_generator(paze_p256_point_t *G);
/* 点初始化 */
void paze_p256_set_inf(paze_p256_point_t *P); /* 无穷远点 */
int paze_p256_is_inf(const paze_p256_point_t *P); /* 1=无穷远 */
void paze_p256_copy(paze_p256_point_t *dst, const paze_p256_point_t *src);
/* 仿射点解码:in 为 65 字节 (0x04 || X || Y) 或 33 字节压缩(暂不支持压缩)。
* 成功返回 PAZE_OK,并校验点在曲线上。 */
paze_status_t paze_p256_from_affine(paze_p256_point_t *P, const uint8_t *in, size_t len);
/* 仿射编码:输出 65 字节 (0x04 || X || Y)。要求 P 非无穷远。 */
paze_status_t paze_p256_to_affine(const paze_p256_point_t *P, uint8_t *out, size_t len);
/* 点加 R = P + Q (Jacobian,常量时间无关;非侧信道安全但 ECDSA verify 可公开)。
* P 或 Q 可为无穷远。R 可与 P/Q 别名。 */
paze_status_t paze_p256_add(paze_p256_point_t *R,
const paze_p256_point_t *P,
const paze_p256_point_t *Q);
/* 点倍 R = 2P */
paze_status_t paze_p256_double(paze_p256_point_t *R, const paze_p256_point_t *P);
/* 标量乘 R = k * P。k 为大端 32 字节(< n)。常量时间(double-and-add)。
* 若 P 为 NULL,使用基点 G。 */
paze_status_t paze_p256_scalar_mult(paze_p256_point_t *R,
const uint8_t k_be[32],
const paze_p256_point_t *P);
/* 取点的仿射 x 坐标(归约到 mod n 所需范围)供 ECDSA 用 */
paze_status_t paze_p256_get_x_mod_n(paze_bn_t *x, const paze_p256_point_t *P);
#ifdef __cplusplus
}
#endif
#endif /* PAZE_P256_H */