Skip to content

Commit 773a6f0

Browse files
committed
Start on PKCS #12 support
1 parent 5042d3d commit 773a6f0

File tree

9 files changed

+126
-24
lines changed

9 files changed

+126
-24
lines changed

openssl-sys/src/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ pub type X509_NAME_ENTRY = c_void;
3737
pub type X509_REQ = c_void;
3838
pub type X509_STORE_CTX = c_void;
3939
pub type bio_st = c_void;
40+
#[repr(C)]
41+
pub struct PKCS12(c_void);
42+
43+
#[repr(C)]
44+
pub struct stack_st_X509 {
45+
pub stack: _STACK,
46+
}
4047

4148
#[repr(C)]
4249
pub struct stack_st_X509_EXTENSION {
@@ -1070,6 +1077,15 @@ extern "C" {
10701077
pub fn i2d_RSAPrivateKey(k: *mut RSA, buf: *const *mut u8) -> c_int;
10711078
pub fn d2i_RSAPrivateKey(k: *const *mut RSA, buf: *const *const u8, len: c_uint) -> *mut RSA;
10721079

1080+
pub fn d2i_PKCS12(a: *mut *mut PKCS12, pp: *mut *const u8, length: c_long) -> *mut PKCS12;
1081+
pub fn PKCS12_parse(p12: *mut PKCS12,
1082+
pass: *const c_char,
1083+
pkey: *mut *mut EVP_PKEY,
1084+
cert: *mut *mut X509,
1085+
ca: *mut *mut stack_st_X509)
1086+
-> c_int;
1087+
pub fn PKCS12_free(p12: *mut PKCS12);
1088+
10731089
pub fn SSLeay() -> c_long;
10741090
pub fn SSLeay_version(key: c_int) -> *const c_char;
10751091
}

openssl/src/crypto/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub mod hash;
1818
#[cfg(feature = "hmac")]
1919
pub mod hmac;
2020
pub mod pkcs5;
21+
pub mod pkcs12;
2122
pub mod pkey;
2223
pub mod rand;
2324
pub mod symm;

openssl/src/crypto/pkcs12.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//! PKCS #12 archives.
2+
3+
use ffi;
4+
use libc::{c_long, c_uchar};
5+
use std::cmp;
6+
use std::ptr;
7+
8+
use error::ErrorStack;
9+
10+
/// A PKCS #12 archive.
11+
pub struct Pkcs12(*mut ffi::PKCS12);
12+
13+
impl Drop for Pkcs12 {
14+
fn drop(&mut self) {
15+
unsafe { ffi::PKCS12_free(self.0); }
16+
}
17+
}
18+
19+
impl Pkcs12 {
20+
pub fn from_der(der: &[u8]) -> Result<Pkcs12, ErrorStack> {
21+
unsafe {
22+
let mut ptr = der.as_ptr() as *const c_uchar;
23+
let length = cmp::min(der.len(), c_long::max_value() as usize) as c_long;
24+
let p12 = try_ssl_null!(ffi::d2i_PKCS12(ptr::null_mut(), &mut ptr, length));
25+
Ok(Pkcs12(p12))
26+
}
27+
}
28+
}
29+
30+
#[cfg(test)]
31+
mod test {
32+
use super::*;
33+
34+
#[test]
35+
fn from_der() {
36+
let der = include_bytes!("../../test/identity.p12");
37+
Pkcs12::from_der(der).unwrap();
38+
}
39+
}

openssl/src/ssl/tests/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ run_test!(verify_trusted, |method, stream| {
245245
let mut ctx = SslContext::new(method).unwrap();
246246
ctx.set_verify(SSL_VERIFY_PEER);
247247

248-
match ctx.set_CA_file(&Path::new("test/cert.pem")) {
248+
match ctx.set_CA_file(&Path::new("test/root-ca.pem")) {
249249
Ok(_) => {}
250250
Err(err) => panic!("Unexpected error {:?}", err),
251251
}
@@ -314,7 +314,7 @@ run_test!(verify_trusted_get_error_ok, |method, stream| {
314314
true
315315
});
316316

317-
match ctx.set_CA_file(&Path::new("test/cert.pem")) {
317+
match ctx.set_CA_file(&Path::new("test/root-ca.pem")) {
318318
Ok(_) => {}
319319
Err(err) => panic!("Unexpected error {:?}", err),
320320
}
@@ -338,7 +338,7 @@ run_test!(verify_callback_data, |method, stream| {
338338
// in DER format.
339339
// Command: openssl x509 -in test/cert.pem -outform DER | openssl dgst -sha256
340340
// Please update if "test/cert.pem" will ever change
341-
let node_hash_str = "E19427DAC79FBE758394945276A6E4F15F0BEBE6";
341+
let node_hash_str = "59172d9313e84459bcff27f967e79e6e9217e584";
342342
let node_id = node_hash_str.from_hex().unwrap();
343343
ctx.set_verify_callback(SSL_VERIFY_PEER, move |_preverify_ok, x509_ctx| {
344344
let cert = x509_ctx.current_cert();
@@ -367,7 +367,7 @@ run_test!(ssl_verify_callback, |method, stream| {
367367
let ctx = SslContext::new(method).unwrap();
368368
let mut ssl = ctx.into_ssl().unwrap();
369369

370-
let node_hash_str = "E19427DAC79FBE758394945276A6E4F15F0BEBE6";
370+
let node_hash_str = "59172d9313e84459bcff27f967e79e6e9217e584";
371371
let node_id = node_hash_str.from_hex().unwrap();
372372
ssl.set_verify_callback(SSL_VERIFY_PEER, move |_, x509| {
373373
CHECKED.store(1, Ordering::SeqCst);

openssl/src/x509/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ fn test_cert_loading() {
8686
let cert = X509::from_pem(cert).ok().expect("Failed to load PEM");
8787
let fingerprint = cert.fingerprint(SHA1).unwrap();
8888

89-
let hash_str = "E19427DAC79FBE758394945276A6E4F15F0BEBE6";
89+
let hash_str = "59172d9313e84459bcff27f967e79e6e9217e584";
9090
let hash_vec = hash_str.from_hex().unwrap();
9191

9292
assert_eq!(fingerprint, hash_vec);

openssl/test/cert.pem

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIDhzCCAm+gAwIBAgIJAKyxk8nkmAtWMA0GCSqGSIb3DQEBCwUAMFoxCzAJBgNV
3-
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
4-
aWRnaXRzIFB0eSBMdGQxEzARBgNVBAMMCmZvb2Jhci5jb20wHhcNMTYwNTE2MDUw
5-
NTAwWhcNMjYwNTE0MDUwNTAwWjBaMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29t
6-
ZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMwEQYD
7-
VQQDDApmb29iYXIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
8-
qPQljESzF6NQhf4jkYfQeDYbSRf/LUfT5RvebDb8lrkEP/I33r/vMxK6ZcXy5LdK
9-
SanKImRvIPTVNJFOqOU/v9UIGXJQgKGWktCasZqKNmJP9ULI9eqZzAXNdLkg5Olf
10-
WiUl9bysDjVTUsIhwNTIV/ou1n+/ytJ4qvpO4TpIZXhZFoGbVKuNYF4dVXzroJGu
11-
1JLWJ5PZqwWwDI5mpaGTZ9qTDAEMVYOE4Yi5t877lqr1wEls1GXOyAHdRmzeALQ7
12-
obNudnqhPROIkx5OxdeMAEtSVqr+uuoUXhh65mSRsdMUEzPbzw9RzebdlNyk34Tv
13-
5k5QFFlcoPbQrTs26CoLNQIDAQABo1AwTjAdBgNVHQ4EFgQUtnMvYaVLoe9ILBWx
14-
n/PcNC+8rDAwHwYDVR0jBBgwFoAUtnMvYaVLoe9ILBWxn/PcNC+8rDAwDAYDVR0T
15-
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAALVDDD2f25h5ytSkoUqQilybeRDg
16-
bPhTEEC83NWg2snV1yGtwO3zZ+hvX+J/RqOn33ER/RnQCZTB9FGPj566IbLwLSAE
17-
y83GDsbsFEWCL8yN4Q3dQVub7D3HZ5PBtGpBxC7brvJD7OnR3n75QOFC+OaGKUCo
18-
16XulVsB3IQsXdzL4GwoUqWGWaUyf5MkzFruBma16QetK5J10R42skeXssjvqupv
19-
qUQZxzGOzIGuLTBvJrtFxtoTCu+oZV942wGmuyvLwqRfzIODLNcGLS6lGJudXJPT
20-
Vapaj6maldL3qe1X4bxvtglnpdlrOJ65E3YEC1gcD1KUvfO5vItKrP1FbA==
2+
MIIDGzCCAgMCCQCHcfe97pgvpTANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB
3+
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
4+
cyBQdHkgTHRkMB4XDTE2MDgxNDE3MDAwM1oXDTI2MDgxMjE3MDAwM1owWjELMAkG
5+
A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0
6+
IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKZm9vYmFyLmNvbTCCASIwDQYJKoZI
7+
hvcNAQEBBQADggEPADCCAQoCggEBAKj0JYxEsxejUIX+I5GH0Hg2G0kX/y1H0+Ub
8+
3mw2/Ja5BD/yN96/7zMSumXF8uS3SkmpyiJkbyD01TSRTqjlP7/VCBlyUIChlpLQ
9+
mrGaijZiT/VCyPXqmcwFzXS5IOTpX1olJfW8rA41U1LCIcDUyFf6LtZ/v8rSeKr6
10+
TuE6SGV4WRaBm1SrjWBeHVV866CRrtSS1ieT2asFsAyOZqWhk2fakwwBDFWDhOGI
11+
ubfO+5aq9cBJbNRlzsgB3UZs3gC0O6GzbnZ6oT0TiJMeTsXXjABLUlaq/rrqFF4Y
12+
euZkkbHTFBMz288PUc3m3ZTcpN+E7+ZOUBRZXKD20K07NugqCzUCAwEAATANBgkq
13+
hkiG9w0BAQsFAAOCAQEASvYHuIl5C0NHBELPpVHNuLbQsDQNKVj3a54+9q1JkiMM
14+
6taEJYfw7K1Xjm4RoiFSHpQBh+PWZS3hToToL2Zx8JfMR5MuAirdPAy1Sia/J/qE
15+
wQdJccqmvuLkLTSlsGbEJ/LUUgOAgrgHOZM5lUgIhCneA0/dWJ3PsN0zvn69/faY
16+
oo1iiolWiIHWWBUSdr3jM2AJaVAsTmLh00cKaDNk37JB940xConBGSl98JPrNrf9
17+
dUAiT0iIBngDBdHnn/yTj+InVEFyZSKrNtiDSObFHxPcxGteHNrCPJdP1e+GqkHp
18+
HJMRZVCQpSMzvHlofHSNgzWV1MX5h1CP4SGZdBDTfA==
2119
-----END CERTIFICATE-----

openssl/test/identity.p12

3.31 KB
Binary file not shown.

openssl/test/root-ca.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpQIBAAKCAQEArVHWFn52Lbl1l59exduZntVSZyDYpzDND+S2LUcO6fRBWhV/
3+
1Kzox+2GZptbuMGmfI3iAnb0CFT4uC3kBkQQlXonGATSVyaFTFR+jq/lc0SP+9Bd
4+
7SBXieIVeIXlY1TvlwIvj3Ntw9zX+scTA4SXxH6M0rKv9gTOub2vCMSHeF16X8DQ
5+
r4XsZuQr7Cp7j1I4aqOJyap5JTl5ijmG8cnu0n+8UcRlBzy99dLWJG0AfI3VRJdW
6+
pGTNVZ92aFff3RpK3F/WI2gp3qV1ynRAKuvmncGC3LDvYfcc2dgsc1N6Ffq8GIrk
7+
gRob6eBcklDHp1d023Lwre+VaVDSo1//Y72UFwIDAQABAoIBAGZrnd/dC2kp11uq
8+
Sg8SHk3GMdPPjTf/lq51sVJAU4fdV2Eso0XCiCzdKDcqR6F+jiu8jHp4YO0riW8N
9+
b1pkjohGjyOaddIaaVsZ80/OkgDz20Ird9XQ7uoEODvopA12+755BDH5PDwqHVeM
10+
nKfPiwAK6Jz6CxGO9bq9ZNoBiSyO1uofaB4Cpp8t74XVeAuPiI/Bb6WJ8TW5K5dt
11+
x0Jihdo46QgZR+z4PnyWIoACkhSoQmtTb9NUrpKceBcxdCrZ/kEmYpnPq/PuSw6g
12+
6HthjYP/H9Xulz69UR5Ez6z+1pU1rKFmQ46qK7X3zVHg233MlGekMzxdmShEjzCP
13+
BMGYpQECgYEA5tqTZsUJwx3HDhkaZ/XOtaQqwOnZm9wPwTjGbV1t4+NUJzsl5gjP
14+
ho+I8ZSGZ6MnNSh+ClpYhUHYBq0rTuAAYL2arcMOuOs1GrMmiZJbXm8zq8M7gYr5
15+
V99H/7akSx66WV/agPkLIvh/BWxlWgQcoVAIzZibbLUxr7Ye50pCLfECgYEAwDLn
16+
mFz0mFMvGtaSp8RnTDTFCz9czCeDt0GujCxG1epdvtuxlg/S1QH+mGzA/AHkiu7z
17+
uzCwGKWozNTdRkqVwYoJTB+AYHseSkuGP+a1zr39w+xBW/vESb2oP95GIwprXcG2
18+
b/qdeQVzuLQhYoqWI2u8CBwlHFfpQO4Bp2ea+ocCgYEAurIgLSfCqlpFpiAlG9hN
19+
8NYwgU1d4E+LKj+JMd8yRO+PGh8amjub4X3pST5NqDjpN3Nk42iHWFWUqGmZsbM0
20+
ewg7tLUgDeqiStKBoxaK8AdMqWc9k5lZ53e6mZISsnHKUQdVBaLjH8gJqdAs8yyK
21+
HudEB0mYwMSUxz6pJXIHrXECgYEAhJkaCpXm8chB8UQj/baUhZDKeI4IWZjRWHbq
22+
Ey7g1+hPMMOk6yCTlf1ARqyRH8u2ftuIL5bRhs+Te21IE5yVYOb4rxn0mZuXNC6S
23+
ujdTKwUMtESkeu9hZnaAQz/4J2ii1hY05WCDj+DhC4bKmY9/MYS8PuQb/kfwVqld
24+
Xr8tvrUCgYEAmslHocXBUFXyRDkEOx/aKo+t9fPBr95PBZzFUt9ejrTP4PXsLa46
25+
3/PNOCGdrQxh5qHHcvLwR4bPL++Dj+qMUTJXANrArKPDpE2WqH6pqWIC6yaZvzUk
26+
17QbpXR6bHcdJV045pWpw40UCStTocVynY1lBfOw8VqxBIBlpVBBzew=
27+
-----END RSA PRIVATE KEY-----

openssl/test/root-ca.pem

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDXTCCAkWgAwIBAgIJAOIvDiVb18eVMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
3+
BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
4+
aWRnaXRzIFB0eSBMdGQwHhcNMTYwODE0MTY1NjExWhcNMjYwODEyMTY1NjExWjBF
5+
MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
6+
ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
7+
CgKCAQEArVHWFn52Lbl1l59exduZntVSZyDYpzDND+S2LUcO6fRBWhV/1Kzox+2G
8+
ZptbuMGmfI3iAnb0CFT4uC3kBkQQlXonGATSVyaFTFR+jq/lc0SP+9Bd7SBXieIV
9+
eIXlY1TvlwIvj3Ntw9zX+scTA4SXxH6M0rKv9gTOub2vCMSHeF16X8DQr4XsZuQr
10+
7Cp7j1I4aqOJyap5JTl5ijmG8cnu0n+8UcRlBzy99dLWJG0AfI3VRJdWpGTNVZ92
11+
aFff3RpK3F/WI2gp3qV1ynRAKuvmncGC3LDvYfcc2dgsc1N6Ffq8GIrkgRob6eBc
12+
klDHp1d023Lwre+VaVDSo1//Y72UFwIDAQABo1AwTjAdBgNVHQ4EFgQUbNOlA6sN
13+
XyzJjYqciKeId7g3/ZowHwYDVR0jBBgwFoAUbNOlA6sNXyzJjYqciKeId7g3/Zow
14+
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAVVaR5QWLZIRR4Dw6TSBn
15+
BQiLpBSXN6oAxdDw6n4PtwW6CzydaA+creiK6LfwEsiifUfQe9f+T+TBSpdIYtMv
16+
Z2H2tjlFX8VrjUFvPrvn5c28CuLI0foBgY8XGSkR2YMYzWw2jPEq3Th/KM5Catn3
17+
AFm3bGKWMtGPR4v+90chEN0jzaAmJYRrVUh9vea27bOCn31Nse6XXQPmSI6Gyncy
18+
OAPUsvPClF3IjeL1tmBotWqSGn1cYxLo+Lwjk22A9h6vjcNQRyZF2VLVvtwYrNU3
19+
mwJ6GCLsLHpwW/yjyvn8iEltnJvByM/eeRnfXV6WDObyiZsE/n6DxIRJodQzFqy9
20+
GA==
21+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)