Skip to content

Commit d299bbc

Browse files
authored
Merge pull request #1740 from alexanderjordanbaker/X509LoadCertFile
Add support for X509_load_cert_file
2 parents 4edda63 + 5ae938e commit d299bbc

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

openssl-sys/src/handwritten/x509_vfy.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ extern "C" {
1212
extern "C" {
1313
pub fn X509_LOOKUP_free(ctx: *mut X509_LOOKUP);
1414
pub fn X509_LOOKUP_hash_dir() -> *mut X509_LOOKUP_METHOD;
15+
pub fn X509_LOOKUP_file() -> *mut X509_LOOKUP_METHOD;
1516
pub fn X509_LOOKUP_ctrl(
1617
ctx: *mut X509_LOOKUP,
1718
cmd: c_int,
1819
argc: *const c_char,
1920
argl: c_long,
2021
ret: *mut *mut c_char,
2122
) -> c_int;
23+
pub fn X509_load_cert_file(ctx: *mut X509_LOOKUP, file: *const c_char, _type: c_int) -> c_int;
2224
}
2325

2426
extern "C" {

openssl/src/x509/store.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ use crate::{cvt, cvt_p};
5656
use openssl_macros::corresponds;
5757
#[cfg(not(boringssl))]
5858
use std::ffi::CString;
59+
#[cfg(not(boringssl))]
60+
use std::path::Path;
5961

6062
foreign_type_and_impl_send_sync! {
6163
type CType = ffi::X509_STORE;
@@ -176,6 +178,37 @@ impl X509LookupRef<HashDir> {
176178
}
177179
}
178180

181+
/// Marker type corresponding to the [`X509_LOOKUP_file`] lookup method.
182+
///
183+
/// [`X509_LOOKUP_file`]: https://www.openssl.org/docs/man1.1.1/man3/X509_LOOKUP_file.html
184+
pub struct File;
185+
186+
impl X509Lookup<File> {
187+
/// Lookup method loads all the certificates or CRLs present in a file
188+
/// into memory at the time the file is added as a lookup source.
189+
#[corresponds(X509_LOOKUP_file)]
190+
pub fn file() -> &'static X509LookupMethodRef<File> {
191+
unsafe { X509LookupMethodRef::from_ptr(ffi::X509_LOOKUP_file()) }
192+
}
193+
}
194+
195+
#[cfg(not(boringssl))]
196+
impl X509LookupRef<File> {
197+
#[corresponds(X509_load_cert_file)]
198+
/// Specifies a file from which certificates will be loaded
199+
pub fn load_cert_file<P: AsRef<Path>>(&mut self, file: P, file_type: SslFiletype) -> Result<(), ErrorStack> {
200+
let file = CString::new(file.as_ref().as_os_str().to_str().unwrap()).unwrap();
201+
unsafe {
202+
cvt(ffi::X509_load_cert_file(
203+
self.as_ptr(),
204+
file.as_ptr(),
205+
file_type.as_raw(),
206+
))
207+
.map(|_| ())
208+
}
209+
}
210+
}
211+
179212
generic_foreign_type_and_impl_send_sync! {
180213
type CType = ffi::X509_LOOKUP_METHOD;
181214
fn drop = X509_LOOKUP_meth_free;

openssl/src/x509/tests.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ use crate::hash::MessageDigest;
66
use crate::nid::Nid;
77
use crate::pkey::{PKey, Private};
88
use crate::rsa::Rsa;
9+
#[cfg(not(boringssl))]
10+
use crate::ssl::SslFiletype;
911
use crate::stack::Stack;
1012
use crate::x509::extension::{
1113
AuthorityKeyIdentifier, BasicConstraints, ExtendedKeyUsage, KeyUsage, SubjectAlternativeName,
1214
SubjectKeyIdentifier,
1315
};
16+
#[cfg(not(boringssl))]
17+
use crate::x509::store::X509Lookup;
1418
use crate::x509::store::X509StoreBuilder;
1519
#[cfg(any(ossl102, libressl261))]
1620
use crate::x509::verify::{X509VerifyFlags, X509VerifyParam};
@@ -668,3 +672,23 @@ fn test_verify_param_set_depth_fails_verification() {
668672
expected_error
669673
)
670674
}
675+
676+
#[test]
677+
#[cfg(not(boringssl))]
678+
fn test_load_cert_file() {
679+
let cert = include_bytes!("../../test/cert.pem");
680+
let cert = X509::from_pem(cert).unwrap();
681+
let chain = Stack::new().unwrap();
682+
683+
let mut store_bldr = X509StoreBuilder::new().unwrap();
684+
let lookup = store_bldr.add_lookup(X509Lookup::file()).unwrap();
685+
lookup
686+
.load_cert_file("test/root-ca.pem", SslFiletype::PEM)
687+
.unwrap();
688+
let store = store_bldr.build();
689+
690+
let mut context = X509StoreContext::new().unwrap();
691+
assert!(context
692+
.init(&store, &cert, &chain, |c| c.verify_cert())
693+
.unwrap());
694+
}

0 commit comments

Comments
 (0)