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