文件

55 行
1.8 KiB
C

/* p521.h —— NIST P-521 (secp521r1) 椭圆曲线
*
* 域算术复用 bignum (mod p),点运算用 Jacobian 坐标,公式与 p256/p384 相同。
* 曲线: y^2 = x^3 - 3x + b (mod p), p = 2^521 - 1
* 域元素/标量 66 字节,未压缩仿射点 133 字节 (0x04 || X || Y)。
* 与 p256.h/p384.h 接口保持一致。
*/
#ifndef PAZE_P521_H
#define PAZE_P521_H
#include "paze/paze_types.h"
#include "paze/bignum.h"
#ifdef __cplusplus
extern "C" {
#endif
/* Jacobian 坐标点:(X:Y:Z),Z=0 表示无穷远。 */
typedef struct {
paze_bn_t X, Y, Z;
} paze_p521_point_t;
/* 域/群阶常量(大端 66 字节) */
extern const uint8_t paze_p521_p_be[66];
extern const uint8_t paze_p521_n_be[66];
extern const uint8_t paze_p521_gx_be[66];
extern const uint8_t paze_p521_gy_be[66];
void paze_p521_load_p(paze_bn_t *p);
void paze_p521_load_n(paze_bn_t *n);
void paze_p521_load_generator(paze_p521_point_t *G);
void paze_p521_set_inf(paze_p521_point_t *P);
int paze_p521_is_inf(const paze_p521_point_t *P);
void paze_p521_copy(paze_p521_point_t *dst, const paze_p521_point_t *src);
paze_status_t paze_p521_from_affine(paze_p521_point_t *P, const uint8_t *in, size_t len);
paze_status_t paze_p521_to_affine(const paze_p521_point_t *P, uint8_t *out, size_t len);
paze_status_t paze_p521_add(paze_p521_point_t *R,
const paze_p521_point_t *P,
const paze_p521_point_t *Q);
paze_status_t paze_p521_double(paze_p521_point_t *R, const paze_p521_point_t *P);
paze_status_t paze_p521_scalar_mult(paze_p521_point_t *R,
const uint8_t k_be[66],
const paze_p521_point_t *P);
paze_status_t paze_p521_get_x_mod_n(paze_bn_t *x, const paze_p521_point_t *P);
#ifdef __cplusplus
}
#endif
#endif /* PAZE_P521_H */