@@ -215,6 +215,79 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign_init(
215215    } 
216216} 
217217
218+ unsafe  extern  "C"  fn  parsec_provider_signature_settable_params ( 
219+     _ctx :  VOID_PTR , 
220+     _provkey :  VOID_PTR , 
221+ )  -> * const  OSSL_PARAM  { 
222+     static  ONCE_INIT :  std:: sync:: Once  = std:: sync:: Once :: new ( ) ; 
223+     static  mut  SIGCTX_GETTABLE_TABLE :  [ OSSL_PARAM ;  3 ]  = [ ossl_param ! ( ) ;  3 ] ; 
224+ 
225+     ONCE_INIT . call_once ( || { 
226+         SIGCTX_GETTABLE_TABLE  = [ 
227+             ossl_param ! ( OSSL_SIGNATURE_PARAM_PAD_MODE ,  OSSL_PARAM_UTF8_STRING ) , 
228+             ossl_param ! ( OSSL_SIGNATURE_PARAM_PSS_SALTLEN ,  OSSL_PARAM_UTF8_STRING ) , 
229+             ossl_param ! ( ) , 
230+         ] ; 
231+     } ) ; 
232+     SIGCTX_GETTABLE_TABLE . as_ptr ( )  as  _ 
233+ } 
234+ 
235+ /* 
236+ Sets the context parameters for RSA signature 
237+ */ 
238+ pub  unsafe  extern  "C"  fn  parsec_provider_signature_set_params ( 
239+     _keydata :  VOID_PTR , 
240+     params :  * const  OSSL_PARAM , 
241+ )  -> std:: os:: raw:: c_int  { 
242+     // Currently we only support PSS paddding mode with a Salt length of 32 bytes equivalent to the 
243+     // hash length. So we only check for these values here and not update the signature context 
244+     // object with it. 
245+ 
246+     // Check the padding mode 
247+     if  let  Ok ( param)  = openssl_returns_nonnull_const ( openssl_bindings:: OSSL_PARAM_locate_const ( 
248+         params, 
249+         OSSL_SIGNATURE_PARAM_PAD_MODE . as_ptr ( )  as  _ , 
250+     ) )  { 
251+         if  ( * param) . data_type  == OSSL_PARAM_UTF8_STRING  { 
252+             let  pad_mode:  & [ u8 ]  =
253+                 core:: slice:: from_raw_parts ( ( * param) . data  as  * mut  u8 ,  ( * param) . data_size ) ; 
254+             if  pad_mode != OSSL_PKEY_RSA_PAD_MODE_PSS  { 
255+                 return  OPENSSL_ERROR ; 
256+             } 
257+         } 
258+         if  ( * param) . data_type  == OSSL_PARAM_INTEGER  { 
259+             let  pad_mode:  & [ u8 ]  =
260+                 core:: slice:: from_raw_parts ( ( * param) . data  as  * mut  u8 ,  ( * param) . data_size ) ; 
261+             if  pad_mode[ 0 ]  != 6  { 
262+                 return  OPENSSL_ERROR ; 
263+             } 
264+         } 
265+     } 
266+ 
267+     // Check the salt length 
268+     if  let  Ok ( param)  = openssl_returns_nonnull_const ( openssl_bindings:: OSSL_PARAM_locate_const ( 
269+         params, 
270+         OSSL_SIGNATURE_PARAM_PSS_SALTLEN . as_ptr ( )  as  _ , 
271+     ) )  { 
272+         if  ( * param) . data_type  == OSSL_PARAM_UTF8_STRING  { 
273+             let  salt_len:  & [ u8 ]  =
274+                 core:: slice:: from_raw_parts ( ( * param) . data  as  * const  u8 ,  ( * param) . data_size ) ; 
275+             if  * salt_len != OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST [ ..6 ]  { 
276+                 return  OPENSSL_ERROR ; 
277+             } 
278+         } 
279+         if  ( * param) . data_type  == OSSL_PARAM_INTEGER  { 
280+             let  salt_len:  & mut  [ u8 ]  =
281+                 core:: slice:: from_raw_parts_mut ( ( * param) . data  as  * mut  u8 ,  ( * param) . data_size ) ; 
282+             if  salt_len[ 0 ]  != 32  { 
283+                 return  OPENSSL_ERROR ; 
284+             } 
285+         } 
286+     } 
287+ 
288+     OPENSSL_SUCCESS 
289+ } 
290+ 
218291pub  type  SignatureNewCtxPtr  =
219292    unsafe  extern  "C"  fn ( VOID_PTR ,  * const  std:: os:: raw:: c_char )  -> VOID_PTR ; 
220293pub  type  SignatureFreeCtxPtr  = unsafe  extern  "C"  fn ( VOID_PTR ) ; 
@@ -234,6 +307,16 @@ pub type SignatureDigestSignInitPtr = unsafe extern "C" fn(
234307    * const  OSSL_PARAM , 
235308)  -> std:: os:: raw:: c_int ; 
236309
310+ const  OSSL_FUNC_SIGNATURE_SETTABLE_PARAMS_PTR :  SignatureSettableParamsPtr  =
311+     parsec_provider_signature_settable_params; 
312+ 
313+ const  OSSL_FUNC_SIGNATURE_SET_PARAMS_PTR :  SignatureSetParamsPtr  =
314+     parsec_provider_signature_set_params; 
315+ pub  type  SignatureSettableParamsPtr  = unsafe  extern  "C"  fn ( VOID_PTR ,  VOID_PTR )  -> * const  OSSL_PARAM ; 
316+ 
317+ pub  type  SignatureSetParamsPtr  =
318+     unsafe  extern  "C"  fn ( VOID_PTR ,  * const  OSSL_PARAM )  -> std:: os:: raw:: c_int ; 
319+ 
237320const  OSSL_FUNC_SIGNATURE_NEWCTX_PTR :  SignatureNewCtxPtr  = parsec_provider_signature_newctx; 
238321const  OSSL_FUNC_SIGNATURE_FREECTX_PTR :  SignatureFreeCtxPtr  = parsec_provider_signature_freectx; 
239322const  OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR :  SignatureDigestSignPtr  =
@@ -242,7 +325,7 @@ const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
242325const  OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR :  SignatureDigestSignInitPtr  =
243326    parsec_provider_signature_digest_sign_init; 
244327
245- const  PARSEC_PROVIDER_SIGN_IMPL :  [ OSSL_DISPATCH ;  5 ]  = [ 
328+ const  PARSEC_PROVIDER_SIGN_IMPL :  [ OSSL_DISPATCH ;  7 ]  = [ 
246329    unsafe  {  ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_NEWCTX ,  OSSL_FUNC_SIGNATURE_NEWCTX_PTR )  } , 
247330    unsafe  {  ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_FREECTX ,  OSSL_FUNC_SIGNATURE_FREECTX_PTR )  } , 
248331    unsafe  { 
@@ -257,6 +340,18 @@ const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
257340            OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR 
258341        ) 
259342    } , 
343+     unsafe  { 
344+         ossl_dispatch ! ( 
345+             OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS , 
346+             OSSL_FUNC_SIGNATURE_SETTABLE_PARAMS_PTR 
347+         ) 
348+     } , 
349+     unsafe  { 
350+         ossl_dispatch ! ( 
351+             OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS , 
352+             OSSL_FUNC_SIGNATURE_SET_PARAMS_PTR 
353+         ) 
354+     } , 
260355    ossl_dispatch ! ( ) , 
261356] ; 
262357
0 commit comments