107 lines
2.3 KiB
C
107 lines
2.3 KiB
C
|
|
#include <string.h>
|
|
#include "sign.h"
|
|
#include "hash.h"
|
|
#include "utils.h"
|
|
|
|
void getFullkey(
|
|
ECC_PARAMS *params,
|
|
char *ID, // 用户ID
|
|
big d, // 用户部分私钥
|
|
big x, // 用户秘密值
|
|
epoint *X, // 用户公钥
|
|
big sa // 用户完整私钥
|
|
)
|
|
{
|
|
// 计算hash值H_2(ID, X)
|
|
big h_2_big = mirvar(0);
|
|
hash2(ID, X, (*params).p, h_2_big);
|
|
|
|
// 计算sa = d + h_2*x mod p
|
|
big tmp = mirvar(0);
|
|
multiply(x, h_2_big, tmp);
|
|
add(d, tmp, sa);
|
|
power(sa, 1, (*params).p, sa); // mod p
|
|
|
|
mirkill(h_2_big);
|
|
mirkill(tmp);
|
|
}
|
|
|
|
void sign_Thumbur(
|
|
ECC_PARAMS *params,
|
|
char *ID, // 用户ID
|
|
char *msg, // 签名消息
|
|
big sa, // 输入用户完整私钥
|
|
epoint *Q, // 输入用户完整公钥
|
|
epoint *U, // 输出签名的随机数变换
|
|
epoint *PK_pub, //输入KGC的公钥
|
|
big v // 输出签名的计算值
|
|
)
|
|
{
|
|
// 产生随机数u,计算U=uP
|
|
big u = mirvar(0);
|
|
bigrand((*params).p, u);
|
|
ecurve_mult(u, (*params).P, U);
|
|
|
|
// 计算hash值H_3(ID, msg, Q, U, PK_pub)
|
|
big h_3_big = mirvar(0);
|
|
hash3(ID, msg, Q, U, PK_pub, (*params).p, h_3_big);
|
|
|
|
// 计算签名值 v = u + h_3*sa
|
|
big tmp = mirvar(0);
|
|
multiply(sa, h_3_big, tmp);
|
|
add(u, tmp, v);
|
|
power(v, 1, (*params).p, v); // mod p
|
|
outbig(v, "v");
|
|
|
|
mirkill(u);
|
|
mirkill(h_3_big);
|
|
mirkill(tmp);
|
|
}
|
|
|
|
bool verify_Thumbur(
|
|
ECC_PARAMS *params,
|
|
char *ID,
|
|
char *msg,
|
|
epoint *Q,
|
|
epoint *PK_pub,
|
|
epoint *U,
|
|
big v
|
|
)
|
|
{
|
|
// 计算hash值H_1(ID, Q, PK_pub)
|
|
big h_1_big = mirvar(0);
|
|
hash1(ID, Q, PK_pub, (*params).p, h_1_big);
|
|
|
|
// 计算hash值H_3(ID, msg, Q, U, PK_pub)
|
|
big h_3_big = mirvar(0);
|
|
hash3(ID, msg, Q, U, PK_pub, (*params).p, h_3_big);
|
|
|
|
// 验签等式 v*P = U + h_3(Q + h_1*P_pub)
|
|
// 等式左边:
|
|
epoint *left = epoint_init();
|
|
ecurve_mult(v, (*params).P, left);
|
|
|
|
// 等式右边:
|
|
epoint *tmp_p = epoint_init();
|
|
ecurve_mult(h_1_big, PK_pub, tmp_p);
|
|
ecurve_add(Q, tmp_p);
|
|
ecurve_mult(h_3_big, tmp_p, tmp_p);
|
|
ecurve_add(U, tmp_p);
|
|
|
|
bool bRv = false;
|
|
if (epoint_comp(left, tmp_p))
|
|
{
|
|
bRv = true;
|
|
}
|
|
else
|
|
{
|
|
bRv = false;
|
|
}
|
|
|
|
mirkill(h_1_big);
|
|
mirkill(h_3_big);
|
|
epoint_free(left);
|
|
epoint_free(tmp_p);
|
|
return bRv;
|
|
} |