diff options
Diffstat (limited to 'lockchain-core/src/crypto')
-rw-r--r-- | lockchain-core/src/crypto/keystore.rs | 59 | ||||
-rw-r--r-- | lockchain-core/src/crypto/mod.rs | 4 |
2 files changed, 62 insertions, 1 deletions
diff --git a/lockchain-core/src/crypto/keystore.rs b/lockchain-core/src/crypto/keystore.rs new file mode 100644 index 0000000..0f19e30 --- /dev/null +++ b/lockchain-core/src/crypto/keystore.rs @@ -0,0 +1,59 @@ +//! A utility keystore module for the lockchain ecosystem + +use traits::{AutoEncoder, Base64AutoEncoder}; +use {crypto::Key, meta::MetaDomain}; + +use std::collections::HashMap; + +#[derive(Serialize, Deserialize)] +pub struct KeyStore { + keys: HashMap<String, Key>, +} + +impl KeyStore { + pub fn add_key(&mut self, user: &str, key: Key) { + self.keys.insert(user.into(), key); + } + + pub fn revoke_key(&mut self, user: &str) { + self.keys.remove(user); + } +} + +impl AutoEncoder for KeyStore {} + +impl From<MetaDomain> for KeyStore { + fn from(d: MetaDomain) -> Self { + Self { + keys: d + .all() + .iter() + .map(|(k, v)| { + ( + k.clone(), + match v { + ::Payload::Text(s) => Key::decode(&String::from_base64(s)).unwrap(), + _ => unreachable!(), + }, + ) + }) + .collect(), + } + } +} + +impl From<KeyStore> for MetaDomain { + fn from(ks: KeyStore) -> Self { + MetaDomain::new("keystore").fill( + ks.keys + .iter() + .map(|(name, key)| { + ( + name.clone(), + ::Payload::Text(key.encode().unwrap().to_base64()), + ) + }) + .collect(), + ) + } +} diff --git a/lockchain-core/src/crypto/mod.rs b/lockchain-core/src/crypto/mod.rs index 6fa17bb..671cff0 100644 --- a/lockchain-core/src/crypto/mod.rs +++ b/lockchain-core/src/crypto/mod.rs @@ -13,10 +13,12 @@ mod keys { impl AutoEncoder for KeyType {} } -pub mod passwords; +// pub mod passwords; pub mod encoding; +pub mod keystore; pub mod hashing; pub mod random; pub use self::data::PackedData; +pub use self::keystore::KeyStore; pub use self::keys::{Key, KeyType}; |