From d38ed26b257db841fa3a4b79ec5f6a2b8cfe0fd5 Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Sat, 29 Feb 2020 17:04:46 +0100
Subject: [PATCH] [bench] compare ring and sodium for verify operation

---
 benches/ring_vs_sodium.rs | 48 +++++++++++++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 10 deletions(-)

diff --git a/benches/ring_vs_sodium.rs b/benches/ring_vs_sodium.rs
index 34f727d..8605bd4 100644
--- a/benches/ring_vs_sodium.rs
+++ b/benches/ring_vs_sodium.rs
@@ -1,7 +1,9 @@
 use criterion::{black_box, criterion_group, criterion_main, Criterion};
-use dup_crypto::seeds::Seed32;
-use ring::signature::Ed25519KeyPair as RingKeyPair;
-use sodiumoxide::crypto::sign;
+use ring::signature::{Ed25519KeyPair as RingKeyPair, KeyPair, UnparsedPublicKey, ED25519};
+use sodiumoxide::crypto::sign::{
+    ed25519::{PublicKey, SecretKey, Seed as SodiumSeed, Signature},
+    keypair_from_seed, sign_detached, verify_detached,
+};
 
 const MESSAGE: &[u8] = b"azedjlazifjs dleufxmjz jfmjfmljrfmlgc jzlamu^^^^^^^^^^^^^^^^^^^^^ssssssssssssssssssssssss\
 ssssssssssssszaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa541368630...5.31873679387azqszxdxs<dzdq ccg ill:;n: \
@@ -11,16 +13,28 @@ fn ring_sign(ring_key_pair: &RingKeyPair) {
     ring_key_pair.sign(MESSAGE);
 }
 
-fn sodium_sign(sodium_secret_key: &sodiumoxide::crypto::sign::ed25519::SecretKey) {
-    sign::sign(MESSAGE, &sodium_secret_key);
+fn ring_verify((ring_key_pair, signature): (&RingKeyPair, &[u8])) {
+    UnparsedPublicKey::new(&ED25519, ring_key_pair.public_key())
+        .verify(MESSAGE, signature)
+        .expect("invalid sig");
+}
+
+fn sodium_sign(sodium_secret_key: &SecretKey) {
+    let _ = sign_detached(MESSAGE, &sodium_secret_key);
+}
+
+fn sodium_verify((public_key, signature): (&PublicKey, &Signature)) {
+    assert!(verify_detached(signature, MESSAGE, public_key))
 }
 
 pub fn benchmark(c: &mut Criterion) {
-    let ring_key_pair = RingKeyPair::from_seed_unchecked(
-        Seed32::random().expect("fail to gen random seed").as_ref(),
-    )
-    .expect("fail to gen ring keypair");
-    let (_, sodium_secret_key) = sign::gen_keypair();
+    // Generate keypair
+    let seed = dup_crypto::rand::gen_32_bytes().expect("fail to gen random seed");
+    let ring_key_pair =
+        RingKeyPair::from_seed_unchecked(seed.as_ref()).expect("fail to gen ring keypair");
+    let (sodium_public_key, sodium_secret_key) = keypair_from_seed(&SodiumSeed(seed));
+
+    // Sign benches
     let mut group = c.benchmark_group("sign");
     group.bench_function("sodium_sign", |b| {
         b.iter(|| sodium_sign(black_box(&sodium_secret_key)))
@@ -29,6 +43,20 @@ pub fn benchmark(c: &mut Criterion) {
         b.iter(|| ring_sign(black_box(&ring_key_pair)))
     });
     group.finish();
+
+    // Generate signature
+    let ring_sig = ring_key_pair.sign(MESSAGE);
+    let sodium_sig = sign_detached(MESSAGE, &sodium_secret_key);
+
+    // Verify benches
+    let mut group = c.benchmark_group("verify");
+    group.bench_function("sodium_verify", |b| {
+        b.iter(|| sodium_verify(black_box((&sodium_public_key, &sodium_sig))))
+    });
+    group.bench_function("ring_verify", |b| {
+        b.iter(|| ring_verify(black_box((&ring_key_pair, ring_sig.as_ref()))))
+    });
+    group.finish();
 }
 
 criterion_group!(benches, benchmark);
-- 
GitLab