Skip to content

Commit d200b71

Browse files
committed
add support for other oid in the extended key usage
1 parent 30489d7 commit d200b71

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

rcgen/src/lib.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1282,10 +1282,12 @@ pub enum ExtendedKeyUsagePurpose {
12821282
TimeStamping,
12831283
/// id-kp-OCSPSigning
12841284
OcspSigning,
1285+
/// Defined by an organization with a need
1286+
Other(Vec<u64>),
12851287
}
12861288

12871289
impl ExtendedKeyUsagePurpose {
1288-
fn oid(&self) -> &'static [u64] {
1290+
fn oid(&self) -> &[u64] {
12891291
use ExtendedKeyUsagePurpose::*;
12901292
match self {
12911293
// anyExtendedKeyUsage
@@ -1297,6 +1299,7 @@ impl ExtendedKeyUsagePurpose {
12971299
EmailProtection => &[1, 3, 6, 1, 5, 5, 7, 3, 4],
12981300
TimeStamping => &[1, 3, 6, 1, 5, 5, 7, 3, 8],
12991301
OcspSigning => &[1, 3, 6, 1, 5, 5, 7, 3, 9],
1302+
Other(oid) => &oid,
13001303
}
13011304
}
13021305
}
@@ -1935,6 +1938,36 @@ mod tests {
19351938
assert!(extension.value.any);
19361939
}
19371940

1941+
#[test]
1942+
fn test_with_extended_key_usages_other() {
1943+
use x509_parser::der_parser::asn1_rs::Oid;
1944+
let mut params: CertificateParams = Default::default();
1945+
const OID_1: &[u64] = &[1, 2, 3, 4];
1946+
const OID_2: &[u64] = &[1, 2, 3, 4, 5, 6];
1947+
1948+
// Set extended_key_usages
1949+
params.extended_key_usages = vec![
1950+
ExtendedKeyUsagePurpose::Other(Vec::from(OID_1)),
1951+
ExtendedKeyUsagePurpose::Other(Vec::from(OID_2)),
1952+
];
1953+
1954+
// Make the cert
1955+
let cert = Certificate::from_params(params).unwrap();
1956+
1957+
// Serialize it
1958+
let der = cert.serialize_der().unwrap();
1959+
1960+
// Parse it
1961+
let (_rem, cert) = x509_parser::parse_x509_certificate(&der).unwrap();
1962+
1963+
// Ensure we found it.
1964+
let maybe_extension = cert.extended_key_usage().unwrap();
1965+
let extension = maybe_extension.unwrap();
1966+
1967+
let expected_oids = vec![Oid::from(OID_1).unwrap(), Oid::from(OID_2).unwrap()];
1968+
assert_eq!(extension.value.other, expected_oids);
1969+
}
1970+
19381971
#[test]
19391972
fn signature_algos_different() {
19401973
// TODO unify this with test_key_params_mismatch.

0 commit comments

Comments
 (0)