From ff93ffa10763d5d8419649557e526d65860fb914 Mon Sep 17 00:00:00 2001 From: MITSUNARI Shigeo Date: Sun, 7 May 2017 10:47:42 +0900 Subject: refactor getter/setter --- go/bls/bls.go | 212 ++++++++++++++++++++++++++++++++--------------------- go/bls/bls_test.go | 58 ++++++++++----- 2 files changed, 166 insertions(+), 104 deletions(-) (limited to 'go/bls') diff --git a/go/bls/bls.go b/go/bls/bls.go index a62cddd..ea6607e 100644 --- a/go/bls/bls.go +++ b/go/bls/bls.go @@ -10,6 +10,7 @@ package bls import "C" import "fmt" import "unsafe" +import "encoding/hex" // CurveFp254BNb -- 254 bit curve const CurveFp254BNb = 0 @@ -70,28 +71,62 @@ func (id *ID) getPointer() (p *C.blsId) { return (*C.blsId)(unsafe.Pointer(&id.v[0])) } -// GetString -- -func (id *ID) GetString(ioMode int) string { +// GetByte +func (id *ID) GetByte(ioMode int) []byte { buf := make([]byte, 1024) // #nosec n := C.blsIdGetStr(id.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if n == 0 { panic("implementation err. size of buf is small") } - return string(buf[:n]) + return buf[:n] } -// SetStr -- -func (id *ID) SetStr(s string, ioMode int) error { - buf := []byte(s) +// SetByte -- +func (id *ID) SetByte(buf []byte, ioMode int) error { // #nosec err := C.blsIdSetStr(id.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if err > 0 { - return fmt.Errorf("bad string:%s", s) + return fmt.Errorf("bad byte:%x", buf) } return nil } +// Serialize +func (id *ID) Serialize() []byte { + return id.GetByte(C.BlsIoEcComp) +} + +// Deserialize +func (id *ID) Deserialize(b []byte) error { + return id.SetByte(b, C.BlsIoEcComp) +} + +// GetHexString +func (id *ID) GetHexString() string { + return string(id.GetByte(16)) +} + +// GetDecString +func (id *ID) GetDecString() string { + return string(id.GetByte(10)) +} + +// SetHexString +func (id *ID) SetHexString(s string) error { + return id.SetByte([]byte(s), 16) +} + +// SetDecString +func (id *ID) SetDecString(s string) error { + return id.SetByte([]byte(s), 10) +} + +// IsSame -- +func (id *ID) IsSame(rhs *ID) bool { + return C.blsIdIsSame(id.getPointer(), rhs.getPointer()) == 1 +} + // Set -- func (id *ID) Set(v []uint64) { expect := GetOpUnitSize() @@ -113,48 +148,55 @@ func (sec *SecretKey) getPointer() (p *C.blsSecretKey) { return (*C.blsSecretKey)(unsafe.Pointer(&sec.v[0])) } -// GetString -- -func (sec *SecretKey) GetString(ioMode int) string { +// GetByte +func (sec *SecretKey) GetByte(ioMode int) []byte { buf := make([]byte, 1024) // #nosec n := C.blsSecretKeyGetStr(sec.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if n == 0 { panic("implementation err. size of buf is small") } - return string(buf[:n]) + return buf[:n] } -// SetStr -- The string passed in is a number and can be either hex or decimal -func (sec *SecretKey) SetStr(s string, ioMode int) error { - buf := []byte(s) +// SetByte -- +func (sec *SecretKey) SetByte(buf []byte, ioMode int) error { // #nosec err := C.blsSecretKeySetStr(sec.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if err > 0 { - return fmt.Errorf("bad string:%s", s) + return fmt.Errorf("bad byte:%x", buf) } return nil } -// SetData -- -func (sec *SecretKey) SetData(buf []byte) error { - // #nosec - err := C.blsSecretKeySetStr(sec.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.BlsIoEcComp) - if err > 0 { - return fmt.Errorf("bad buf:%s", buf) - } - return nil +// Serialize +func (sec *SecretKey) Serialize() []byte { + return sec.GetByte(C.BlsIoEcComp) } -// GetData -- -func (sec *SecretKey) GetData() []byte { - fpSize := GetOpUnitSize() * 8 - buf := make([]byte, fpSize) - // #nosec - n := C.blsSecretKeyGetStr(sec.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.BlsIoEcComp) - if n != C.size_t(fpSize) { - panic("implementation err. size of buf is small") - } - return buf +// Deserialize +func (sec *SecretKey) Deserialize(b []byte) error { + return sec.SetByte(b, C.BlsIoEcComp) +} + +// GetHexString +func (sec *SecretKey) GetHexString() string { + return string(sec.GetByte(16)) +} + +// GetDecString +func (sec *SecretKey) GetDecString() string { + return string(sec.GetByte(10)) +} + +// SetHexString +func (sec *SecretKey) SetHexString(s string) error { + return sec.SetByte([]byte(s), 16) +} + +// SetDecString +func (sec *SecretKey) SetDecString(s string) error { + return sec.SetByte([]byte(s), 10) } // IsSame -- @@ -230,48 +272,49 @@ func (pub *PublicKey) getPointer() (p *C.blsPublicKey) { return (*C.blsPublicKey)(unsafe.Pointer(&pub.v[0])) } -// GetString -- -func (pub *PublicKey) GetString(ioMode int) string { +// GetByte +func (pub *PublicKey) GetByte(ioMode int) []byte { buf := make([]byte, 1024) - // #nosec + // #nopub n := C.blsPublicKeyGetStr(pub.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if n == 0 { panic("implementation err. size of buf is small") } - return string(buf[:n]) + return buf[:n] } -// SetStr -- -func (pub *PublicKey) SetStr(s string, ioMode int) error { - buf := []byte(s) - // #nosec +// SetByte -- +func (pub *PublicKey) SetByte(buf []byte, ioMode int) error { + // #nopub err := C.blsPublicKeySetStr(pub.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if err > 0 { - return fmt.Errorf("bad string:%s", s) + return fmt.Errorf("bad byte:%x", buf) } return nil } -// SetData -- -func (pub *PublicKey) SetData(buf []byte) error { - // #nosec - err := C.blsPublicKeySetStr(pub.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.BlsIoEcComp) - if err > 0 { - return fmt.Errorf("bad buf:%s", buf) - } - return nil +// Serialize +func (pub *PublicKey) Serialize() []byte { + return pub.GetByte(C.BlsIoEcComp) } -// GetData -- -func (pub *PublicKey) GetData() []byte { - fpSize := GetOpUnitSize() * 8 - buf := make([]byte, fpSize*2) - // #nosec - n := C.blsPublicKeyGetStr(pub.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.BlsIoEcComp) - if n != C.size_t(fpSize*2) { - panic("implementation err. size of buf is small") +// Deserialize +func (pub *PublicKey) Deserialize(b []byte) error { + return pub.SetByte(b, C.BlsIoEcComp) +} + +// GetHexString +func (pub *PublicKey) GetHexString() string { + return fmt.Sprintf("%x", pub.Serialize()) +} + +// SetStr +func (pub *PublicKey) SetStr(s string) error { + b, err := hex.DecodeString(s) + if err != nil { + return err } - return buf + return pub.Deserialize(b) } // IsSame -- @@ -305,48 +348,49 @@ func (sign *Sign) getPointer() (p *C.blsSign) { return (*C.blsSign)(unsafe.Pointer(&sign.v[0])) } -// GetString -- -func (sign *Sign) GetString(ioMode int) string { +// GetByte +func (sign *Sign) GetByte(ioMode int) []byte { buf := make([]byte, 1024) - // #nosec + // #nosign n := C.blsSignGetStr(sign.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if n == 0 { panic("implementation err. size of buf is small") } - return string(buf[:n]) + return buf[:n] } -// SetStr -- -func (sign *Sign) SetStr(s string, ioMode int) error { - buf := []byte(s) - // #nosec +// SetByte -- +func (sign *Sign) SetByte(buf []byte, ioMode int) error { + // #nosign err := C.blsSignSetStr(sign.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.int(ioMode)) if err > 0 { - return fmt.Errorf("bad string:%s", s) + return fmt.Errorf("bad byte:%x", buf) } return nil } -// SetData -- -func (sign *Sign) SetData(buf []byte) error { - // #nosec - err := C.blsSignSetStr(sign.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.BlsIoEcComp) - if err > 0 { - return fmt.Errorf("bad buf:%s", buf) - } - return nil +// Serialize +func (sign *Sign) Serialize() []byte { + return sign.GetByte(C.BlsIoEcComp) } -// GetData -- -func (sign *Sign) GetData() []byte { - fpSize := GetOpUnitSize() * 8 - buf := make([]byte, fpSize) - // #nosec - n := C.blsSignGetStr(sign.getPointer(), (*C.char)(unsafe.Pointer(&buf[0])), C.size_t(len(buf)), C.BlsIoEcComp) - if n != C.size_t(fpSize) { - panic("implementation err. size of buf is small") +// Deserialize +func (sign *Sign) Deserialize(b []byte) error { + return sign.SetByte(b, C.BlsIoEcComp) +} + +// GetHexString +func (sign *Sign) GetHexString() string { + return fmt.Sprintf("%x", sign.Serialize()) +} + +// SetStr +func (sign *Sign) SetStr(s string) error { + b, err := hex.DecodeString(s) + if err != nil { + return err } - return buf + return sign.Deserialize(b) } // IsSame -- diff --git a/go/bls/bls_test.go b/go/bls/bls_test.go index 1a325d1..4e79f08 100644 --- a/go/bls/bls_test.go +++ b/go/bls/bls_test.go @@ -15,11 +15,20 @@ func testPre(t *testing.T) { t.Log("id :", id) var id2 ID - err := id2.SetStr(id.GetString(10), 10) + err := id2.SetHexString(id.GetHexString()) if err != nil { t.Fatal(err) } - t.Log("id2:", id2) + if !id.IsSame(&id2) { + t.Errorf("not same id", id.GetHexString(), id2.GetHexString()) + } + err = id2.SetDecString(id.GetDecString()) + if err != nil { + t.Fatal(err) + } + if !id.IsSame(&id2) { + t.Errorf("not same id", id.GetDecString(), id2.GetDecString()) + } } { var sec SecretKey @@ -46,7 +55,7 @@ func testPre(t *testing.T) { sec := make([]SecretKey, 3) for i := 0; i < len(sec); i++ { sec[i].Init() - t.Log("sec=", sec[i].GetString(16)) + t.Log("sec=", sec[i].GetHexString()) } } } @@ -60,11 +69,20 @@ func testStringConversion(t *testing.T) { } else { s = "40804142231733909759579603404752749028378864165570215949" } - err := sec.SetStr(s, 10) + err := sec.SetDecString(s) + if err != nil { + t.Fatal(err) + } + if s != sec.GetDecString() { + t.Error("not equal") + } + s = sec.GetHexString() + var sec2 SecretKey + err = sec2.SetHexString(s) if err != nil { t.Fatal(err) } - if s != sec.GetString(10) { + if !sec.IsSame(&sec2) { t.Error("not equal") } } @@ -88,8 +106,8 @@ func testRecoverSecretKey(t *testing.T) { // recover sec2 from secVec and idVec var sec2 SecretKey sec2.Recover(secVec, idVec) - if sec.GetString(16) != sec2.GetString(16) { - t.Errorf("Mismatch in recovered secret key:\n %s\n %s.", sec.GetString(16), sec2.GetString(16)) + if !sec.IsSame(&sec2) { + t.Errorf("Mismatch in recovered secret key:\n %s\n %s.", sec.GetHexString(), sec2.GetHexString()) } } @@ -119,15 +137,15 @@ func testSign(t *testing.T) { 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].GetString(16)) + t.Logf("idVec[%d]=%s\n", i, idVec[i].GetHexString()) secVec[i].Set(msk, &idVec[i]) pubVec[i].Set(mpk, &idVec[i]) - t.Logf("pubVec[%d]=%s\n", i, pubVec[i].GetString(16)) + t.Logf("pubVec[%d]=%s\n", i, pubVec[i].GetHexString()) - if pubVec[i].GetString(16) != secVec[i].GetPublicKey().GetString(16) { - t.Error("Pubkey derivation does not match") + if !pubVec[i].IsSame(secVec[i].GetPublicKey()) { + t.Errorf("Pubkey derivation does not match\n%s\n%s", pubVec[i].GetHexString(), secVec[i].GetPublicKey().GetHexString()) } signVec[i] = *secVec[i].Sign(m) @@ -137,17 +155,17 @@ func testSign(t *testing.T) { } var sec1 SecretKey sec1.Recover(secVec, idVec) - if sec0.GetString(16) != sec1.GetString(16) { + if !sec0.IsSame(&sec1) { t.Error("Mismatch in recovered seckey.") } var pub1 PublicKey pub1.Recover(pubVec, idVec) - if pub0.GetString(16) != pub1.GetString(16) { + if !pub0.IsSame(&pub1) { t.Error("Mismatch in recovered pubkey.") } var s1 Sign s1.Recover(signVec, idVec) - if s0.GetString(16) != s1.GetString(16) { + if !s0.IsSame(&s1) { t.Error("Mismatch in recovered signature.") } } @@ -193,8 +211,8 @@ func testData(t *testing.T) { t.Log("testData") var sec1, sec2 SecretKey sec1.Init() - s := sec1.GetData() - err := sec2.SetData(s) + b := sec1.Serialize() + err := sec2.Deserialize(b) if err != nil { t.Fatal(err) } @@ -202,9 +220,9 @@ func testData(t *testing.T) { t.Error("SecretKey not same") } pub1 := sec1.GetPublicKey() - s = pub1.GetData() + b = pub1.Serialize() var pub2 PublicKey - err = pub2.SetData(s) + err = pub2.Deserialize(b) if err != nil { t.Fatal(err) } @@ -213,9 +231,9 @@ func testData(t *testing.T) { } m := "doremi" sign1 := sec1.Sign(m) - s = sign1.GetData() + b = sign1.Serialize() var sign2 Sign - err = sign2.SetData(s) + err = sign2.Deserialize(b) if err != nil { t.Fatal(err) } -- cgit v1.2.3