3
3
// Modifications copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
4
// SPDX-License-Identifier: Apache-2.0 OR ISC
5
5
6
+ use crate :: aws_lc:: { EVP_DigestSign , EVP_DigestSignInit , EVP_PKEY , EVP_PKEY_EC } ;
6
7
use core:: fmt;
7
8
use core:: fmt:: { Debug , Formatter } ;
8
9
use core:: mem:: MaybeUninit ;
9
10
use core:: ptr:: { null, null_mut} ;
10
11
11
- use crate :: aws_lc:: { EVP_DigestSign , EVP_DigestSignInit , EVP_PKEY_cmp , EVP_PKEY , EVP_PKEY_EC } ;
12
-
13
12
use crate :: digest:: digest_ctx:: DigestContext ;
14
13
use crate :: ec:: evp_key_generate;
15
14
use crate :: ec:: signature:: { EcdsaSignatureFormat , EcdsaSigningAlgorithm , PublicKey } ;
@@ -162,8 +161,8 @@ impl EcdsaKeyPair {
162
161
) -> Result < Self , KeyRejected > {
163
162
let priv_evp_pkey = parse_sec1_private_bn ( private_key, alg. id . nid ( ) ) ?;
164
163
let pub_evp_pkey = parse_sec1_public_point ( public_key, alg. id . nid ( ) ) ?;
165
- // EVP_PKEY_cmp only compare params and public key
166
- if 1 != unsafe { EVP_PKEY_cmp ( * priv_evp_pkey. as_const ( ) , * pub_evp_pkey. as_const ( ) ) } {
164
+ // EVP_PKEY_cmp only compares params and public key
165
+ if ! priv_evp_pkey. eq ( & pub_evp_pkey) {
167
166
return Err ( KeyRejected :: inconsistent_components ( ) ) ;
168
167
}
169
168
@@ -187,7 +186,8 @@ impl EcdsaKeyPair {
187
186
alg : & ' static EcdsaSigningAlgorithm ,
188
187
private_key : & [ u8 ] ,
189
188
) -> Result < Self , KeyRejected > {
190
- let evp_pkey = parse_rfc5915_private_key ( private_key, alg. id . nid ( ) ) ?;
189
+ let evp_pkey = LcPtr :: < EVP_PKEY > :: parse_rfc5208_private_key ( private_key, EVP_PKEY_EC )
190
+ . or ( parse_rfc5915_private_key ( private_key, alg. id . nid ( ) ) ) ?;
191
191
192
192
Ok ( Self :: new ( alg, evp_pkey) ?)
193
193
}
@@ -320,3 +320,32 @@ impl AsDer<EcPrivateKeyRfc5915Der<'static>> for PrivateKey<'_> {
320
320
Ok ( EcPrivateKeyRfc5915Der :: new ( bytes) )
321
321
}
322
322
}
323
+
324
+ #[ cfg( test) ]
325
+ mod tests {
326
+ use crate :: encoding:: AsDer ;
327
+ use crate :: signature:: { EcdsaKeyPair , ECDSA_P256_SHA256_FIXED_SIGNING } ;
328
+
329
+ #[ test]
330
+ fn test_from_private_key_der ( ) {
331
+ let key_pair = EcdsaKeyPair :: generate ( & ECDSA_P256_SHA256_FIXED_SIGNING ) . unwrap ( ) ;
332
+
333
+ let bytes_5208 = key_pair. to_pkcs8v1 ( ) . unwrap ( ) ;
334
+ let bytes_5915 = key_pair. private_key ( ) . as_der ( ) . unwrap ( ) ;
335
+
336
+ let key_pair_5208 = EcdsaKeyPair :: from_private_key_der (
337
+ & ECDSA_P256_SHA256_FIXED_SIGNING ,
338
+ bytes_5208. as_ref ( ) ,
339
+ )
340
+ . unwrap ( ) ;
341
+ let key_pair_5915 = EcdsaKeyPair :: from_private_key_der (
342
+ & ECDSA_P256_SHA256_FIXED_SIGNING ,
343
+ bytes_5915. as_ref ( ) ,
344
+ )
345
+ . unwrap ( ) ;
346
+
347
+ assert_eq ! ( key_pair. evp_pkey, key_pair_5208. evp_pkey) ;
348
+ assert_eq ! ( key_pair. evp_pkey, key_pair_5915. evp_pkey) ;
349
+ assert_eq ! ( key_pair_5208. evp_pkey, key_pair_5915. evp_pkey) ;
350
+ }
351
+ }
0 commit comments