|
|
|
@ -31,21 +31,21 @@ using namespace bls;
|
|
|
|
|
void benchSigs() {
|
|
|
|
|
string testName = "Signing";
|
|
|
|
|
const int numIters = 5000;
|
|
|
|
|
PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
vector<uint8_t> message1 = sk.GetG1Element().Serialize();
|
|
|
|
|
|
|
|
|
|
auto start = startStopwatch();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
AugSchemeMPL().Sign(sk, message1);
|
|
|
|
|
BasicSchemeMPL().Sign(sk, message1);
|
|
|
|
|
}
|
|
|
|
|
endStopwatch(testName, start, numIters);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void benchVerification() {
|
|
|
|
|
string testName = "Verification";
|
|
|
|
|
const int numIters = 10000;
|
|
|
|
|
PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
const int numIters = 1000;
|
|
|
|
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
G1Element pk = sk.GetG1Element();
|
|
|
|
|
|
|
|
|
|
std::vector<G2Element> sigs;
|
|
|
|
@ -54,7 +54,7 @@ void benchVerification() {
|
|
|
|
|
uint8_t message[4];
|
|
|
|
|
Util::IntToFourBytes(message, i);
|
|
|
|
|
vector<uint8_t> messageBytes(message, message + 4);
|
|
|
|
|
sigs.push_back(AugSchemeMPL().Sign(sk, messageBytes));
|
|
|
|
|
sigs.push_back(BasicSchemeMPL().Sign(sk, messageBytes));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
auto start = startStopwatch();
|
|
|
|
@ -62,34 +62,36 @@ void benchVerification() {
|
|
|
|
|
uint8_t message[4];
|
|
|
|
|
Util::IntToFourBytes(message, i);
|
|
|
|
|
vector<uint8_t> messageBytes(message, message + 4);
|
|
|
|
|
bool ok = AugSchemeMPL().Verify(pk, messageBytes, sigs[i]);
|
|
|
|
|
bool ok = BasicSchemeMPL().Verify(pk, messageBytes, sigs[i]);
|
|
|
|
|
ASSERT(ok);
|
|
|
|
|
}
|
|
|
|
|
endStopwatch(testName, start, numIters);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void benchBatchVerification() {
|
|
|
|
|
const int numIters = 100000;
|
|
|
|
|
const int numIters = 10000;
|
|
|
|
|
|
|
|
|
|
vector<vector<uint8_t>> sig_bytes;
|
|
|
|
|
vector<vector<uint8_t>> pk_bytes;
|
|
|
|
|
vector<vector<uint8_t>> ms;
|
|
|
|
|
|
|
|
|
|
auto start = startStopwatch();
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
uint8_t message[4];
|
|
|
|
|
Util::IntToFourBytes(message, i);
|
|
|
|
|
vector<uint8_t> messageBytes(message, message + 4);
|
|
|
|
|
PrivateKey sk = AugSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
G1Element pk = sk.GetG1Element();
|
|
|
|
|
sig_bytes.push_back(AugSchemeMPL().Sign(sk, messageBytes).Serialize());
|
|
|
|
|
sig_bytes.push_back(BasicSchemeMPL().Sign(sk, messageBytes).Serialize());
|
|
|
|
|
pk_bytes.push_back(pk.Serialize());
|
|
|
|
|
ms.push_back(messageBytes);
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("Batch verification preparation", start, numIters);
|
|
|
|
|
|
|
|
|
|
vector<G1Element> pks;
|
|
|
|
|
pks.reserve(numIters);
|
|
|
|
|
|
|
|
|
|
auto start = startStopwatch();
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
for (auto const& pk : pk_bytes) {
|
|
|
|
|
pks.emplace_back(G1Element::FromBytes(Bytes(pk)));
|
|
|
|
|
}
|
|
|
|
@ -105,52 +107,71 @@ void benchBatchVerification() {
|
|
|
|
|
endStopwatch("Signature validation", start, numIters);
|
|
|
|
|
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
G2Element aggSig = AugSchemeMPL().Aggregate(sigs);
|
|
|
|
|
G2Element aggSig = BasicSchemeMPL().Aggregate(sigs);
|
|
|
|
|
endStopwatch("Aggregation", start, numIters);
|
|
|
|
|
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
bool ok = AugSchemeMPL().AggregateVerify(pks, ms, aggSig);
|
|
|
|
|
bool ok = BasicSchemeMPL().AggregateVerify(pks, ms, aggSig);
|
|
|
|
|
ASSERT(ok);
|
|
|
|
|
endStopwatch("Batch verification", start, numIters);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void benchFastAggregateVerification() {
|
|
|
|
|
const int numIters = 5000;
|
|
|
|
|
|
|
|
|
|
vector<G2Element> sigs;
|
|
|
|
|
vector<G1Element> pks;
|
|
|
|
|
vector<uint8_t> message = {1, 2, 3, 4, 5, 6, 7, 8};
|
|
|
|
|
vector<G2Element> pops;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
PrivateKey sk = PopSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
void benchSerialize() {
|
|
|
|
|
const int numIters = 5000000;
|
|
|
|
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
G1Element pk = sk.GetG1Element();
|
|
|
|
|
sigs.push_back(PopSchemeMPL().Sign(sk, message));
|
|
|
|
|
pops.push_back(PopSchemeMPL().PopProve(sk));
|
|
|
|
|
pks.push_back(pk);
|
|
|
|
|
}
|
|
|
|
|
vector<uint8_t> message = sk.GetG1Element().Serialize();
|
|
|
|
|
G2Element sig = BasicSchemeMPL().Sign(sk, message);
|
|
|
|
|
|
|
|
|
|
auto start = startStopwatch();
|
|
|
|
|
G2Element aggSig = PopSchemeMPL().Aggregate(sigs);
|
|
|
|
|
endStopwatch("PopScheme Aggregation", start, numIters);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
sk.Serialize();
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("Serialize PrivateKey", start, numIters);
|
|
|
|
|
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
bool ok = PopSchemeMPL().PopVerify(pks[i], pops[i]);
|
|
|
|
|
ASSERT(ok);
|
|
|
|
|
pk.Serialize();
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("PopScheme Proofs verification", start, numIters);
|
|
|
|
|
endStopwatch("Serialize G1Element", start, numIters);
|
|
|
|
|
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
bool ok = PopSchemeMPL().FastAggregateVerify(pks, message, aggSig);
|
|
|
|
|
ASSERT(ok);
|
|
|
|
|
endStopwatch("PopScheme verification", start, numIters);
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
sig.Serialize();
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("Serialize G2Element", start, numIters);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void benchSerializeToArray() {
|
|
|
|
|
const int numIters = 5000000;
|
|
|
|
|
PrivateKey sk = BasicSchemeMPL().KeyGen(getRandomSeed());
|
|
|
|
|
G1Element pk = sk.GetG1Element();
|
|
|
|
|
vector<uint8_t> message = sk.GetG1Element().Serialize();
|
|
|
|
|
G2Element sig = BasicSchemeMPL().Sign(sk, message);
|
|
|
|
|
|
|
|
|
|
auto start = startStopwatch();
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
sk.SerializeToArray();
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("SerializeToArray PrivateKey", start, numIters);
|
|
|
|
|
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
pk.SerializeToArray();
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("SerializeToArray G1Element", start, numIters);
|
|
|
|
|
|
|
|
|
|
start = startStopwatch();
|
|
|
|
|
for (int i = 0; i < numIters; i++) {
|
|
|
|
|
sig.SerializeToArray();
|
|
|
|
|
}
|
|
|
|
|
endStopwatch("SerializeToArray G2Element", start, numIters);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(int argc, char* argv[]) {
|
|
|
|
|
benchSigs();
|
|
|
|
|
benchVerification();
|
|
|
|
|
benchBatchVerification();
|
|
|
|
|
benchFastAggregateVerification();
|
|
|
|
|
benchSerialize();
|
|
|
|
|
benchSerializeToArray();
|
|
|
|
|
}
|
|
|
|
|