Skip to content

Commit edf67a1

Browse files
committed
Add X509::get_ext_by_nid
This function allows retrieving extensions from X509 certificates using NID objects.
1 parent 6be32e0 commit edf67a1

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

openssl/src/x509/mod.rs

+29
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,35 @@ impl X509Ref {
420420
}
421421
}
422422

423+
/// Returns this certificate's extensions for the given [Nid].
424+
///
425+
/// # Examples
426+
///
427+
/// ```
428+
/// use openssl::nid::Nid;
429+
/// use openssl::x509::X509;
430+
///
431+
/// let cert = X509::from_pem(include_bytes!("../../test/extensions.pem")).unwrap();
432+
/// let nid = Nid::create(&"1.3.6.1.4.1.41482.5.3", &"fw", &"firmware").unwrap();
433+
/// let extension = cert.get_ext_by_nid(nid).unwrap().unwrap();
434+
/// let value = extension.data().as_slice();
435+
/// assert_eq!(value, [4, 3, 5, 2, 7]);
436+
/// ```
437+
#[corresponds(X509_get_ext_by_NID)]
438+
pub fn get_ext_by_nid(&self, nid: Nid) -> Result<Option<&X509ExtensionRef>, ErrorStack> {
439+
unsafe {
440+
let loc = ffi::X509_get_ext_by_NID(self.as_ptr(), nid.as_raw(), -1);
441+
Ok(if loc >= 0 {
442+
Some(X509ExtensionRef::from_ptr(cvt_p(ffi::X509_get_ext(
443+
self.as_ptr(),
444+
loc,
445+
))?))
446+
} else {
447+
None
448+
})
449+
}
450+
}
451+
423452
/// Returns this certificate's subject alternative name entries, if they exist.
424453
#[corresponds(X509_get_ext_d2i)]
425454
pub fn subject_alt_names(&self) -> Option<Stack<GeneralName>> {

openssl/test/extensions.pem

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDOTCCAiGgAwIBAgIJAN1RLZj8pwQyMA0GCSqGSIb3DQEBCwUAMCgxJjAkBgNV
3+
BAMMHVl1YmljbyBPcGVuUEdQIEF0dGVzdGF0aW9uIENBMB4XDTE5MDgwMTAwMDAw
4+
MFoXDTQ2MTIxNzAwMDAwMFowIzEhMB8GA1UEAwwYWXViaWtleSBPUEdQIEF0dGVz
5+
dGF0aW9uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+gnQOA27wOHe
6+
aflJf1R5hNlRM2dJ3Bm8h4HbavsONxgeB2pf17/OwKHtOSl7NznfeiiD1nmIo2k3
7+
rxOplhxuWBEwkn2mxdvMqClbnsmmiZdASYaqYICjFzAu2HNgjfGOuFOuqfp7Vkut
8+
x+uFZtNpwtTwOrUs3hb3m4BAa7D+u0WoAFHWzhuFPDOYuI/S6pN9nBdZddEvBFAB
9+
XpGJdv9pOGAecymzNRaTYuG9nsI5hB7Buw8fDXfy/qcqX1x6/jtAnpwEU7JlzJki
10+
Ek75ETfLKlQQmoBLPk9TPW1Z9Dfk4Q191mOjW5kLdxJy65/PHAyqBzqO1vg+6475
11+
TXAHjLUu1wIDAQABo2swaTATBgorBgEEAYLECgUDBAUEAwUCBzAdBgNVHQ4EFgQU
12+
sRtH7kxAgfcF53Jq2bwMf/En5scwHwYDVR0jBBgwFoAU+/zJb8n0p2mpdkSR93HP
13+
JmUuEkowEgYDVR0TAQH/BAgwBgEB/wIBADANBgkqhkiG9w0BAQsFAAOCAQEAYZA7
14+
EP9WIF7I/L8FLxeAmeqPW9qgEXNjfwvoS732omeEOK1Y465/suEXDnMd2GhufgrM
15+
9NFf0djmvGHQWhu+2/1GPlt7LSC3K95ERyjzSZ7rNPw9ITtgG25KG5MoLFmTP5H1
16+
+AGqopS+dlsGE6iQUJqW53wBxsko3DGp1G7Fy/71tEwP5tomfrQgNxvSrNYHrpSZ
17+
oQdzKypYMI16Z2p/WEJDXoWk0+tA3SlX8fP0X5AxTkOTE7L6R//7NCmkObxBdy2q
18+
EM05C5JASEmkPxkG+d+ArcCSe2jOIwxeWKkCMzCk9kie2f0hCzh1vzJdJJ7GUglf
19+
3MevZb+xsxi0oAS32A==
20+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)