1 //! Tests for SEC1 encoding/decoding traits.
2 
3 #![cfg(any(feature = "pem", all(feature = "der", feature = "std")))]
4 
5 use der::SecretDocument;
6 use sec1::{DecodeEcPrivateKey, EncodeEcPrivateKey, Result};
7 
8 #[cfg(feature = "pem")]
9 use sec1::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 /// SEC1 `EcPrivateKey` encoded as ASN.1 DER
18 const P256_DER_EXAMPLE: &[u8] = include_bytes!("examples/p256-priv.der");
19 
20 /// SEC1 `EcPrivateKey` encoded as PEM
21 #[cfg(feature = "pem")]
22 const P256_PEM_EXAMPLE: &str = include_str!("examples/p256-priv.pem");
23 
24 /// Mock 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 DecodeEcPrivateKey for MockPrivateKey {
from_sec1_der(bytes: &[u8]) -> Result<MockPrivateKey>34     fn from_sec1_der(bytes: &[u8]) -> Result<MockPrivateKey> {
35         Ok(MockPrivateKey(bytes.to_vec()))
36     }
37 }
38 
39 impl EncodeEcPrivateKey for MockPrivateKey {
to_sec1_der(&self) -> Result<SecretDocument>40     fn to_sec1_der(&self) -> Result<SecretDocument> {
41         Ok(SecretDocument::try_from(self.as_ref())?)
42     }
43 }
44 
45 #[cfg(feature = "pem")]
46 #[test]
from_sec1_pem()47 fn from_sec1_pem() {
48     let key = MockPrivateKey::from_sec1_pem(P256_PEM_EXAMPLE).unwrap();
49     assert_eq!(key.as_ref(), P256_DER_EXAMPLE);
50 }
51 
52 #[cfg(feature = "std")]
53 #[test]
read_sec1_der_file()54 fn read_sec1_der_file() {
55     let key = MockPrivateKey::read_sec1_der_file("tests/examples/p256-priv.der").unwrap();
56     assert_eq!(key.as_ref(), P256_DER_EXAMPLE);
57 }
58 
59 #[cfg(all(feature = "pem", feature = "std"))]
60 #[test]
read_sec1_pem_file()61 fn read_sec1_pem_file() {
62     let key = MockPrivateKey::read_sec1_pem_file("tests/examples/p256-priv.pem").unwrap();
63     assert_eq!(key.as_ref(), P256_DER_EXAMPLE);
64 }
65 
66 #[cfg(feature = "pem")]
67 #[test]
to_sec1_pem()68 fn to_sec1_pem() {
69     let pem = MockPrivateKey(P256_DER_EXAMPLE.to_vec())
70         .to_sec1_pem(LineEnding::LF)
71         .unwrap();
72 
73     assert_eq!(&*pem, P256_PEM_EXAMPLE);
74 }
75 
76 #[cfg(feature = "std")]
77 #[test]
write_sec1_der_file()78 fn write_sec1_der_file() {
79     let dir = tempdir().unwrap();
80     let path = dir.path().join("example.der");
81     MockPrivateKey(P256_DER_EXAMPLE.to_vec())
82         .write_sec1_der_file(&path)
83         .unwrap();
84 
85     let key = MockPrivateKey::read_sec1_der_file(&path).unwrap();
86     assert_eq!(key.as_ref(), P256_DER_EXAMPLE);
87 }
88 
89 #[cfg(all(feature = "pem", feature = "std"))]
90 #[test]
write_sec1_pem_file()91 fn write_sec1_pem_file() {
92     let dir = tempdir().unwrap();
93     let path = dir.path().join("example.pem");
94     MockPrivateKey(P256_DER_EXAMPLE.to_vec())
95         .write_sec1_pem_file(&path, LineEnding::LF)
96         .unwrap();
97 
98     let pem = fs::read_to_string(path).unwrap();
99     assert_eq!(&pem, P256_PEM_EXAMPLE);
100 }
101