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 | |
| 5 | use oxedyne_fe2o3_core::prelude::*; |
| 6 | use oxedyne_fe2o3_crypto::linkring::{ |
| 7 | self, |
| 8 | Ring, |
| 9 | SecretKey, |
| 10 | }; |
| 11 | |
| 12 | use std::time::Instant; |
| 13 | |
| 14 | #[test] |
| 15 | #[ignore] |
| 16 | fn 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 | } |