mystuff/net/gurk-rs/files/vendor/libsignal-protocol/benches/ratchet.rs
2022-10-31 22:01:15 +01:00

104 lines
2.8 KiB
Rust

//
// Copyright 2020 Signal Messenger, LLC.
// SPDX-License-Identifier: AGPL-3.0-only
//
use criterion::{criterion_group, criterion_main, Criterion, SamplingMode};
use futures_util::FutureExt;
use libsignal_protocol::*;
use std::convert::TryFrom;
use uuid::Uuid;
#[path = "../tests/support/mod.rs"]
mod support;
pub fn ratchet_forward_result(c: &mut Criterion) -> Result<(), SignalProtocolError> {
let mut group = c.benchmark_group("ratchet");
group.sampling_mode(SamplingMode::Flat);
group.sample_size(10); //minimum allowed...
group.warm_up_time(core::time::Duration::from_millis(100));
let mut csprng = rand::rngs::OsRng;
let sender_address = ProtocolAddress::new("+14159999111".to_owned(), 1);
let distribution_id = Uuid::from_u128(0xd1d1d1d1_7000_11eb_b32a_33b8a8a487a6);
let mut alice_store = support::test_in_memory_protocol_store()?;
let mut bob_store = support::test_in_memory_protocol_store()?;
let sent_distribution_message = create_sender_key_distribution_message(
&sender_address,
distribution_id,
&mut alice_store,
&mut csprng,
None,
)
.now_or_never()
.expect("sync")?;
let recv_distribution_message =
SenderKeyDistributionMessage::try_from(sent_distribution_message.serialized())?;
process_sender_key_distribution_message(
&sender_address,
&recv_distribution_message,
&mut bob_store,
None,
)
.now_or_never()
.expect("sync")?;
for ratchets in [100, 1000].iter() {
let ratchets = *ratchets;
for i in 0..ratchets {
group_encrypt(
&mut alice_store,
&sender_address,
distribution_id,
format!("nefarious plotting {}", i).as_bytes(),
&mut csprng,
None,
)
.now_or_never()
.expect("sync")?;
}
let alice_ciphertext = group_encrypt(
&mut alice_store,
&sender_address,
distribution_id,
"you got the plan?".as_bytes(),
&mut csprng,
None,
)
.now_or_never()
.expect("sync")?;
group.bench_function(format!("ratchet {}", ratchets), |b| {
b.iter(|| {
let mut bob_store = bob_store.clone();
group_decrypt(
alice_ciphertext.serialized(),
&mut bob_store,
&sender_address,
None,
)
.now_or_never()
.expect("sync")
.expect("ok");
})
});
}
Ok(())
}
pub fn ratchet_forward(mut c: &mut Criterion) {
ratchet_forward_result(&mut c).expect("success");
}
criterion_group!(ratchet, ratchet_forward);
criterion_main!(ratchet);