use p2panda_core::SigningKey;
use p2panda_encryption::Rng;
use p2panda_encryption::crypto::x25519::SecretKey;
use p2panda_encryption::key_bundle::{Lifetime, LongTermKeyBundle, PreKey};
use p2panda_encryption::key_registry::KeyRegistry;
use crate::key_registry::traits::KeyRegistryStore;
use crate::{SqliteStore, tx_unwrap};
#[tokio::test]
async fn set_get_key_registry() {
let store = SqliteStore::temporary().await;
let rng = Rng::from_seed([1; 32]);
let signing_key = SigningKey::generate();
let verifying_key = signing_key.verifying_key();
let identity_secret = SecretKey::from_bytes(rng.random_array().unwrap());
let bundle_1 = {
let prekey_secret = SecretKey::from_bytes(rng.random_array().unwrap());
let prekey = PreKey::new(prekey_secret.verifying_key().unwrap(), Lifetime::new(120));
let prekey_signature = prekey.sign(&identity_secret, &rng).unwrap();
LongTermKeyBundle::new(
identity_secret.verifying_key().unwrap(),
prekey,
prekey_signature,
)
};
let state = KeyRegistry::init();
let state = KeyRegistry::add_longterm_bundle(state, verifying_key, bundle_1.clone()).unwrap();
assert!(
<SqliteStore as KeyRegistryStore>::get_key_registry(&store)
.await
.unwrap()
.is_none()
);
tx_unwrap!(store, store.set_key_registry(&state).await.unwrap());
assert_eq!(store.get_key_registry().await.unwrap(), Some(state.clone()));
let bundle_2 = {
let prekey_secret = SecretKey::from_bytes(rng.random_array().unwrap());
let prekey = PreKey::new(prekey_secret.verifying_key().unwrap(), Lifetime::new(60));
let prekey_signature = prekey.sign(&identity_secret, &rng).unwrap();
LongTermKeyBundle::new(
identity_secret.verifying_key().unwrap(),
prekey,
prekey_signature,
)
};
let new_state =
KeyRegistry::add_longterm_bundle(state.clone(), verifying_key, bundle_2.clone()).unwrap();
assert_ne!(state, new_state);
tx_unwrap!(store, store.set_key_registry(&new_state).await.unwrap());
assert_eq!(
store.get_key_registry().await.unwrap(),
Some(new_state.clone())
);
}