1 //! Tests for PKCS#1 encoding/decoding traits.
2
3 #![cfg(any(feature = "pem", feature = "std"))]
4
5 use der::SecretDocument;
6 use pkcs1::{DecodeRsaPrivateKey, EncodeRsaPrivateKey, Result};
7
8 #[cfg(feature = "pem")]
9 use pkcs1::der::pem::LineEnding;
10
11 #[cfg(feature = "std")]
12 use tempfile::tempdir;
13
14 #[cfg(all(feature = "pem", feature = "std"))]
15 use std::fs;
16
17 /// PKCS#1 `RsaPrivateKey` encoded as ASN.1 DER
18 const RSA_2048_PRIV_DER_EXAMPLE: &[u8] = include_bytes!("examples/rsa2048-priv.der");
19
20 /// PKCS#1 `RsaPrivateKey` encoded as PEM
21 #[cfg(feature = "pem")]
22 const RSA_2048_PRIV_PEM_EXAMPLE: &str = include_str!("examples/rsa2048-priv.pem");
23
24 /// Mock RSA private key type for testing trait impls against.
25 pub struct MockPrivateKey(Vec<u8>);
26
27 impl AsRef<[u8]> for MockPrivateKey {
as_ref(&self) -> &[u8]28 fn as_ref(&self) -> &[u8] {
29 self.0.as_ref()
30 }
31 }
32
33 impl DecodeRsaPrivateKey for MockPrivateKey {
from_pkcs1_der(bytes: &[u8]) -> Result<MockPrivateKey>34 fn from_pkcs1_der(bytes: &[u8]) -> Result<MockPrivateKey> {
35 Ok(MockPrivateKey(bytes.to_vec()))
36 }
37 }
38
39 impl EncodeRsaPrivateKey for MockPrivateKey {
to_pkcs1_der(&self) -> Result<SecretDocument>40 fn to_pkcs1_der(&self) -> Result<SecretDocument> {
41 Ok(SecretDocument::try_from(self.as_ref())?)
42 }
43 }
44
45 #[cfg(feature = "pem")]
46 #[test]
from_pkcs1_pem()47 fn from_pkcs1_pem() {
48 let key = MockPrivateKey::from_pkcs1_pem(RSA_2048_PRIV_PEM_EXAMPLE).unwrap();
49 assert_eq!(key.as_ref(), RSA_2048_PRIV_DER_EXAMPLE);
50 }
51
52 #[cfg(feature = "std")]
53 #[test]
read_pkcs1_der_file()54 fn read_pkcs1_der_file() {
55 let key = MockPrivateKey::read_pkcs1_der_file("tests/examples/rsa2048-priv.der").unwrap();
56 assert_eq!(key.as_ref(), RSA_2048_PRIV_DER_EXAMPLE);
57 }
58
59 #[cfg(all(feature = "pem", feature = "std"))]
60 #[test]
read_pkcs1_pem_file()61 fn read_pkcs1_pem_file() {
62 let key = MockPrivateKey::read_pkcs1_pem_file("tests/examples/rsa2048-priv.pem").unwrap();
63 assert_eq!(key.as_ref(), RSA_2048_PRIV_DER_EXAMPLE);
64 }
65
66 #[cfg(feature = "pem")]
67 #[test]
to_pkcs1_pem()68 fn to_pkcs1_pem() {
69 let pem = MockPrivateKey(RSA_2048_PRIV_DER_EXAMPLE.to_vec())
70 .to_pkcs1_pem(LineEnding::LF)
71 .unwrap();
72
73 assert_eq!(&*pem, RSA_2048_PRIV_PEM_EXAMPLE);
74 }
75
76 #[cfg(feature = "std")]
77 #[test]
write_pkcs1_der_file()78 fn write_pkcs1_der_file() {
79 let dir = tempdir().unwrap();
80 let path = dir.path().join("example.der");
81 MockPrivateKey(RSA_2048_PRIV_DER_EXAMPLE.to_vec())
82 .write_pkcs1_der_file(&path)
83 .unwrap();
84
85 let key = MockPrivateKey::read_pkcs1_der_file(&path).unwrap();
86 assert_eq!(key.as_ref(), RSA_2048_PRIV_DER_EXAMPLE);
87 }
88
89 #[cfg(all(feature = "pem", feature = "std"))]
90 #[test]
write_pkcs1_pem_file()91 fn write_pkcs1_pem_file() {
92 let dir = tempdir().unwrap();
93 let path = dir.path().join("example.pem");
94 MockPrivateKey(RSA_2048_PRIV_DER_EXAMPLE.to_vec())
95 .write_pkcs1_pem_file(&path, LineEnding::LF)
96 .unwrap();
97
98 let pem = fs::read_to_string(path).unwrap();
99 assert_eq!(&pem, RSA_2048_PRIV_PEM_EXAMPLE);
100 }
101