@@ -6,6 +6,7 @@ use std::ffi::CString;
66use std:: ptr;
77
88use crate :: error:: ErrorStack ;
9+ use crate :: hash:: MessageDigest ;
910use crate :: nid:: Nid ;
1011use crate :: pkey:: { HasPrivate , PKey , PKeyRef , Private } ;
1112use 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