aboutsummaryrefslogtreecommitdiffstats
path: root/go/bls/bls_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/bls/bls_test.go')
-rw-r--r--go/bls/bls_test.go344
1 files changed, 344 insertions, 0 deletions
diff --git a/go/bls/bls_test.go b/go/bls/bls_test.go
new file mode 100644
index 0000000..f2039fc
--- /dev/null
+++ b/go/bls/bls_test.go
@@ -0,0 +1,344 @@
+package bls
+
+import "testing"
+import "strconv"
+
+var curve = CurveFp382_1
+
+//var curve = CurveFp254BNb
+var unitN = 0
+
+func testPre(t *testing.T) {
+ t.Log("init")
+ var err error
+ {
+ var id ID
+ id.Set([]uint64{6, 5, 4, 3, 2, 1}[0:unitN])
+
+ t.Log("id :", id)
+ var id2 ID
+ err = id2.SetStr(id.String())
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log("id2:", id2)
+ }
+ {
+ var sec SecretKey
+ sec.SetArray([]uint64{1, 2, 3, 4, 5, 6}[0:unitN])
+ t.Log("sec=", sec)
+ }
+
+ t.Log("create secret key")
+ m := "this is a bls sample for go"
+ var sec SecretKey
+ sec.Init()
+ t.Log("sec:", sec)
+ t.Log("create public key")
+ pub := sec.GetPublicKey()
+ t.Log("pub:", pub)
+ sign := sec.Sign(m)
+ t.Log("sign:", sign)
+ if !sign.Verify(pub, m) {
+ t.Error("Signature does not verify")
+ }
+
+ // How to make array of SecretKey
+ {
+ sec := make([]SecretKey, 3)
+ for i := 0; i < len(sec); i++ {
+ sec[i].Init()
+ t.Log("sec=", sec[i].String())
+ }
+ }
+}
+
+func testRecoverSecretKey(t *testing.T) {
+ t.Log("testRecoverSecretKey")
+ k := 3000
+ var sec SecretKey
+ sec.Init()
+
+ // make master secret key
+ msk := sec.GetMasterSecretKey(k)
+
+ n := k
+ secVec := make([]SecretKey, n)
+ idVec := make([]ID, n)
+ for i := 0; i < n; i++ {
+ idVec[i].Set([]uint64{uint64(i), 1, 2, 3, 4, 5}[0:unitN])
+ secVec[i].Set(msk, &idVec[i])
+ }
+ // recover sec2 from secVec and idVec
+ var sec2 SecretKey
+ sec2.Recover(secVec, idVec)
+ if sec.String() != sec2.String() {
+ t.Errorf("Mismatch in recovered secret key:\n %s\n %s.", sec.String(), sec2.String())
+ }
+}
+
+func testSign(t *testing.T) {
+ m := "testSign"
+ t.Log(m)
+
+ var sec0 SecretKey
+ sec0.Init()
+ pub0 := sec0.GetPublicKey()
+ s0 := sec0.Sign(m)
+ if !s0.Verify(pub0, m) {
+ t.Error("Signature does not verify")
+ }
+
+ k := 3
+ msk := sec0.GetMasterSecretKey(k)
+ mpk := GetMasterPublicKey(msk)
+
+ idTbl := []uint64{3, 5, 193, 22, 15}
+ n := len(idTbl)
+
+ secVec := make([]SecretKey, n)
+ pubVec := make([]PublicKey, n)
+ signVec := make([]Sign, n)
+ idVec := make([]ID, n)
+
+ for i := 0; i < n; i++ {
+ idVec[i].Set([]uint64{idTbl[i], 0, 0, 0, 0, 0}[0:unitN])
+ t.Logf("idVec[%d]=%s\n", i, idVec[i].String())
+
+ secVec[i].Set(msk, &idVec[i])
+
+ pubVec[i].Set(mpk, &idVec[i])
+ t.Logf("pubVec[%d]=%s\n", i, pubVec[i].String())
+
+ if pubVec[i].String() != secVec[i].GetPublicKey().String() {
+ t.Error("Pubkey derivation does not match")
+ }
+
+ signVec[i] = *secVec[i].Sign(m)
+ if !signVec[i].Verify(&pubVec[i], m) {
+ t.Error("Pubkey derivation does not match")
+ }
+ }
+ var sec1 SecretKey
+ sec1.Recover(secVec, idVec)
+ if sec0.String() != sec1.String() {
+ t.Error("Mismatch in recovered seckey.")
+ }
+ var pub1 PublicKey
+ pub1.Recover(pubVec, idVec)
+ if pub0.String() != pub1.String() {
+ t.Error("Mismatch in recovered pubkey.")
+ }
+ var s1 Sign
+ s1.Recover(signVec, idVec)
+ if s0.String() != s1.String() {
+ t.Error("Mismatch in recovered signature.")
+ }
+}
+
+func testAdd(t *testing.T) {
+ t.Log("testAdd")
+ var sec1 SecretKey
+ var sec2 SecretKey
+ sec1.Init()
+ sec2.Init()
+
+ pub1 := sec1.GetPublicKey()
+ pub2 := sec2.GetPublicKey()
+
+ m := "test test"
+ sign1 := sec1.Sign(m)
+ sign2 := sec2.Sign(m)
+
+ t.Log("sign1 :", sign1)
+ sign1.Add(sign2)
+ t.Log("sign1 add:", sign1)
+ pub1.Add(pub2)
+ if !sign1.Verify(pub1, m) {
+ t.Fail()
+ }
+}
+
+func testPop(t *testing.T) {
+ t.Log("testPop")
+ var sec SecretKey
+ sec.Init()
+ pop := sec.GetPop()
+ if !pop.VerifyPop(sec.GetPublicKey()) {
+ t.Errorf("Valid Pop does not verify")
+ }
+ sec.Init()
+ if pop.VerifyPop(sec.GetPublicKey()) {
+ t.Errorf("Invalid Pop verifies")
+ }
+}
+
+func testData(t *testing.T) {
+ t.Log("testData")
+ var sec1, sec2 SecretKey
+ sec1.Init()
+ s := sec1.GetData()
+ sec2.SetData(s)
+ if !sec1.IsSame(&sec2) {
+ t.Error("SecretKey not same")
+ }
+ pub1 := sec1.GetPublicKey()
+ s = pub1.GetData()
+ var pub2 PublicKey
+ pub2.SetData(s)
+ if !pub1.IsSame(&pub2) {
+ t.Error("PublicKey not same")
+ }
+ m := "doremi"
+ sign1 := sec1.Sign(m)
+ s = sign1.GetData()
+ var sign2 Sign
+ sign2.SetData(s)
+ if !sign1.IsSame(&sign2) {
+ t.Error("Sign not same")
+ }
+}
+
+func BenchmarkPubkeyFromSeckey(b *testing.B) {
+ b.StopTimer()
+ Init(curve)
+ var sec SecretKey
+ for n := 0; n < b.N; n++ {
+ sec.Init()
+ b.StartTimer()
+ sec.GetPublicKey()
+ b.StopTimer()
+ }
+}
+
+func BenchmarkSigning(b *testing.B) {
+ b.StopTimer()
+ Init(curve)
+ var sec SecretKey
+ for n := 0; n < b.N; n++ {
+ sec.Init()
+ b.StartTimer()
+ sec.Sign(strconv.Itoa(n))
+ b.StopTimer()
+ }
+}
+
+func BenchmarkValidation(b *testing.B) {
+ b.StopTimer()
+ Init(curve)
+ var sec SecretKey
+ for n := 0; n < b.N; n++ {
+ sec.Init()
+ pub := sec.GetPublicKey()
+ m := strconv.Itoa(n)
+ sig := sec.Sign(m)
+ b.StartTimer()
+ sig.Verify(pub, m)
+ b.StopTimer()
+ }
+}
+
+func benchmarkDeriveSeckeyShare(k int, b *testing.B) {
+ b.StopTimer()
+ Init(curve)
+ var sec SecretKey
+ sec.Init()
+ msk := sec.GetMasterSecretKey(k)
+ var id ID
+ for n := 0; n < b.N; n++ {
+ id.Set([]uint64{1, 2, 3, 4, 5, uint64(n)})
+ b.StartTimer()
+ sec.Set(msk, &id)
+ b.StopTimer()
+ }
+}
+
+//func BenchmarkDeriveSeckeyShare100(b *testing.B) { benchmarkDeriveSeckeyShare(100, b) }
+//func BenchmarkDeriveSeckeyShare200(b *testing.B) { benchmarkDeriveSeckeyShare(200, b) }
+func BenchmarkDeriveSeckeyShare500(b *testing.B) { benchmarkDeriveSeckeyShare(500, b) }
+
+//func BenchmarkDeriveSeckeyShare1000(b *testing.B) { benchmarkDeriveSeckeyShare(1000, b) }
+
+func benchmarkRecoverSeckey(k int, b *testing.B) {
+ b.StopTimer()
+ Init(curve)
+ var sec SecretKey
+ sec.Init()
+ msk := sec.GetMasterSecretKey(k)
+
+ // derive n shares
+ n := k
+ secVec := make([]SecretKey, n)
+ idVec := make([]ID, n)
+ for i := 0; i < n; i++ {
+ idVec[i].Set([]uint64{1, 2, 3, 4, 5, uint64(i)})
+ secVec[i].Set(msk, &idVec[i])
+ }
+
+ // recover from secVec and idVec
+ var sec2 SecretKey
+ b.StartTimer()
+ for n := 0; n < b.N; n++ {
+ sec2.Recover(secVec, idVec)
+ }
+}
+
+func BenchmarkRecoverSeckey100(b *testing.B) { benchmarkRecoverSeckey(100, b) }
+func BenchmarkRecoverSeckey200(b *testing.B) { benchmarkRecoverSeckey(200, b) }
+func BenchmarkRecoverSeckey500(b *testing.B) { benchmarkRecoverSeckey(500, b) }
+func BenchmarkRecoverSeckey1000(b *testing.B) { benchmarkRecoverSeckey(1000, b) }
+
+func benchmarkRecoverSignature(k int, b *testing.B) {
+ b.StopTimer()
+ Init(curve)
+ var sec SecretKey
+ sec.Init()
+ msk := sec.GetMasterSecretKey(k)
+
+ // derive n shares
+ n := k
+ idVec := make([]ID, n)
+ secVec := make([]SecretKey, n)
+ signVec := make([]Sign, n)
+ for i := 0; i < n; i++ {
+ idVec[i].Set([]uint64{1, 2, 3, 4, 5, uint64(i)})
+ secVec[i].Set(msk, &idVec[i])
+ signVec[i] = *secVec[i].Sign("test message")
+ }
+
+ // recover signature
+ var sig Sign
+ b.StartTimer()
+ for n := 0; n < b.N; n++ {
+ sig.Recover(signVec, idVec)
+ }
+}
+
+func BenchmarkRecoverSignature100(b *testing.B) { benchmarkRecoverSignature(100, b) }
+func BenchmarkRecoverSignature200(b *testing.B) { benchmarkRecoverSignature(200, b) }
+func BenchmarkRecoverSignature500(b *testing.B) { benchmarkRecoverSignature(500, b) }
+func BenchmarkRecoverSignature1000(b *testing.B) { benchmarkRecoverSignature(1000, b) }
+
+func test(t *testing.T, c int) {
+ Init(c)
+ unitN = GetOpUnitSize()
+ t.Logf("unitN=%d\n", unitN)
+ testPre(t)
+ testRecoverSecretKey(t)
+ testAdd(t)
+ testSign(t)
+ testPop(t)
+ testData(t)
+}
+
+func TestMain(t *testing.T) {
+ t.Logf("GetMaxOpUnitSize() = %d\n", GetMaxOpUnitSize())
+ t.Log("CurveFp254BNb")
+ test(t, CurveFp254BNb)
+ if GetMaxOpUnitSize() == 6 {
+ t.Log("CurveFp382_1")
+ test(t, CurveFp382_1)
+ t.Log("CurveFp382_1")
+ test(t, CurveFp382_2)
+ }
+}