Skip to content

Commit 38ce543

Browse files
committed
sign: Add support for set() and settable()
Signed-off-by: Gowtham Suresh Kumar <[email protected]>
1 parent 71d00eb commit 38ce543

File tree

1 file changed

+96
-1
lines changed
  • parsec-openssl-provider/src/signature

1 file changed

+96
-1
lines changed

parsec-openssl-provider/src/signature/mod.rs

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
218291
pub type SignatureNewCtxPtr =
219292
unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR;
220293
pub 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+
237320
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx;
238321
const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx;
239322
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
@@ -242,7 +325,7 @@ const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
242325
const 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

Comments
 (0)