249 lines
7.3 KiB
Rust
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
|
|
);
|