Skip to main content

signstar_crypto/key/import/
nethsm.rs

1//! Implementations specific to a NetHSM backend.
2
3use base64ct::{Base64, Encoding};
4use nethsm_sdk_rs::models::KeyPrivateData;
5
6use crate::key::import::{PrivateKeyData, PrivateKeyImport};
7
8impl TryFrom<PrivateKeyImport> for KeyPrivateData {
9    type Error = crate::Error;
10
11    fn try_from(value: PrivateKeyImport) -> Result<Self, Self::Error> {
12        Ok(match value.key_data {
13            PrivateKeyData::Rsa {
14                prime_p,
15                prime_q,
16                public_exponent,
17            } =>
18            // WARNING: Upstream has decided to set all models non-exhaustive.
19            //
20            // On each update to nethsm-sdk-rs, check whether KeyPrivateData has gained further
21            // fields.
22            {
23                let mut key_private_data = KeyPrivateData::default();
24                key_private_data.prime_p = Some(Base64::encode_string(&prime_p));
25                key_private_data.prime_q = Some(Base64::encode_string(&prime_q));
26                key_private_data.public_exponent = Some(Base64::encode_string(&public_exponent));
27                key_private_data.data = None;
28                key_private_data
29            }
30            PrivateKeyData::Curve25519(data)
31            | PrivateKeyData::EcBp256(data)
32            | PrivateKeyData::EcBp384(data)
33            | PrivateKeyData::EcK256(data)
34            | PrivateKeyData::EcP224(data)
35            | PrivateKeyData::EcP256(data)
36            | PrivateKeyData::EcP384(data)
37            | PrivateKeyData::EcP521(data) =>
38            // WARNING: Upstream has decided to set all models non-exhaustive.
39            //
40            // On each update to nethsm-sdk-rs, check whether KeyPrivateData has gained further
41            // fields.
42            {
43                let mut key_private_data = KeyPrivateData::default();
44                key_private_data.prime_q = None;
45                key_private_data.prime_q = None;
46                key_private_data.public_exponent = None;
47                key_private_data.data = Some(Base64::encode_string(&data));
48                key_private_data
49            }
50        })
51    }
52}