81 lines
3.0 KiB
Rust
81 lines
3.0 KiB
Rust
|
|
use x509_cert::ext::pkix::name::{GeneralName, GeneralNames};
|
||
|
|
|
||
|
|
use der::{Decode, Encode};
|
||
|
|
use hex_literal::hex;
|
||
|
|
use rstest::rstest;
|
||
|
|
|
||
|
|
const OTHER_NAME: &[u8] = &hex!("A01B060560865E0202A0120C105249462D472D32303030343033362D30");
|
||
|
|
const RFC822_NAME: &[u8] = &hex!("8117456D61696C5F353238343037373733406468732E676F76");
|
||
|
|
const DNS_NAME: &[u8] =
|
||
|
|
&hex!("8222756E7465726E65686D656E736E616368666F6C67652D696E2D62617965726E2E6465");
|
||
|
|
const DIRECTORY_NAME: &[u8] =
|
||
|
|
&hex!("A43B3039310B3009060355040613024445310F300D06035504080C0642617965726E31193017060355040A0C104672656973746161742042617965726E");
|
||
|
|
// TODO: EdiPartyName
|
||
|
|
const URI: &[u8] = &hex!(
|
||
|
|
"862A687474703A2F2F63726C2E71756F7661646973676C6F62616C2E636F6D2F71767263613267332E63726C"
|
||
|
|
);
|
||
|
|
const IPADDR: &[u8] = &hex!("87202A02102C000000000000000000000000FFFFFFFF000000000000000000000000");
|
||
|
|
// TODO: RegisteredId
|
||
|
|
|
||
|
|
const OTHER_NAMES: &[u8] = &hex!("301da01b060560865e0202a0120c105249462d472d32303030343033362d30");
|
||
|
|
const RFC822_NAMES: &[u8] = &hex!("30198117456D61696C5F353238343037373733406468732E676F76");
|
||
|
|
const DNS_NAMES: &[u8] =
|
||
|
|
&hex!("30248222756E7465726E65686D656E736E616368666F6C67652D696E2D62617965726E2E6465");
|
||
|
|
const DIRECTORY_NAMES: &[u8] = &hex!("303DA43B3039310B3009060355040613024445310F300D06035504080C0642617965726E31193017060355040A0C104672656973746161742042617965726E");
|
||
|
|
// TODO: EdiPartyName
|
||
|
|
const URIS: &[u8] = &hex!(
|
||
|
|
"302C862A687474703A2F2F63726C2E71756F7661646973676C6F62616C2E636F6D2F71767263613267332E63726C"
|
||
|
|
);
|
||
|
|
const IPADDRS: &[u8] =
|
||
|
|
&hex!("302287202A02102C000000000000000000000000FFFFFFFF000000000000000000000000");
|
||
|
|
// TODO: RegisteredId
|
||
|
|
|
||
|
|
#[rstest]
|
||
|
|
#[case(1, OTHER_NAME)]
|
||
|
|
#[case(2, RFC822_NAME)]
|
||
|
|
#[case(3, DNS_NAME)]
|
||
|
|
#[case(4, DIRECTORY_NAME)]
|
||
|
|
#[case(5, URI)]
|
||
|
|
#[case(6, IPADDR)]
|
||
|
|
fn singular(#[case] idx: usize, #[case] value: &[u8]) {
|
||
|
|
let decoded = GeneralName::from_der(value).unwrap();
|
||
|
|
|
||
|
|
match (idx, &decoded) {
|
||
|
|
(1, GeneralName::OtherName(..)) => (),
|
||
|
|
(2, GeneralName::Rfc822Name(..)) => (),
|
||
|
|
(3, GeneralName::DnsName(..)) => (),
|
||
|
|
(4, GeneralName::DirectoryName(..)) => (),
|
||
|
|
(5, GeneralName::UniformResourceIdentifier(..)) => (),
|
||
|
|
(6, GeneralName::IpAddress(..)) => (),
|
||
|
|
_ => panic!("unexpected decoded value"),
|
||
|
|
}
|
||
|
|
|
||
|
|
let encoded = decoded.to_vec().unwrap();
|
||
|
|
assert_eq!(value, encoded);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[rstest]
|
||
|
|
#[case(1, OTHER_NAMES)]
|
||
|
|
#[case(2, RFC822_NAMES)]
|
||
|
|
#[case(3, DNS_NAMES)]
|
||
|
|
#[case(4, DIRECTORY_NAMES)]
|
||
|
|
#[case(5, URIS)]
|
||
|
|
#[case(6, IPADDRS)]
|
||
|
|
fn plural(#[case] idx: usize, #[case] value: &[u8]) {
|
||
|
|
let decoded = GeneralNames::from_der(value).unwrap();
|
||
|
|
|
||
|
|
assert_eq!(1, decoded.len());
|
||
|
|
match (idx, &decoded[0]) {
|
||
|
|
(1, GeneralName::OtherName(..)) => (),
|
||
|
|
(2, GeneralName::Rfc822Name(..)) => (),
|
||
|
|
(3, GeneralName::DnsName(..)) => (),
|
||
|
|
(4, GeneralName::DirectoryName(..)) => (),
|
||
|
|
(5, GeneralName::UniformResourceIdentifier(..)) => (),
|
||
|
|
(6, GeneralName::IpAddress(..)) => (),
|
||
|
|
_ => panic!("unexpected decoded value"),
|
||
|
|
}
|
||
|
|
|
||
|
|
let encoded = decoded.to_vec().unwrap();
|
||
|
|
assert_eq!(value, encoded);
|
||
|
|
}
|