aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt6
-rw-r--r--ffi/go/bls/bls.go34
-rw-r--r--ffi/go/bls/bls_test.go36
-rw-r--r--ffi/go/bls/callback.go12
-rw-r--r--test/bls_test.hpp37
5 files changed, 122 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b5aa0ff..dcb91fa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,8 +24,8 @@ install(TARGETS bls_c384_256 DESTINATION lib)
install(FILES ${BLS_HEADERS} DESTINATION include/bls)
add_executable(bls_c256_test test/bls_c256_test.cpp)
-target_link_libraries(bls_c256_test bls_c256)
+target_link_libraries(bls_c256_test bls_c256 pthread)
add_executable(bls_c384_test test/bls_c384_test.cpp)
-target_link_libraries(bls_c384_test bls_c384)
+target_link_libraries(bls_c384_test bls_c384 pthread)
add_executable(bls_c384_256_test test/bls_c384_256_test.cpp)
-target_link_libraries(bls_c384_256_test bls_c384_256)
+target_link_libraries(bls_c384_256_test bls_c384_256 pthread)
diff --git a/ffi/go/bls/bls.go b/ffi/go/bls/bls.go
index 425a68c..a49b7ef 100644
--- a/ffi/go/bls/bls.go
+++ b/ffi/go/bls/bls.go
@@ -10,11 +10,14 @@ package bls
#cgo LDFLAGS:-lbls384
#cgo LDFLAGS:-lcrypto -lgmp -lgmpxx -lstdc++
#include "config.h"
+typedef unsigned int (*ReadRandFunc)(void *, void *, unsigned int);
+int wrapReadRandCgo(void *self, void *buf, unsigned int n);
#include <bls/bls.h>
*/
import "C"
import "fmt"
import "unsafe"
+import "io"
// Init --
// call this function before calling all the other operations
@@ -396,3 +399,34 @@ func (sign *Sign) VerifyAggregateHashes(pubVec []PublicKey, hash [][]byte) bool
}
return C.blsVerifyAggregatedHashes(sign.getPointer(), pubVec[0].getPointer(), unsafe.Pointer(&h[0]), C.size_t(hashByte), C.size_t(n)) == 1
}
+
+///
+
+var s_randReader io.Reader
+
+func createSlice(buf *C.char, n C.uint) []byte {
+ size := int(n)
+ return (*[1 << 30]byte)(unsafe.Pointer(buf))[:size:size]
+}
+
+// this function can't be put in callback.go
+//export wrapReadRandGo
+func wrapReadRandGo(buf *C.char, n C.uint) C.uint {
+ slice := createSlice(buf, n)
+ ret, err := s_randReader.Read(slice)
+ if ret == int(n) && err == nil {
+ return n
+ }
+ return 0
+}
+
+// SetRandFunc --
+func SetRandFunc(randReader io.Reader) {
+ s_randReader = randReader
+ if randReader != nil {
+ C.blsSetRandFunc(nil, C.ReadRandFunc(unsafe.Pointer(C.wrapReadRandCgo)))
+ } else {
+ // use default random generator
+ C.blsSetRandFunc(nil, C.ReadRandFunc(unsafe.Pointer(nil)))
+ }
+}
diff --git a/ffi/go/bls/bls_test.go b/ffi/go/bls/bls_test.go
index 84c8be2..a13ee02 100644
--- a/ffi/go/bls/bls_test.go
+++ b/ffi/go/bls/bls_test.go
@@ -5,6 +5,7 @@ import "strconv"
import "crypto/sha256"
import "crypto/sha512"
import "fmt"
+import "crypto/rand"
var unitN = 0
@@ -448,6 +449,40 @@ func testAggregateHashes(t *testing.T) {
}
}
+type SeqRead struct {
+}
+
+func (self *SeqRead) Read(buf []byte) (int, error) {
+ n := len(buf)
+ for i := 0; i < n; i++ {
+ buf[i] = byte(i)
+ }
+ return n, nil
+}
+
+func testReadRand(t *testing.T) {
+ s1 := new(SeqRead)
+ SetRandFunc(s1)
+ var sec SecretKey
+ sec.SetByCSPRNG()
+ buf := sec.GetLittleEndian()
+ fmt.Printf("(SeqRead) buf=%x\n", buf)
+ for i := 0; i < len(buf)-1; i++ {
+ // ommit buf[len(buf) - 1] because it may be masked
+ if buf[i] != byte(i) {
+ t.Fatal("buf")
+ }
+ }
+ SetRandFunc(rand.Reader)
+ sec.SetByCSPRNG()
+ buf = sec.GetLittleEndian()
+ fmt.Printf("(rand.Reader) buf=%x\n", buf)
+ SetRandFunc(nil)
+ sec.SetByCSPRNG()
+ buf = sec.GetLittleEndian()
+ fmt.Printf("(default) buf=%x\n", buf)
+}
+
func test(t *testing.T, c int) {
err := Init(c)
if err != nil {
@@ -455,6 +490,7 @@ func test(t *testing.T, c int) {
}
unitN = GetOpUnitSize()
t.Logf("unitN=%d\n", unitN)
+ testReadRand(t)
testPre(t)
testRecoverSecretKey(t)
testAdd(t)
diff --git a/ffi/go/bls/callback.go b/ffi/go/bls/callback.go
new file mode 100644
index 0000000..ba73a5e
--- /dev/null
+++ b/ffi/go/bls/callback.go
@@ -0,0 +1,12 @@
+package bls
+
+/*
+// exported from bls.go
+unsigned int wrapReadRandGo(void *buf, unsigned int n);
+int wrapReadRandCgo(void *self, void *buf, unsigned int n)
+{
+ (void)self;
+ return wrapReadRandGo(buf, n);
+}
+*/
+import "C"
diff --git a/test/bls_test.hpp b/test/bls_test.hpp
index 58ab475..ad91020 100644
--- a/test/bls_test.hpp
+++ b/test/bls_test.hpp
@@ -461,6 +461,42 @@ void verifyAggregateTest()
CYBOZU_TEST_ASSERT(!sig.verifyAggregatedHashes(pubs, h.data(), sizeofHash, n));
}
+unsigned int writeSeq(void *self, void *buf, unsigned int bufSize)
+{
+ int& seq = *(int*)self;
+ char *p = (char *)buf;
+ for (unsigned int i = 0; i < bufSize; i++) {
+ p[i] = char(seq++);
+ }
+ return bufSize;
+}
+
+void setRandFuncTest()
+{
+ blsSecretKey sec;
+ const int seqInit1 = 5;
+ int seq = seqInit1;
+ blsSetRandFunc(&seq, writeSeq);
+ blsSecretKeySetByCSPRNG(&sec);
+ unsigned char buf[128];
+ size_t n = blsSecretKeySerialize(buf, sizeof(buf), &sec);
+ CYBOZU_TEST_ASSERT(n > 0);
+ for (size_t i = 0; i < n - 1; i++) {
+ // ommit buf[n - 1] because it may be masked
+ CYBOZU_TEST_EQUAL(buf[i], seqInit1 + i);
+ }
+ // use default CSPRNG
+ blsSetRandFunc(0, 0);
+ blsSecretKeySetByCSPRNG(&sec);
+ n = blsSecretKeySerialize(buf, sizeof(buf), &sec);
+ CYBOZU_TEST_ASSERT(n > 0);
+ printf("sec=");
+ for (size_t i = 0; i < n; i++) {
+ printf("%02x", buf[i]);
+ }
+ printf("\n");
+}
+
void testAll()
{
blsTest();
@@ -470,6 +506,7 @@ void testAll()
dataTest();
aggregateTest();
verifyAggregateTest();
+ setRandFuncTest();
}
CYBOZU_TEST_AUTO(all)
{