Skip to content

Commit dd86163

Browse files
signature: Add Signature Initialization
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 8118788 commit dd86163

File tree

3 files changed

+53
-5
lines changed

3 files changed

+53
-5
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use parsec_openssl2::types::VOID_PTR;
1616
use parsec_openssl2::*;
1717
use std::sync::{Arc, Mutex};
1818

19-
struct ParsecProviderKeyObject {
19+
pub struct ParsecProviderKeyObject {
2020
provctx: Arc<ParsecProviderContext>,
2121
key_name: Mutex<Option<String>>,
2222
}
@@ -31,7 +31,7 @@ impl Clone for ParsecProviderKeyObject {
3131
}
3232
}
3333

34-
fn kmgmt_keyobj_new(provctx: Arc<ParsecProviderContext>) -> Arc<ParsecProviderKeyObject> {
34+
pub fn kmgmt_keyobj_new(provctx: Arc<ParsecProviderContext>) -> Arc<ParsecProviderKeyObject> {
3535
Arc::new(ParsecProviderKeyObject {
3636
provctx: provctx.clone(),
3737
key_name: None.into(),

parsec-openssl-provider/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ openssl_errors::openssl_errors! {
117117
PROVIDER_KEYMGMT_SET_PARAMS("parsec_provider_kmgmt_set_params");
118118
PROVIDER_KEYMGMT_VALIDATE("parsec_provider_kmgmt_validate");
119119
PROVIDER_QUERY("parsec_provider_query");
120+
PROVIDER_SIGNATURE_SIGN_INIT("parsec_provider_signature_sign_init");
120121
PROVIDER_TEARDOWN("parsec_provider_teardown");
121122
}
122123

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

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
// Copyright 2024 Contributors to the Parsec project.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
use crate::keymgmt::ParsecProviderKeyObject;
45
use crate::openssl_bindings::{
56
OSSL_ALGORITHM, OSSL_DISPATCH, OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_NEWCTX,
7+
OSSL_FUNC_SIGNATURE_SIGN_INIT, OSSL_PARAM,
68
};
79
use crate::{
810
PARSEC_PROVIDER_DESCRIPTION_ECDSA, PARSEC_PROVIDER_DESCRIPTION_RSA,
@@ -11,18 +13,21 @@ use crate::{
1113
use parsec_openssl2::types::VOID_PTR;
1214
use parsec_openssl2::*;
1315

14-
use std::sync::Arc;
16+
use std::sync::{Arc, Mutex};
1517

1618
struct ParsecProviderSignatureContext {
1719
/* The key object is set in the signature context by calling OSSL_FUNC_signature_sign_init().
1820
Before calling OSSL_FUNC_signature_sign_init(), the key object itself should have been set up
1921
and initialized via keymgmt function calls.
2022
*/
23+
keyobj: Mutex<Option<Arc<ParsecProviderKeyObject>>>,
2124
}
2225

2326
impl ParsecProviderSignatureContext {
2427
pub fn new() -> Self {
25-
ParsecProviderSignatureContext {}
28+
ParsecProviderSignatureContext {
29+
keyobj: Mutex::new(None),
30+
}
2631
}
2732
}
2833

@@ -59,17 +64,59 @@ pub unsafe extern "C" fn parsec_provider_signature_freectx(ctx: VOID_PTR) {
5964
// When arc_ctx is dropped, the reference count is decremented and the memory is freed
6065
}
6166

67+
/*
68+
Initialises a context for signing given a provider side signature context in the ctx parameter, and a pointer to a
69+
provider key object in the provkey parameter. The params, if not NULL, should be set on the context in a manner similar
70+
to using OSSL_FUNC_signature_set_ctx_params(). The key object should have been previously generated, loaded or imported
71+
into the provider using the key management (OSSL_OP_KEYMGMT) operation.
72+
*/
73+
unsafe extern "C" fn parsec_provider_signature_sign_init(
74+
ctx: VOID_PTR,
75+
provkey: VOID_PTR,
76+
_params: *const OSSL_PARAM,
77+
) -> std::os::raw::c_int {
78+
let result = super::r#catch(Some(|| super::Error::PROVIDER_SIGNATURE_SIGN_INIT), || {
79+
if ctx.is_null() || provkey.is_null() {
80+
return Err("Neither ctx nor provkey pointers should be NULL.".into());
81+
}
82+
let sig_ctx_ptr = ctx as *const ParsecProviderSignatureContext;
83+
Arc::increment_strong_count(sig_ctx_ptr);
84+
let arc_sig_ctx = Arc::from_raw(sig_ctx_ptr);
85+
86+
let provkey_ptr = provkey as *const ParsecProviderKeyObject;
87+
Arc::increment_strong_count(provkey_ptr);
88+
let arc_provkey = Arc::from_raw(provkey_ptr);
89+
90+
*(arc_sig_ctx.keyobj.lock().unwrap()) = Some(arc_provkey.clone());
91+
Ok(OPENSSL_SUCCESS)
92+
});
93+
94+
match result {
95+
Ok(result) => result,
96+
Err(()) => OPENSSL_ERROR,
97+
}
98+
}
99+
62100
pub type SignatureNewCtxPtr =
63101
unsafe extern "C" fn(VOID_PTR, *const std::os::raw::c_char) -> VOID_PTR;
64102
pub type SignatureFreeCtxPtr = unsafe extern "C" fn(VOID_PTR);
103+
pub type SignatureSignInitPtr =
104+
unsafe extern "C" fn(VOID_PTR, VOID_PTR, *const OSSL_PARAM) -> std::os::raw::c_int;
65105

66106
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR: SignatureNewCtxPtr = parsec_provider_signature_newctx;
67107
const OSSL_FUNC_SIGNATURE_FREECTX_PTR: SignatureFreeCtxPtr = parsec_provider_signature_freectx;
108+
const OSSL_FUNC_SIGNATURE_SIGN_INIT_PTR: SignatureSignInitPtr = parsec_provider_signature_sign_init;
68109

69110
const PARSEC_PROVIDER_ECDSA_SIGN_IMPL: [OSSL_DISPATCH; 1] = [ossl_dispatch!()];
70-
const PARSEC_PROVIDER_RSA_SIGN_IMPL: [OSSL_DISPATCH; 3] = [
111+
const PARSEC_PROVIDER_RSA_SIGN_IMPL: [OSSL_DISPATCH; 4] = [
71112
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_NEWCTX, OSSL_FUNC_SIGNATURE_NEWCTX_PTR) },
72113
unsafe { ossl_dispatch!(OSSL_FUNC_SIGNATURE_FREECTX, OSSL_FUNC_SIGNATURE_FREECTX_PTR) },
114+
unsafe {
115+
ossl_dispatch!(
116+
OSSL_FUNC_SIGNATURE_SIGN_INIT,
117+
OSSL_FUNC_SIGNATURE_SIGN_INIT_PTR
118+
)
119+
},
73120
ossl_dispatch!(),
74121
];
75122

0 commit comments

Comments
 (0)