Skip to main content

signstar_crypto/key/base/
nethsm.rs

1//! NetHSM specific integration for cryptographic keys.
2
3use nethsm_sdk_rs::models::SignMode;
4
5use crate::key::base::{DecryptMode, EncryptMode, KeyMechanism, KeyType, SignatureType};
6
7impl From<KeyType> for nethsm_sdk_rs::models::KeyType {
8    fn from(value: KeyType) -> Self {
9        match value {
10            KeyType::Curve25519 => Self::Curve25519,
11            KeyType::EcP256 => Self::EcP256,
12            KeyType::EcP384 => Self::EcP384,
13            KeyType::EcP521 => Self::EcP521,
14            KeyType::Generic => Self::Generic,
15            KeyType::Rsa => Self::Rsa,
16        }
17    }
18}
19
20impl TryFrom<nethsm_sdk_rs::models::KeyType> for KeyType {
21    type Error = crate::key::Error;
22    /// Creates a [`KeyType`] from a [`nethsm_sdk_rs::models::KeyType`].
23    ///
24    /// # Panics
25    ///
26    /// Panics if `value` is [`nethsm_sdk_rs::models::KeyType::EcP224`].
27    /// This variant is about to be removed from [`nethsm_sdk_rs::models::KeyType`] and [`KeyType`]
28    /// does not support it.
29    fn try_from(value: nethsm_sdk_rs::models::KeyType) -> Result<Self, Self::Error> {
30        Ok(match value {
31            nethsm_sdk_rs::models::KeyType::Curve25519 => Self::Curve25519,
32            nethsm_sdk_rs::models::KeyType::EcP224 => {
33                unimplemented!(
34                    "Elliptic Curve P224 is not implemented and the nethsm-sdk-rs crate will drop it in the future"
35                )
36            }
37            nethsm_sdk_rs::models::KeyType::EcP256 => Self::EcP256,
38            nethsm_sdk_rs::models::KeyType::EcP384 => Self::EcP384,
39            nethsm_sdk_rs::models::KeyType::EcP521 => Self::EcP521,
40            nethsm_sdk_rs::models::KeyType::Generic => Self::Generic,
41            nethsm_sdk_rs::models::KeyType::Rsa => Self::Rsa,
42        })
43    }
44}
45
46impl TryFrom<&nethsm_sdk_rs::models::KeyMechanism> for KeyMechanism {
47    type Error = crate::Error;
48    fn try_from(value: &nethsm_sdk_rs::models::KeyMechanism) -> Result<Self, Self::Error> {
49        Ok(match value {
50            nethsm_sdk_rs::models::KeyMechanism::AesDecryptionCbc => Self::AesDecryptionCbc,
51            nethsm_sdk_rs::models::KeyMechanism::AesEncryptionCbc => Self::AesEncryptionCbc,
52            nethsm_sdk_rs::models::KeyMechanism::EcdsaSignature => Self::EcdsaSignature,
53            nethsm_sdk_rs::models::KeyMechanism::EdDsaSignature => Self::EdDsaSignature,
54            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionOaepMd5 => Self::RsaDecryptionOaepMd5,
55            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionOaepSha1 => {
56                Self::RsaDecryptionOaepSha1
57            }
58            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionOaepSha224 => {
59                Self::RsaDecryptionOaepSha224
60            }
61            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionOaepSha256 => {
62                Self::RsaDecryptionOaepSha256
63            }
64            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionOaepSha384 => {
65                Self::RsaDecryptionOaepSha384
66            }
67            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionOaepSha512 => {
68                Self::RsaDecryptionOaepSha512
69            }
70            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionPkcs1 => Self::RsaDecryptionPkcs1,
71            nethsm_sdk_rs::models::KeyMechanism::RsaDecryptionRaw => Self::RsaDecryptionRaw,
72            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePkcs1 => Self::RsaSignaturePkcs1,
73            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePssSha1 => Self::RsaSignaturePssSha1,
74            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePssSha224 => {
75                Self::RsaSignaturePssSha224
76            }
77            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePssSha256 => {
78                Self::RsaSignaturePssSha256
79            }
80            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePssSha384 => {
81                Self::RsaSignaturePssSha384
82            }
83            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePssSha512 => {
84                Self::RsaSignaturePssSha512
85            }
86            nethsm_sdk_rs::models::KeyMechanism::RsaSignaturePssMd5 => {
87                return Err(crate::Error::UnsupportedNetHsmKeyMechanism(*value));
88            }
89        })
90    }
91}
92
93impl From<KeyMechanism> for nethsm_sdk_rs::models::KeyMechanism {
94    fn from(value: KeyMechanism) -> Self {
95        match value {
96            KeyMechanism::AesDecryptionCbc => Self::AesDecryptionCbc,
97            KeyMechanism::AesEncryptionCbc => Self::AesEncryptionCbc,
98            KeyMechanism::EcdsaSignature => Self::EcdsaSignature,
99            KeyMechanism::EdDsaSignature => Self::EdDsaSignature,
100            KeyMechanism::RsaDecryptionOaepMd5 => Self::RsaDecryptionOaepMd5,
101            KeyMechanism::RsaDecryptionOaepSha1 => Self::RsaDecryptionOaepSha1,
102            KeyMechanism::RsaDecryptionOaepSha224 => Self::RsaDecryptionOaepSha224,
103            KeyMechanism::RsaDecryptionOaepSha256 => Self::RsaDecryptionOaepSha256,
104            KeyMechanism::RsaDecryptionOaepSha384 => Self::RsaDecryptionOaepSha384,
105            KeyMechanism::RsaDecryptionOaepSha512 => Self::RsaDecryptionOaepSha512,
106            KeyMechanism::RsaDecryptionPkcs1 => Self::RsaDecryptionPkcs1,
107            KeyMechanism::RsaDecryptionRaw => Self::RsaDecryptionRaw,
108            KeyMechanism::RsaSignaturePkcs1 => Self::RsaSignaturePkcs1,
109            KeyMechanism::RsaSignaturePssSha1 => Self::RsaSignaturePssSha1,
110            KeyMechanism::RsaSignaturePssSha224 => Self::RsaSignaturePssSha224,
111            KeyMechanism::RsaSignaturePssSha256 => Self::RsaSignaturePssSha256,
112            KeyMechanism::RsaSignaturePssSha384 => Self::RsaSignaturePssSha384,
113            KeyMechanism::RsaSignaturePssSha512 => Self::RsaSignaturePssSha512,
114        }
115    }
116}
117
118impl From<SignatureType> for SignMode {
119    /// Creates a [`SignMode`] from a [`SignatureType`].
120    ///
121    /// # Note
122    ///
123    /// The more specific [`SignatureType::EcdsaP256`], [`SignatureType::EcdsaP384`] and
124    /// [`SignatureType::EcdsaP521`] are returned as [`SignMode::Ecdsa`].
125    fn from(value: SignatureType) -> Self {
126        match value {
127            SignatureType::Pkcs1 => SignMode::Pkcs1,
128            SignatureType::PssSha1 => SignMode::PssSha1,
129            SignatureType::PssSha224 => SignMode::PssSha224,
130            SignatureType::PssSha256 => SignMode::PssSha256,
131            SignatureType::PssSha384 => SignMode::PssSha384,
132            SignatureType::PssSha512 => SignMode::PssSha512,
133            SignatureType::EdDsa => SignMode::EdDsa,
134            SignatureType::EcdsaP256 | SignatureType::EcdsaP384 | SignatureType::EcdsaP521 => {
135                SignMode::Ecdsa
136            }
137        }
138    }
139}
140
141impl From<EncryptMode> for nethsm_sdk_rs::models::EncryptMode {
142    fn from(value: EncryptMode) -> Self {
143        match value {
144            EncryptMode::AesCbc => Self::AesCbc,
145        }
146    }
147}
148
149impl From<DecryptMode> for nethsm_sdk_rs::models::DecryptMode {
150    fn from(value: DecryptMode) -> Self {
151        match value {
152            DecryptMode::AesCbc => Self::AesCbc,
153            DecryptMode::OaepMd5 => Self::OaepMd5,
154            DecryptMode::OaepSha1 => Self::OaepSha1,
155            DecryptMode::OaepSha224 => Self::OaepSha224,
156            DecryptMode::OaepSha256 => Self::OaepSha256,
157            DecryptMode::OaepSha384 => Self::OaepSha384,
158            DecryptMode::OaepSha512 => Self::OaepSha512,
159            DecryptMode::Pkcs1 => Self::Pkcs1,
160            DecryptMode::Raw => Self::Raw,
161        }
162    }
163}