#[cfg(any(test, feature = "use-mock-crust", feature = "use-mock-routing"))]
pub use fake_clock::FakeClock as Instant;
use maidsafe_utilities::serialisation;
use routing::{MutableData, Value, XorName, sha3};
use rust_sodium::crypto::sign;
use serde::Serialize;
use std::collections;
#[cfg(feature = "use-mock-crust")]
use std::collections::hash_map::DefaultHasher;
#[cfg(feature = "use-mock-crust")]
use std::hash::BuildHasherDefault;
#[cfg(not(any(test, feature = "use-mock-crust", feature = "use-mock-routing")))]
pub use std::time::Instant;
use tiny_keccak;
#[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd, Hash, Serialize, Deserialize)]
pub struct SecureHash(sha3::Digest256);
pub fn secure_hash<T: Serialize>(value: &T) -> SecureHash {
serialisation::serialise(value)
.map(|data| SecureHash(tiny_keccak::sha3_256(&data)))
.unwrap_or_else(|_| {
error!("Serialisation failure");
Default::default()
})
}
#[cfg(feature = "use-mock-crust")]
pub type HashMap<K, V> = collections::HashMap<K, V, BuildHasherDefault<DefaultHasher>>;
#[cfg(not(feature = "use-mock-crust"))]
pub type HashMap<K, V> = collections::HashMap<K, V>;
#[cfg(feature = "use-mock-crust")]
pub type HashSet<T> = collections::HashSet<T, BuildHasherDefault<DefaultHasher>>;
#[cfg(not(feature = "use-mock-crust"))]
pub type HashSet<T> = collections::HashSet<T>;
pub fn client_name_from_key(key: &sign::PublicKey) -> XorName {
XorName(tiny_keccak::sha3_256(&key[..]))
}
pub fn mdata_shell_hash(data: &MutableData) -> SecureHash {
let shell = (*data.name(),
data.tag(),
data.version(),
data.owners().clone(),
data.permissions().clone());
secure_hash(&shell)
}
pub fn mdata_value_hash(value: &Value) -> SecureHash {
secure_hash(&value)
}
pub fn verify_mdata_owner(data: &MutableData, client_name: &XorName) -> bool {
data.owners()
.iter()
.map(|owner_key| client_name_from_key(owner_key))
.any(|name| name == *client_name)
}