1 use x509_cert::ext::pkix::name::{GeneralName, GeneralNames};
2
3 use der::{Decode, Encode};
4 use hex_literal::hex;
5 use rstest::rstest;
6
7 const OTHER_NAME: &[u8] = &hex!("A01B060560865E0202A0120C105249462D472D32303030343033362D30");
8 const RFC822_NAME: &[u8] = &hex!("8117456D61696C5F353238343037373733406468732E676F76");
9 const DNS_NAME: &[u8] =
10 &hex!("8222756E7465726E65686D656E736E616368666F6C67652D696E2D62617965726E2E6465");
11 const DIRECTORY_NAME: &[u8] =
12 &hex!("A43B3039310B3009060355040613024445310F300D06035504080C0642617965726E31193017060355040A0C104672656973746161742042617965726E");
13 // TODO: EdiPartyName
14 const URI: &[u8] = &hex!(
15 "862A687474703A2F2F63726C2E71756F7661646973676C6F62616C2E636F6D2F71767263613267332E63726C"
16 );
17 const IPADDR: &[u8] = &hex!("87202A02102C000000000000000000000000FFFFFFFF000000000000000000000000");
18 // TODO: RegisteredId
19
20 const OTHER_NAMES: &[u8] = &hex!("301da01b060560865e0202a0120c105249462d472d32303030343033362d30");
21 const RFC822_NAMES: &[u8] = &hex!("30198117456D61696C5F353238343037373733406468732E676F76");
22 const DNS_NAMES: &[u8] =
23 &hex!("30248222756E7465726E65686D656E736E616368666F6C67652D696E2D62617965726E2E6465");
24 const DIRECTORY_NAMES: &[u8] = &hex!("303DA43B3039310B3009060355040613024445310F300D06035504080C0642617965726E31193017060355040A0C104672656973746161742042617965726E");
25 // TODO: EdiPartyName
26 const URIS: &[u8] = &hex!(
27 "302C862A687474703A2F2F63726C2E71756F7661646973676C6F62616C2E636F6D2F71767263613267332E63726C"
28 );
29 const IPADDRS: &[u8] =
30 &hex!("302287202A02102C000000000000000000000000FFFFFFFF000000000000000000000000");
31 // TODO: RegisteredId
32
33 #[rstest]
34 #[case(1, OTHER_NAME)]
35 #[case(2, RFC822_NAME)]
36 #[case(3, DNS_NAME)]
37 #[case(4, DIRECTORY_NAME)]
38 #[case(5, URI)]
39 #[case(6, IPADDR)]
singular(#[case] idx: usize, #[case] value: &[u8])40 fn singular(#[case] idx: usize, #[case] value: &[u8]) {
41 let decoded = GeneralName::from_der(value).unwrap();
42
43 match (idx, &decoded) {
44 (1, GeneralName::OtherName(..)) => (),
45 (2, GeneralName::Rfc822Name(..)) => (),
46 (3, GeneralName::DnsName(..)) => (),
47 (4, GeneralName::DirectoryName(..)) => (),
48 (5, GeneralName::UniformResourceIdentifier(..)) => (),
49 (6, GeneralName::IpAddress(..)) => (),
50 _ => panic!("unexpected decoded value"),
51 }
52
53 let encoded = decoded.to_der().unwrap();
54 assert_eq!(value, encoded);
55 }
56
57 #[rstest]
58 #[case(1, OTHER_NAMES)]
59 #[case(2, RFC822_NAMES)]
60 #[case(3, DNS_NAMES)]
61 #[case(4, DIRECTORY_NAMES)]
62 #[case(5, URIS)]
63 #[case(6, IPADDRS)]
plural(#[case] idx: usize, #[case] value: &[u8])64 fn plural(#[case] idx: usize, #[case] value: &[u8]) {
65 let decoded = GeneralNames::from_der(value).unwrap();
66
67 assert_eq!(1, decoded.len());
68 match (idx, &decoded[0]) {
69 (1, GeneralName::OtherName(..)) => (),
70 (2, GeneralName::Rfc822Name(..)) => (),
71 (3, GeneralName::DnsName(..)) => (),
72 (4, GeneralName::DirectoryName(..)) => (),
73 (5, GeneralName::UniformResourceIdentifier(..)) => (),
74 (6, GeneralName::IpAddress(..)) => (),
75 _ => panic!("unexpected decoded value"),
76 }
77
78 let encoded = decoded.to_der().unwrap();
79 assert_eq!(value, encoded);
80 }
81