Skip to content

Commit 9503740

Browse files
signature: Add Signature operation
Implement: * OSSL_FUNC_SIGNATURE_SIGN_INIT as indicated by https://www.openssl.org/docs/man3.0/man7/provider-signature.html Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
1 parent f7045d2 commit 9503740

File tree

2 files changed

+82
-3
lines changed

2 files changed

+82
-3
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
};
1515
use parsec_openssl2::types::VOID_PTR;
1616
use parsec_openssl2::*;
17-
use std::sync::{Arc, Mutex};
17+
use std::sync::{Arc, Mutex, MutexGuard};
1818

1919
pub struct ParsecProviderKeyObject {
2020
provctx: Arc<ParsecProviderContext>,
@@ -31,6 +31,16 @@ impl Clone for ParsecProviderKeyObject {
3131
}
3232
}
3333

34+
impl ParsecProviderKeyObject {
35+
pub fn get_provctx(&self) -> Arc<ParsecProviderContext> {
36+
self.provctx.clone()
37+
}
38+
39+
pub fn get_key_name(&self) -> MutexGuard<'_, Option<String>> {
40+
self.key_name.lock().unwrap()
41+
}
42+
}
43+
3444
pub fn kmgmt_keyobj_new(provctx: Arc<ParsecProviderContext>) -> Arc<ParsecProviderKeyObject> {
3545
Arc::new(ParsecProviderKeyObject {
3646
provctx: provctx.clone(),

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

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
use crate::keymgmt::ParsecProviderKeyObject;
55
use crate::openssl_bindings::{
66
OSSL_ALGORITHM, OSSL_DISPATCH, OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_NEWCTX,
7-
OSSL_FUNC_SIGNATURE_SIGN_INIT, OSSL_PARAM,
7+
OSSL_FUNC_SIGNATURE_SIGN, OSSL_FUNC_SIGNATURE_SIGN_INIT, OSSL_PARAM,
88
};
99
use crate::{
1010
PARSEC_PROVIDER_DESCRIPTION_ECDSA, PARSEC_PROVIDER_DESCRIPTION_RSA,
1111
PARSEC_PROVIDER_DFLT_PROPERTIES, PARSEC_PROVIDER_ECDSA_NAME, PARSEC_PROVIDER_RSA_NAME,
1212
};
13+
use parsec_client::core::interface::operations::psa_algorithm::{AsymmetricSignature, Hash};
1314
use parsec_openssl2::types::VOID_PTR;
1415
use parsec_openssl2::*;
1516

@@ -97,20 +98,88 @@ unsafe extern "C" fn parsec_provider_signature_sign_init(
9798
}
9899
}
99100

101+
unsafe extern "C" fn parsec_provider_signature_sign(
102+
ctx: VOID_PTR,
103+
sig: *mut std::os::raw::c_uchar,
104+
siglen: *mut std::os::raw::c_uint,
105+
sigsize: std::os::raw::c_uint,
106+
tbs: *const std::os::raw::c_uchar,
107+
tbslen: std::os::raw::c_uint,
108+
) -> std::os::raw::c_int {
109+
let result = super::r#catch(Some(|| super::Error::PROVIDER_SIGNATURE_SIGN_INIT), || {
110+
if ctx.is_null() || tbs.is_null() || sig.is_null() || siglen.is_null() {
111+
return Err("Received unexpected NULL pointer as an argument.".into());
112+
}
113+
114+
Arc::increment_strong_count(ctx as *const ParsecProviderSignatureContext);
115+
let arc_sig_ctx = Arc::from_raw(ctx as *const ParsecProviderSignatureContext);
116+
117+
let keyobj = match *arc_sig_ctx.keyobj.lock().unwrap() {
118+
None => {
119+
return Err("Key Object not set. This should be done through sign_init()".into())
120+
}
121+
Some(ref keyobj) => keyobj.clone(),
122+
};
123+
124+
let key_name_binding = keyobj.get_key_name();
125+
let key_name = match *key_name_binding {
126+
None => return Err("Key name not set in the Key Object".into()),
127+
Some(ref name) => name,
128+
};
129+
130+
let tbs_slice: &[u8] = core::slice::from_raw_parts(tbs, tbslen as usize);
131+
132+
let sign_algorithm = AsymmetricSignature::RsaPkcs1v15Sign {
133+
hash_alg: Hash::Sha256.into(),
134+
};
135+
136+
let sign_res: Vec<u8> = keyobj
137+
.get_provctx()
138+
.get_client()
139+
.psa_sign_hash(key_name, tbs_slice, sign_algorithm)
140+
.map_err(|_| "Parsec Client failed to sign".to_string())?;
141+
142+
if sigsize > sign_res.len() as u32 {
143+
std::ptr::copy(sign_res.as_ptr(), sig, sign_res.len());
144+
} else {
145+
std::ptr::copy(sign_res.as_ptr(), sig, sigsize as usize);
146+
}
147+
148+
*siglen = sign_res.len() as u32;
149+
150+
Ok(OPENSSL_SUCCESS)
151+
});
152+
153+
match result {
154+
Ok(result) => result,
155+
Err(()) => OPENSSL_ERROR,
156+
}
157+
}
158+
100159
pub type SignatureNewCtxPtr =
101160
unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR;
102161
pub type SignatureFreeCtxPtr = unsafe extern "C" fn(VOID_PTR);
162+
pub type SignatureSignPtr = unsafe extern "C" fn(
163+
VOID_PTR,
164+
*mut std::os::raw::c_uchar,
165+
*mut std::os::raw::c_uint,
166+
std::os::raw::c_uint,
167+
*const std::os::raw::c_uchar,
168+
std::os::raw::c_uint,
169+
) -> std::os::raw::c_int;
103170
pub type SignatureSignInitPtr =
104171
unsafe extern "C" fn(VOID_PTR, VOID_PTR, *const OSSL_PARAM) -> std::os::raw::c_int;
105172

106173
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx;
107174
const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx;
175+
const OSSL_FUNC_SIGNATURE_SIGN_PTR: SignatureSignPtr = parsec_provider_signature_sign;
108176
const OSSL_FUNC_SIGNATURE_SIGN_INIT_PTR: SignatureSignInitPtr = parsec_provider_signature_sign_init;
109177

110178
const PARSEC_PROVIDER_ECDSA_SIGN_IMPL: [OSSL_DISPATCH; 1] = [ossl_dispatch!()];
111-
const PARSEC_PROVIDER_RSA_SIGN_IMPL: [OSSL_DISPATCH; 4] = [
179+
const PARSEC_PROVIDER_RSA_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
112180
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_NEWCTX, OSSL_FUNC_SIGNATURE_NEWCTX_PTR) },
113181
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_FREECTX_PTR) },
182+
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_SIGN, OSSL_FUNC_SIGNATURE_SIGN_PTR) },
114183
unsafe {
115184
ossl_dispatch!(
116185
OSSL_FUNC_SIGNATURE_SIGN_INIT,

0 commit comments

Comments
 (0)