104 lines
2.8 KiB
Rust
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);
|