Skip to content

Commit 67bd97f

Browse files
committed
Add X509::get_ext
This function allows retrieving extensions from X509 certificates.
1 parent 2e6bc97 commit 67bd97f

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
@@ -425,6 +425,35 @@ impl X509Ref {
425425
}
426426
}
427427

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