@@ -215,6 +215,79 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign_init(
215
215
}
216
216
}
217
217
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
+
218
291
pub type SignatureNewCtxPtr =
219
292
unsafe extern "C" fn ( VOID_PTR , * const std:: os:: raw:: c_char ) -> VOID_PTR ;
220
293
pub type SignatureFreeCtxPtr = unsafe extern "C" fn ( VOID_PTR ) ;
@@ -234,6 +307,16 @@ pub type SignatureDigestSignInitPtr = unsafe extern "C" fn(
234
307
* const OSSL_PARAM ,
235
308
) -> std:: os:: raw:: c_int ;
236
309
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
+
237
320
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR : SignatureNewCtxPtr = parsec_provider_signature_newctx;
238
321
const OSSL_FUNC_SIGNATURE_FREECTX_PTR : SignatureFreeCtxPtr = parsec_provider_signature_freectx;
239
322
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR : SignatureDigestSignPtr =
@@ -242,7 +325,7 @@ const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
242
325
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR : SignatureDigestSignInitPtr =
243
326
parsec_provider_signature_digest_sign_init;
244
327
245
- const PARSEC_PROVIDER_SIGN_IMPL : [ OSSL_DISPATCH ; 5 ] = [
328
+ const PARSEC_PROVIDER_SIGN_IMPL : [ OSSL_DISPATCH ; 7 ] = [
246
329
unsafe { ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_NEWCTX , OSSL_FUNC_SIGNATURE_NEWCTX_PTR ) } ,
247
330
unsafe { ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_FREECTX , OSSL_FUNC_SIGNATURE_FREECTX_PTR ) } ,
248
331
unsafe {
@@ -257,6 +340,18 @@ const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
257
340
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR
258
341
)
259
342
} ,
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
+ } ,
260
355
ossl_dispatch ! ( ) ,
261
356
] ;
262
357
0 commit comments