@@ -212,6 +212,79 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign_init(
212212    } 
213213} 
214214
215+ unsafe  extern  "C"  fn  parsec_provider_signature_settable_params ( 
216+     _ctx :  VOID_PTR , 
217+     _provkey :  VOID_PTR , 
218+ )  -> * const  OSSL_PARAM  { 
219+     static  ONCE_INIT :  std:: sync:: Once  = std:: sync:: Once :: new ( ) ; 
220+     static  mut  SIGCTX_GETTABLE_TABLE :  [ OSSL_PARAM ;  3 ]  = [ ossl_param ! ( ) ;  3 ] ; 
221+ 
222+     ONCE_INIT . call_once ( || { 
223+         SIGCTX_GETTABLE_TABLE  = [ 
224+             ossl_param ! ( OSSL_SIGNATURE_PARAM_PAD_MODE ,  OSSL_PARAM_UTF8_STRING ) , 
225+             ossl_param ! ( OSSL_SIGNATURE_PARAM_PSS_SALTLEN ,  OSSL_PARAM_UTF8_STRING ) , 
226+             ossl_param ! ( ) , 
227+         ] ; 
228+     } ) ; 
229+     SIGCTX_GETTABLE_TABLE . as_ptr ( )  as  _ 
230+ } 
231+ 
232+ /* 
233+ Sets the context parameters for RSA signature 
234+ */ 
235+ pub  unsafe  extern  "C"  fn  parsec_provider_signature_set_params ( 
236+     _keydata :  VOID_PTR , 
237+     params :  * const  OSSL_PARAM , 
238+ )  -> std:: os:: raw:: c_int  { 
239+     // Currently we only support PSS paddding mode with a Salt length of 32 bytes equivalent to the 
240+     // hash length. So we only check for these values here and not update the signature context 
241+     // object with it. 
242+ 
243+     // Check the padding mode 
244+     if  let  Ok ( param)  = openssl_returns_nonnull_const ( openssl_bindings:: OSSL_PARAM_locate_const ( 
245+         params, 
246+         OSSL_SIGNATURE_PARAM_PAD_MODE . as_ptr ( )  as  _ , 
247+     ) )  { 
248+         if  ( * param) . data_type  == OSSL_PARAM_UTF8_STRING  { 
249+             let  pad_mode:  & [ u8 ]  =
250+                 core:: slice:: from_raw_parts ( ( * param) . data  as  * mut  u8 ,  ( * param) . data_size ) ; 
251+             if  pad_mode != OSSL_PKEY_RSA_PAD_MODE_PSS  { 
252+                 return  OPENSSL_ERROR ; 
253+             } 
254+         } 
255+         if  ( * param) . data_type  == OSSL_PARAM_INTEGER  { 
256+             let  pad_mode:  & [ u8 ]  =
257+                 core:: slice:: from_raw_parts ( ( * param) . data  as  * mut  u8 ,  ( * param) . data_size ) ; 
258+             if  pad_mode[ 0 ]  != 6  { 
259+                 return  OPENSSL_ERROR ; 
260+             } 
261+         } 
262+     } 
263+ 
264+     // Check the salt length 
265+     if  let  Ok ( param)  = openssl_returns_nonnull_const ( openssl_bindings:: OSSL_PARAM_locate_const ( 
266+         params, 
267+         OSSL_SIGNATURE_PARAM_PSS_SALTLEN . as_ptr ( )  as  _ , 
268+     ) )  { 
269+         if  ( * param) . data_type  == OSSL_PARAM_UTF8_STRING  { 
270+             let  salt_len:  & [ u8 ]  =
271+                 core:: slice:: from_raw_parts ( ( * param) . data  as  * const  u8 ,  ( * param) . data_size ) ; 
272+             if  * salt_len != OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST [ ..6 ]  { 
273+                 return  OPENSSL_ERROR ; 
274+             } 
275+         } 
276+         if  ( * param) . data_type  == OSSL_PARAM_INTEGER  { 
277+             let  salt_len:  & mut  [ u8 ]  =
278+                 core:: slice:: from_raw_parts_mut ( ( * param) . data  as  * mut  u8 ,  ( * param) . data_size ) ; 
279+             if  salt_len[ 0 ]  != 32  { 
280+                 return  OPENSSL_ERROR ; 
281+             } 
282+         } 
283+     } 
284+ 
285+     OPENSSL_SUCCESS 
286+ } 
287+ 
215288pub  type  SignatureNewCtxPtr  =
216289    unsafe  extern  "C"  fn ( VOID_PTR ,  * const  std:: os:: raw:: c_char )  -> VOID_PTR ; 
217290pub  type  SignatureFreeCtxPtr  = unsafe  extern  "C"  fn ( VOID_PTR ) ; 
@@ -231,6 +304,16 @@ pub type SignatureDigestSignInitPtr = unsafe extern "C" fn(
231304    * const  OSSL_PARAM , 
232305)  -> std:: os:: raw:: c_int ; 
233306
307+ const  OSSL_FUNC_SIGNATURE_SETTABLE_PARAMS_PTR :  SignatureSettableParamsPtr  =
308+     parsec_provider_signature_settable_params; 
309+ 
310+ const  OSSL_FUNC_SIGNATURE_SET_PARAMS_PTR :  SignatureSetParamsPtr  =
311+     parsec_provider_signature_set_params; 
312+ pub  type  SignatureSettableParamsPtr  = unsafe  extern  "C"  fn ( VOID_PTR ,  VOID_PTR )  -> * const  OSSL_PARAM ; 
313+ 
314+ pub  type  SignatureSetParamsPtr  =
315+     unsafe  extern  "C"  fn ( VOID_PTR ,  * const  OSSL_PARAM )  -> std:: os:: raw:: c_int ; 
316+ 
234317const  OSSL_FUNC_SIGNATURE_NEWCTX_PTR :  SignatureNewCtxPtr  = parsec_provider_signature_newctx; 
235318const  OSSL_FUNC_SIGNATURE_FREECTX_PTR :  SignatureFreeCtxPtr  = parsec_provider_signature_freectx; 
236319const  OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR :  SignatureDigestSignPtr  =
@@ -239,7 +322,7 @@ const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
239322const  OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR :  SignatureDigestSignInitPtr  =
240323    parsec_provider_signature_digest_sign_init; 
241324
242- const  PARSEC_PROVIDER_SIGN_IMPL :  [ OSSL_DISPATCH ;  5 ]  = [ 
325+ const  PARSEC_PROVIDER_SIGN_IMPL :  [ OSSL_DISPATCH ;  7 ]  = [ 
243326    unsafe  {  ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_NEWCTX ,  OSSL_FUNC_SIGNATURE_NEWCTX_PTR )  } , 
244327    unsafe  {  ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_FREECTX ,  OSSL_FUNC_SIGNATURE_FREECTX_PTR )  } , 
245328    unsafe  { 
@@ -254,6 +337,18 @@ const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
254337            OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR 
255338        ) 
256339    } , 
340+     unsafe  { 
341+         ossl_dispatch ! ( 
342+             OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS , 
343+             OSSL_FUNC_SIGNATURE_SETTABLE_PARAMS_PTR 
344+         ) 
345+     } , 
346+     unsafe  { 
347+         ossl_dispatch ! ( 
348+             OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS , 
349+             OSSL_FUNC_SIGNATURE_SET_PARAMS_PTR 
350+         ) 
351+     } , 
257352    ossl_dispatch ! ( ) , 
258353] ; 
259354
0 commit comments