文件

69 行
2.6 KiB
C

/* p384.h —— NIST P-384 (secp384r1) 椭圆曲线
*
* 域算术复用 bignum (mod p),点运算用 Jacobian 坐标。
* 曲线参数: y^2 = x^3 - 3x + b (mod p)
* p = 2^384 - 2^128 - 2^96 + 2^32 - 1
* n = G 的阶
*
* 用于 ECDSA 签名 (TLS 证书) 与 ECDH (TLS 密钥交换)。
* 与 p256.h 结构/接口保持一致;标量 48 字节,仿射点 97 字节。
*/
#ifndef PAZE_P384_H
#define PAZE_P384_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_p384_point_t;
/* 域/群阶常量访问(大端字节流,48 字节) */
extern const uint8_t paze_p384_p_be[48]; /* 域素数 p */
extern const uint8_t paze_p384_n_be[48]; /* 群阶 n */
extern const uint8_t paze_p384_gx_be[48]; /* 基点 x */
extern const uint8_t paze_p384_gy_be[48]; /* 基点 y */
/* 加载常量为 bignum */
void paze_p384_load_p(paze_bn_t *p);
void paze_p384_load_n(paze_bn_t *n);
void paze_p384_load_generator(paze_p384_point_t *G);
/* 点初始化 */
void paze_p384_set_inf(paze_p384_point_t *P); /* 无穷远点 */
int paze_p384_is_inf(const paze_p384_point_t *P); /* 1=无穷远 */
void paze_p384_copy(paze_p384_point_t *dst, const paze_p384_point_t *src);
/* 仿射点解码:in 为 97 字节 (0x04 || X || Y) 或 49 字节压缩(暂不支持压缩)。
* 成功返回 PAZE_OK,并校验点在曲线上。 */
paze_status_t paze_p384_from_affine(paze_p384_point_t *P, const uint8_t *in, size_t len);
/* 仿射编码:输出 97 字节 (0x04 || X || Y)。要求 P 非无穷远。 */
paze_status_t paze_p384_to_affine(const paze_p384_point_t *P, uint8_t *out, size_t len);
/* 点加 R = P + Q (Jacobian,非侧信道安全;供 ECDSA verify 等公开路径用)。 */
paze_status_t paze_p384_add(paze_p384_point_t *R,
const paze_p384_point_t *P,
const paze_p384_point_t *Q);
/* 点倍 R = 2P */
paze_status_t paze_p384_double(paze_p384_point_t *R, const paze_p384_point_t *P);
/* 标量乘 R = k * P。k 为大端 48 字节(< n)。常量时间(double-and-add)。
* 若 P 为 NULL,使用基点 G。 */
paze_status_t paze_p384_scalar_mult(paze_p384_point_t *R,
const uint8_t k_be[48],
const paze_p384_point_t *P);
/* 取点的仿射 x 坐标(归约到 mod n 所需范围)供 ECDSA 用 */
paze_status_t paze_p384_get_x_mod_n(paze_bn_t *x, const paze_p384_point_t *P);
#ifdef __cplusplus
}
#endif
#endif /* PAZE_P384_H */