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