Oregami
Repositories/oxedyne/fe2o3

oxedyne/fe2o3/fe2o3_crypto/tests/linkring_bench.rs

2.4 KiB, 1 run

created by r1870400018:61085, which is this file's identity for as long as the history lasts, whatever it is later renamed to

download · who wrote it · its history

1//! Sign and verify costs for `linkring/1` at 2^10 to 2^16 keys, the basis of the
2//! figures at 10^5 to 10^7 in the Hematite User Guide. Release only:
3//! `cargo test --release --test linkring_bench -- --ignored --nocapture`.
4
5use oxedyne_fe2o3_core::prelude::*;
6use oxedyne_fe2o3_crypto::linkring::{
7 self,
8 Ring,
9 SecretKey,
10};
11
12use std::time::Instant;
13
14#[test]
15#[ignore]
16fn bench_linkring() -> Outcome<()> {
17 let threads = std::thread::available_parallelism().map(|n| n.get()).unwrap_or(1).min(8);
18 println!("threads for verify_par: {}", threads);
19 // LINKRING_BENCH_N adds one direct size, such as 1000000.
20 let mut sizes: Vec<usize> = [10u32, 12, 14, 16].iter().map(|e| 1usize << e).collect();
21 if let Ok(v) = std::env::var("LINKRING_BENCH_N") {
22 sizes = vec![res!(v.parse::<usize>().map_err(|_| err!("LINKRING_BENCH_N '{}'", v; Test)))];
23 }
24 for n in sizes {
25 let mut list = Vec::with_capacity(n * 32);
26 let mut signer = None;
27 for i in 0..n {
28 let k = res!(SecretKey::from_seed(fmt!("bench-{}", i).as_bytes()));
29 list.extend_from_slice(&k.public_key());
30 if i == n / 3 {
31 signer = Some(k);
32 }
33 }
34 let key = res!(signer.ok_or_else(|| err!("no signer"; Test)));
35 let t = Instant::now();
36 let ring = res!(Ring::from_list_par(&list, if n > 1 << 16 { threads } else { 1 }));
37 let t_dec = t.elapsed().as_secs_f64();
38 let t = Instant::now();
39 let (tag, body) = res!(linkring::sign(&ring, &key, b"present/1:https://app.example", b"msg"));
40 let t_sign = t.elapsed().as_secs_f64();
41 let t = Instant::now();
42 let ok = res!(linkring::verify(&ring, b"present/1:https://app.example", b"msg", &tag, &body));
43 let t_ver = t.elapsed().as_secs_f64();
44 let t = Instant::now();
45 let ok_p = res!(linkring::verify_par(&ring, b"present/1:https://app.example", b"msg", &tag, &body, threads));
46 let t_par = t.elapsed().as_secs_f64();
47 req!(ok && ok_p, true);
48 let us = |s: f64| s * 1e6 / n as f64;
49 println!("N={:<8} body {:>5} B | sign {:>8.1} ms ({:.2} us/key) | verify {:>8.1} ms ({:.2} us/key) \
50 | verify x{} {:>7.1} ms ({:.2} us/key) | decode {:.2} us/key",
51 n, body.len(), t_sign * 1e3, us(t_sign), t_ver * 1e3, us(t_ver),
52 threads, t_par * 1e3, us(t_par), us(t_dec));
53 }
54 Ok(())
55}