Skip to content

Commit 71d00eb

Browse files
committed
sign: Add support for digest_sign_init()
Signed-off-by: Gowtham Suresh Kumar <[email protected]>
1 parent 9f1d0aa commit 71d00eb

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

parsec-openssl-provider/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ openssl_errors::openssl_errors! {
119119
PROVIDER_KEYMGMT_VALIDATE("parsec_provider_kmgmt_validate");
120120
PROVIDER_QUERY("parsec_provider_query");
121121
PROVIDER_SIGNATURE_SIGN("parsec_provider_signature_sign");
122-
PROVIDER_SIGNATURE_SIGN_INIT("parsec_provider_signature_sign_init");
122+
PROVIDER_SIGNATURE_DIGEST_SIGN_INIT("parsec_provider_signature_digest_sign_init");
123123
PROVIDER_TEARDOWN("parsec_provider_teardown");
124124
}
125125

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

Lines changed: 57 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,45 @@ 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(
186+
Some(|| super::Error::PROVIDER_SIGNATURE_DIGEST_SIGN_INIT),
187+
|| {
188+
if ctx.is_null() || provkey.is_null() {
189+
return Err("Neither ctx nor provkey pointers should be NULL.".into());
190+
}
191+
192+
Arc::increment_strong_count(ctx as *const RwLock<ParsecProviderSignatureContext>);
193+
let sig_ctx = Arc::from_raw(ctx as *const RwLock<ParsecProviderSignatureContext>);
194+
let mut reader_sig_ctx = sig_ctx.write().unwrap();
195+
Arc::increment_strong_count(provkey as *const RwLock<ParsecProviderKeyObject>);
196+
let prov_key = Arc::from_raw(provkey as *const RwLock<ParsecProviderKeyObject>);
197+
198+
reader_sig_ctx.keyobj = Some(prov_key.clone());
199+
200+
// Currently we only support SHA256 hash function.
201+
// Return error if any other function is selected.
202+
if let Ok(hash_function) = CStr::from_ptr(mdname).to_str() {
203+
if hash_function != "SHA256" && hash_function != "SHA2-256" {
204+
return Err("Invalid hash function".into());
205+
}
206+
}
207+
208+
Ok(parsec_provider_signature_set_params(ctx, params))
209+
},
210+
);
211+
212+
match result {
213+
Ok(result) => result,
214+
Err(()) => OPENSSL_ERROR,
215+
}
216+
}
217+
182218
pub type SignatureNewCtxPtr =
183219
unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR;
184220
pub type SignatureFreeCtxPtr = unsafe extern "C" fn(VOID_PTR);
@@ -191,11 +227,21 @@ pub type SignatureDigestSignPtr = unsafe extern "C" fn(
191227
std::os::raw::c_uint,
192228
) -> std::os::raw::c_int;
193229

230+
pub type SignatureDigestSignInitPtr = unsafe extern "C" fn(
231+
VOID_PTR,
232+
*const std::os::raw::c_char,
233+
VOID_PTR,
234+
*const OSSL_PARAM,
235+
) -> std::os::raw::c_int;
236+
194237
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx;
195238
const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx;
196239
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR: SignatureDigestSignPtr =
197240
parsec_provider_signature_digest_sign;
198241

242+
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR: SignatureDigestSignInitPtr =
243+
parsec_provider_signature_digest_sign_init;
244+
199245
const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
200246
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_NEWCTX, OSSL_FUNC_SIGNATURE_NEWCTX_PTR) },
201247
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_FREECTX_PTR) },
@@ -205,6 +251,12 @@ const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
205251
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR
206252
)
207253
},
254+
unsafe {
255+
ossl_dispatch!(
256+
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
257+
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR
258+
)
259+
},
208260
ossl_dispatch!(),
209261
];
210262

0 commit comments

Comments
 (0)