2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
4
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:: * ;
9
6
use crate :: {
10
7
PARSEC_PROVIDER_DESCRIPTION_ECDSA , PARSEC_PROVIDER_DESCRIPTION_RSA ,
11
8
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;
15
12
use parsec_client:: core:: interface:: operations:: psa_key_attributes:: { Attributes , EccFamily , Type } ;
16
13
use parsec_openssl2:: types:: VOID_PTR ;
17
14
use parsec_openssl2:: * ;
18
-
15
+ use std :: ffi :: CStr ;
19
16
use std:: sync:: { Arc , RwLock } ;
20
17
21
18
struct ParsecProviderSignatureContext {
@@ -179,6 +176,45 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign(
179
176
}
180
177
}
181
178
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
+
182
218
pub type SignatureNewCtxPtr =
183
219
unsafe extern "C" fn ( VOID_PTR , * const std:: os:: raw:: c_char ) -> VOID_PTR ;
184
220
pub type SignatureFreeCtxPtr = unsafe extern "C" fn ( VOID_PTR ) ;
@@ -191,11 +227,21 @@ pub type SignatureDigestSignPtr = unsafe extern "C" fn(
191
227
std:: os:: raw:: c_uint ,
192
228
) -> std:: os:: raw:: c_int ;
193
229
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
+
194
237
const OSSL_FUNC_SIGNATURE_NEWCTX_PTR : SignatureNewCtxPtr = parsec_provider_signature_newctx;
195
238
const OSSL_FUNC_SIGNATURE_FREECTX_PTR : SignatureFreeCtxPtr = parsec_provider_signature_freectx;
196
239
const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR : SignatureDigestSignPtr =
197
240
parsec_provider_signature_digest_sign;
198
241
242
+ const OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR : SignatureDigestSignInitPtr =
243
+ parsec_provider_signature_digest_sign_init;
244
+
199
245
const PARSEC_PROVIDER_SIGN_IMPL : [ OSSL_DISPATCH ; 5 ] = [
200
246
unsafe { ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_NEWCTX , OSSL_FUNC_SIGNATURE_NEWCTX_PTR ) } ,
201
247
unsafe { ossl_dispatch ! ( OSSL_FUNC_SIGNATURE_FREECTX , OSSL_FUNC_SIGNATURE_FREECTX_PTR ) } ,
@@ -205,6 +251,12 @@ const PARSEC_PROVIDER_SIGN_IMPL: [OSSL_DISPATCH; 5] = [
205
251
OSSL_FUNC_SIGNATURE_DIGEST_SIGN_PTR
206
252
)
207
253
} ,
254
+ unsafe {
255
+ ossl_dispatch ! (
256
+ OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT ,
257
+ OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT_PTR
258
+ )
259
+ } ,
208
260
ossl_dispatch ! ( ) ,
209
261
] ;
210
262
0 commit comments