| //! PEM decoding and encoding tests. |
| |
| #![cfg(all(feature = "derive", feature = "oid", feature = "pem"))] |
| |
| use der::{ |
| asn1::{BitString, ObjectIdentifier}, |
| pem::{LineEnding, PemLabel}, |
| Decode, DecodePem, EncodePem, Sequence, |
| }; |
| |
| /// Example SPKI document encoded as DER. |
| const SPKI_DER: &[u8] = include_bytes!("examples/spki.der"); |
| |
| /// Example SPKI document encoded as PEM. |
| const SPKI_PEM: &str = include_str!("examples/spki.pem"); |
| |
| /// X.509 `AlgorithmIdentifier` |
| #[derive(Copy, Clone, Debug, Eq, PartialEq, Sequence)] |
| pub struct AlgorithmIdentifier { |
| pub algorithm: ObjectIdentifier, |
| // pub parameters: ... (not used in spki.pem) |
| } |
| |
| /// X.509 `SubjectPublicKeyInfo` (SPKI) in borrowed form |
| #[derive(Copy, Clone, Debug, Eq, PartialEq, Sequence)] |
| pub struct SpkiBorrowed<'a> { |
| pub algorithm: AlgorithmIdentifier, |
| #[asn1(type = "BIT STRING")] |
| pub subject_public_key: &'a [u8], |
| } |
| |
| impl PemLabel for SpkiBorrowed<'_> { |
| const PEM_LABEL: &'static str = "PUBLIC KEY"; |
| } |
| |
| /// X.509 `SubjectPublicKeyInfo` (SPKI) in owned form |
| #[derive(Clone, Debug, Eq, PartialEq, Sequence)] |
| pub struct SpkiOwned { |
| pub algorithm: AlgorithmIdentifier, |
| pub subject_public_key: BitString, |
| } |
| |
| impl PemLabel for SpkiOwned { |
| const PEM_LABEL: &'static str = "PUBLIC KEY"; |
| } |
| |
| #[test] |
| fn from_pem() { |
| // Decode PEM to owned form. |
| let pem_spki = SpkiOwned::from_pem(SPKI_PEM).unwrap(); |
| |
| // Decode DER to borrowed form. |
| let der_spki = SpkiBorrowed::from_der(SPKI_DER).unwrap(); |
| |
| assert_eq!(pem_spki.algorithm, der_spki.algorithm); |
| assert_eq!( |
| pem_spki.subject_public_key.raw_bytes(), |
| der_spki.subject_public_key |
| ); |
| } |
| |
| #[test] |
| fn to_pem() { |
| let spki = SpkiBorrowed::from_der(SPKI_DER).unwrap(); |
| let pem = spki.to_pem(LineEnding::LF).unwrap(); |
| assert_eq!(&pem, SPKI_PEM); |
| } |