@@ -59,6 +59,8 @@ impl ParsecProviderKeyObject {
59
59
}
60
60
}
61
61
62
+ // Ec supported curve name
63
+ const EC_CURVE_NAME : & str = "prime256v1\0 " ;
62
64
/*
63
65
should create a provider side key object. The provider context provctx is passed and may be incorporated
64
66
in the key object, but that is not mandatory.
@@ -132,7 +134,7 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_gettable_params(
132
134
/*
133
135
should extract information data associated with the given keydata
134
136
*/
135
- pub unsafe extern "C" fn parsec_provider_kmgmt_get_params (
137
+ pub unsafe extern "C" fn parsec_provider_kmgmt_rsa_get_params (
136
138
keydata : VOID_PTR ,
137
139
params : * mut OSSL_PARAM ,
138
140
) -> std:: os:: raw:: c_int {
@@ -162,6 +164,76 @@ pub unsafe extern "C" fn parsec_provider_kmgmt_get_params(
162
164
}
163
165
}
164
166
167
+ fn get_ec_secbits ( bits : usize ) -> usize {
168
+ /* common values from various NIST documents */
169
+ if bits < 224 {
170
+ return 0 ;
171
+ }
172
+ if bits < 256 {
173
+ return 112 ;
174
+ }
175
+ if bits < 384 {
176
+ return 128 ;
177
+ }
178
+ if bits < 512 {
179
+ return 192 ;
180
+ }
181
+ return 256 ;
182
+ }
183
+
184
+ pub unsafe extern "C" fn parsec_provider_ecdsa_kmgmt_get_params (
185
+ keydata : VOID_PTR ,
186
+ params : * mut OSSL_PARAM ,
187
+ ) -> std:: os:: raw:: c_int {
188
+ let result = super :: r#catch ( Some ( || super :: Error :: PROVIDER_KEYMGMT_GET_PARAMS ) , || {
189
+ if keydata. is_null ( ) || params. is_null ( ) {
190
+ Err ( "Null pointer received as parameter" . into ( ) )
191
+ } else {
192
+ Arc :: increment_strong_count ( keydata as * const RwLock < ParsecProviderKeyObject > ) ;
193
+ let key_data = Arc :: from_raw ( keydata as * const RwLock < ParsecProviderKeyObject > ) ;
194
+ let reader_key_data = key_data. read ( ) . unwrap ( ) ;
195
+
196
+ let key_name = match reader_key_data. key_name {
197
+ None => return Err ( "Key name is not set" . to_string ( ) . into ( ) ) ,
198
+ Some ( ref name) => name,
199
+ } ;
200
+
201
+ let key_attrs = reader_key_data
202
+ . provctx
203
+ . get_client ( )
204
+ . key_attributes ( key_name)
205
+ . map_err ( |e| format ! ( "Failed to retrived key attributes: {}" , e) ) ?;
206
+
207
+ if let Ok ( ptr) = openssl_returns_nonnull ( openssl_bindings:: OSSL_PARAM_locate (
208
+ params,
209
+ OSSL_PKEY_PARAM_GROUP_NAME . as_ptr ( ) as * const std:: os:: raw:: c_char ,
210
+ ) ) {
211
+ let mut s = EC_CURVE_NAME . to_string ( ) ;
212
+ ( * ptr) . data_type = OSSL_PARAM_UTF8_STRING ;
213
+ ( * ptr) . return_size = s. len ( ) ;
214
+ std:: ptr:: copy ( s. as_mut_ptr ( ) as _ , ( * ptr) . data , s. len ( ) ) ;
215
+ }
216
+ let _ = locate_and_set_int_param ( OSSL_PKEY_PARAM_BITS , key_attrs. bits , params) ;
217
+ let _ = locate_and_set_int_param (
218
+ OSSL_PKEY_PARAM_SECURITY_BITS ,
219
+ get_ec_secbits ( key_attrs. bits ) ,
220
+ params,
221
+ ) ;
222
+ let _ = locate_and_set_int_param (
223
+ OSSL_PKEY_PARAM_MAX_SIZE ,
224
+ ( 3 + ( key_attrs. bits + 4 ) * 2 ) . try_into ( ) . unwrap ( ) ,
225
+ params,
226
+ ) ;
227
+ Ok ( OPENSSL_SUCCESS )
228
+ }
229
+ } ) ;
230
+
231
+ match result {
232
+ Ok ( result) => result,
233
+ Err ( ( ) ) => OPENSSL_ERROR ,
234
+ }
235
+ }
236
+
165
237
// should update information data associated with the given keydata
166
238
pub unsafe extern "C" fn parsec_provider_kmgmt_set_params (
167
239
keydata : VOID_PTR ,
@@ -210,6 +282,7 @@ pub unsafe extern "C" fn parsec_provider_ecdsa_kmgmt_has(
210
282
let key_data = Arc :: from_raw ( keydata as * const RwLock < ParsecProviderKeyObject > ) ;
211
283
212
284
if selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY as std:: os:: raw:: c_int != 0 {
285
+ let reader_key_data = key_data. read ( ) . unwrap ( ) ;
213
286
if reader_key_data. get_ecdsa_key ( ) . is_none ( ) {
214
287
return Err ( "ECDSA key has not been set." . into ( ) ) ;
215
288
}
@@ -695,7 +768,9 @@ const OSSL_FUNC_KEYMGMT_IMPORT_TYPES_PTR: KeyMgmtImportTypesPtr =
695
768
const OSSL_FUNC_KEYMGMT_ECDSA_IMPORT_TYPES_PTR : KeyMgmtImportTypesPtr =
696
769
parsec_provider_ecdsa_kmgmt_import_types;
697
770
const OSSL_FUNC_KEYMGMT_SET_PARAMS_PTR : KeyMgmtSetParamsPtr = parsec_provider_kmgmt_set_params;
698
- const OSSL_FUNC_KEYMGMT_GET_PARAMS_PTR : KeyMgmtGetParamsPtr = parsec_provider_kmgmt_get_params;
771
+ const OSSL_FUNC_KEYMGMT_RSA_GET_PARAMS_PTR : KeyMgmtGetParamsPtr = parsec_provider_kmgmt_rsa_get_params;
772
+ const OSSL_FUNC_KEYMGMT_ECDSA_GET_PARAMS_PTR : KeyMgmtGetParamsPtr =
773
+ parsec_provider_ecdsa_kmgmt_get_params;
699
774
const OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS_PTR : KeyMgmtSettableParamsPtr =
700
775
parsec_provider_kmgmt_settable_params;
701
776
const OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS_PTR : KeyMgmtGettableParamsPtr =
@@ -737,7 +812,7 @@ const PARSEC_PROVIDER_KEYMGMT_IMPL: [OSSL_DISPATCH; 13] = [
737
812
unsafe {
738
813
ossl_dispatch ! (
739
814
OSSL_FUNC_KEYMGMT_GET_PARAMS ,
740
- OSSL_FUNC_KEYMGMT_GET_PARAMS_PTR
815
+ OSSL_FUNC_KEYMGMT_RSA_GET_PARAMS_PTR
741
816
)
742
817
} ,
743
818
unsafe {
@@ -782,7 +857,7 @@ const PARSEC_PROVIDER_KEYMGMT_ECDSA_IMPL: [OSSL_DISPATCH; 12] = [
782
857
unsafe {
783
858
ossl_dispatch ! (
784
859
OSSL_FUNC_KEYMGMT_GET_PARAMS ,
785
- OSSL_FUNC_KEYMGMT_GET_PARAMS_PTR
860
+ OSSL_FUNC_KEYMGMT_ECDSA_GET_PARAMS_PTR
786
861
)
787
862
} ,
788
863
unsafe {
0 commit comments