1use crate::{Algorithm, Error, KeyHandle, Result};
4
5#[cfg(feature = "ecdsa")]
6use crate::ecdsa;
7
8#[cfg(feature = "ed25519")]
9use crate::ed25519;
10
11#[derive(Debug, Default)]
13pub struct KeyRing {
14 #[cfg(feature = "ecdsa")]
16 pub ecdsa: ecdsa::KeyRing,
17
18 #[cfg(feature = "ed25519")]
20 pub ed25519: ed25519::KeyRing,
21}
22
23impl KeyRing {
24 pub fn new() -> Self {
26 Self::default()
27 }
28}
29
30pub trait LoadPkcs8 {
32 fn load_pkcs8(&mut self, private_key: pkcs8::PrivateKeyInfo<'_>) -> Result<KeyHandle>;
34}
35
36impl LoadPkcs8 for KeyRing {
37 fn load_pkcs8(&mut self, private_key: pkcs8::PrivateKeyInfo<'_>) -> Result<KeyHandle> {
38 #[allow(unused_variables)]
39 let algorithm = Algorithm::try_from(private_key.algorithm)?;
40
41 #[cfg(feature = "ecdsa")]
42 if algorithm.is_ecdsa() {
43 return self.ecdsa.load_pkcs8(private_key);
44 }
45
46 #[cfg(feature = "ed25519")]
47 if algorithm == Algorithm::Ed25519 {
48 return self.ed25519.load_pkcs8(private_key);
49 }
50
51 Err(Error::AlgorithmInvalid)
52 }
53}