diff --git a/Cargo.lock b/Cargo.lock index 92ec4c7..d15974f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -271,6 +271,7 @@ version = "0.0.0" dependencies = [ "bitflags", "bitflags_serde_shim", + "criterion", "ed25519-dalek", "expect-test", "hex", @@ -281,6 +282,7 @@ dependencies = [ "serde_jcs", "serde_json", "serde_with", + "sha2", "thiserror", "url", ] @@ -311,7 +313,6 @@ dependencies = [ "axum-extra", "blah-types", "clap", - "criterion", "ed25519-dalek", "futures-util", "hex", diff --git a/blah-types/Cargo.toml b/blah-types/Cargo.toml index 288b9d6..c2c551d 100644 --- a/blah-types/Cargo.toml +++ b/blah-types/Cargo.toml @@ -3,6 +3,10 @@ name = "blah-types" version = "0.0.0" edition = "2021" +[[bench]] +name = "crypto_ops" +harness = false + [dependencies] bitflags = "2" bitflags_serde_shim = "0.2" @@ -19,7 +23,10 @@ thiserror = "1" url = { version = "2", features = ["serde"] } [dev-dependencies] +criterion = "0.5" +ed25519-dalek = { version = "2", features = ["rand_core"] } expect-test = "1" +sha2 = "0.10" [lints] workspace = true diff --git a/blahd/benches/register-pow.rs b/blah-types/benches/crypto_ops.rs similarity index 51% rename from blahd/benches/register-pow.rs rename to blah-types/benches/crypto_ops.rs index f514bf4..bfb8997 100644 --- a/blahd/benches/register-pow.rs +++ b/blah-types/benches/crypto_ops.rs @@ -2,19 +2,25 @@ use std::hint::black_box; use std::time::Instant; -use blah_types::{get_timestamp, PubKey, Signee, UserKey, UserRegisterPayload}; +use blah_types::{ + get_timestamp, ChatPayload, Id, PubKey, SignExt, Signee, UserKey, UserRegisterPayload, +}; use criterion::{criterion_group, criterion_main, Criterion}; use ed25519_dalek::SigningKey; -use rand::{thread_rng, Rng}; +use rand::rngs::mock::StepRng; +use rand::rngs::StdRng; +use rand::{Rng, SeedableRng}; use sha2::{Digest, Sha256}; +const SEED: u64 = 0xDEAD_BEEF_BEEF_DEAD; + fn bench_register_pow(c: &mut Criterion) { - let rng = &mut thread_rng(); + let rng = &mut StdRng::seed_from_u64(SEED); let id_key_priv = SigningKey::from_bytes(&[0x1A; 32]); let id_key = PubKey::from(id_key_priv.verifying_key()); let act_key_priv = SigningKey::from_bytes(&[0x2B; 32]); - let act_key = act_key_priv.verifying_key().into(); + let act_key = PubKey::from(act_key_priv.verifying_key()); let payload = UserRegisterPayload { id_key: id_key.clone(), server_url: "http://some.example.com".parse().unwrap(), @@ -52,5 +58,42 @@ fn bench_register_pow(c: &mut Criterion) { }); } -criterion_group!(benches, bench_register_pow); +fn avg_msg() -> ChatPayload { + // The average text message length is 50.88 bytes (UTF-8), according to + // the last 1 year data from + ChatPayload { + rich_text: "🤔️ average length message! 平均长度消息".into(), + room: Id(1_234_567_890_000 << 16 | 0xDEAD), + } +} + +fn bench_msg_sign_verify(c: &mut Criterion) { + let rng = &mut StdRng::seed_from_u64(SEED); + + let id_key_priv = SigningKey::generate(rng); + let act_key_priv = SigningKey::generate(rng); + let id_key = PubKey::from(id_key_priv.verifying_key()); + let timestamp = 1_727_045_943 << 16; // The time when I writing this code. + + let msg = avg_msg(); + c.bench_function("msg-sign", |b| { + let seq_rng = &mut StepRng::new(1, 1); + b.iter(|| { + black_box(msg.clone()) + .sign_msg_with(&id_key, &act_key_priv, timestamp, seq_rng) + .unwrap() + }) + }); + + let signed = msg + .sign_msg_with(&id_key, &act_key_priv, timestamp, rng) + .unwrap(); + + c.bench_function("msg-verify", |b| { + b.iter(|| black_box(&signed).verify().unwrap()); + }); +} + +criterion_group!(benches, bench_register_pow, bench_msg_sign_verify); + criterion_main!(benches); diff --git a/blahd/Cargo.toml b/blahd/Cargo.toml index 37a0950..a2b173c 100644 --- a/blahd/Cargo.toml +++ b/blahd/Cargo.toml @@ -3,10 +3,6 @@ name = "blahd" version = "0.0.0" edition = "2021" -[[bench]] -name = "register-pow" -harness = false - [dependencies] anyhow = "1" axum = { version = "0.7", features = ["ws"] } @@ -41,7 +37,6 @@ url = { version = "2", features = ["serde"] } blah-types = { path = "../blah-types", features = ["rusqlite"] } [dev-dependencies] -criterion = "0.5" nix = { version = "0.29", features = ["fs", "process", "signal"] } reqwest = { version = "0.12", features = ["json"] } rstest = { version = "0.22", default-features = false }