synor/crates/synor-crypto/benches/crypto_bench.rs
2026-01-08 05:22:24 +05:30

249 lines
7.3 KiB
Rust

//! Cryptography benchmarks for Synor.
//!
//! Benchmarks Ed25519, Dilithium3, and hybrid signature operations.
//! Run with: cargo bench -p synor-crypto
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use synor_crypto::keypair::{Dilithium3Keypair, Ed25519Keypair, HybridKeypair};
/// Message sizes to benchmark (in bytes).
const MESSAGE_SIZES: &[usize] = &[32, 256, 1024, 4096, 16384];
// ==================== Ed25519 Benchmarks ====================
fn ed25519_keygen_benchmark(c: &mut Criterion) {
c.bench_function("ed25519_keygen", |b| {
b.iter(|| black_box(Ed25519Keypair::generate()))
});
}
fn ed25519_sign_benchmark(c: &mut Criterion) {
let keypair = Ed25519Keypair::generate();
let message = vec![0u8; 256];
c.bench_function("ed25519_sign_256b", |b| {
b.iter(|| black_box(keypair.sign(&message)))
});
}
fn ed25519_sign_varying_sizes(c: &mut Criterion) {
let keypair = Ed25519Keypair::generate();
let mut group = c.benchmark_group("ed25519_sign");
for &size in MESSAGE_SIZES {
let message = vec![0xABu8; size];
group.throughput(Throughput::Bytes(size as u64));
group.bench_with_input(BenchmarkId::from_parameter(size), &message, |b, msg| {
b.iter(|| black_box(keypair.sign(msg)))
});
}
group.finish();
}
fn ed25519_verify_benchmark(c: &mut Criterion) {
use ed25519_dalek::Verifier;
let keypair = Ed25519Keypair::generate();
let message = vec![0u8; 256];
let signature = keypair.sign(&message);
let verifying_key = keypair.verifying_key();
c.bench_function("ed25519_verify_256b", |b| {
b.iter(|| black_box(verifying_key.verify(&message, &signature).is_ok()))
});
}
// ==================== Dilithium3 Benchmarks ====================
fn dilithium_keygen_benchmark(c: &mut Criterion) {
c.bench_function("dilithium3_keygen", |b| {
b.iter(|| black_box(Dilithium3Keypair::generate()))
});
}
fn dilithium_sign_benchmark(c: &mut Criterion) {
let keypair = Dilithium3Keypair::generate();
let message = vec![0u8; 256];
c.bench_function("dilithium3_sign_256b", |b| {
b.iter(|| black_box(keypair.sign(&message)))
});
}
fn dilithium_sign_varying_sizes(c: &mut Criterion) {
let keypair = Dilithium3Keypair::generate();
let mut group = c.benchmark_group("dilithium3_sign");
for &size in MESSAGE_SIZES {
let message = vec![0xABu8; size];
group.throughput(Throughput::Bytes(size as u64));
group.bench_with_input(BenchmarkId::from_parameter(size), &message, |b, msg| {
b.iter(|| black_box(keypair.sign(msg)))
});
}
group.finish();
}
fn dilithium_verify_benchmark(c: &mut Criterion) {
use pqcrypto_dilithium::dilithium3;
let keypair = Dilithium3Keypair::generate();
let message = vec![0u8; 256];
let signed_message = keypair.sign(&message);
let public_key = keypair.public_key();
c.bench_function("dilithium3_verify_256b", |b| {
b.iter(|| black_box(dilithium3::open(&signed_message, public_key).is_ok()))
});
}
// ==================== Hybrid Signature Benchmarks ====================
fn hybrid_keygen_benchmark(c: &mut Criterion) {
c.bench_function("hybrid_keygen", |b| {
b.iter(|| black_box(HybridKeypair::generate()))
});
}
fn hybrid_sign_benchmark(c: &mut Criterion) {
let keypair = HybridKeypair::generate();
let message = vec![0u8; 256];
c.bench_function("hybrid_sign_256b", |b| {
b.iter(|| black_box(keypair.sign(&message)))
});
}
fn hybrid_sign_varying_sizes(c: &mut Criterion) {
let keypair = HybridKeypair::generate();
let mut group = c.benchmark_group("hybrid_sign");
for &size in MESSAGE_SIZES {
let message = vec![0xABu8; size];
group.throughput(Throughput::Bytes(size as u64));
group.bench_with_input(BenchmarkId::from_parameter(size), &message, |b, msg| {
b.iter(|| black_box(keypair.sign(msg)))
});
}
group.finish();
}
fn hybrid_verify_benchmark(c: &mut Criterion) {
let keypair = HybridKeypair::generate();
let message = vec![0u8; 256];
let signature = keypair.sign(&message);
let public_key = keypair.public_key();
c.bench_function("hybrid_verify_256b", |b| {
b.iter(|| black_box(public_key.verify(&message, &signature).is_ok()))
});
}
// ==================== Hashing Benchmarks ====================
fn blake3_hash_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("blake3_hash");
for &size in MESSAGE_SIZES {
let data = vec![0xABu8; size];
group.throughput(Throughput::Bytes(size as u64));
group.bench_with_input(BenchmarkId::from_parameter(size), &data, |b, d| {
b.iter(|| black_box(blake3::hash(d)))
});
}
group.finish();
}
fn blake3_hash_large(c: &mut Criterion) {
// 1MB benchmark for throughput measurement
let data = vec![0xABu8; 1024 * 1024];
c.bench_function("blake3_hash_1mb", |b| {
b.iter(|| black_box(blake3::hash(&data)))
});
}
// ==================== Address Derivation Benchmarks ====================
fn address_derivation_benchmark(c: &mut Criterion) {
use synor_crypto::Network;
let keypair = HybridKeypair::generate();
c.bench_function("address_derivation", |b| {
b.iter(|| black_box(keypair.address(Network::Mainnet)))
});
}
// ==================== Signature Size Comparison ====================
fn signature_sizes(c: &mut Criterion) {
// This isn't really a benchmark, but it's useful to document sizes
let ed_keypair = Ed25519Keypair::generate();
let dil_keypair = Dilithium3Keypair::generate();
let hybrid_keypair = HybridKeypair::generate();
let message = b"test";
let ed_sig = ed_keypair.sign(message);
let dil_sig = dil_keypair.sign(message);
let hybrid_sig = hybrid_keypair.sign(message);
println!("\n=== Signature Sizes ===");
println!("Ed25519: {} bytes", std::mem::size_of_val(&ed_sig));
println!(
"Dilithium3: {} bytes",
pqcrypto_traits::sign::SignedMessage::as_bytes(&dil_sig).len() - message.len()
);
println!(
"Hybrid: {} bytes",
hybrid_sig.ed25519_signature.len() + hybrid_sig.dilithium_signature.len()
);
println!();
// Quick sanity check benchmark
c.bench_function("signature_size_overhead", |b| {
b.iter(|| {
let sig = hybrid_keypair.sign(message);
black_box(sig.ed25519_signature.len() + sig.dilithium_signature.len())
})
});
}
// ==================== Criterion Groups ====================
criterion_group!(
keygen_benches,
ed25519_keygen_benchmark,
dilithium_keygen_benchmark,
hybrid_keygen_benchmark,
);
criterion_group!(
sign_benches,
ed25519_sign_benchmark,
ed25519_sign_varying_sizes,
dilithium_sign_benchmark,
dilithium_sign_varying_sizes,
hybrid_sign_benchmark,
hybrid_sign_varying_sizes,
);
criterion_group!(
verify_benches,
ed25519_verify_benchmark,
dilithium_verify_benchmark,
hybrid_verify_benchmark,
);
criterion_group!(hash_benches, blake3_hash_benchmark, blake3_hash_large,);
criterion_group!(misc_benches, address_derivation_benchmark, signature_sizes,);
criterion_main!(
keygen_benches,
sign_benches,
verify_benches,
hash_benches,
misc_benches
);