22// SPDX-License-Identifier: Apache-2.0
33
44use 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:: * ;
96use 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;
1512use parsec_client:: core:: interface:: operations:: psa_key_attributes:: { Attributes , EccFamily , Type } ;
1613use parsec_openssl2:: types:: VOID_PTR ;
1714use parsec_openssl2:: * ;
18-
15+ use std :: ffi :: CStr ;
1916use std:: sync:: { Arc , RwLock } ;
2017
2118struct 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+
182215pub type SignatureNewCtxPtr =
183216 unsafe extern "C" fn ( VOID_PTR , * const std:: os:: raw:: c_char ) -> VOID_PTR ;
184217pub 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+
194234const OSSL_FUNC_SIGNATURE_NEWCTX_PTR : SignatureNewCtxPtr = parsec_provider_signature_newctx;
195235const OSSL_FUNC_SIGNATURE_FREECTX_PTR : SignatureFreeCtxPtr = parsec_provider_signature_freectx;
196236const 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+
199242const 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