1#[cfg(feature = "nethsm")]
4pub mod nethsm;
5
6use std::fmt::Debug;
7
8use rsa::{
9 RsaPrivateKey,
10 pkcs8::DecodePrivateKey as _,
11 traits::PrivateKeyParts,
12 traits::PublicKeyParts,
13};
14
15#[cfg(doc)]
16use crate::key::MIN_RSA_BIT_LENGTH;
17use crate::key::{Error, KeyType, key_type_matches_length};
18
19pub enum PrivateKeyData {
23 Curve25519(Vec<u8>),
25 EcBp256(Vec<u8>),
27 EcBp384(Vec<u8>),
29 EcK256(Vec<u8>),
31 EcP224(Vec<u8>),
33 EcP256(Vec<u8>),
35 EcP384(Vec<u8>),
37 EcP521(Vec<u8>),
39 Rsa {
41 prime_p: Vec<u8>,
43 prime_q: Vec<u8>,
45 public_exponent: Vec<u8>,
47 },
48}
49
50impl Debug for PrivateKeyData {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 const REDACTED: &&str = &"[REDACTED]";
53 match self {
54 Self::Curve25519(_) => f.debug_tuple("Curve25519").field(REDACTED).finish(),
55 Self::EcBp256(_) => f.debug_tuple("EcBp256").field(REDACTED).finish(),
56 Self::EcBp384(_) => f.debug_tuple("EcBp384").field(REDACTED).finish(),
57 Self::EcK256(_) => f.debug_tuple("EcK256").field(REDACTED).finish(),
58 Self::EcP224(_) => f.debug_tuple("EcP224").field(REDACTED).finish(),
59 Self::EcP256(_) => f.debug_tuple("EcP256").field(REDACTED).finish(),
60 Self::EcP384(_) => f.debug_tuple("EcP384").field(REDACTED).finish(),
61 Self::EcP521(_) => f.debug_tuple("EcP521").field(REDACTED).finish(),
62 Self::Rsa {
63 public_exponent, ..
64 } => f
65 .debug_struct("Rsa")
66 .field("prime_p", REDACTED)
67 .field("prime_q", REDACTED)
68 .field("public_exponent", public_exponent)
69 .finish(),
70 }
71 }
72}
73
74impl From<&PrivateKeyData> for KeyType {
75 fn from(value: &PrivateKeyData) -> Self {
76 match value {
77 PrivateKeyData::Curve25519(_) => Self::Curve25519,
78 PrivateKeyData::EcBp256(_) => Self::EcBp256,
79 PrivateKeyData::EcBp384(_) => Self::EcBp384,
80 PrivateKeyData::EcK256(_) => Self::EcK256,
81 PrivateKeyData::EcP224(_) => Self::EcP224,
82 PrivateKeyData::EcP256(_) => Self::EcP256,
83 PrivateKeyData::EcP384(_) => Self::EcP384,
84 PrivateKeyData::EcP521(_) => Self::EcP521,
85 PrivateKeyData::Rsa { .. } => Self::Rsa,
86 }
87 }
88}
89
90#[derive(Debug)]
92pub struct PrivateKeyImport {
93 key_data: PrivateKeyData,
94}
95
96fn pad(buf: &[u8], len: usize) -> Result<Vec<u8>, Error> {
111 let buffer_len = buf.len();
112 if len < buf.len() {
113 return Err(Error::PaddingInputTooLong {
114 buffer_len,
115 pad_len: len,
116 });
117 }
118 let mut v = vec![0; len];
119 v[len - buf.len()..].copy_from_slice(buf);
120 Ok(v)
121}
122
123impl PrivateKeyImport {
124 pub fn new(key_type: KeyType, key_data: &[u8]) -> Result<Self, crate::Error> {
157 Ok(match key_type {
158 KeyType::Curve25519 => {
159 let key_pair = ed25519_dalek::pkcs8::KeypairBytes::from_pkcs8_der(key_data)
160 .map_err(Error::Pkcs8)?;
161 Self {
162 key_data: PrivateKeyData::Curve25519(key_pair.secret_key.to_vec()),
163 }
164 }
165 KeyType::EcBp256 => {
166 let private_key =
167 bp256::r1::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
168 Self {
169 key_data: PrivateKeyData::EcBp256(private_key.to_bytes().as_slice().to_owned()),
170 }
171 }
172 KeyType::EcBp384 => {
173 let private_key =
174 bp384::r1::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
175 Self {
176 key_data: PrivateKeyData::EcBp384(private_key.to_bytes().as_slice().to_owned()),
177 }
178 }
179 KeyType::EcBp512 => return Err(Error::UnsupportedKeyType(key_type).into()),
180 KeyType::EcK256 => {
181 let private_key =
182 k256::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
183 Self {
184 key_data: PrivateKeyData::EcK256(private_key.to_bytes().as_slice().to_owned()),
185 }
186 }
187 KeyType::EcP224 => {
188 let private_key =
189 p224::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
190 Self {
191 key_data: PrivateKeyData::EcP224(private_key.to_bytes().as_slice().to_owned()),
192 }
193 }
194 KeyType::EcP256 => {
195 let private_key =
196 p256::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
197 Self {
198 key_data: PrivateKeyData::EcP256(private_key.to_bytes().as_slice().to_owned()),
199 }
200 }
201 KeyType::EcP384 => {
202 let private_key =
203 p384::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
204 Self {
205 key_data: PrivateKeyData::EcP384(private_key.to_bytes().as_slice().to_owned()),
206 }
207 }
208 KeyType::EcP521 => {
209 let private_key =
210 p521::SecretKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
211 Self {
212 key_data: PrivateKeyData::EcP521(private_key.to_bytes().as_slice().to_owned()),
213 }
214 }
215 KeyType::Generic => return Err(Error::UnsupportedKeyType(KeyType::Generic).into()),
216 KeyType::Rsa => {
217 let private_key = RsaPrivateKey::from_pkcs8_der(key_data).map_err(Error::Pkcs8)?;
218 key_type_matches_length(key_type, Some(private_key.size() as u32 * 8))?;
220 Self {
221 key_data: PrivateKeyData::Rsa {
222 prime_p: private_key
223 .primes()
224 .first()
225 .ok_or(Error::NoPrimes)?
226 .to_be_bytes()
227 .to_vec(),
228 prime_q: private_key
229 .primes()
230 .get(1)
231 .ok_or(Error::NoPrimes)?
232 .to_be_bytes()
233 .to_vec(),
234 public_exponent: private_key.e().to_be_bytes().to_vec(),
235 },
236 }
237 }
238 })
239 }
240
241 pub fn from_pkcs8_pem(key_type: KeyType, key_data: &str) -> Result<Self, crate::Error> {
276 Ok(match key_type {
277 KeyType::Curve25519 => {
278 let key_pair = ed25519_dalek::pkcs8::KeypairBytes::from_pkcs8_pem(key_data)
279 .map_err(Error::Pkcs8)?;
280 Self {
281 key_data: PrivateKeyData::Curve25519(key_pair.secret_key.to_vec()),
282 }
283 }
284 KeyType::EcBp256 => {
285 let private_key =
286 bp256::r1::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
287 Self {
288 key_data: PrivateKeyData::EcBp256(private_key.to_bytes().as_slice().to_owned()),
289 }
290 }
291 KeyType::EcBp384 => {
292 let private_key =
293 bp384::r1::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
294 Self {
295 key_data: PrivateKeyData::EcBp384(private_key.to_bytes().as_slice().to_owned()),
296 }
297 }
298 KeyType::EcBp512 => return Err(Error::UnsupportedKeyType(key_type).into()),
299 KeyType::EcK256 => {
300 let private_key =
301 k256::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
302 Self {
303 key_data: PrivateKeyData::EcK256(private_key.to_bytes().as_slice().to_owned()),
304 }
305 }
306 KeyType::EcP224 => {
307 let private_key =
308 p224::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
309 Self {
310 key_data: PrivateKeyData::EcP224(private_key.to_bytes().as_slice().to_owned()),
311 }
312 }
313 KeyType::EcP256 => {
314 let private_key =
315 p256::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
316 Self {
317 key_data: PrivateKeyData::EcP256(private_key.to_bytes().as_slice().to_owned()),
318 }
319 }
320 KeyType::EcP384 => {
321 let private_key =
322 p384::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
323 Self {
324 key_data: PrivateKeyData::EcP384(private_key.to_bytes().as_slice().to_owned()),
325 }
326 }
327 KeyType::EcP521 => {
328 let private_key =
329 p521::SecretKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
330 Self {
331 key_data: PrivateKeyData::EcP521(private_key.to_bytes().as_slice().to_owned()),
332 }
333 }
334 KeyType::Generic => return Err(Error::UnsupportedKeyType(KeyType::Generic).into()),
335 KeyType::Rsa => {
336 let private_key = RsaPrivateKey::from_pkcs8_pem(key_data).map_err(Error::Pkcs8)?;
337 key_type_matches_length(key_type, Some(private_key.size() as u32 * 8))?;
339 Self {
340 key_data: PrivateKeyData::Rsa {
341 prime_p: private_key
342 .primes()
343 .first()
344 .ok_or(Error::NoPrimes)?
345 .to_be_bytes()
346 .to_vec(),
347 prime_q: private_key
348 .primes()
349 .get(1)
350 .ok_or(Error::NoPrimes)?
351 .to_be_bytes()
352 .to_vec(),
353 public_exponent: private_key.e().to_be_bytes().to_vec(),
354 },
355 }
356 }
357 })
358 }
359
360 pub fn from_rsa(prime_p: Vec<u8>, prime_q: Vec<u8>, public_exponent: Vec<u8>) -> Self {
379 Self {
380 key_data: PrivateKeyData::Rsa {
381 prime_p,
382 prime_q,
383 public_exponent,
384 },
385 }
386 }
387
388 pub fn from_raw_bytes(ec: KeyType, bytes: impl AsRef<[u8]>) -> Result<Self, crate::Error> {
409 let bytes = bytes.as_ref();
410 Ok(Self {
411 key_data: match ec {
412 KeyType::EcP256 => PrivateKeyData::EcP256(pad(bytes, 32)?),
413 KeyType::EcP384 => PrivateKeyData::EcP384(pad(bytes, 48)?),
414 KeyType::EcP521 => PrivateKeyData::EcP521(pad(bytes, 66)?),
415 KeyType::Curve25519 => PrivateKeyData::Curve25519(pad(bytes, 32)?),
416 key_type => return Err(Error::UnsupportedKeyType(key_type).into()),
417 },
418 })
419 }
420
421 pub fn key_type(&self) -> KeyType {
423 KeyType::from(&self.key_data)
424 }
425}
426
427#[cfg(test)]
428mod tests {
429 use k256::elliptic_curve::Generate;
430 use rand::{SeedableRng, rng, rngs::ChaCha20Rng};
431 use rsa::RsaPrivateKey;
432 use rsa::pkcs8::EncodePrivateKey;
433 use rstest::rstest;
434 use testresult::TestResult;
435
436 use super::*;
437
438 fn ed25519_private_key() -> TestResult<Vec<u8>> {
439 let signing_key =
440 ed25519_dalek::SigningKey::generate(&mut ChaCha20Rng::from_rng(&mut rng()));
441 Ok(signing_key.to_pkcs8_der()?.as_bytes().to_vec())
442 }
443
444 fn bp256_private_key() -> TestResult<Vec<u8>> {
445 let private_key =
446 bp256::r1::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
447 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
448 }
449
450 fn bp384_private_key() -> TestResult<Vec<u8>> {
451 let private_key =
452 bp384::r1::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
453 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
454 }
455
456 fn k256_private_key() -> TestResult<Vec<u8>> {
457 let private_key =
458 k256::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
459 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
460 }
461
462 fn p224_private_key() -> TestResult<Vec<u8>> {
463 let private_key =
464 p224::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
465 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
466 }
467
468 fn p256_private_key() -> TestResult<Vec<u8>> {
469 let private_key =
470 p256::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
471 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
472 }
473
474 fn p384_private_key() -> TestResult<Vec<u8>> {
475 let private_key =
476 p384::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
477 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
478 }
479
480 fn p521_private_key() -> TestResult<Vec<u8>> {
481 let private_key =
482 p521::SecretKey::generate_from_rng(&mut ChaCha20Rng::from_rng(&mut rng()));
483 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
484 }
485
486 fn rsa_private_key() -> TestResult<Vec<u8>> {
487 let private_key =
488 RsaPrivateKey::new(&mut ChaCha20Rng::from_rng(&mut rng()), 2048.try_into()?)?;
489 Ok(private_key.to_pkcs8_der()?.as_bytes().to_vec())
490 }
491
492 #[rstest]
493 #[case::curve25519(KeyType::Curve25519)]
494 #[case::ecbp256(KeyType::EcBp256)]
495 #[case::ecbp384(KeyType::EcBp384)]
496 #[case::eck256(KeyType::EcK256)]
497 #[case::ecp224(KeyType::EcP224)]
498 #[case::ecp256(KeyType::EcP256)]
499 #[case::ecp384(KeyType::EcP384)]
500 #[case::ecp521(KeyType::EcP521)]
501 #[case::rsa(KeyType::Rsa)]
502 fn key_data(#[case] key_type: KeyType) -> TestResult {
503 let bp256_private_key = bp256_private_key()?;
504 let bp384_private_key = bp384_private_key()?;
505 let ed25519_private_key = ed25519_private_key()?;
506 let k256_private_key = k256_private_key()?;
507 let p224_private_key = p224_private_key()?;
508 let p256_private_key = p256_private_key()?;
509 let p384_private_key = p384_private_key()?;
510 let p521_private_key = p521_private_key()?;
511 let rsa_private_key = rsa_private_key()?;
512
513 let (ok_cases, error_cases) = match key_type {
514 KeyType::Curve25519 => (
515 [&ed25519_private_key],
516 [
517 &bp256_private_key,
518 &bp384_private_key,
519 &k256_private_key,
520 &p224_private_key,
521 &p256_private_key,
522 &p384_private_key,
523 &p521_private_key,
524 &rsa_private_key,
525 ],
526 ),
527 KeyType::EcBp256 => (
528 [&bp256_private_key],
529 [
530 &bp384_private_key,
531 &ed25519_private_key,
532 &k256_private_key,
533 &p224_private_key,
534 &p256_private_key,
535 &p384_private_key,
536 &p521_private_key,
537 &rsa_private_key,
538 ],
539 ),
540 KeyType::EcBp384 => (
541 [&bp384_private_key],
542 [
543 &bp256_private_key,
544 &ed25519_private_key,
545 &k256_private_key,
546 &p224_private_key,
547 &p256_private_key,
548 &p384_private_key,
549 &p521_private_key,
550 &rsa_private_key,
551 ],
552 ),
553 KeyType::EcK256 => (
554 [&k256_private_key],
555 [
556 &bp256_private_key,
557 &bp384_private_key,
558 &ed25519_private_key,
559 &p224_private_key,
560 &p256_private_key,
561 &p384_private_key,
562 &p521_private_key,
563 &rsa_private_key,
564 ],
565 ),
566 KeyType::EcP224 => (
567 [&p224_private_key],
568 [
569 &bp256_private_key,
570 &bp384_private_key,
571 &ed25519_private_key,
572 &k256_private_key,
573 &p256_private_key,
574 &p384_private_key,
575 &p521_private_key,
576 &rsa_private_key,
577 ],
578 ),
579 KeyType::EcP256 => (
580 [&p256_private_key],
581 [
582 &bp256_private_key,
583 &bp384_private_key,
584 &ed25519_private_key,
585 &k256_private_key,
586 &p224_private_key,
587 &p384_private_key,
588 &p521_private_key,
589 &rsa_private_key,
590 ],
591 ),
592 KeyType::EcP384 => (
593 [&p384_private_key],
594 [
595 &bp256_private_key,
596 &bp384_private_key,
597 &ed25519_private_key,
598 &k256_private_key,
599 &p224_private_key,
600 &p256_private_key,
601 &p521_private_key,
602 &rsa_private_key,
603 ],
604 ),
605 KeyType::EcP521 => (
606 [&p521_private_key],
607 [
608 &bp256_private_key,
609 &bp384_private_key,
610 &ed25519_private_key,
611 &k256_private_key,
612 &p224_private_key,
613 &p256_private_key,
614 &p384_private_key,
615 &rsa_private_key,
616 ],
617 ),
618 KeyType::Rsa => (
619 [&rsa_private_key],
620 [
621 &bp256_private_key,
622 &bp384_private_key,
623 &ed25519_private_key,
624 &k256_private_key,
625 &p224_private_key,
626 &p256_private_key,
627 &p384_private_key,
628 &p521_private_key,
629 ],
630 ),
631 KeyType::Generic => unimplemented!("generic key types are not supported"),
632 KeyType::EcBp512 => unimplemented!("there is currently no rustcrypto support"),
633 };
634
635 for ok_case in ok_cases.iter() {
636 assert!(PrivateKeyImport::new(key_type, ok_case).is_ok());
637 }
638
639 for error_case in error_cases.iter() {
640 assert!(PrivateKeyImport::new(key_type, error_case).is_err());
641 }
642
643 Ok(())
644 }
645
646 #[rstest]
647 #[case::curve_25519(PrivateKeyImport::new(KeyType::Curve25519, ed25519_private_key()?.as_slice())?, KeyType::Curve25519)]
648 #[case::ecbp256(PrivateKeyImport::new(KeyType::EcBp256, bp256_private_key()?.as_slice())?, KeyType::EcBp256)]
649 #[case::ecbp384(PrivateKeyImport::new(KeyType::EcBp384, bp384_private_key()?.as_slice())?, KeyType::EcBp384)]
650 #[case::eck256(PrivateKeyImport::new(KeyType::EcK256, k256_private_key()?.as_slice())?, KeyType::EcK256)]
651 #[case::ecp224(PrivateKeyImport::new(KeyType::EcP224, p224_private_key()?.as_slice())?, KeyType::EcP224)]
652 #[case::ecp256(PrivateKeyImport::new(KeyType::EcP256, p256_private_key()?.as_slice())?, KeyType::EcP256)]
653 #[case::ecp384(PrivateKeyImport::new(KeyType::EcP384, p384_private_key()?.as_slice())?, KeyType::EcP384)]
654 #[case::ecp521(PrivateKeyImport::new(KeyType::EcP521, p521_private_key()?.as_slice())?, KeyType::EcP521)]
655 #[case::rsa(PrivateKeyImport::new(KeyType::Rsa, rsa_private_key()?.as_slice())?, KeyType::Rsa)]
656 fn private_key_import_key_data_matches(
657 #[case] private_key_data: PrivateKeyImport,
658 #[case] key_type: KeyType,
659 ) -> TestResult {
660 assert_eq!(private_key_data.key_type(), key_type);
661
662 Ok(())
663 }
664}