@@ -12,9 +12,9 @@ use crate::ssl::TicketKeyCallbackResult;
1212use crate :: x509:: { X509StoreContext , X509StoreContextRef } ;
1313use foreign_types:: ForeignType ;
1414use foreign_types:: ForeignTypeRef ;
15- use libc:: c_char;
16- use libc:: { c_int, c_uchar, c_uint, c_void} ;
15+ use libc:: { c_char, c_int, c_uchar, c_uint, c_void} ;
1716use std:: ffi:: CStr ;
17+ use std:: mem:: MaybeUninit ;
1818use std:: ptr;
1919use std:: slice;
2020use std:: str;
@@ -270,6 +270,11 @@ where
270270 }
271271}
272272
273+ unsafe fn to_uninit < ' a , T : ' a > ( ptr : * mut T ) -> & ' a mut MaybeUninit < T > {
274+ assert ! ( !ptr. is_null( ) ) ;
275+ unsafe { & mut * ptr. cast :: < MaybeUninit < T > > ( ) }
276+ }
277+
273278pub ( super ) unsafe extern "C" fn raw_ticket_key < F > (
274279 ssl : * mut ffi:: SSL ,
275280 key_name : * mut u8 ,
@@ -283,8 +288,8 @@ where
283288 & SslRef ,
284289 & mut [ u8 ; 16 ] ,
285290 & mut [ u8 ; ffi:: EVP_MAX_IV_LENGTH as usize ] ,
286- * mut ffi:: EVP_CIPHER_CTX ,
287- * mut ffi:: HMAC_CTX ,
291+ & mut MaybeUninit < ffi:: EVP_CIPHER_CTX > ,
292+ & mut MaybeUninit < ffi:: HMAC_CTX > ,
288293 bool ,
289294 ) -> TicketKeyCallbackResult
290295 + ' static
@@ -294,32 +299,34 @@ where
294299 // SAFETY: boring provides valid inputs.
295300 let ssl = unsafe { SslRef :: from_ptr_mut ( ssl) } ;
296301
302+ let evp_ctx = unsafe { to_uninit ( evp_ctx) } ;
303+ let hmac_ctx = unsafe { to_uninit ( hmac_ctx) } ;
304+
297305 let ssl_context = ssl. ssl_context ( ) . to_owned ( ) ;
298306 let callback = ssl_context
299307 . ex_data :: < F > ( SslContext :: cached_ex_index :: < F > ( ) )
300308 . expect ( "expected session resumption callback" ) ;
301309
302310 // SAFETY: the callback guarantees that key_name is 16 bytes
303311 let key_name =
304- unsafe { slice:: from_raw_parts_mut ( key_name, ffi:: SSL_TICKET_KEY_NAME_LEN as usize ) } ;
305- let key_name = <& mut [ u8 ; 16 ] >:: try_from ( key_name) . expect ( "boring provides a 16-byte key name" ) ;
312+ unsafe { to_uninit ( key_name. cast :: < [ u8 ; ffi:: SSL_TICKET_KEY_NAME_LEN as usize ] > ( ) ) } ;
306313
307314 // SAFETY: the callback provides 16 bytes iv
308315 //
309316 // https://github.com/google/boringssl/blob/main/ssl/ssl_session.cc#L331
310- let iv = unsafe { core:: slice:: from_raw_parts_mut ( iv, ffi:: EVP_MAX_IV_LENGTH as usize ) } ;
311- let iv = <& mut [ u8 ; ffi:: EVP_MAX_IV_LENGTH as usize ] >:: try_from ( iv)
312- . expect ( "boring provides a 16-byte iv" ) ;
317+ let iv = unsafe { to_uninit ( iv. cast :: < [ u8 ; ffi:: EVP_MAX_IV_LENGTH as usize ] > ( ) ) } ;
313318
314319 // When encrypting a new ticket, encrypt will be one.
315320 let encrypt = encrypt == 1 ;
316321
317322 // Zero-initialize the key_name and iv, since the application is expected to populate these
318323 // fields in the encrypt mode.
319324 if encrypt {
320- unsafe { ptr :: write ( key_name , [ 0 ; 16 ] ) } ;
321- unsafe { ptr :: write ( iv , [ 0 ; ffi :: EVP_MAX_IV_LENGTH as usize ] ) } ;
325+ * key_name = MaybeUninit :: zeroed ( ) ;
326+ * iv = MaybeUninit :: zeroed ( ) ;
322327 }
328+ let key_name = unsafe { key_name. assume_init_mut ( ) } ;
329+ let iv = unsafe { iv. assume_init_mut ( ) } ;
323330
324331 callback ( ssl, key_name, iv, evp_ctx, hmac_ctx, encrypt) . into ( )
325332}
0 commit comments