1use std::{fmt::Display, str::FromStr};
2
3use base64ct::{Base64, Encoding};
4use nethsm_sdk_rs::models::KeyPrivateData;
5use rsa::{
6 RsaPrivateKey,
7 pkcs8::DecodePrivateKey,
8 traits::PrivateKeyParts,
9 traits::PublicKeyParts,
10};
11use serde::{Deserialize, Serialize};
12
13use crate::{KeyMechanism, KeyType, OpenPgpUserIdList, OpenPgpVersion, SignatureType, TlsKeyType};
14
15pub const MIN_RSA_BIT_LENGTH: u32 = 2048;
19
20#[derive(Debug, thiserror::Error)]
22pub enum Error {
23 #[error("PKCS#8 error: {0}")]
25 Pkcs8(#[from] rsa::pkcs8::Error),
26
27 #[error("No primes found")]
29 NoPrimes,
30
31 #[error("The {0} key type is not supported")]
33 UnsupportedKeyType(KeyType),
34
35 #[error(
37 "The key type {key_type} does not support the following key mechanisms: {invalid_mechanisms:?}"
38 )]
39 InvalidKeyMechanism {
40 key_type: KeyType,
41 invalid_mechanisms: Vec<KeyMechanism>,
42 },
43
44 #[error("Elliptic curve key ({key_type}) does not support setting length")]
46 KeyLengthUnsupported { key_type: KeyType },
47
48 #[error("Generating a key of type {key_type} requires setting a length")]
50 KeyLengthRequired { key_type: KeyType },
51
52 #[error(
54 "AES only defines key lengths of 128, 192 and 256. A key length of {key_length} is unsupported!"
55 )]
56 InvalidKeyLengthAes { key_length: u32 },
57
58 #[error(
60 "RSA keys shorter than {MIN_RSA_BIT_LENGTH} are not supported. A key length of {key_length} is unsafe!"
61 )]
62 InvalidKeyLengthRsa { key_length: u32 },
63
64 #[error("Elliptic curve key ({tls_key_type}) does not support setting length")]
66 TlsKeyLengthUnsupported { tls_key_type: TlsKeyType },
67
68 #[error("Generating a key of type {tls_key_type} requires setting a length")]
70 TlsKeyLengthRequired { tls_key_type: TlsKeyType },
71
72 #[error(
74 "RSA keys shorter than {MIN_RSA_BIT_LENGTH} are not supported. A key length of {key_length} is unsafe!"
75 )]
76 InvalidTlsKeyLengthRsa { key_length: u32 },
77
78 #[error("Invalid Key ID{}: {}", if key_ids.len() == 1 {"s"} else { " "}, key_ids.join(", "))]
80 InvalidKeyIds {
81 key_ids: Vec<String>,
83 },
84
85 #[error("The key type {key_type} is not compatible with signature type: {signature_type}")]
87 InvalidKeyTypeForSignatureType {
88 key_type: KeyType,
89 signature_type: SignatureType,
90 },
91
92 #[error(
94 "The key mechanism {required_key_mechanism} must be used with signature type {signature_type}"
95 )]
96 InvalidKeyMechanismsForSignatureType {
97 required_key_mechanism: KeyMechanism,
98 signature_type: SignatureType,
99 },
100
101 #[error("Unable to derive a valid cryptography key use from string: {0}")]
103 InvalidCryptograhicKeyUse(String),
104
105 #[error(
107 "The key type {key_type}, key mechanisms {key_mechanisms:?} and signature type {signature_type} are incompatible with raw cryptographic signing"
108 )]
109 InvalidRawSigningKeySetup {
110 key_type: KeyType,
111 key_mechanisms: Vec<KeyMechanism>,
112 signature_type: SignatureType,
113 },
114
115 #[error(
117 "The key type {key_type}, key mechanisms {key_mechanisms:?} and signature type {signature_type} are incompatible with OpenPGP signing"
118 )]
119 InvalidOpenPgpSigningKeySetup {
120 key_type: KeyType,
121 key_mechanisms: Vec<KeyMechanism>,
122 signature_type: SignatureType,
123 },
124}
125
126#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
136#[serde(into = "String", try_from = "String")]
137pub struct KeyId(String);
138
139impl KeyId {
140 pub fn new(key_id: String) -> Result<Self, Error> {
167 if key_id.is_empty()
168 || !key_id.chars().all(|char| {
169 char.is_numeric() || (char.is_ascii_lowercase() && char.is_ascii_alphabetic())
170 })
171 {
172 return Err(Error::InvalidKeyIds {
173 key_ids: vec![key_id],
174 });
175 }
176
177 Ok(Self(key_id))
178 }
179}
180
181impl AsRef<str> for KeyId {
182 fn as_ref(&self) -> &str {
183 &self.0
184 }
185}
186
187impl From<KeyId> for String {
188 fn from(value: KeyId) -> Self {
189 value.0
190 }
191}
192
193impl FromStr for KeyId {
194 type Err = Error;
195 fn from_str(s: &str) -> Result<Self, Self::Err> {
196 Self::new(s.into())
197 }
198}
199
200impl Display for KeyId {
201 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
202 self.0.fmt(f)
203 }
204}
205
206impl TryFrom<&str> for KeyId {
207 type Error = Error;
208
209 fn try_from(value: &str) -> Result<Self, Self::Error> {
210 Self::from_str(value)
211 }
212}
213
214impl TryFrom<&String> for KeyId {
215 type Error = Error;
216
217 fn try_from(value: &String) -> Result<Self, Self::Error> {
218 Self::from_str(value)
219 }
220}
221
222impl TryFrom<String> for KeyId {
223 type Error = Error;
224
225 fn try_from(value: String) -> Result<Self, Self::Error> {
226 Self::new(value)
227 }
228}
229
230#[derive(Clone, Debug, Deserialize, Hash, Eq, PartialEq, Serialize)]
236pub enum CryptographicKeyContext {
237 #[serde(rename = "openpgp")]
239 OpenPgp {
240 user_ids: OpenPgpUserIdList,
242
243 version: OpenPgpVersion,
245 },
246
247 #[serde(rename = "raw")]
249 Raw,
250}
251
252impl CryptographicKeyContext {
253 pub fn validate_signing_key_setup(
308 &self,
309 key_type: KeyType,
310 key_mechanisms: &[KeyMechanism],
311 signature_type: SignatureType,
312 ) -> Result<(), Error> {
313 match self {
314 Self::Raw => match (key_type, signature_type) {
315 (KeyType::Curve25519, SignatureType::EdDsa)
316 if key_mechanisms.contains(&KeyMechanism::EdDsaSignature) => {}
317 (KeyType::EcP224, SignatureType::EcdsaP224)
318 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
319 (KeyType::EcP256, SignatureType::EcdsaP256)
320 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
321 (KeyType::EcP384, SignatureType::EcdsaP384)
322 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
323 (KeyType::EcP521, SignatureType::EcdsaP521)
324 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
325 (KeyType::Rsa, SignatureType::Pkcs1)
326 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePkcs1) => {}
327 (KeyType::Rsa, SignatureType::PssMd5)
328 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePssMd5) => {}
329 (KeyType::Rsa, SignatureType::PssSha1)
330 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePssSha1) => {}
331 (KeyType::Rsa, SignatureType::PssSha224)
332 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePssSha224) => {}
333 (KeyType::Rsa, SignatureType::PssSha256)
334 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePssSha256) => {}
335 (KeyType::Rsa, SignatureType::PssSha384)
336 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePssSha384) => {}
337 (KeyType::Rsa, SignatureType::PssSha512)
338 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePssSha512) => {}
339 _ => {
340 return Err(Error::InvalidRawSigningKeySetup {
341 key_type,
342 key_mechanisms: key_mechanisms.to_vec(),
343 signature_type,
344 });
345 }
346 },
347 Self::OpenPgp {
348 user_ids: _,
349 version: _,
350 } => match (key_type, signature_type) {
351 (KeyType::Curve25519, SignatureType::EdDsa)
352 if key_mechanisms.contains(&KeyMechanism::EdDsaSignature) => {}
353 (KeyType::EcP256, SignatureType::EcdsaP256)
354 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
355 (KeyType::EcP384, SignatureType::EcdsaP384)
356 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
357 (KeyType::EcP521, SignatureType::EcdsaP521)
358 if key_mechanisms.contains(&KeyMechanism::EcdsaSignature) => {}
359 (KeyType::Rsa, SignatureType::Pkcs1)
360 if key_mechanisms.contains(&KeyMechanism::RsaSignaturePkcs1) => {}
361 _ => {
362 return Err(Error::InvalidOpenPgpSigningKeySetup {
363 key_type,
364 key_mechanisms: key_mechanisms.to_vec(),
365 signature_type,
366 });
367 }
368 },
369 }
370 Ok(())
371 }
372}
373
374#[derive(Clone, Debug, Deserialize, Hash, Eq, PartialEq, Serialize)]
376pub struct SigningKeySetup {
377 key_id: KeyId,
378 key_type: KeyType,
379 key_mechanisms: Vec<KeyMechanism>,
380 key_length: Option<u32>,
381 signature_type: SignatureType,
382 key_context: CryptographicKeyContext,
383}
384
385impl SigningKeySetup {
386 pub fn new(
468 key_id: KeyId,
469 key_type: KeyType,
470 key_mechanisms: Vec<KeyMechanism>,
471 key_length: Option<u32>,
472 signature_type: SignatureType,
473 cryptographic_key_context: CryptographicKeyContext,
474 ) -> Result<Self, Error> {
475 key_type_matches_mechanisms(key_type, &key_mechanisms)?;
476 key_type_matches_length(key_type, key_length)?;
477 key_type_and_mechanisms_match_signature_type(key_type, &key_mechanisms, signature_type)?;
478 cryptographic_key_context.validate_signing_key_setup(
479 key_type,
480 &key_mechanisms,
481 signature_type,
482 )?;
483
484 Ok(Self {
485 key_id,
486 key_type,
487 key_mechanisms,
488 key_length,
489 signature_type,
490 key_context: cryptographic_key_context,
491 })
492 }
493
494 pub fn get_key_id(&self) -> KeyId {
496 self.key_id.clone()
497 }
498
499 pub fn get_key_type(&self) -> KeyType {
501 self.key_type
502 }
503
504 pub fn get_key_mechanisms(&self) -> Vec<KeyMechanism> {
506 self.key_mechanisms.clone()
507 }
508
509 pub fn get_key_length(&self) -> Option<u32> {
511 self.key_length
512 }
513
514 pub fn get_signature_type(&self) -> SignatureType {
516 self.signature_type
517 }
518
519 pub fn get_key_context(&self) -> CryptographicKeyContext {
521 self.key_context.clone()
522 }
523}
524
525enum PrivateKeyData {
527 Curve25519(Vec<u8>),
529 EcP224(Vec<u8>),
531 EcP256(Vec<u8>),
533 EcP384(Vec<u8>),
535 EcP521(Vec<u8>),
537 Rsa {
539 prime_p: Vec<u8>,
540 prime_q: Vec<u8>,
541 public_exponent: Vec<u8>,
542 },
543}
544
545impl std::fmt::Debug for PrivateKeyData {
546 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
547 const REDACTED: &&str = &"[REDACTED]";
548 match self {
549 Self::Curve25519(_) => f.debug_tuple("Curve25519").field(REDACTED).finish(),
550 Self::EcP224(_) => f.debug_tuple("EcP224").field(REDACTED).finish(),
551 Self::EcP256(_) => f.debug_tuple("EcP256").field(REDACTED).finish(),
552 Self::EcP384(_) => f.debug_tuple("EcP384").field(REDACTED).finish(),
553 Self::EcP521(_) => f.debug_tuple("EcP521").field(REDACTED).finish(),
554 Self::Rsa {
555 public_exponent, ..
556 } => f
557 .debug_struct("Rsa")
558 .field("prime_p", REDACTED)
559 .field("prime_q", REDACTED)
560 .field("public_exponent", public_exponent)
561 .finish(),
562 }
563 }
564}
565
566#[derive(Debug)]
568pub struct PrivateKeyImport {
569 key_data: PrivateKeyData,
570}
571
572fn pad(buf: &[u8], len: usize) -> Result<Vec<u8>, crate::Error> {
588 if len < buf.len() {
589 return Err(crate::Error::Default(format!(
590 "Input buffer should be upmost {len} bytes long but has {} bytes.",
591 buf.len()
592 )));
593 }
594 let mut v = vec![0; len];
595 v[len - buf.len()..].copy_from_slice(buf);
596 Ok(v)
597}
598
599impl PrivateKeyImport {
600 pub fn new(key_type: KeyType, key_data: &[u8]) -> Result<Self, Error> {
633 Ok(match key_type {
634 KeyType::Curve25519 => {
635 let key_pair = ed25519_dalek::pkcs8::KeypairBytes::from_pkcs8_der(key_data)?;
636 Self {
637 key_data: PrivateKeyData::Curve25519(key_pair.secret_key.to_vec()),
638 }
639 }
640 KeyType::EcP224 => {
641 let private_key = p224::SecretKey::from_pkcs8_der(key_data)?;
642 Self {
643 key_data: PrivateKeyData::EcP224(private_key.to_bytes().as_slice().to_owned()),
644 }
645 }
646 KeyType::EcP256 => {
647 let private_key = p256::SecretKey::from_pkcs8_der(key_data)?;
648 Self {
649 key_data: PrivateKeyData::EcP256(private_key.to_bytes().as_slice().to_owned()),
650 }
651 }
652 KeyType::EcP384 => {
653 let private_key = p384::SecretKey::from_pkcs8_der(key_data)?;
654 Self {
655 key_data: PrivateKeyData::EcP384(private_key.to_bytes().as_slice().to_owned()),
656 }
657 }
658 KeyType::EcP521 => {
659 let private_key = p521::SecretKey::from_pkcs8_der(key_data)?;
660 Self {
661 key_data: PrivateKeyData::EcP521(private_key.to_bytes().as_slice().to_owned()),
662 }
663 }
664 KeyType::Generic => return Err(Error::UnsupportedKeyType(KeyType::Generic)),
665 KeyType::Rsa => {
666 let private_key = RsaPrivateKey::from_pkcs8_der(key_data)?;
667 key_type_matches_length(key_type, Some(private_key.size() as u32 * 8))?;
669 Self {
670 key_data: PrivateKeyData::Rsa {
671 prime_p: private_key
672 .primes()
673 .first()
674 .ok_or(Error::NoPrimes)?
675 .to_bytes_be(),
676 prime_q: private_key
677 .primes()
678 .get(1)
679 .ok_or(Error::NoPrimes)?
680 .to_bytes_be(),
681 public_exponent: private_key.e().to_bytes_be(),
682 },
683 }
684 }
685 })
686 }
687
688 pub fn from_pkcs8_pem(key_type: KeyType, key_data: &str) -> Result<Self, Error> {
723 Ok(match key_type {
724 KeyType::Curve25519 => {
725 let key_pair = ed25519_dalek::pkcs8::KeypairBytes::from_pkcs8_pem(key_data)?;
726 Self {
727 key_data: PrivateKeyData::Curve25519(key_pair.secret_key.to_vec()),
728 }
729 }
730 KeyType::EcP224 => {
731 let private_key = p224::SecretKey::from_pkcs8_pem(key_data)?;
732 Self {
733 key_data: PrivateKeyData::EcP224(private_key.to_bytes().as_slice().to_owned()),
734 }
735 }
736 KeyType::EcP256 => {
737 let private_key = p256::SecretKey::from_pkcs8_pem(key_data)?;
738 Self {
739 key_data: PrivateKeyData::EcP256(private_key.to_bytes().as_slice().to_owned()),
740 }
741 }
742 KeyType::EcP384 => {
743 let private_key = p384::SecretKey::from_pkcs8_pem(key_data)?;
744 Self {
745 key_data: PrivateKeyData::EcP384(private_key.to_bytes().as_slice().to_owned()),
746 }
747 }
748 KeyType::EcP521 => {
749 let private_key = p521::SecretKey::from_pkcs8_pem(key_data)?;
750 Self {
751 key_data: PrivateKeyData::EcP521(private_key.to_bytes().as_slice().to_owned()),
752 }
753 }
754 KeyType::Generic => return Err(Error::UnsupportedKeyType(KeyType::Generic)),
755 KeyType::Rsa => {
756 let private_key = RsaPrivateKey::from_pkcs8_pem(key_data)?;
757 key_type_matches_length(key_type, Some(private_key.size() as u32 * 8))?;
759 Self {
760 key_data: PrivateKeyData::Rsa {
761 prime_p: private_key
762 .primes()
763 .first()
764 .ok_or(Error::NoPrimes)?
765 .to_bytes_be(),
766 prime_q: private_key
767 .primes()
768 .get(1)
769 .ok_or(Error::NoPrimes)?
770 .to_bytes_be(),
771 public_exponent: private_key.e().to_bytes_be(),
772 },
773 }
774 }
775 })
776 }
777
778 pub fn from_rsa(prime_p: Vec<u8>, prime_q: Vec<u8>, public_exponent: Vec<u8>) -> Self {
797 Self {
798 key_data: PrivateKeyData::Rsa {
799 prime_p,
800 prime_q,
801 public_exponent,
802 },
803 }
804 }
805
806 pub fn from_raw_bytes(ec: KeyType, bytes: impl AsRef<[u8]>) -> Result<Self, crate::Error> {
827 let bytes = bytes.as_ref();
828 Ok(Self {
829 key_data: match ec {
830 KeyType::EcP224 => PrivateKeyData::EcP224(pad(bytes, 28)?),
831 KeyType::EcP256 => PrivateKeyData::EcP256(pad(bytes, 32)?),
832 KeyType::EcP384 => PrivateKeyData::EcP384(pad(bytes, 48)?),
833 KeyType::EcP521 => PrivateKeyData::EcP521(pad(bytes, 66)?),
834 KeyType::Curve25519 => PrivateKeyData::Curve25519(pad(bytes, 32)?),
835 ec => return Err(crate::Error::Default(format!("Unsupported key type: {ec}"))),
836 },
837 })
838 }
839
840 pub fn key_type(&self) -> KeyType {
842 match &self.key_data {
843 PrivateKeyData::Curve25519(_) => KeyType::Curve25519,
844 PrivateKeyData::EcP224(_) => KeyType::EcP224,
845 PrivateKeyData::EcP256(_) => KeyType::EcP256,
846 PrivateKeyData::EcP384(_) => KeyType::EcP384,
847 PrivateKeyData::EcP521(_) => KeyType::EcP521,
848 PrivateKeyData::Rsa {
849 prime_p: _,
850 prime_q: _,
851 public_exponent: _,
852 } => KeyType::Rsa,
853 }
854 }
855}
856
857impl From<PrivateKeyImport> for KeyPrivateData {
858 fn from(value: PrivateKeyImport) -> Self {
859 match value.key_data {
860 PrivateKeyData::Rsa {
861 prime_p,
862 prime_q,
863 public_exponent,
864 } => KeyPrivateData {
865 prime_p: Some(Base64::encode_string(&prime_p)),
866 prime_q: Some(Base64::encode_string(&prime_q)),
867 public_exponent: Some(Base64::encode_string(&public_exponent)),
868 data: None,
869 },
870 PrivateKeyData::EcP224(data)
871 | PrivateKeyData::EcP256(data)
872 | PrivateKeyData::EcP384(data)
873 | PrivateKeyData::EcP521(data)
874 | PrivateKeyData::Curve25519(data) => KeyPrivateData {
875 prime_p: None,
876 prime_q: None,
877 public_exponent: None,
878 data: Some(Base64::encode_string(&data)),
879 },
880 }
881 }
882}
883
884pub fn key_type_matches_mechanisms(
944 key_type: KeyType,
945 mechanisms: &[KeyMechanism],
946) -> Result<(), Error> {
947 let valid_mechanisms: &[KeyMechanism] = match key_type {
948 KeyType::Curve25519 => &KeyMechanism::curve25519_mechanisms(),
949 KeyType::EcP224 | KeyType::EcP256 | KeyType::EcP384 | KeyType::EcP521 => {
950 &KeyMechanism::elliptic_curve_mechanisms()
951 }
952 KeyType::Generic => &KeyMechanism::generic_mechanisms(),
953 KeyType::Rsa => &KeyMechanism::rsa_mechanisms(),
954 };
955
956 let invalid_mechanisms = mechanisms
957 .iter()
958 .filter(|mechanism| !valid_mechanisms.contains(mechanism))
959 .cloned()
960 .collect::<Vec<KeyMechanism>>();
961
962 if invalid_mechanisms.is_empty() {
963 Ok(())
964 } else {
965 Err(Error::InvalidKeyMechanism {
966 key_type,
967 invalid_mechanisms,
968 })
969 }
970}
971
972pub fn key_type_and_mechanisms_match_signature_type(
999 key_type: KeyType,
1000 mechanisms: &[KeyMechanism],
1001 signature_type: SignatureType,
1002) -> Result<(), Error> {
1003 match signature_type {
1004 SignatureType::EcdsaP224 => {
1005 if key_type != KeyType::EcP224 {
1006 return Err(Error::InvalidKeyTypeForSignatureType {
1007 key_type,
1008 signature_type,
1009 });
1010 } else if !mechanisms.contains(&KeyMechanism::EcdsaSignature) {
1011 return Err(Error::InvalidKeyMechanismsForSignatureType {
1012 required_key_mechanism: KeyMechanism::EcdsaSignature,
1013 signature_type,
1014 });
1015 }
1016 }
1017 SignatureType::EcdsaP256 => {
1018 if key_type != KeyType::EcP256 {
1019 return Err(Error::InvalidKeyTypeForSignatureType {
1020 key_type,
1021 signature_type,
1022 });
1023 } else if !mechanisms.contains(&KeyMechanism::EcdsaSignature) {
1024 return Err(Error::InvalidKeyMechanismsForSignatureType {
1025 required_key_mechanism: KeyMechanism::EcdsaSignature,
1026 signature_type,
1027 });
1028 }
1029 }
1030 SignatureType::EcdsaP384 => {
1031 if key_type != KeyType::EcP384 {
1032 return Err(Error::InvalidKeyTypeForSignatureType {
1033 key_type,
1034 signature_type,
1035 });
1036 } else if !mechanisms.contains(&KeyMechanism::EcdsaSignature) {
1037 return Err(Error::InvalidKeyMechanismsForSignatureType {
1038 required_key_mechanism: KeyMechanism::EcdsaSignature,
1039 signature_type,
1040 });
1041 }
1042 }
1043 SignatureType::EcdsaP521 => {
1044 if key_type != KeyType::EcP521 {
1045 return Err(Error::InvalidKeyTypeForSignatureType {
1046 key_type,
1047 signature_type,
1048 });
1049 } else if !mechanisms.contains(&KeyMechanism::EcdsaSignature) {
1050 return Err(Error::InvalidKeyMechanismsForSignatureType {
1051 required_key_mechanism: KeyMechanism::EcdsaSignature,
1052 signature_type,
1053 });
1054 }
1055 }
1056 SignatureType::EdDsa => {
1057 if key_type != KeyType::Curve25519 {
1058 return Err(Error::InvalidKeyTypeForSignatureType {
1059 key_type,
1060 signature_type,
1061 });
1062 } else if !mechanisms.contains(&KeyMechanism::EdDsaSignature) {
1063 return Err(Error::InvalidKeyMechanismsForSignatureType {
1064 required_key_mechanism: KeyMechanism::EdDsaSignature,
1065 signature_type,
1066 });
1067 }
1068 }
1069 SignatureType::Pkcs1 => {
1070 if key_type != KeyType::Rsa {
1071 return Err(Error::InvalidKeyTypeForSignatureType {
1072 key_type,
1073 signature_type,
1074 });
1075 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePkcs1) {
1076 return Err(Error::InvalidKeyMechanismsForSignatureType {
1077 required_key_mechanism: KeyMechanism::RsaSignaturePkcs1,
1078 signature_type,
1079 });
1080 }
1081 }
1082 SignatureType::PssMd5 => {
1083 if key_type != KeyType::Rsa {
1084 return Err(Error::InvalidKeyTypeForSignatureType {
1085 key_type,
1086 signature_type,
1087 });
1088 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePssMd5) {
1089 return Err(Error::InvalidKeyMechanismsForSignatureType {
1090 required_key_mechanism: KeyMechanism::RsaSignaturePssMd5,
1091 signature_type,
1092 });
1093 }
1094 }
1095 SignatureType::PssSha1 => {
1096 if key_type != KeyType::Rsa {
1097 return Err(Error::InvalidKeyTypeForSignatureType {
1098 key_type,
1099 signature_type,
1100 });
1101 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePssSha1) {
1102 return Err(Error::InvalidKeyMechanismsForSignatureType {
1103 required_key_mechanism: KeyMechanism::RsaSignaturePssSha1,
1104 signature_type,
1105 });
1106 }
1107 }
1108 SignatureType::PssSha224 => {
1109 if key_type != KeyType::Rsa {
1110 return Err(Error::InvalidKeyTypeForSignatureType {
1111 key_type,
1112 signature_type,
1113 });
1114 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePssSha224) {
1115 return Err(Error::InvalidKeyMechanismsForSignatureType {
1116 required_key_mechanism: KeyMechanism::RsaSignaturePssSha224,
1117 signature_type,
1118 });
1119 }
1120 }
1121 SignatureType::PssSha256 => {
1122 if key_type != KeyType::Rsa {
1123 return Err(Error::InvalidKeyTypeForSignatureType {
1124 key_type,
1125 signature_type,
1126 });
1127 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePssSha256) {
1128 return Err(Error::InvalidKeyMechanismsForSignatureType {
1129 required_key_mechanism: KeyMechanism::RsaSignaturePssSha256,
1130 signature_type,
1131 });
1132 }
1133 }
1134 SignatureType::PssSha384 => {
1135 if key_type != KeyType::Rsa {
1136 return Err(Error::InvalidKeyTypeForSignatureType {
1137 key_type,
1138 signature_type,
1139 });
1140 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePssSha384) {
1141 return Err(Error::InvalidKeyMechanismsForSignatureType {
1142 required_key_mechanism: KeyMechanism::RsaSignaturePssSha384,
1143 signature_type,
1144 });
1145 }
1146 }
1147 SignatureType::PssSha512 => {
1148 if key_type != KeyType::Rsa {
1149 return Err(Error::InvalidKeyTypeForSignatureType {
1150 key_type,
1151 signature_type,
1152 });
1153 } else if !mechanisms.contains(&KeyMechanism::RsaSignaturePssSha512) {
1154 return Err(Error::InvalidKeyMechanismsForSignatureType {
1155 required_key_mechanism: KeyMechanism::RsaSignaturePssSha512,
1156 signature_type,
1157 });
1158 }
1159 }
1160 }
1161 Ok(())
1162}
1163
1164pub fn key_type_matches_length(key_type: KeyType, length: Option<u32>) -> Result<(), Error> {
1198 match key_type {
1199 KeyType::Curve25519
1200 | KeyType::EcP224
1201 | KeyType::EcP256
1202 | KeyType::EcP384
1203 | KeyType::EcP521 => {
1204 if length.is_some() {
1205 Err(Error::KeyLengthUnsupported { key_type })
1206 } else {
1207 Ok(())
1208 }
1209 }
1210 KeyType::Generic => match length {
1211 None => Err(Error::KeyLengthRequired { key_type }),
1212 Some(length) => {
1213 if ![128, 192, 256].contains(&length) {
1214 Err(Error::InvalidKeyLengthAes { key_length: length })
1215 } else {
1216 Ok(())
1217 }
1218 }
1219 },
1220 KeyType::Rsa => match length {
1221 None => Err(Error::KeyLengthRequired { key_type }),
1222 Some(length) => {
1223 if length < MIN_RSA_BIT_LENGTH {
1224 Err(Error::InvalidKeyLengthRsa { key_length: length })
1225 } else {
1226 Ok(())
1227 }
1228 }
1229 },
1230 }
1231}
1232
1233pub fn tls_key_type_matches_length(
1263 tls_key_type: TlsKeyType,
1264 length: Option<u32>,
1265) -> Result<(), Error> {
1266 match tls_key_type {
1267 TlsKeyType::Curve25519
1268 | TlsKeyType::EcP224
1269 | TlsKeyType::EcP256
1270 | TlsKeyType::EcP384
1271 | TlsKeyType::EcP521 => {
1272 if length.is_some() {
1273 Err(Error::TlsKeyLengthUnsupported { tls_key_type })
1274 } else {
1275 Ok(())
1276 }
1277 }
1278 TlsKeyType::Rsa => match length {
1279 None => Err(Error::TlsKeyLengthRequired { tls_key_type }),
1280 Some(length) => {
1281 if length < MIN_RSA_BIT_LENGTH {
1282 Err(Error::InvalidTlsKeyLengthRsa { key_length: length })
1283 } else {
1284 Ok(())
1285 }
1286 }
1287 },
1288 }
1289}
1290
1291#[cfg(test)]
1292mod tests {
1293 use rsa::RsaPrivateKey;
1294 use rsa::pkcs8::EncodePrivateKey;
1295 use rstest::{fixture, rstest};
1296 use testresult::TestResult;
1297
1298 use super::*;
1299
1300 #[fixture]
1301 fn ed25519_private_key() -> TestResult<Vec<u8>> {
1302 use ed25519_dalek::SigningKey;
1303 use rand::rngs::OsRng;
1304 let mut csprng = OsRng;
1305 let signing_key: SigningKey = SigningKey::generate(&mut csprng);
1306 Ok(signing_key.to_pkcs8_der()?.as_bytes().to_vec())
1307 }
1308
1309 #[fixture]
1310 fn p224_private_key() -> TestResult<Vec<u8>> {
1311 use p224::elliptic_curve::rand_core::OsRng;
1312 let private_key = p224::SecretKey::random(&mut OsRng);
1313 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
1314 }
1315
1316 #[fixture]
1317 fn p256_private_key() -> TestResult<Vec<u8>> {
1318 use p256::elliptic_curve::rand_core::OsRng;
1319 let private_key = p256::SecretKey::random(&mut OsRng);
1320 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
1321 }
1322
1323 #[fixture]
1324 fn p384_private_key() -> TestResult<Vec<u8>> {
1325 use p384::elliptic_curve::rand_core::OsRng;
1326 let private_key = p384::SecretKey::random(&mut OsRng);
1327 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
1328 }
1329
1330 #[fixture]
1331 fn p521_private_key() -> TestResult<Vec<u8>> {
1332 use p521::elliptic_curve::rand_core::OsRng;
1333 let private_key = p521::SecretKey::random(&mut OsRng);
1334 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
1335 }
1336
1337 #[fixture]
1338 fn rsa_private_key() -> TestResult<Vec<u8>> {
1339 let mut rng = rand::thread_rng();
1340 let private_key = RsaPrivateKey::new(&mut rng, 2048.try_into()?)?;
1341 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
1342 }
1343
1344 #[rstest]
1345 fn key_data(
1346 ed25519_private_key: TestResult<Vec<u8>>,
1347 p224_private_key: TestResult<Vec<u8>>,
1348 p256_private_key: TestResult<Vec<u8>>,
1349 p384_private_key: TestResult<Vec<u8>>,
1350 p521_private_key: TestResult<Vec<u8>>,
1351 rsa_private_key: TestResult<Vec<u8>>,
1352 ) -> TestResult {
1353 let ed25519_private_key = ed25519_private_key?;
1354 let p224_private_key = p224_private_key?;
1355 let p256_private_key = p256_private_key?;
1356 let p384_private_key = p384_private_key?;
1357 let p521_private_key = p521_private_key?;
1358 let rsa_private_key = rsa_private_key?;
1359
1360 assert!(PrivateKeyImport::new(KeyType::Curve25519, &ed25519_private_key).is_ok());
1361 assert!(PrivateKeyImport::new(KeyType::Curve25519, &p224_private_key).is_err());
1362 assert!(PrivateKeyImport::new(KeyType::Curve25519, &p256_private_key).is_err());
1363 assert!(PrivateKeyImport::new(KeyType::Curve25519, &p384_private_key).is_err());
1364 assert!(PrivateKeyImport::new(KeyType::Curve25519, &p521_private_key).is_err());
1365 assert!(PrivateKeyImport::new(KeyType::Curve25519, &rsa_private_key).is_err());
1366
1367 assert!(PrivateKeyImport::new(KeyType::EcP224, &ed25519_private_key).is_err());
1368 assert!(PrivateKeyImport::new(KeyType::EcP224, &p224_private_key).is_ok());
1369 assert!(PrivateKeyImport::new(KeyType::EcP224, &p256_private_key).is_err());
1370 assert!(PrivateKeyImport::new(KeyType::EcP224, &p384_private_key).is_err());
1371 assert!(PrivateKeyImport::new(KeyType::EcP224, &p521_private_key).is_err());
1372 assert!(PrivateKeyImport::new(KeyType::EcP224, &rsa_private_key).is_err());
1373
1374 assert!(PrivateKeyImport::new(KeyType::EcP256, &ed25519_private_key).is_err());
1375 assert!(PrivateKeyImport::new(KeyType::EcP256, &p224_private_key).is_err());
1376 assert!(PrivateKeyImport::new(KeyType::EcP256, &p256_private_key).is_ok());
1377 assert!(PrivateKeyImport::new(KeyType::EcP256, &p384_private_key).is_err());
1378 assert!(PrivateKeyImport::new(KeyType::EcP256, &p521_private_key).is_err());
1379 assert!(PrivateKeyImport::new(KeyType::EcP256, &rsa_private_key).is_err());
1380
1381 assert!(PrivateKeyImport::new(KeyType::EcP384, &ed25519_private_key).is_err());
1382 assert!(PrivateKeyImport::new(KeyType::EcP384, &p224_private_key).is_err());
1383 assert!(PrivateKeyImport::new(KeyType::EcP384, &p256_private_key).is_err());
1384 assert!(PrivateKeyImport::new(KeyType::EcP384, &p384_private_key).is_ok());
1385 assert!(PrivateKeyImport::new(KeyType::EcP384, &p521_private_key).is_err());
1386 assert!(PrivateKeyImport::new(KeyType::EcP384, &rsa_private_key).is_err());
1387
1388 assert!(PrivateKeyImport::new(KeyType::EcP521, &ed25519_private_key).is_err());
1389 assert!(PrivateKeyImport::new(KeyType::EcP521, &p224_private_key).is_err());
1390 assert!(PrivateKeyImport::new(KeyType::EcP521, &p256_private_key).is_err());
1391 assert!(PrivateKeyImport::new(KeyType::EcP521, &p384_private_key).is_err());
1392 assert!(PrivateKeyImport::new(KeyType::EcP521, &p521_private_key).is_ok());
1393 assert!(PrivateKeyImport::new(KeyType::EcP521, &rsa_private_key).is_err());
1394
1395 assert!(PrivateKeyImport::new(KeyType::Rsa, &ed25519_private_key).is_err());
1396 assert!(PrivateKeyImport::new(KeyType::Rsa, &p224_private_key).is_err());
1397 assert!(PrivateKeyImport::new(KeyType::Rsa, &p256_private_key).is_err());
1398 assert!(PrivateKeyImport::new(KeyType::Rsa, &p384_private_key).is_err());
1399 assert!(PrivateKeyImport::new(KeyType::Rsa, &p521_private_key).is_err());
1400 assert!(PrivateKeyImport::new(KeyType::Rsa, &rsa_private_key).is_ok());
1401
1402 assert!(PrivateKeyImport::new(KeyType::Generic, &ed25519_private_key).is_err());
1403 assert!(PrivateKeyImport::new(KeyType::Generic, &p224_private_key).is_err());
1404 assert!(PrivateKeyImport::new(KeyType::Generic, &p256_private_key).is_err());
1405 assert!(PrivateKeyImport::new(KeyType::Generic, &p384_private_key).is_err());
1406 assert!(PrivateKeyImport::new(KeyType::Generic, &p521_private_key).is_err());
1407 assert!(PrivateKeyImport::new(KeyType::Generic, &rsa_private_key).is_err());
1408 Ok(())
1409 }
1410
1411 #[rstest]
1412 #[case(KeyType::Curve25519, &[KeyMechanism::EdDsaSignature], SignatureType::EdDsa, None)]
1413 #[case(KeyType::EcP224, &[KeyMechanism::EcdsaSignature], SignatureType::EcdsaP224, None)]
1414 #[case(KeyType::EcP256, &[KeyMechanism::EcdsaSignature], SignatureType::EcdsaP256, None)]
1415 #[case(KeyType::EcP384, &[KeyMechanism::EcdsaSignature], SignatureType::EcdsaP384, None)]
1416 #[case(KeyType::EcP521, &[KeyMechanism::EcdsaSignature], SignatureType::EcdsaP521, None)]
1417 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePkcs1], SignatureType::Pkcs1, None)]
1418 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePssMd5], SignatureType::PssMd5, None)]
1419 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePssSha1], SignatureType::PssSha1, None)]
1420 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePssSha224], SignatureType::PssSha224, None)]
1421 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePssSha256], SignatureType::PssSha256, None)]
1422 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePssSha384], SignatureType::PssSha384, None)]
1423 #[case(KeyType::Rsa, &[KeyMechanism::RsaSignaturePssSha512], SignatureType::PssSha512, None)]
1424 #[case(
1425 KeyType::Curve25519,
1426 &[KeyMechanism::EdDsaSignature],
1427 SignatureType::EcdsaP256,
1428 Some(Box::new(Error::InvalidKeyTypeForSignatureType {
1429 key_type: KeyType::Curve25519,
1430 signature_type: SignatureType::EcdsaP256
1431 })
1432 ))]
1433 #[case(
1434 KeyType::Curve25519,
1435 &[KeyMechanism::EcdsaSignature],
1436 SignatureType::EdDsa,
1437 Some(Box::new(Error::InvalidKeyMechanismsForSignatureType {
1438 signature_type: SignatureType::EdDsa,
1439 required_key_mechanism: KeyMechanism::EdDsaSignature,
1440 })
1441 ))]
1442 #[case(
1443 KeyType::EcP224,
1444 &[KeyMechanism::EcdsaSignature],
1445 SignatureType::EdDsa,
1446 Some(Box::new(Error::InvalidKeyTypeForSignatureType {
1447 key_type: KeyType::EcP224,
1448 signature_type: SignatureType::EdDsa,
1449 })
1450 ))]
1451 #[case(
1452 KeyType::EcP224,
1453 &[KeyMechanism::EdDsaSignature],
1454 SignatureType::EcdsaP224,
1455 Some(Box::new(Error::InvalidKeyMechanismsForSignatureType {
1456 signature_type: SignatureType::EcdsaP224,
1457 required_key_mechanism: KeyMechanism::EcdsaSignature,
1458 })
1459 ))]
1460 #[case(
1461 KeyType::EcP256,
1462 &[KeyMechanism::EcdsaSignature],
1463 SignatureType::EdDsa,
1464 Some(Box::new(Error::InvalidKeyTypeForSignatureType {
1465 key_type: KeyType::EcP256,
1466 signature_type: SignatureType::EdDsa,
1467 })
1468 ))]
1469 #[case(
1470 KeyType::EcP256,
1471 &[KeyMechanism::EdDsaSignature],
1472 SignatureType::EcdsaP256,
1473 Some(Box::new(Error::InvalidKeyMechanismsForSignatureType {
1474 signature_type: SignatureType::EcdsaP256,
1475 required_key_mechanism: KeyMechanism::EcdsaSignature,
1476 })
1477 ))]
1478 #[case(
1479 KeyType::EcP384,
1480 &[KeyMechanism::EcdsaSignature],
1481 SignatureType::EdDsa,
1482 Some(Box::new(Error::InvalidKeyTypeForSignatureType {
1483 key_type: KeyType::EcP384,
1484 signature_type: SignatureType::EdDsa,
1485 })
1486 ))]
1487 #[case(
1488 KeyType::EcP384,
1489 &[KeyMechanism::EdDsaSignature],
1490 SignatureType::EcdsaP384,
1491 Some(Box::new(Error::InvalidKeyMechanismsForSignatureType {
1492 signature_type: SignatureType::EcdsaP384,
1493 required_key_mechanism: KeyMechanism::EcdsaSignature,
1494 })
1495 ))]
1496 #[case(
1497 KeyType::EcP521,
1498 &[KeyMechanism::EcdsaSignature],
1499 SignatureType::EdDsa,
1500 Some(Box::new(Error::InvalidKeyTypeForSignatureType {
1501 key_type: KeyType::EcP521,
1502 signature_type: SignatureType::EdDsa,
1503 })
1504 ))]
1505 #[case(
1506 KeyType::EcP521,
1507 &[KeyMechanism::EdDsaSignature],
1508 SignatureType::EcdsaP521,
1509 Some(Box::new(Error::InvalidKeyMechanismsForSignatureType {
1510 signature_type: SignatureType::EcdsaP521,
1511 required_key_mechanism: KeyMechanism::EcdsaSignature,
1512 })
1513 ))]
1514 #[case(
1515 KeyType::Rsa,
1516 &[KeyMechanism::RsaSignaturePkcs1],
1517 SignatureType::EdDsa,
1518 Some(Box::new(Error::InvalidKeyTypeForSignatureType {
1519 key_type: KeyType::Rsa,
1520 signature_type: SignatureType::EdDsa,
1521 })
1522 ))]
1523 #[case(
1524 KeyType::Rsa,
1525 &[KeyMechanism::RsaDecryptionOaepMd5],
1526 SignatureType::PssMd5,
1527 Some(Box::new(Error::InvalidKeyMechanismsForSignatureType {
1528 signature_type: SignatureType::PssMd5,
1529 required_key_mechanism: KeyMechanism::RsaSignaturePssMd5,
1530 })
1531 ))]
1532 fn test_key_type_and_mechanisms_match_signature_type(
1533 #[case] key_type: KeyType,
1534 #[case] key_mechanisms: &[KeyMechanism],
1535 #[case] signature_type: SignatureType,
1536 #[case] result: Option<Box<Error>>,
1537 ) -> TestResult {
1538 if let Some(error) = result {
1539 if let Err(fn_error) = key_type_and_mechanisms_match_signature_type(
1540 key_type,
1541 key_mechanisms,
1542 signature_type,
1543 ) {
1544 assert_eq!(fn_error.to_string(), error.to_string());
1545 } else {
1546 panic!("Did not return an Error!");
1547 }
1548 } else {
1549 key_type_and_mechanisms_match_signature_type(key_type, key_mechanisms, signature_type)?;
1550 }
1551
1552 Ok(())
1553 }
1554}