package main
import "fmt"
import "./blscgo"
import "testing"
//import "runtime"
//import "time"
var unitN = 0
func verifyTrue(b bool) {
if !b {
fmt.Println("ERR")
}
}
func testRecoverSecretKey(t *testing.T) {
k := 3000
var sec blscgo.SecretKey
sec.Init()
// make master secret key
msk := sec.GetMasterSecretKey(k)
n := k
secVec := make([]blscgo.SecretKey, n)
idVec := make([]blscgo.ID, n)
for i := 0; i < n; i++ {
idVec[i].Set([]uint64{1, 2, 3, uint64(i), 4, 5}[0:unitN])
secVec[i].Set(msk, &idVec[i])
}
// recover sec2 from secVec and idVec
var sec2 blscgo.SecretKey
sec2.Recover(secVec, idVec)
if sec.String() != sec2.String() {
t.Fatal("sec err %s %s\n", sec, sec2)
}
}
func testSign(t *testing.T) {
m := "testSign"
var sec0 blscgo.SecretKey
sec0.Init()
pub0 := sec0.GetPublicKey()
s0 := sec0.Sign(m)
if !s0.Verify(pub0, m) {
t.Fatal("s0.Verify")
}
k := 3
msk := sec0.GetMasterSecretKey(k)
mpk := blscgo.GetMasterPublicKey(msk)
idTbl := []uint64{3, 5, 193, 22, 15}
n := len(idTbl)
secVec := make([]blscgo.SecretKey, n)
pubVec := make([]blscgo.PublicKey, n)
signVec := make([]blscgo.Sign, n)
idVec := make([]blscgo.ID, n)
for i := 0; i < n; i++ {
idVec[i].Set([]uint64{idTbl[i], 0, 0, 0, 0, 0}[0:unitN])
secVec[i].Set(msk, &idVec[i])
pubVec[i].Set(mpk, &idVec[i])
if pubVec[i].String() != secVec[i].GetPublicKey().String() {
t.Fatal("pubVec %d", i)
}
signVec[i] = *secVec[i].Sign(m)
s := *secVec[i].SignCT(m)
if signVec[i].String() != s.String() {
t.Fatal("SingCT %d", i)
}
if !signVec[i].Verify(&pubVec[i], m) {
t.Fatal("singVec %d", i)
}
}
var sec1 blscgo.SecretKey
sec1.Recover(secVec, idVec)
if sec0.String() != sec1.String() {
t.Fatal("sec0 sec1")
}
var pub1 blscgo.PublicKey
pub1.Recover(pubVec, idVec)
if pub0.String() != pub1.String() {
t.Fatal("pub0 pub1")
}
var s1 blscgo.Sign
s1.Recover(signVec, idVec)
if s0.String() != s1.String() {
t.Fatal("s0 s1")
}
}
func testAdd(t *testing.T) {
var sec1 blscgo.SecretKey
var sec2 blscgo.SecretKey
sec1.Init()
sec2.Init()
pub1 := sec1.GetPublicKey()
pub2 := sec2.GetPublicKey()
m := "test test"
sign1 := sec1.Sign(m)
sign2 := sec2.Sign(m)
sign1.Add(sign2)
pub1.Add(pub2)
if !sign1.Verify(pub1, m) {
t.Fatal("sign1.Verify")
}
}
func testPop(t *testing.T) {
var sec blscgo.SecretKey
sec.Init()
pop := sec.GetPop()
if !pop.VerifyPop(sec.GetPublicKey()) {
t.Fatal("pop.VerifyPop")
}
sec.Init()
if pop.VerifyPop(sec.GetPublicKey()) {
t.Fatal("pop.Verify another")
}
}
func test(t *testing.T, cp int) {
blscgo.Init(cp)
unitN = blscgo.GetOpUnitSize()
{
var id blscgo.ID
id.Set([]uint64{6, 5, 4, 3, 2, 1}[0:unitN])
var id2 blscgo.ID
id2.SetStr(id.String())
if id.String() != id2.String() {
t.Fatal("id err %s %s", id, id2)
}
}
{
var sec blscgo.SecretKey
sec.SetArray([]uint64{1, 2, 3, 4, 5, 6}[0:unitN])
}
fmt.Println("create secret key")
m := "this is a blscgo sample for go"
var sec blscgo.SecretKey
sec.Init()
pub := sec.GetPublicKey()
sign := sec.Sign(m)
if !sign.Verify(pub, m) {
t.Fatal("sign.Verify")
}
// How to make array of SecretKey
{
sec := make([]blscgo.SecretKey, 3)
for i := 0; i < len(sec); i++ {
sec[i].Init()
}
}
testRecoverSecretKey(t)
testAdd(t)
testSign(t)
testPop(t)
// put memory status
/*
runtime.GC()
time.Sleep(2 * time.Second)
var mem runtime.MemStats
runtime.ReadMemStats(&mem)
fmt.Println("mem=", mem)
*/
}
func TestMain(t *testing.T) {
fmt.Printf("GetMaxOpUnitSize() = %d\n", blscgo.GetMaxOpUnitSize())
fmt.Println("CurveFp254BNb")
test(t, blscgo.CurveFp254BNb)
if blscgo.GetMaxOpUnitSize() == 6 {
fmt.Println("CurveFp382_1")
test(t, blscgo.CurveFp382_1)
fmt.Println("CurveFp382_1")
test(t, blscgo.CurveFp382_2)
}
}