68 lines
1.8 KiB
Rust
68 lines
1.8 KiB
Rust
|
|
//! 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);
|
||
|
|
}
|