KGC_TEST/ecurve.c

69 lines
2.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ecurve.h"
// 使用的椭圆曲线(SECP256K1)公开参数
char Q[] = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"; // 有限域的模q
char A[] = "0000000000000000000000000000000000000000000000000000000000000000"; // 曲线方程系数a
char B[] = "0000000000000000000000000000000000000000000000000000000000000007"; // 曲线方程系数b
char X[] = "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"; // 基点P的x坐标
char Y[] = "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"; // 基点P的y坐标
char P_N[] = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"; // 基点P的阶令nP=O的最小整数
bool setupEcurve(ECC_PARAMS *params)
{
// 初始化变量
(*params).a = mirvar(0);
(*params).b = mirvar(0);
(*params).q = mirvar(0);
(*params).p = mirvar(0);
(*params).P_x = mirvar(0);
(*params).P_y = mirvar(0);
(*params).P = epoint_init();
// 赋值
cinstr((*params).a, A);
cinstr((*params).b, B);
cinstr((*params).q, Q);
cinstr((*params).p, P_N);
cinstr((*params).P_x, X);
cinstr((*params).P_y, Y);
// 椭圆曲线方程初始化
ecurve_init((*params).a, (*params).b, (*params).q, MR_PROJECTIVE);
// 设置点坐标(P_x,P_y)为点P此函数同时能判断P是否在上面初始化成功的椭圆曲线上
if (!epoint_set((*params).P_x, (*params).P_y, 0, (*params).P))
{
freeEcurve(params);
return false;
}
// 判断P是否是阶为p的基点判断依据基点乘以阶为无穷远点
bool bRv = false;
epoint *P_test = epoint_init();
ecurve_mult((*params).p, (*params).P, P_test);
if (point_at_infinity(P_test))
{
bRv = true;
}
else
{
freeEcurve(params);
bRv = false;
}
epoint_free(P_test);
return bRv;
}
void freeEcurve(ECC_PARAMS *params)
{
mirkill((*params).a);
mirkill((*params).b);
mirkill((*params).q);
mirkill((*params).p);
mirkill((*params).P_x);
mirkill((*params).P_y);
epoint_free((*params).P);
}