1 //! Public key (`SubjectPublicKeyInfo`) tests
2 
3 use core::convert::TryFrom;
4 use hex_literal::hex;
5 use pkcs8::SubjectPublicKeyInfo;
6 
7 #[cfg(feature = "alloc")]
8 use der::Encodable;
9 
10 #[cfg(any(feature = "pem", feature = "std"))]
11 use pkcs8::PublicKeyDocument;
12 
13 /// Elliptic Curve (P-256) `SubjectPublicKeyInfo` encoded as ASN.1 DER
14 const EC_P256_DER_EXAMPLE: &[u8] = include_bytes!("examples/p256-pub.der");
15 
16 /// Ed25519 `SubjectPublicKeyInfo` encoded as ASN.1 DER
17 const ED25519_DER_EXAMPLE: &[u8] = include_bytes!("examples/ed25519-pub.der");
18 
19 /// RSA-2048 `SubjectPublicKeyInfo` encoded as ASN.1 DER
20 const RSA_2048_DER_EXAMPLE: &[u8] = include_bytes!("examples/rsa2048-pub.der");
21 
22 /// Elliptic Curve (P-256) public key encoded as PEM
23 #[cfg(feature = "pem")]
24 const EC_P256_PEM_EXAMPLE: &str = include_str!("examples/p256-pub.pem");
25 
26 /// Ed25519 public key encoded as PEM
27 #[cfg(feature = "pem")]
28 const ED25519_PEM_EXAMPLE: &str = include_str!("examples/ed25519-pub.pem");
29 
30 /// RSA-2048 PKCS#8 public key encoded as PEM
31 #[cfg(feature = "pem")]
32 const RSA_2048_PEM_EXAMPLE: &str = include_str!("examples/rsa2048-pub.pem");
33 
34 #[test]
decode_ec_p256_der()35 fn decode_ec_p256_der() {
36     let spki = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap();
37 
38     assert_eq!(spki.algorithm.oid, "1.2.840.10045.2.1".parse().unwrap());
39 
40     assert_eq!(
41         spki.algorithm.parameters.unwrap().oid().unwrap(),
42         "1.2.840.10045.3.1.7".parse().unwrap()
43     );
44 
45     assert_eq!(spki.subject_public_key, &hex!("041CACFFB55F2F2CEFD89D89EB374B2681152452802DEEA09916068137D839CF7FC481A44492304D7EF66AC117BEFE83A8D08F155F2B52F9F618DD447029048E0F")[..]);
46 }
47 
48 #[test]
decode_ed25519_der()49 fn decode_ed25519_der() {
50     let spki = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap();
51 
52     assert_eq!(spki.algorithm.oid, "1.3.101.112".parse().unwrap());
53     assert_eq!(spki.algorithm.parameters, None);
54     assert_eq!(
55         spki.subject_public_key,
56         &hex!("4D29167F3F1912A6F7ADFA293A051A15C05EC67B8F17267B1C5550DCE853BD0D")[..]
57     );
58 }
59 
60 #[test]
decode_rsa_2048_der()61 fn decode_rsa_2048_der() {
62     let spki = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap();
63 
64     assert_eq!(spki.algorithm.oid, "1.2.840.113549.1.1.1".parse().unwrap());
65     assert!(spki.algorithm.parameters.unwrap().is_null());
66     assert_eq!(spki.subject_public_key, &hex!("3082010A0282010100B6C42C515F10A6AAF282C63EDBE24243A170F3FA2633BD4833637F47CA4F6F36E03A5D29EFC3191AC80F390D874B39E30F414FCEC1FCA0ED81E547EDC2CD382C76F61C9018973DB9FA537972A7C701F6B77E0982DFC15FC01927EE5E7CD94B4F599FF07013A7C8281BDF22DCBC9AD7CABB7C4311C982F58EDB7213AD4558B332266D743AED8192D1884CADB8B14739A8DADA66DC970806D9C7AC450CB13D0D7C575FB198534FC61BC41BC0F0574E0E0130C7BBBFBDFDC9F6A6E2E3E2AFF1CBEAC89BA57884528D55CFB08327A1E8C89F4E003CF2888E933241D9D695BCBBACDC90B44E3E095FA37058EA25B13F5E295CBEAC6DE838AB8C50AF61E298975B872F0203010001")[..]);
67 }
68 
69 #[test]
70 #[cfg(feature = "pem")]
decode_ec_p256_pem()71 fn decode_ec_p256_pem() {
72     let doc: PublicKeyDocument = EC_P256_PEM_EXAMPLE.parse().unwrap();
73     assert_eq!(doc.as_ref(), EC_P256_DER_EXAMPLE);
74 
75     // Ensure `PublicKeyDocument` parses successfully
76     let spki = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap();
77     assert_eq!(doc.spki(), spki);
78 }
79 
80 #[test]
81 #[cfg(feature = "pem")]
decode_ed25519_pem()82 fn decode_ed25519_pem() {
83     let doc: PublicKeyDocument = ED25519_PEM_EXAMPLE.parse().unwrap();
84     assert_eq!(doc.as_ref(), ED25519_DER_EXAMPLE);
85 
86     // Ensure `PublicKeyDocument` parses successfully
87     let spki = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap();
88     assert_eq!(doc.spki(), spki);
89 }
90 
91 #[test]
92 #[cfg(feature = "pem")]
decode_rsa_2048_pem()93 fn decode_rsa_2048_pem() {
94     let doc: PublicKeyDocument = RSA_2048_PEM_EXAMPLE.parse().unwrap();
95     assert_eq!(doc.as_ref(), RSA_2048_DER_EXAMPLE);
96 
97     // Ensure `PublicKeyDocument` parses successfully
98     let spki = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap();
99     assert_eq!(doc.spki(), spki);
100 }
101 
102 #[test]
103 #[cfg(feature = "alloc")]
encode_ec_p256_der()104 fn encode_ec_p256_der() {
105     let pk = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap();
106     let pk_encoded = pk.to_vec().unwrap();
107     assert_eq!(EC_P256_DER_EXAMPLE, pk_encoded.as_slice());
108 }
109 
110 #[test]
111 #[cfg(feature = "alloc")]
encode_ed25519_der()112 fn encode_ed25519_der() {
113     let pk = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap();
114     let pk_encoded = pk.to_vec().unwrap();
115     assert_eq!(ED25519_DER_EXAMPLE, pk_encoded.as_slice());
116 }
117 
118 #[test]
119 #[cfg(feature = "alloc")]
encode_rsa_2048_der()120 fn encode_rsa_2048_der() {
121     let pk = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap();
122     let pk_encoded = pk.to_vec().unwrap();
123     assert_eq!(RSA_2048_DER_EXAMPLE, pk_encoded.as_slice());
124 }
125 
126 #[test]
127 #[cfg(feature = "pem")]
encode_ec_p256_pem()128 fn encode_ec_p256_pem() {
129     let pk = SubjectPublicKeyInfo::try_from(EC_P256_DER_EXAMPLE).unwrap();
130     let pk_encoded = PublicKeyDocument::from(pk).to_pem();
131     assert_eq!(EC_P256_PEM_EXAMPLE, pk_encoded);
132 }
133 
134 #[test]
135 #[cfg(feature = "pem")]
encode_ed25519_pem()136 fn encode_ed25519_pem() {
137     let pk = SubjectPublicKeyInfo::try_from(ED25519_DER_EXAMPLE).unwrap();
138     let pk_encoded = PublicKeyDocument::from(pk).to_pem();
139     assert_eq!(ED25519_PEM_EXAMPLE, pk_encoded);
140 }
141 
142 #[test]
143 #[cfg(feature = "pem")]
encode_rsa_2048_pem()144 fn encode_rsa_2048_pem() {
145     let pk = SubjectPublicKeyInfo::try_from(RSA_2048_DER_EXAMPLE).unwrap();
146     let pk_encoded = PublicKeyDocument::from(pk).to_pem();
147     assert_eq!(RSA_2048_PEM_EXAMPLE, pk_encoded);
148 }
149 
150 #[test]
151 #[cfg(feature = "std")]
read_der_file()152 fn read_der_file() {
153     let pkcs8_doc = PublicKeyDocument::read_der_file("tests/examples/p256-pub.der").unwrap();
154     assert_eq!(pkcs8_doc.as_ref(), EC_P256_DER_EXAMPLE);
155 }
156 
157 #[test]
158 #[cfg(all(feature = "pem", feature = "std"))]
read_pem_file()159 fn read_pem_file() {
160     let pkcs8_doc = PublicKeyDocument::read_pem_file("tests/examples/p256-pub.pem").unwrap();
161     assert_eq!(pkcs8_doc.as_ref(), EC_P256_DER_EXAMPLE);
162 }
163