113 lines
2.6 KiB
Go
113 lines
2.6 KiB
Go
package main
|
||
|
||
/*
|
||
#cgo CFLAGS: -I./include
|
||
#cgo LDFLAGS: -L./lib -lKGCAll
|
||
#include "miracl.h"
|
||
#include "mirdef.h"
|
||
#include "hash.h"
|
||
#include "kgc.h"
|
||
#include "utils.h"
|
||
#include "ecurve.h"
|
||
#include "sign.h"
|
||
|
||
#include "utils.cpp"
|
||
#include "ecurve.cpp"
|
||
#include "hash.cpp"
|
||
#include "sign.cpp"
|
||
#include "kgc.cpp"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <stdbool.h>
|
||
char* IDA = "1234567890111213141516171819202122232425"; // 发送者ID
|
||
char* IDB = "1448579437597582757693565726417498574267"; // 接受者ID
|
||
char* M = "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD";
|
||
char* msk = "msk";
|
||
char* PKP = "PK_pub";
|
||
char* Public = "P_P";
|
||
char* QA = "Q_A";
|
||
char* dA = "d_A";
|
||
char* xA = "x_A";
|
||
char* XA = "X_A";
|
||
char* saA = "sa_A";
|
||
*/
|
||
import "C"
|
||
import "fmt"
|
||
|
||
func main() {
|
||
|
||
mip := C.mirsys(512, 16) // 初始化MIRACL系统,512位,16进制数
|
||
mip.IOBASE = 16 // 设置大整数为16进制
|
||
a := C.mirvar(0)
|
||
C.mirkill(a)
|
||
C.setRandSeed()
|
||
|
||
// 建立椭圆曲线
|
||
var params C.ECC_PARAMS
|
||
if !C.setupEcurve(¶ms) {
|
||
fmt.Println("ecurve setup failed")
|
||
C.mirexit()
|
||
panic("椭圆曲线建立失败!")
|
||
}
|
||
|
||
C.setRandSeed() // 随机数种子
|
||
//初始化参数
|
||
msk := C.mirvar(0) //私钥
|
||
PK_pub := C.epoint_init() //公钥
|
||
d_A := C.mirvar(0) //用户A产生的部分私钥
|
||
x_A := C.mirvar(0) //用户产生的秘密值
|
||
X_A := C.epoint_init()
|
||
sa_A := C.mirvar(0) //用户完整私钥
|
||
Q_A := C.epoint_init() //用户完整公钥
|
||
val := C.mirvar(0) //用户返回的签名值
|
||
U := C.epoint_init() //随机点值
|
||
|
||
// 产生KGC密钥对: msk, PK_pub
|
||
C.genKGCkey(¶ms, msk, PK_pub)
|
||
C.outbig(msk, C.msk)
|
||
|
||
C.outpoint((¶ms).P, C.Public)
|
||
C.outpoint(PK_pub, C.PKP)
|
||
|
||
// 产生用户A的秘密值
|
||
C.genSecret(¶ms, x_A, X_A)
|
||
C.outbig(x_A, C.xA)
|
||
C.outpoint(X_A, C.XA)
|
||
|
||
// 产生用户A的部分私钥和用户的完整公钥
|
||
if !C.genPPK_std(¶ms, msk, PK_pub, C.IDA, d_A, Q_A, X_A) {
|
||
fmt.Println("Generate PPK for IDA failed.")
|
||
goto error
|
||
}
|
||
C.outbig(d_A, C.dA)
|
||
C.outpoint(Q_A, C.QA)
|
||
|
||
// 输出完整的用户私钥
|
||
C.getFullkey(¶ms, C.IDA, d_A, x_A, X_A, sa_A)
|
||
C.outbig(sa_A, C.saA)
|
||
|
||
// 签名,Gowri Thumbur方案
|
||
C.sign_Thumbur(¶ms, C.IDA, C.M, sa_A, Q_A, U, PK_pub, val)
|
||
|
||
// 验签
|
||
if C.verify_Thumbur(¶ms, C.IDA, C.M, Q_A, PK_pub, U, val) {
|
||
fmt.Println("\nsignature valid.")
|
||
} else {
|
||
fmt.Println("\nverify failed.")
|
||
}
|
||
|
||
error:
|
||
C.mirkill(msk)
|
||
C.mirkill(d_A)
|
||
C.mirkill(x_A)
|
||
C.mirkill(sa_A)
|
||
C.epoint_free(PK_pub)
|
||
C.epoint_free(X_A)
|
||
C.epoint_free(Q_A)
|
||
C.epoint_free(U)
|
||
|
||
C.freeEcurve(¶ms)
|
||
C.mirexit() // 退出MIRACL系统
|
||
|
||
}
|