11// Copyright 2024 Contributors to the Parsec project.
22// SPDX-License-Identifier: Apache-2.0
33
4+ use crate :: keymgmt:: ParsecProviderKeyObject ;
45use 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} ;
79use crate :: {
810 PARSEC_PROVIDER_DESCRIPTION_ECDSA , PARSEC_PROVIDER_DESCRIPTION_RSA ,
@@ -11,18 +13,21 @@ use crate::{
1113use parsec_openssl2:: types:: VOID_PTR ;
1214use parsec_openssl2:: * ;
1315
14- use std:: sync:: Arc ;
16+ use std:: sync:: { Arc , Mutex } ;
1517
1618struct 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
2326impl 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+
62100pub type SignatureNewCtxPtr =
63101 unsafe extern "C" fn ( VOID_PTR , * const std:: os:: raw:: c_char ) -> VOID_PTR ;
64102pub 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
66106const OSSL_FUNC_SIGNATURE_NEWCTX_PTR : SignatureNewCtxPtr = parsec_provider_signature_newctx;
67107const 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
69110const 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