aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-04-14 08:54:12 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-04-14 08:54:12 +0800
commit737475faeaca06f65f1a95db810ba2aa6f83e422 (patch)
tree7b273c688ee3a21ddf2cd8ae5511fba6910b7917
parentfb2abdeec5ce179e70c198ffd500272ba0c33e13 (diff)
downloaddexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.tar
dexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.tar.gz
dexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.tar.bz2
dexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.tar.lz
dexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.tar.xz
dexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.tar.zst
dexon-bls-737475faeaca06f65f1a95db810ba2aa6f83e422.zip
rename go/blscgo to go/bls
-rw-r--r--.travis.yml8
-rw-r--r--Makefile4
-rw-r--r--go/bls/bls.go (renamed from go/blscgo/bls.go)2
-rw-r--r--go/bls/bls_test.go344
-rw-r--r--go/main_test.go214
5 files changed, 351 insertions, 221 deletions
diff --git a/.travis.yml b/.travis.yml
index fe05a98..47b30bf 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,10 +7,10 @@ compiler:
before_install:
- sudo apt install -y libgmp-dev
script:
- - git clone https://github.com/herumi/cybozulib.git
- - git clone https://github.com/herumi/xbyak.git
- - git clone https://github.com/herumi/mcl.git
- - git clone https://github.com/herumi/bls.git
+ - git clone --depth 1 https://github.com/herumi/cybozulib.git
+ - git clone --depth 1 https://github.com/herumi/xbyak.git
+ - git clone --depth 1 https://github.com/herumi/mcl.git
+ - git clone --depth 1 https://github.com/herumi/bls.git
- cd bls
- make UNIT=4 test run_go
- make clean
diff --git a/Makefile b/Makefile
index d8bf027..1e2e216 100644
--- a/Makefile
+++ b/Makefile
@@ -65,8 +65,8 @@ test: $(TEST_EXE)
@sh -ec 'for i in $(TEST_EXE); do $$i|grep "ctest:name"; done' > result.txt
@grep -v "ng=0, exception=0" result.txt; if [ $$? -eq 1 ]; then echo "all unit tests succeed"; else exit 1; fi
-run_go: go/main_test.go $(BLS_LIB) $(BLS_IF_LIB)
- cd go && go test -tags $(GO_TAG) -v .
+run_go: go/bls/bls.go go/bls/bls_test.go $(BLS_LIB) $(BLS_IF_LIB)
+ cd go/bls && go test -tags $(GO_TAG) -v .
clean:
$(RM) $(BLS_LIB) $(OBJ_DIR)/*.d $(OBJ_DIR)/*.o $(EXE_DIR)/*.exe $(GEN_EXE) $(ASM_SRC) $(ASM_OBJ) $(LIB_OBJ) $(LLVM_SRC) $(BLS_IF_LIB)
diff --git a/go/blscgo/bls.go b/go/bls/bls.go
index ae16a4c..4dcd662 100644
--- a/go/blscgo/bls.go
+++ b/go/bls/bls.go
@@ -1,4 +1,4 @@
-package blscgo
+package bls
/*
#cgo CFLAGS:-I../../include -DBLS_MAX_OP_UNIT_SIZE=6
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)
+ }
+}
diff --git a/go/main_test.go b/go/main_test.go
deleted file mode 100644
index b5069c3..0000000
--- a/go/main_test.go
+++ /dev/null
@@ -1,214 +0,0 @@
-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)
- 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 testData(t *testing.T) {
- var sec1, sec2 blscgo.SecretKey
- sec1.Init()
- s := sec1.GetData()
- sec2.SetData(s)
- if !sec1.IsSame(&sec2) {
- t.Fatal("SecretKey not same")
- }
- pub1 := sec1.GetPublicKey()
- s = pub1.GetData()
- var pub2 blscgo.PublicKey
- pub2.SetData(s)
- if !pub1.IsSame(&pub2) {
- t.Fatal("PublicKey not same")
- }
- m := "doremi"
- sign1 := sec1.Sign(m)
- s = sign1.GetData()
- var sign2 blscgo.Sign
- sign2.SetData(s)
- if !sign1.IsSame(&sign2) {
- t.Fatal("Sign not same")
- }
-}
-
-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)
- testData(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)
- }
-}