Skip to content

Commit 5930bf6

Browse files
committed
sign: Add support for set() and settable()
Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
1 parent e2aa4a1 commit 5930bf6

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
@@ -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+
215288
pub type SignatureNewCtxPtr =
216289
unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR;
217290
pub 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+
234317
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx;
235318
const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx;
236319
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
@@ -239,7 +322,7 @@ const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
239322
const 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

Comments
 (0)