Skip to content

Commit 0c6bb62

Browse files
committed
sign: Add support for digest_sign_init()
Signed-off-by: Gowtham Suresh Kumar <gowtham.sureshkumar@arm.com>
1 parent 5ec69ab commit 0c6bb62

File tree

1 file changed

+54
-5
lines changed
  • parsec-openssl-provider/src/signature

1 file changed

+54
-5
lines changed

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

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
use crate::keymgmt::ParsecProviderKeyObject;
5-
use crate::openssl_bindings::{
6-
OSSL_ALGORITHM, OSSL_DISPATCH, OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_NEWCTX,
7-
OSSL_FUNC_SIGNATURE_SIGN, OSSL_FUNC_SIGNATURE_SIGN_INIT, OSSL_PARAM,
8-
};
5+
use crate::openssl_bindings::*;
96
use crate::{
107
PARSEC_PROVIDER_DESCRIPTION_ECDSA, PARSEC_PROVIDER_DESCRIPTION_RSA,
118
PARSEC_PROVIDER_DFLT_PROPERTIES, PARSEC_PROVIDER_ECDSA_NAME, PARSEC_PROVIDER_RSA_NAME,
@@ -15,7 +12,7 @@ use parsec_client::core::interface::operations::psa_algorithm::Hash;
1512
use parsec_client::core::interface::operations::psa_key_attributes::{Attributes, EccFamily, Type};
1613
use parsec_openssl2::types::VOID_PTR;
1714
use parsec_openssl2::*;
18-
15+
use std::ffi::CStr;
1916
use std::sync::{Arc, RwLock};
2017

2118
struct ParsecProviderSignatureContext {
@@ -179,6 +176,42 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign(
179176
}
180177
}
181178

179+
unsafe extern "C" fn parsec_provider_signature_digest_sign_init(
180+
ctx: VOID_PTR,
181+
mdname: *const std::os::raw::c_char,
182+
provkey: VOID_PTR,
183+
params: *const OSSL_PARAM,
184+
) -> std::os::raw::c_int {
185+
let result = super::r#catch(Some(|| super::Error::PROVIDER_SIGNATURE_SIGN_INIT), || {
186+
if ctx.is_null() || provkey.is_null() {
187+
return Err("Neither ctx nor provkey pointers should be NULL.".into());
188+
}
189+
190+
Arc::increment_strong_count(ctx as *const RwLock<ParsecProviderSignatureContext>);
191+
let sig_ctx = Arc::from_raw(ctx as *const RwLock<ParsecProviderSignatureContext>);
192+
let mut reader_sig_ctx = sig_ctx.write().unwrap();
193+
Arc::increment_strong_count(provkey as *const RwLock<ParsecProviderKeyObject>);
194+
let prov_key = Arc::from_raw(provkey as *const RwLock<ParsecProviderKeyObject>);
195+
196+
reader_sig_ctx.keyobj = Some(prov_key.clone());
197+
198+
// Currently we only support SHA256 hash function.
199+
// Return error if any other function is selected.
200+
if let Ok(hash_function) = CStr::from_ptr(mdname).to_str() {
201+
if hash_function != "SHA256" && hash_function != "SHA2-256" {
202+
return Err("Invalid hash function".into());
203+
}
204+
}
205+
206+
Ok(parsec_provider_signature_set_params(ctx, params))
207+
});
208+
209+
match result {
210+
Ok(result) => result,
211+
Err(()) => OPENSSL_ERROR,
212+
}
213+
}
214+
182215
pub type SignatureNewCtxPtr =
183216
unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR;
184217
pub type SignatureFreeCtxPtr = unsafe extern "C" fn(VOID_PTR);
@@ -191,11 +224,21 @@ pub type SignatureDigestSignPtr = unsafe extern "C" fn(
191224
std::os::raw::c_uint,
192225
) -> std::os::raw::c_int;
193226

227+
pub type SignatureDigestSignInitPtr = unsafe extern "C" fn(
228+
VOID_PTR,
229+
*const std::os::raw::c_char,
230+
VOID_PTR,
231+
*const OSSL_PARAM,
232+
) -> std::os::raw::c_int;
233+
194234
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx;
195235
const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx;
196236
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
197237
parsec_provider_signature_digest_sign;
198238

239+
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR: SignatureDigestSignInitPtr =
240+
parsec_provider_signature_digest_sign_init;
241+
199242
const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
200243
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_NEWCTX, OSSL_FUNC_SIGNATURE_NEWCTX_PTR) },
201244
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_FREECTX_PTR) },
@@ -205,6 +248,12 @@ const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
205248
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR
206249
)
207250
},
251+
unsafe {
252+
ossl_dispatch!(
253+
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
254+
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR
255+
)
256+
},
208257
ossl_dispatch!(),
209258
];
210259

0 commit comments

Comments
 (0)