Skip to content
This repository was archived by the owner on Jul 6, 2019. It is now read-only.

Commit 4f87a00

Browse files
committed
Merge branch 'master' of github.com:herumi/mcl
2 parents 2bb6b1d + 951f571 commit 4f87a00

29 files changed

+1371
-644
lines changed

.travis.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
sudo: false
1+
sudo: true
22
dist: trusty
33
language: cpp
44
compiler:
@@ -9,7 +9,7 @@ addons:
99
packages:
1010
- libgmp-dev
1111
script:
12-
- make test DEBUG=1 -j3
12+
- make test_ci DEBUG=1 -j3
1313
- make clean
1414
- make test_go
1515

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ if(NOT MSVC)
8989
add_library(mcl_dy SHARED ${SRCS})
9090
endif()
9191

92-
file(GLOB MCL_HEADERS include/mcl/*.hpp include/mcl/*.h)
92+
file(GLOB MCL_HEADERS include/mcl/*.hpp include/mcl/bn.h include/mcl/curve_type.h)
9393
file(GLOB CYBOZULIB_HEADERS include/cybozu/*.hpp)
9494

9595
install(TARGETS mcl DESTINATION lib)

Makefile

+24-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ OBJ_DIR=obj
44
EXE_DIR=bin
55
SRC_SRC=fp.cpp bn_c256.cpp bn_c384.cpp bn_c512.cpp she_c256.cpp
66
TEST_SRC=fp_test.cpp ec_test.cpp fp_util_test.cpp window_method_test.cpp elgamal_test.cpp fp_tower_test.cpp gmp_test.cpp bn_test.cpp bn384_test.cpp glv_test.cpp paillier_test.cpp she_test.cpp vint_test.cpp bn512_test.cpp ecdsa_test.cpp conversion_test.cpp
7-
TEST_SRC+=bn_c256_test.cpp bn_c384_test.cpp bn_c512_test.cpp she_c256_test.cpp she_c384_test.cpp
7+
TEST_SRC+=bn_c256_test.cpp bn_c384_test.cpp bn_c384_256_test.cpp bn_c512_test.cpp she_c256_test.cpp she_c384_test.cpp
88
TEST_SRC+=aggregate_sig_test.cpp array_test.cpp
99
TEST_SRC+=bls12_test.cpp
1010
TEST_SRC+=ecdsa_c_test.cpp
@@ -32,19 +32,22 @@ MCL_LIB=$(LIB_DIR)/libmcl.a
3232
MCL_SNAME=mcl$(SHARE_BASENAME_SUF)
3333
BN256_SNAME=mclbn256$(SHARE_BASENAME_SUF)
3434
BN384_SNAME=mclbn384$(SHARE_BASENAME_SUF)
35+
BN384_256_SNAME=mclbn384_256$(SHARE_BASENAME_SUF)
3536
BN512_SNAME=mclbn512$(SHARE_BASENAME_SUF)
3637
SHE256_SNAME=mclshe256$(SHARE_BASENAME_SUF)
3738
MCL_SLIB=$(LIB_DIR)/lib$(MCL_SNAME).$(LIB_SUF)
3839
BN256_LIB=$(LIB_DIR)/libmclbn256.a
3940
BN256_SLIB=$(LIB_DIR)/lib$(BN256_SNAME).$(LIB_SUF)
4041
BN384_LIB=$(LIB_DIR)/libmclbn384.a
4142
BN384_SLIB=$(LIB_DIR)/lib$(BN384_SNAME).$(LIB_SUF)
43+
BN384_256_LIB=$(LIB_DIR)/libmclbn384_256.a
44+
BN384_256_SLIB=$(LIB_DIR)/lib$(BN384_256_SNAME).$(LIB_SUF)
4245
BN512_LIB=$(LIB_DIR)/libmclbn512.a
4346
BN512_SLIB=$(LIB_DIR)/lib$(BN512_SNAME).$(LIB_SUF)
4447
SHE256_LIB=$(LIB_DIR)/libmclshe256.a
4548
SHE384_LIB=$(LIB_DIR)/libmclshe384.a
4649
ECDSA_LIB=$(LIB_DIR)/libmclecdsa.a
47-
all: $(MCL_LIB) $(MCL_SLIB) $(BN256_LIB) $(BN256_SLIB) $(BN384_LIB) $(BN384_SLIB) $(BN512_LIB) $(BN512_SLIB) $(SHE256_LIB) $(SHE384_lib) $(ECDSA_LIB)
50+
all: $(MCL_LIB) $(MCL_SLIB) $(BN256_LIB) $(BN256_SLIB) $(BN384_LIB) $(BN384_SLIB) $(BN384_256_LIB) $(BN384_256_SLIB) $(BN512_LIB) $(BN512_SLIB) $(SHE256_LIB) $(SHE384_lib) $(ECDSA_LIB)
4851

4952
#LLVM_VER=-3.8
5053
LLVM_LLC=llc$(LLVM_VER)
@@ -69,6 +72,7 @@ ASM_OBJ=$(OBJ_DIR)/$(CPU).o
6972
LIB_OBJ=$(OBJ_DIR)/fp.o
7073
BN256_OBJ=$(OBJ_DIR)/bn_c256.o
7174
BN384_OBJ=$(OBJ_DIR)/bn_c384.o
75+
BN384_256_OBJ=$(OBJ_DIR)/bn_c384_256.o
7276
BN512_OBJ=$(OBJ_DIR)/bn_c512.o
7377
SHE256_OBJ=$(OBJ_DIR)/she_c256.o
7478
SHE384_OBJ=$(OBJ_DIR)/she_c384.o
@@ -115,12 +119,14 @@ endif
115119
ifneq ($(findstring $(OS),mac/mingw64),)
116120
BN256_SLIB_LDFLAGS+=-l$(MCL_SNAME) -L./lib
117121
BN384_SLIB_LDFLAGS+=-l$(MCL_SNAME) -L./lib
122+
BN384_256_SLIB_LDFLAGS+=-l$(MCL_SNAME) -L./lib
118123
BN512_SLIB_LDFLAGS+=-l$(MCL_SNAME) -L./lib
119124
endif
120125
ifeq ($(OS),mingw64)
121126
MCL_SLIB_LDFLAGS+=-Wl,--out-implib,$(LIB_DIR)/lib$(MCL_SNAME).a
122127
BN256_SLIB_LDFLAGS+=-Wl,--out-implib,$(LIB_DIR)/lib$(BN256_SNAME).a
123128
BN384_SLIB_LDFLAGS+=-Wl,--out-implib,$(LIB_DIR)/lib$(BN384_SNAME).a
129+
BN384_256_SLIB_LDFLAGS+=-Wl,--out-implib,$(LIB_DIR)/lib$(BN384_256_SNAME).a
124130
BN512_SLIB_LDFLAGS+=-Wl,--out-implib,$(LIB_DIR)/lib$(BN512_SNAME).a
125131
endif
126132

@@ -148,12 +154,18 @@ $(BN256_SLIB): $(BN256_OBJ) $(MCL_SLIB)
148154
$(BN384_LIB): $(BN384_OBJ)
149155
$(AR) $@ $(BN384_OBJ)
150156

157+
$(BN384_256_LIB): $(BN384_256_OBJ)
158+
$(AR) $@ $(BN384_256_OBJ)
159+
151160
$(BN512_LIB): $(BN512_OBJ)
152161
$(AR) $@ $(BN512_OBJ)
153162

154163
$(BN384_SLIB): $(BN384_OBJ) $(MCL_SLIB)
155164
$(PRE)$(CXX) -o $@ $(BN384_OBJ) -shared $(LDFLAGS) $(BN384_SLIB_LDFLAGS)
156165

166+
$(BN384_256_SLIB): $(BN384_256_OBJ) $(MCL_SLIB)
167+
$(PRE)$(CXX) -o $@ $(BN384_256_OBJ) -shared $(LDFLAGS) $(BN384_256_SLIB_LDFLAGS)
168+
157169
$(BN512_SLIB): $(BN512_OBJ) $(MCL_SLIB)
158170
$(PRE)$(CXX) -o $@ $(BN512_OBJ) -shared $(LDFLAGS) $(BN512_SLIB_LDFLAGS)
159171

@@ -235,6 +247,9 @@ $(EXE_DIR)/bn_c256_test.exe: $(OBJ_DIR)/bn_c256_test.o $(BN256_LIB) $(MCL_LIB)
235247
$(EXE_DIR)/bn_c384_test.exe: $(OBJ_DIR)/bn_c384_test.o $(BN384_LIB) $(MCL_LIB)
236248
$(PRE)$(CXX) $< -o $@ $(BN384_LIB) $(MCL_LIB) $(LDFLAGS)
237249

250+
$(EXE_DIR)/bn_c384_256_test.exe: $(OBJ_DIR)/bn_c384_256_test.o $(BN384_256_LIB) $(MCL_LIB)
251+
$(PRE)$(CXX) $< -o $@ $(BN384_256_LIB) $(MCL_LIB) $(LDFLAGS)
252+
238253
$(EXE_DIR)/bn_c512_test.exe: $(OBJ_DIR)/bn_c512_test.o $(BN512_LIB) $(MCL_LIB)
239254
$(PRE)$(CXX) $< -o $@ $(BN512_LIB) $(MCL_LIB) $(LDFLAGS)
240255

@@ -254,6 +269,8 @@ SAMPLE_EXE=$(addprefix $(EXE_DIR)/,$(addsuffix .exe,$(basename $(SAMPLE_SRC))))
254269
sample: $(SAMPLE_EXE) $(MCL_LIB)
255270

256271
TEST_EXE=$(addprefix $(EXE_DIR)/,$(TEST_SRC:.cpp=.exe))
272+
test_ci: $(TEST_EXE)
273+
@sh -ec 'for i in $(TEST_EXE); do echo $$i; env LSAN_OPTIONS=verbosity=1:log_threads=1 $$i; done'
257274
test: $(TEST_EXE)
258275
@echo test $(TEST_EXE)
259276
@sh -ec 'for i in $(TEST_EXE); do $$i|grep "ctest:name"; done' > result.txt
@@ -264,8 +281,8 @@ EMCC_OPT+=-O3 -DNDEBUG -DMCLSHE_WIN_SIZE=8
264281
EMCC_OPT+=-s WASM=1 -s NO_EXIT_RUNTIME=1 -s MODULARIZE=1 #-s ASSERTIONS=1
265282
EMCC_OPT+=-DCYBOZU_MINIMUM_EXCEPTION
266283
EMCC_OPT+=-s ABORTING_MALLOC=0
267-
SHE_C_DEP=src/fp.cpp src/she_c_impl.hpp include/mcl/she.hpp include/mcl/she.h Makefile
268-
MCL_C_DEP=src/fp.cpp src/bn_c_impl.hpp include/mcl/bn.hpp include/mcl/bn.h Makefile
284+
SHE_C_DEP=src/fp.cpp src/she_c_impl.hpp include/mcl/she.hpp include/mcl/fp.hpp include/mcl/op.hpp include/mcl/she.h Makefile
285+
MCL_C_DEP=src/fp.cpp src/bn_c_impl.hpp include/mcl/bn.hpp include/mcl/fp.hpp include/mcl/op.hpp include/mcl/bn.h Makefile
269286
ifeq ($(MCL_USE_LLVM),2)
270287
EMCC_OPT+=src/base64m.ll -DMCL_USE_LLVM
271288
SHE_C_DEP+=src/base64m.ll
@@ -313,9 +330,11 @@ make_tbl:
313330
update_xbyak:
314331
cp -a ../xbyak/xbyak/xbyak.h ../xbyak/xbyak/xbyak_util.h ../xbyak/xbyak/xbyak_mnemonic.h src/xbyak/
315332

333+
update_cybozulib:
334+
cp -a $(addprefix ../cybozulib/,$(wildcard include/cybozu/*.hpp)) include/cybozu/
316335

317336
clean:
318-
$(RM) $(MCL_LIB) $(MCL_SLIB) $(BN256_LIB) $(BN256_SLIB) $(BN384_LIB) $(BN384_SLIB) $(BN512_LIB) $(BN512_SLIB) $(SHE256_LIB) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d $(EXE_DIR)/*.exe $(GEN_EXE) $(ASM_OBJ) $(LIB_OBJ) $(BN256_OBJ) $(BN384_OBJ) $(BN512_OBJ) $(LLVM_SRC) $(FUNC_LIST) src/*.ll lib/*.a
337+
$(RM) $(LIB_DIR)/*.a $(EXE_DIR)/*.$(LIB_SUF) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d $(EXE_DIR)/*.exe $(GEN_EXE) $(ASM_OBJ) $(LIB_OBJ) $(BN256_OBJ) $(BN384_OBJ) $(BN512_OBJ) $(LLVM_SRC) $(FUNC_LIST) src/*.ll lib/*.a
319338

320339
ALL_SRC=$(SRC_SRC) $(TEST_SRC) $(SAMPLE_SRC)
321340
DEPEND_FILE=$(addprefix $(OBJ_DIR)/, $(addsuffix .d,$(basename $(ALL_SRC))))

common.mk

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ else
7878
endif
7979
ifeq ($(MARCH),)
8080
ifeq ($(INTEL),1)
81-
CFLAGS_OPT+=-march=native
81+
# CFLAGS_OPT+=-march=native
8282
endif
8383
else
8484
CFLAGS_OPT+=$(MARCH)

include/cybozu/random_generator.hpp

+24-10
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,9 @@ class RandomGenerator {
5454
}
5555
throw cybozu::Exception("randomgenerator");
5656
}
57-
void read_inner(void *buf, size_t byteSize)
57+
bool read_inner(void *buf, size_t byteSize)
5858
{
59-
if (CryptGenRandom(prov_, static_cast<DWORD>(byteSize), static_cast<BYTE*>(buf)) == 0) {
60-
throw cybozu::Exception("randomgenerator:read") << byteSize;
61-
}
59+
return CryptGenRandom(prov_, static_cast<DWORD>(byteSize), static_cast<BYTE*>(buf)) != 0;
6260
}
6361
~RandomGenerator()
6462
{
@@ -71,12 +69,15 @@ class RandomGenerator {
7169
@note bufNum is not byte size
7270
*/
7371
template<class T>
74-
void read(T *buf, size_t bufNum)
72+
void read(bool *pb, T *buf, size_t bufNum)
7573
{
7674
cybozu::AutoLockCs al(cs_);
7775
const size_t byteSize = sizeof(T) * bufNum;
7876
if (byteSize > bufSize) {
79-
read_inner(buf, byteSize);
77+
if (!read_inner(buf, byteSize)) {
78+
*pb = false;
79+
return;
80+
}
8081
} else {
8182
if (pos_ + byteSize > bufSize) {
8283
read_inner(buf_, bufSize);
@@ -85,6 +86,14 @@ class RandomGenerator {
8586
memcpy(buf, buf_ + pos_, byteSize);
8687
pos_ += byteSize;
8788
}
89+
*pb = true;
90+
}
91+
template<class T>
92+
void read(T *buf, size_t bufNum)
93+
{
94+
bool b;
95+
read(&b, buf, bufNum);
96+
if (!b) throw cybozu::Exception("RandomGenerator:read") << bufNum;
8897
}
8998
private:
9099
HCRYPTPROV prov_;
@@ -107,12 +116,17 @@ class RandomGenerator {
107116
@note bufNum is not byte size
108117
*/
109118
template<class T>
110-
void read(T *buf, size_t bufNum)
119+
void read(bool *pb, T *buf, size_t bufNum)
111120
{
112121
const size_t byteSize = sizeof(T) * bufNum;
113-
if (::fread(buf, 1, (int)byteSize, fp_) != byteSize) {
114-
throw cybozu::Exception("randomgenerator:read") << byteSize;
115-
}
122+
*pb = ::fread(buf, 1, (int)byteSize, fp_) == byteSize;
123+
}
124+
template<class T>
125+
void read(T *buf, size_t bufNum)
126+
{
127+
bool b;
128+
read(&b, buf, bufNum);
129+
if (!b) throw cybozu::Exception("RandomGenerator:read") << bufNum;
116130
}
117131
#endif
118132
private:

include/cybozu/xorshift.hpp

+65-48
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,47 @@
77
@author MITSUNARI Shigeo
88
*/
99
#include <cybozu/inttype.hpp>
10+
#include <assert.h>
1011

1112
namespace cybozu {
1213

14+
namespace xorshift_local {
15+
16+
/*
17+
U is uint32_t or uint64_t
18+
*/
19+
template<class U, class Gen>
20+
void read_local(void *p, size_t n, Gen& gen, U (Gen::*f)())
21+
{
22+
uint8_t *dst = static_cast<uint8_t*>(p);
23+
const size_t uSize = sizeof(U);
24+
assert(uSize == 4 || uSize == 8);
25+
union ua {
26+
U u;
27+
uint8_t a[uSize];
28+
};
29+
30+
while (n >= uSize) {
31+
ua ua;
32+
ua.u = (gen.*f)();
33+
for (size_t i = 0; i < uSize; i++) {
34+
dst[i] = ua.a[i];
35+
}
36+
dst += uSize;
37+
n -= uSize;
38+
}
39+
assert(n < uSize);
40+
if (n > 0) {
41+
ua ua;
42+
ua.u = (gen.*f)();
43+
for (size_t i = 0; i < n; i++) {
44+
dst[i] = ua.a[i];
45+
}
46+
}
47+
}
48+
49+
} // xorshift_local
50+
1351
class XorShift {
1452
uint32_t x_, y_, z_, w_;
1553
public:
@@ -38,25 +76,18 @@ class XorShift {
3876
return (uint64_t(a) << 32) | b;
3977
}
4078
template<class T>
41-
void read(T *x, size_t n)
42-
{
43-
const size_t size = sizeof(T) * n;
44-
uint8_t *p8 = static_cast<uint8_t*>(x);
45-
for (size_t i = 0; i < size; i++) {
46-
p8[i] = static_cast<uint8_t>(get32());
47-
}
48-
}
49-
void read(uint32_t *x, size_t n)
79+
void read(bool *pb, T *p, size_t n)
5080
{
51-
for (size_t i = 0; i < n; i++) {
52-
x[i] = get32();
53-
}
81+
xorshift_local::read_local(p, n * sizeof(T), *this, &XorShift::get32);
82+
*pb = true;
5483
}
55-
void read(uint64_t *x, size_t n)
84+
template<class T>
85+
size_t read(T *p, size_t n)
5686
{
57-
for (size_t i = 0; i < n; i++) {
58-
x[i] = get64();
59-
}
87+
bool b;
88+
read(&b, p, n);
89+
(void)b;
90+
return n;
6091
}
6192
};
6293

@@ -90,25 +121,18 @@ class XorShift128Plus {
90121
return s_[1] + s0;
91122
}
92123
template<class T>
93-
void read(T *x, size_t n)
124+
void read(bool *pb, T *p, size_t n)
94125
{
95-
const size_t size = sizeof(T) * n;
96-
uint8_t *p8 = static_cast<uint8_t*>(x);
97-
for (size_t i = 0; i < size; i++) {
98-
p8[i] = static_cast<uint8_t>(get32());
99-
}
126+
xorshift_local::read_local(p, n * sizeof(T), *this, &XorShift128Plus::get64);
127+
*pb = true;
100128
}
101-
void read(uint32_t *x, size_t n)
102-
{
103-
for (size_t i = 0; i < n; i++) {
104-
x[i] = get32();
105-
}
106-
}
107-
void read(uint64_t *x, size_t n)
129+
template<class T>
130+
size_t read(T *p, size_t n)
108131
{
109-
for (size_t i = 0; i < n; i++) {
110-
x[i] = get64();
111-
}
132+
bool b;
133+
read(&b, p, n);
134+
(void)b;
135+
return n;
112136
}
113137
};
114138

@@ -147,25 +171,18 @@ class Xoroshiro128Plus {
147171
return result;
148172
}
149173
template<class T>
150-
void read(T *x, size_t n)
174+
void read(bool *pb, T *p, size_t n)
151175
{
152-
const size_t size = sizeof(T) * n;
153-
uint8_t *p8 = static_cast<uint8_t*>(x);
154-
for (size_t i = 0; i < size; i++) {
155-
p8[i] = static_cast<uint8_t>(get32());
156-
}
157-
}
158-
void read(uint32_t *x, size_t n)
159-
{
160-
for (size_t i = 0; i < n; i++) {
161-
x[i] = get32();
162-
}
176+
xorshift_local::read_local(p, n * sizeof(T), *this, &Xoroshiro128Plus::get64);
177+
*pb = true;
163178
}
164-
void read(uint64_t *x, size_t n)
179+
template<class T>
180+
size_t read(T *p, size_t n)
165181
{
166-
for (size_t i = 0; i < n; i++) {
167-
x[i] = get64();
168-
}
182+
bool b;
183+
read(&b, p, n);
184+
(void)b;
185+
return n;
169186
}
170187
};
171188

include/mcl/bn.h

+10
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,16 @@ MCLBN_DLL_API int mclBnFr_isOne(const mclBnFr *x);
219219
#ifndef MCL_DONT_USE_CSRPNG
220220
// return 0 if success
221221
MCLBN_DLL_API int mclBnFr_setByCSPRNG(mclBnFr *x);
222+
223+
/*
224+
set user-defined random function for setByCSPRNG
225+
@param self [in] user-defined pointer
226+
@param readFunc [in] user-defined function,
227+
which writes random bufSize bytes to buf and returns bufSize if success else returns 0
228+
@note if self == 0 and readFunc == 0 then set default random function
229+
@note not threadsafe
230+
*/
231+
MCLBN_DLL_API void mclBn_setRandFunc(void *self, unsigned int (*readFunc)(void *self, void *buf, unsigned int bufSize));
222232
#endif
223233

224234
// hash(s) and set x

include/mcl/bn.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ struct MapTo {
523523
mulByCofactorBN(P, P);
524524
} else {
525525
#ifdef MCL_USE_OLD_MAPTO_FOR_BLS12
526-
naiveMapTo<G1, Fp>(P, t);
526+
naiveMapTo<G2, Fp2>(P, t);
527527
#else
528528
if (!calcBN<G2, Fp2>(P, t)) return false;
529529
#endif

0 commit comments

Comments
 (0)