diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | include/bls.hpp | 18 | ||||
-rw-r--r-- | src/bls.cpp | 49 |
3 files changed, 15 insertions, 56 deletions
@@ -61,11 +61,9 @@ test: $(TEST_EXE) @grep -v "ng=0, exception=0" result.txt || echo "all unit tests are ok" run_go: go/main.go $(BLS_LIB) $(BLS_IF_LIB) +# cd go && env GODEBUG=cgocheck=0 go run main.go cd go && go run main.go -run_uncheck_go: go/main.go $(BLS_LIB) $(BLS_IF_LIB) - cd go && env GODEBUG=cgocheck=0 go run main.go - clean: $(RM) $(BLS_LIB) $(OBJ_DIR)/* $(EXE_DIR)/*.exe $(GEN_EXE) $(ASM_SRC) $(ASM_OBJ) $(LIB_OBJ) $(LLVM_SRC) $(BLS_IF_LIB) diff --git a/include/bls.hpp b/include/bls.hpp index d9ad086..cf4ea23 100644 --- a/include/bls.hpp +++ b/include/bls.hpp @@ -60,8 +60,6 @@ class Id { uint64_t self_[4]; // 256-bit friend class PublicKey; friend class SecretKey; - template<class T, class G> friend struct Wrap; - template<class T, class G> friend struct WrapPointer; template<class T, class G> friend struct WrapArray; impl::Id& getInner() { return *reinterpret_cast<impl::Id*>(self_); } const impl::Id& getInner() const { return *reinterpret_cast<const impl::Id*>(self_); } @@ -85,8 +83,6 @@ public: */ class SecretKey { uint64_t self_[4]; // 256-bit - template<class T, class G> friend struct Wrap; - template<class T, class G> friend struct WrapPointer; template<class T, class G> friend struct WrapArray; impl::SecretKey& getInner() { return *reinterpret_cast<impl::SecretKey*>(self_); } const impl::SecretKey& getInner() const { return *reinterpret_cast<const impl::SecretKey*>(self_); } @@ -119,7 +115,10 @@ public: /* set a secret key for id > 0 from msk */ - void set(const SecretKeyVec& msk, const Id& id); + void set(const SecretKeyVec& msk, const Id& id) + { + set(msk.data(), msk.size(), id); + } /* recover secretKey from k secVec */ @@ -144,8 +143,6 @@ class PublicKey { uint64_t self_[4 * 2 * 3]; // 256-bit x 2 x 3 friend class SecretKey; friend class Sign; - template<class T, class G> friend struct Wrap; - template<class T, class G> friend struct WrapPointer; template<class T, class G> friend struct WrapArray; impl::PublicKey& getInner() { return *reinterpret_cast<impl::PublicKey*>(self_); } const impl::PublicKey& getInner() const { return *reinterpret_cast<const impl::PublicKey*>(self_); } @@ -158,7 +155,10 @@ public: /* set public for id from mpk */ - void set(const PublicKeyVec& mpk, const Id& id); + void set(const PublicKeyVec& mpk, const Id& id) + { + set(mpk.data(), mpk.size(), id); + } /* recover publicKey from k pubVec */ @@ -179,8 +179,6 @@ public: class Sign { uint64_t self_[4 * 3]; // 256-bit x 3 friend class SecretKey; - template<class T, class G> friend struct Wrap; - template<class T, class G> friend struct WrapPointer; template<class T, class G> friend struct WrapArray; impl::Sign& getInner() { return *reinterpret_cast<impl::Sign*>(self_); } const impl::Sign& getInner() const { return *reinterpret_cast<const impl::Sign*>(self_); } diff --git a/src/bls.cpp b/src/bls.cpp index 8358c0f..ae9871d 100644 --- a/src/bls.cpp +++ b/src/bls.cpp @@ -68,29 +68,6 @@ void evalPoly(G& y, const T& x, const Vec& c) } template<class T, class G> -struct Wrap { - const std::vector<T> *pv; - Wrap(const std::vector<T>& v) : pv(&v) {} - const G& operator[](size_t i) const - { - return (*pv)[i].getInner().get(); - } - size_t size() const { return pv->size(); } -}; - -template<class T, class G> -struct WrapPointer { - const T *const *v; - size_t k; - WrapPointer(const T *const *v, size_t k) : v(v), k(k) {} - const G& operator[](size_t i) const - { - return v[i]->getInner().get(); - } - size_t size() const { return k; } -}; - -template<class T, class G> struct WrapArray { const T *v; size_t k; @@ -275,9 +252,8 @@ bool Sign::verify(const PublicKey& pub) const void Sign::recover(const SignVec& signVec, const IdVec& idVec) { - Wrap<Sign, G1> signW(signVec); - Wrap<Id, Fr> idW(idVec); - LagrangeInterpolation(getInner().sHm, signW, idW); + if (signVec.size() != idVec.size()) throw cybozu::Exception("Sign:recover:bad size") << signVec.size() << idVec.size(); + recover(signVec.data(), idVec.data(), signVec.size()); } void Sign::recover(const Sign* signVec, const Id *idVec, size_t n) @@ -307,12 +283,6 @@ std::istream& operator>>(std::istream& is, PublicKey& pub) return is >> pub.getInner().sQ; } -void PublicKey::set(const PublicKeyVec& mpk, const Id& id) -{ - Wrap<PublicKey, G2> w(mpk); - evalPoly(getInner().sQ, id.getInner().v, w); -} - void PublicKey::set(const PublicKey *mpk, size_t k, const Id& id) { WrapArray<PublicKey, G2> w(mpk, k); @@ -321,9 +291,8 @@ void PublicKey::set(const PublicKey *mpk, size_t k, const Id& id) void PublicKey::recover(const PublicKeyVec& pubVec, const IdVec& idVec) { - Wrap<PublicKey, G2> pubW(pubVec); - Wrap<Id, Fr> idW(idVec); - LagrangeInterpolation(getInner().sQ, pubW, idW); + if (pubVec.size() != idVec.size()) throw cybozu::Exception("PublicKey:recover:bad size") << pubVec.size() << idVec.size(); + recover(pubVec.data(), idVec.data(), pubVec.size()); } void PublicKey::recover(const PublicKey *pubVec, const Id *idVec, size_t n) { @@ -393,11 +362,6 @@ void SecretKey::getMasterSecretKey(SecretKeyVec& msk, size_t k) const } } -void SecretKey::set(const SecretKeyVec& msk, const Id& id) -{ - Wrap<SecretKey, Fr> w(msk); - evalPoly(getInner().s, id.getInner().v, w); -} void SecretKey::set(const SecretKey *msk, size_t k, const Id& id) { WrapArray<SecretKey, Fr> w(msk, k); @@ -406,9 +370,8 @@ void SecretKey::set(const SecretKey *msk, size_t k, const Id& id) void SecretKey::recover(const SecretKeyVec& secVec, const IdVec& idVec) { - Wrap<SecretKey, Fr> secW(secVec); - Wrap<Id, Fr> idW(idVec); - LagrangeInterpolation(getInner().s, secW, idW); + if (secVec.size() != idVec.size()) throw cybozu::Exception("SecretKey:recover:bad size") << secVec.size() << idVec.size(); + recover(secVec.data(), idVec.data(), secVec.size()); } void SecretKey::recover(const SecretKey *secVec, const Id *idVec, size_t n) { |