use openmls_rust_crypto::OpenMlsRustCrypto;
use crate::{test_utils::*, tree::*};
#[apply(ciphersuites_and_backends)]
fn test_parent_hash(ciphersuite: Ciphersuite, backend: &impl OpenMlsCryptoProvider) {
const NODES: usize = 31;
let mut nodes = vec![];
let mut key_package_bundles = vec![];
for i in 0..NODES {
let credential_bundle = CredentialBundle::new(
vec![i as u8],
CredentialType::Basic,
ciphersuite.signature_algorithm(),
backend,
)
.expect("An unexpected error occurred.");
let key_package_bundle =
KeyPackageBundle::new(&[ciphersuite], &credential_bundle, backend, vec![])
.expect("An unexpected error occurred.");
let leaf_node = Node {
node_type: NodeType::Leaf,
key_package: Some(key_package_bundle.key_package().clone()),
node: None,
};
key_package_bundles.push(key_package_bundle);
nodes.push(Some(leaf_node));
if i != NODES - 1 {
nodes.push(None);
}
}
let key_package_bundle = key_package_bundles.remove(0);
let mut tree = RatchetTree::new_from_nodes(backend, key_package_bundle, &nodes)
.expect("An unexpected error occurred.");
assert!(tree.verify_parent_hashes(backend).is_ok());
for index in 0..tree.tree_size().as_usize() {
if NodeIndex::from(index).is_parent() {
let public_key = backend
.crypto()
.derive_hpke_keypair(
ciphersuite.hpke_config(),
Secret::random(ciphersuite, backend, None)
.expect("Not enough randomness.")
.as_slice(),
)
.public
.into();
let parent_node = ParentNode::new(public_key, &[], &[]);
let node = Node {
key_package: None,
node: Some(parent_node),
node_type: NodeType::Parent,
};
tree.nodes[index] = node;
}
}
let original_parent_hash = tree.set_parent_hashes(backend, LeafIndex::from(0usize));
tree.nodes.swap(15, 47);
let leaf_swap_parent_hash = tree.set_parent_hashes(backend, LeafIndex::from(0usize));
assert!(leaf_swap_parent_hash != original_parent_hash);
}