aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-01-20 16:55:49 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-01-20 16:55:49 +0800
commit7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97 (patch)
treeaf75e5b44299545501a9dc2fa61637f9ca335af9
parentb680d8e089cd81f95c458f2c24f003cc36783c5a (diff)
downloaddexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.tar
dexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.tar.gz
dexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.tar.bz2
dexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.tar.lz
dexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.tar.xz
dexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.tar.zst
dexon-bls-7de669d11d01a7e15957a6a73bb6f8a2f0f6cd97.zip
refactor recover()
-rw-r--r--Makefile4
-rw-r--r--include/bls.hpp18
-rw-r--r--src/bls.cpp49
3 files changed, 15 insertions, 56 deletions
diff --git a/Makefile b/Makefile
index 15c18eb..bb576ff 100644
--- a/Makefile
+++ b/Makefile
@@ -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)
{