@@ -182,32 +182,49 @@ unsafe extern "C" fn parsec_provider_signature_digest_sign_init(
182
182
provkey : VOID_PTR ,
183
183
params : * const OSSL_PARAM ,
184
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 > ) ;
185
+ let result = super :: r#catch ( Some ( || super :: Error :: PROVIDER_SIGNATURE_DIGEST_SIGN_INIT ) , || {
186
+ if ctx. is_null ( ) || provkey. is_null ( ) {
187
+ return Err ( "Neither ctx nor provkey pointers should be NULL." . into ( ) ) ;
188
+ }
197
189
198
- reader_sig_ctx. keyobj = Some ( prov_key. clone ( ) ) ;
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 writer_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 > ) ;
199
195
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
- }
196
+ writer_sig_ctx. keyobj = Some ( prov_key. clone ( ) ) ;
197
+ let key_data = match writer_sig_ctx. keyobj {
198
+ None => {
199
+ return Err ( "Key Object not set." . into ( ) )
206
200
}
201
+ Some ( ref keyobj) => keyobj. read ( ) . unwrap ( ) ,
202
+ } ;
207
203
208
- Ok ( parsec_provider_signature_set_params ( ctx, params) )
209
- } ,
210
- ) ;
204
+ let key_name = match key_data. get_key_name ( ) {
205
+ None => return Err ( "Key name not set in the Key Object" . into ( ) ) ,
206
+ Some ( ref name) => name,
207
+ } ;
208
+ // Currently we only support SHA256 hash function.
209
+ // Return error if any other function is selected.
210
+ if let Ok ( hash_function) = CStr :: from_ptr ( mdname) . to_str ( ) {
211
+ if hash_function != "SHA256" && hash_function != "SHA2-256" {
212
+ return Err ( "Invalid hash function" . into ( ) ) ;
213
+ }
214
+ }
215
+ let key_attributes = key_data
216
+ . get_provctx ( )
217
+ . get_client ( )
218
+ . key_attributes ( key_name)
219
+ . map_err ( |e| format ! ( "Failed to get specified key's attributes: {}" , e) ) ?;
220
+ match key_attributes. key_type {
221
+ Type :: RsaKeyPair => Ok ( parsec_provider_signature_set_params ( ctx, params) ) ,
222
+ Type :: EccKeyPair {
223
+ curve_family : EccFamily :: SecpR1 ,
224
+ } => Ok ( parsec_provider_signature_ecdsa_set_params ( ctx, params) ) ,
225
+ _ => Err ( "Key type not recognized" . to_string ( ) . into ( ) ) ,
226
+ }
227
+ } ) ;
211
228
212
229
match result {
213
230
Ok ( result) => result,
0 commit comments