55 行
1.8 KiB
C
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 */
|