wasi_crypto/asymmetric_common/
secretkey.rs

1use super::*;
2use crate::signatures::SignatureSecretKey;
3use crate::{AlgorithmType, CryptoCtx};
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq)]
6pub enum SecretKeyEncoding {
7    Raw,
8    Pkcs8,
9    Pem,
10    Sec,
11    Local,
12}
13
14#[derive(Clone)]
15pub enum SecretKey {
16    Signature(SignatureSecretKey),
17    KeyExchange(KxSecretKey),
18}
19
20impl SecretKey {
21    pub(crate) fn into_signature_secret_key(self) -> Result<SignatureSecretKey, CryptoError> {
22        match self {
23            SecretKey::Signature(sk) => Ok(sk),
24            _ => bail!(CryptoError::InvalidHandle),
25        }
26    }
27
28    pub(crate) fn into_kx_secret_key(self) -> Result<KxSecretKey, CryptoError> {
29        match self {
30            SecretKey::KeyExchange(sk) => Ok(sk),
31            _ => bail!(CryptoError::InvalidHandle),
32        }
33    }
34
35    fn import(
36        _alg_type: AlgorithmType,
37        _alg_str: &str,
38        _encoded: &[u8],
39        _encoding: SecretKeyEncoding,
40    ) -> Result<SecretKey, CryptoError> {
41        bail!(CryptoError::NotImplemented)
42    }
43
44    fn export(&self, encoding: SecretKeyEncoding) -> Result<Vec<u8>, CryptoError> {
45        match self {
46            SecretKey::Signature(sk) => Ok(sk.export(encoding)?),
47            SecretKey::KeyExchange(sk) => Ok(sk.export(encoding)?),
48        }
49    }
50
51    pub fn publickey(&self) -> Result<PublicKey, CryptoError> {
52        match self {
53            SecretKey::Signature(sk) => Ok(PublicKey::Signature(sk.publickey()?)),
54            SecretKey::KeyExchange(sk) => Ok(PublicKey::KeyExchange(sk.publickey()?)),
55        }
56    }
57}
58
59impl CryptoCtx {
60    pub fn secretkey_import(
61        &self,
62        alg_type: AlgorithmType,
63        alg_str: &str,
64        encoded: &[u8],
65        encoding: SecretKeyEncoding,
66    ) -> Result<Handle, CryptoError> {
67        let sk = SecretKey::import(alg_type, alg_str, encoded, encoding)?;
68        let handle = self.handles.secretkey.register(sk)?;
69        Ok(handle)
70    }
71
72    pub fn secretkey_export(
73        &self,
74        sk_handle: Handle,
75        encoding: SecretKeyEncoding,
76    ) -> Result<Handle, CryptoError> {
77        let sk = self.handles.secretkey.get(sk_handle)?;
78        let encoded = sk.export(encoding)?;
79        let array_output_handle = ArrayOutput::register(&self.handles, encoded)?;
80        Ok(array_output_handle)
81    }
82
83    pub fn publickey(&self, sk_handle: Handle) -> Result<Handle, CryptoError> {
84        let sk = self.handles.secretkey.get(sk_handle)?;
85        let pk = sk.publickey()?;
86        let handle = self.handles.publickey.register(pk)?;
87        Ok(handle)
88    }
89
90    pub fn secretkey_close(&self, sk: Handle) -> Result<(), CryptoError> {
91        self.handles.secretkey.close(sk)
92    }
93}