wasi_crypto/asymmetric_common/
secretkey.rs1use 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}