# SM2算法
typedef struct {
uint8_t x[32];
uint8_t y[32];
} SM2_POINT;
SM2_POINT
结构包含两个成员变量x和y,分别代表SM2椭圆曲线上点的$x$坐标和$y$坐标,以256位大整数表示。
void sm2_point_to_compressed_octets(const SM2_POINT *P, uint8_t out[33]);
将SM2椭圆曲线上的点P
转换为压缩字节格式并存放到字节数组out
中,长度固定为33字节。
void sm2_point_to_uncompressed_octets(const SM2_POINT *P, uint8_t out[65]);
将SM2椭圆曲线上的点P
转换为非压缩字节格式并存放到字节数组out
中,长度固定为65字节。
int sm2_point_from_octets(SM2_POINT *P, const uint8_t *in, size_t inlen);
从压缩或非压缩字节格式的、长度为inlen
的字节数组in
中读取SM2椭圆曲线上的点并将其写入结构P
中。函数执行成功返回1,失败返回-1。
int sm2_point_to_der(const SM2_POINT *P, uint8_t **out, size_t *outlen);
将SM2椭圆曲线点结构P
转换为DER格式,并按ASN1标准将每一项内容及其长度存放到out
和outlen
中。函数执行成功返回1,失败返回-1。
int sm2_point_from_der(SM2_POINT *P, const uint8_t **in, size_t *inlen);
从给定的数组in
和长度信息inlen
中读取DER格式的SM2椭圆曲线点,并将其写入点结构P
中。函数执行成功返回1,失败返回-1。
int sm2_point_from_x(SM2_POINT *P, const uint8_t x[32], int y);
从给定的椭圆曲线点的$x$坐标和压缩信息$y$恢复椭圆曲线点的值,并将其写入点结构P
中。函数执行成功返回1,失败返回-1。
int sm2_point_from_xy(SM2_POINT *P, const uint8_t x[32], const uint8_t y[32]);
从给定的椭圆曲线点的$x$坐标和$y$坐标恢复椭圆曲线点的值,并将其写入点结构P
中。如果该点在SM2椭圆曲线上,返回1,否则返回0。
int sm2_point_is_on_curve(const SM2_POINT *P);
检查给定的点P
是否在SM2椭圆曲线上,是则返回1,否则返回0。
int sm2_point_mul(SM2_POINT *R, const uint8_t k[32], const SM2_POINT *P);
计算给定的椭圆曲线点P
的k
倍点,并将结果写入点结构R
中。函数总是返回1。
int sm2_point_mul_generator(SM2_POINT *R, const uint8_t k[32]);
计算SM2椭圆曲线点群的生成元$G$的k
倍点,并将结果写入点结构R
中。函数总是返回1。
int sm2_point_mul_sum(SM2_POINT *R, const uint8_t k[32], const SM2_POINT *P, const uint8_t s[32]);
对给定椭圆曲线点结构P
、整数k
和s
,计算$R=[k]P+[s]G$(其中$G$为SM2椭圆曲线点群的生成元),并将结果写入点结构R
中。函数总是返回1。