Skip to content

Commit e420d3c

Browse files
authored
Merge pull request #1557 from tpambor/pkcs12-mac-md
Pkcs12Builder: Add option to specify MAC digest algorithm
2 parents 37a920c + ac106a4 commit e420d3c

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

openssl-sys/src/pkcs12.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ extern "C" {
2222
cert: *mut *mut X509,
2323
ca: *mut *mut stack_st_X509,
2424
) -> c_int;
25+
26+
pub fn PKCS12_set_mac(
27+
p12: *mut PKCS12,
28+
pass: *const c_char,
29+
passlen: c_int,
30+
salt: *mut c_uchar,
31+
saltlen: c_int,
32+
iter: c_int,
33+
md_type: *const EVP_MD,
34+
) -> c_int;
2535
}
2636
const_ptr_api! {
2737
extern "C" {

openssl/src/pkcs12.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::ffi::CString;
66
use std::ptr;
77

88
use crate::error::ErrorStack;
9+
use crate::hash::MessageDigest;
910
use crate::nid::Nid;
1011
use crate::pkey::{HasPrivate, PKey, PKeyRef, Private};
1112
use crate::stack::Stack;
@@ -75,6 +76,7 @@ impl Pkcs12 {
7576
/// * `nid_cert` - `AES_256_CBC` (3.0.0+) or `PBE_WITHSHA1AND40BITRC2_CBC`
7677
/// * `iter` - `2048`
7778
/// * `mac_iter` - `2048`
79+
/// * `mac_md` - `SHA-256` (3.0.0+) or `SHA-1`
7880
pub fn builder() -> Pkcs12Builder {
7981
ffi::init();
8082

@@ -83,6 +85,7 @@ impl Pkcs12 {
8385
nid_cert: Nid::UNDEF,
8486
iter: ffi::PKCS12_DEFAULT_ITER,
8587
mac_iter: ffi::PKCS12_DEFAULT_ITER,
88+
mac_md: None,
8689
ca: None,
8790
}
8891
}
@@ -99,6 +102,7 @@ pub struct Pkcs12Builder {
99102
nid_cert: Nid,
100103
iter: c_int,
101104
mac_iter: c_int,
105+
mac_md: Option<MessageDigest>,
102106
ca: Option<Stack<X509>>,
103107
}
104108

@@ -130,6 +134,12 @@ impl Pkcs12Builder {
130134
self
131135
}
132136

137+
/// MAC message digest type
138+
pub fn mac_md(&mut self, md: MessageDigest) -> &mut Self {
139+
self.mac_md = Some(md);
140+
self
141+
}
142+
133143
/// An additional set of certificates to include in the archive beyond the one provided to
134144
/// `build`.
135145
pub fn ca(&mut self, ca: Stack<X509>) -> &mut Self {
@@ -168,13 +178,17 @@ impl Pkcs12Builder {
168178
.unwrap_or(ptr::null_mut());
169179
let nid_key = self.nid_key.as_raw();
170180
let nid_cert = self.nid_cert.as_raw();
181+
let md_type = self
182+
.mac_md
183+
.map(|md_type| md_type.as_ptr())
184+
.unwrap_or(ptr::null());
171185

172186
// According to the OpenSSL docs, keytype is a non-standard extension for MSIE,
173187
// It's values are KEY_SIG or KEY_EX, see the OpenSSL docs for more information:
174188
// https://www.openssl.org/docs/man1.0.2/crypto/PKCS12_create.html
175189
let keytype = 0;
176190

177-
cvt_p(ffi::PKCS12_create(
191+
let pkcs12 = cvt_p(ffi::PKCS12_create(
178192
pass.as_ptr() as *const _ as *mut _,
179193
friendly_name.as_ptr() as *const _ as *mut _,
180194
pkey,
@@ -183,10 +197,22 @@ impl Pkcs12Builder {
183197
nid_key,
184198
nid_cert,
185199
self.iter,
186-
self.mac_iter,
200+
-1,
187201
keytype,
188202
))
189-
.map(Pkcs12)
203+
.map(Pkcs12)?;
204+
205+
cvt(ffi::PKCS12_set_mac(
206+
pkcs12.as_ptr(),
207+
pass.as_ptr(),
208+
-1,
209+
ptr::null_mut(),
210+
0,
211+
self.mac_iter,
212+
md_type,
213+
))?;
214+
215+
Ok(pkcs12)
190216
}
191217
}
192218
}

0 commit comments

Comments
 (0)