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 #include #include 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系统 }