signatory/ed25519/
keyring.rs

1//! Ed25519 keyring.
2
3use super::{SigningKey, VerifyingKey};
4use crate::{Error, KeyHandle, LoadPkcs8, Map, Result};
5
6/// Ed25519 keyring.
7#[derive(Debug, Default)]
8pub struct KeyRing {
9    keys: Map<VerifyingKey, SigningKey>,
10}
11
12impl KeyRing {
13    /// Create new Ed25519 keyring.
14    pub fn new() -> Self {
15        Self::default()
16    }
17
18    /// Get the [`SigningKey`] that corresponds to the provided [`VerifyingKey`]
19    /// (i.e. public key)
20    pub fn get(&self, verifying_key: &VerifyingKey) -> Option<&SigningKey> {
21        self.keys.get(verifying_key)
22    }
23
24    /// Iterate over the keys in the keyring.
25    pub fn iter(&self) -> impl Iterator<Item = &SigningKey> {
26        self.keys.values()
27    }
28}
29
30impl LoadPkcs8 for KeyRing {
31    fn load_pkcs8(&mut self, private_key: pkcs8::PrivateKeyInfo<'_>) -> Result<KeyHandle> {
32        let signing_key = SigningKey::try_from(private_key)?;
33        let verifying_key = signing_key.verifying_key();
34
35        if self.keys.contains_key(&verifying_key) {
36            return Err(Error::DuplicateKey);
37        }
38
39        self.keys.insert(verifying_key, signing_key);
40        Ok(KeyHandle::Ed25519(verifying_key))
41    }
42}