KGC_TEST/generator_cgo/main.go

113 lines
2.6 KiB
Go
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.

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(&params) {
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(&params, msk, PK_pub)
C.outbig(msk, C.msk)
C.outpoint((&params).P, C.Public)
C.outpoint(PK_pub, C.PKP)
// 产生用户A的秘密值
C.genSecret(&params, x_A, X_A)
C.outbig(x_A, C.xA)
C.outpoint(X_A, C.XA)
// 产生用户A的部分私钥和用户的完整公钥
if !C.genPPK_std(&params, 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(&params, C.IDA, d_A, x_A, X_A, sa_A)
C.outbig(sa_A, C.saA)
// 签名Gowri Thumbur方案
C.sign_Thumbur(&params, C.IDA, C.M, sa_A, Q_A, U, PK_pub, val)
// 验签
if C.verify_Thumbur(&params, 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(&params)
C.mirexit() // 退出MIRACL系统
}