aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--include/bls.hpp1
-rw-r--r--sample/bls_smpl.cpp4
-rw-r--r--sample/bls_tool.cpp176
4 files changed, 180 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index 394dbdd..a84735d 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ CFLAGS += -std=c++11
SRC_SRC=bls.cpp
TEST_SRC=bls_test.cpp
-SAMPLE_SRC=bls_smpl.cpp
+SAMPLE_SRC=bls_smpl.cpp bls_tool.cpp
CFLAGS+=-I../mcl/include
diff --git a/include/bls.hpp b/include/bls.hpp
index 1d33777..306dbfa 100644
--- a/include/bls.hpp
+++ b/include/bls.hpp
@@ -52,6 +52,7 @@ const size_t keySize = 4; // 256-bit size
typedef std::vector<SecretKey> SecretKeyVec;
typedef std::vector<PublicKey> PublicKeyVec;
typedef std::vector<Sign> SignVec;
+typedef std::vector<Id> IdVec;
class Id {
impl::Id *self_;
diff --git a/sample/bls_smpl.cpp b/sample/bls_smpl.cpp
index 85530dd..e701b5f 100644
--- a/sample/bls_smpl.cpp
+++ b/sample/bls_smpl.cpp
@@ -23,7 +23,7 @@ void save(const std::string& file, const T& t, const bls::Id& id = 0)
{
const std::string name = makeName(file, id);
std::ofstream ofs(name.c_str(), std::ios::binary);
- if (!(ofs << std::hex << t)) {
+ if (!(ofs << std::hex << std::showbase << t)) {
throw cybozu::Exception("can't save") << name;
}
}
@@ -33,7 +33,7 @@ void load(T& t, const std::string& file, const bls::Id& id = 0)
{
const std::string name = makeName(file, id);
std::ifstream ifs(name.c_str(), std::ios::binary);
- if (!(ifs >> std::hex >> t)) {
+ if (!(ifs >> t)) {
throw cybozu::Exception("can't load") << name;
}
t.id = id;
diff --git a/sample/bls_tool.cpp b/sample/bls_tool.cpp
new file mode 100644
index 0000000..626d68f
--- /dev/null
+++ b/sample/bls_tool.cpp
@@ -0,0 +1,176 @@
+#include <bls.hpp>
+#include <iostream>
+#include <cybozu/option.hpp>
+
+template<class T>
+void write(const T& t)
+{
+ std::cout << std::hex << std::showbase << t << std::endl;
+}
+
+template<class T>
+void read(T& t)
+{
+ if (!(std::cin >> t)) {
+ throw std::runtime_error("can't read");
+ }
+}
+
+void strip(std::string& str)
+{
+ if (str.empty()) return;
+ if (str[str.size() - 1] == '\n') str.resize(str.size() - 1);
+}
+
+void readLine(std::string& str)
+{
+ if (std::getline(std::cin, str)) {
+ strip(str);
+ } else {
+ throw std::runtime_error("can't readLine");
+ }
+}
+
+void init()
+{
+ bls::SecretKey sec;
+ sec.init();
+ write(sec);
+}
+
+void pubkey()
+{
+ bls::SecretKey sec;
+ read(sec);
+ bls::PublicKey pub;
+ sec.getPublicKey(pub);
+ write(pub);
+}
+
+void sign()
+{
+ bls::SecretKey sec;
+ read(sec);
+ std::string m;
+ readLine(m);
+ bls::Sign s;
+ sec.sign(s, m);
+ write(s);
+}
+
+void verify()
+{
+ bls::Sign s;
+ read(s);
+ bls::PublicKey pub;
+ read(pub);
+ std::string m;
+ readLine(m);
+ bool b = s.verify(pub, m);
+ write(int(b));
+}
+
+void share_pub()
+{
+ size_t k;
+ read(k);
+ bls::PublicKeyVec mpk(k);
+ for (size_t i = 0; i < k; i++) {
+ read(mpk[i]);
+ }
+ bls::Id id;
+ read(id);
+ bls::PublicKey pub;
+ pub.set(mpk, id);
+ write(pub);
+}
+
+void recover_sig()
+{
+ size_t k;
+ read(k);
+ bls::SecretKeyVec msk(k);
+ for (size_t i = 0; i < k; i++) {
+ read(msk[i].id);
+ read(msk[i]);
+ }
+ bls::SecretKey sec;
+ sec.recover(msk);
+ write(sec);
+}
+
+void aggregate_pub()
+{
+ size_t n;
+ read(n);
+ if (n == 0) throw std::runtime_error("aggregate_pub:n is zero");
+ bls::PublicKey pub;
+ read(pub);
+ for (size_t i = 1; i < n; i++) {
+ bls::PublicKey rhs;
+ read(rhs);
+ pub.add(rhs);
+ }
+ write(pub);
+}
+
+void aggregate_sig()
+{
+ size_t n;
+ read(n);
+ if (n == 0) throw std::runtime_error("aggregate_sig:n is zero");
+ bls::Sign s;
+ read(s);
+ for (size_t i = 1; i < n; i++) {
+ bls::Sign rhs;
+ read(rhs);
+ s.add(rhs);
+ }
+ write(s);
+}
+
+int main(int argc, char *argv[])
+ try
+{
+ const struct CmdTbl {
+ const char *name;
+ void (*exec)();
+ } tbl[] = {
+ { "init", init },
+ { "pubkey", pubkey },
+ { "sign", sign },
+ { "verify", verify },
+ { "share-pub", share_pub },
+ { "recover-sig", recover_sig },
+ { "aggregate-pub", aggregate_pub },
+ { "aggregate-sig", aggregate_sig },
+ };
+ std::string cmdCat;
+ for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
+ if (i > 0) cmdCat += '|';
+ cmdCat += tbl[i].name;
+ }
+ std::string mode;
+ cybozu::Option opt;
+
+ opt.appendParam(&mode, cmdCat.c_str());
+ opt.appendHelp("h");
+ if (!opt.parse(argc, argv)) {
+ goto ERR_EXIT;
+ }
+
+ bls::init();
+ for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
+ if (mode == tbl[i].name) {
+ tbl[i].exec();
+ return 0;
+ }
+ }
+ fprintf(stderr, "bad mode %s\n", mode.c_str());
+ERR_EXIT:
+ opt.usage();
+ return 1;
+} catch (std::exception& e) {
+ fprintf(stderr, "ERR %s\n", e.what());
+ return 1;
+}