iroh_docs/store/
pubkeys.rsuse std::{
collections::HashMap,
sync::{Arc, RwLock},
};
use ed25519_dalek::{SignatureError, VerifyingKey};
use crate::{AuthorId, AuthorPublicKey, NamespaceId, NamespacePublicKey};
pub trait PublicKeyStore {
fn public_key(&self, id: &[u8; 32]) -> Result<VerifyingKey, SignatureError>;
fn namespace_key(&self, bytes: &NamespaceId) -> Result<NamespacePublicKey, SignatureError> {
self.public_key(bytes.as_bytes()).map(Into::into)
}
fn author_key(&self, bytes: &AuthorId) -> Result<AuthorPublicKey, SignatureError> {
self.public_key(bytes.as_bytes()).map(Into::into)
}
}
impl<T: PublicKeyStore> PublicKeyStore for &T {
fn public_key(&self, id: &[u8; 32]) -> Result<VerifyingKey, SignatureError> {
(*self).public_key(id)
}
}
impl<T: PublicKeyStore> PublicKeyStore for &mut T {
fn public_key(&self, id: &[u8; 32]) -> Result<VerifyingKey, SignatureError> {
PublicKeyStore::public_key(*self, id)
}
}
impl PublicKeyStore for () {
fn public_key(&self, id: &[u8; 32]) -> Result<VerifyingKey, SignatureError> {
VerifyingKey::from_bytes(id)
}
}
#[derive(Debug, Clone, Default)]
pub struct MemPublicKeyStore {
keys: Arc<RwLock<HashMap<[u8; 32], VerifyingKey>>>,
}
impl PublicKeyStore for MemPublicKeyStore {
fn public_key(&self, bytes: &[u8; 32]) -> Result<VerifyingKey, SignatureError> {
if let Some(id) = self.keys.read().unwrap().get(bytes) {
return Ok(*id);
}
let id = VerifyingKey::from_bytes(bytes)?;
self.keys.write().unwrap().insert(*bytes, id);
Ok(id)
}
}