@@ -65,9 +65,8 @@ use crate::hex;
65
65
pub use ephemeral:: { agree_ephemeral, EphemeralPrivateKey } ;
66
66
67
67
use crate :: aws_lc:: {
68
- EVP_PKEY_derive , EVP_PKEY_derive_init , EVP_PKEY_derive_set_peer , EVP_PKEY_get0_EC_KEY ,
69
- NID_X9_62_prime256v1 , NID_secp384r1 , NID_secp521r1 , EVP_PKEY , EVP_PKEY_EC , EVP_PKEY_X25519 ,
70
- NID_X25519 ,
68
+ i2d_ECPrivateKey, EVP_PKEY_get0_EC_KEY , NID_X9_62_prime256v1 , NID_secp384r1 , NID_secp521r1 ,
69
+ EVP_PKEY , EVP_PKEY_EC , EVP_PKEY_X25519 , NID_X25519 ,
71
70
} ;
72
71
73
72
use crate :: buffer:: Buffer ;
@@ -78,7 +77,6 @@ use crate::encoding::{
78
77
EcPublicKeyCompressedBin , EcPublicKeyUncompressedBin , Pkcs8V1Der , PublicKeyX509Der ,
79
78
} ;
80
79
use crate :: evp_pkey:: No_EVP_PKEY_CTX_consumer ;
81
- use crate :: fips:: indicator_check;
82
80
use crate :: pkcs8:: Version ;
83
81
use crate :: ptr:: LcPtr ;
84
82
use core:: fmt;
@@ -455,7 +453,7 @@ impl AsDer<EcPrivateKeyRfc5915Der<'static>> for PrivateKey {
455
453
|evp_pkey| EVP_PKEY_get0_EC_KEY ( * evp_pkey. as_const ( ) )
456
454
} ) ?
457
455
} ;
458
- let length = usize:: try_from ( unsafe { aws_lc :: i2d_ECPrivateKey ( * ec_key, & mut outp) } )
456
+ let length = usize:: try_from ( unsafe { i2d_ECPrivateKey ( * ec_key, & mut outp) } )
459
457
. map_err ( |_| Unspecified ) ?;
460
458
let mut outp = LcPtr :: new ( outp) ?;
461
459
Ok ( EcPrivateKeyRfc5915Der :: take_from_slice ( unsafe {
@@ -712,107 +710,43 @@ where
712
710
713
711
let peer_pub_bytes = peer_public_key. bytes . as_ref ( ) ;
714
712
715
- let mut buffer = [ 0u8 ; MAX_AGREEMENT_SECRET_LEN ] ;
716
-
717
- let secret: & [ u8 ] = match & my_private_key. inner_key {
718
- KeyInner :: X25519 ( priv_key) => {
719
- x25519_diffie_hellman ( & mut buffer, priv_key, peer_pub_bytes) . or ( Err ( error_value) ) ?
720
- }
721
- KeyInner :: ECDH_P256 ( priv_key)
722
- | KeyInner :: ECDH_P384 ( priv_key)
723
- | KeyInner :: ECDH_P521 ( priv_key) => {
724
- ec_key_ecdh ( & mut buffer, priv_key, peer_pub_bytes, expected_nid) . or ( Err ( error_value) ) ?
713
+ let parse_result = match & my_private_key. inner_key {
714
+ KeyInner :: X25519 ( _) => try_parse_x25519_public_key_bytes ( peer_pub_bytes) ,
715
+ KeyInner :: ECDH_P256 ( _) | KeyInner :: ECDH_P384 ( _) | KeyInner :: ECDH_P521 ( _) => {
716
+ encoding:: parse_ec_public_key ( peer_pub_bytes, expected_nid)
725
717
}
726
718
} ;
727
- kdf ( secret)
728
- }
729
-
730
- // Current max secret length is P-521's.
731
- const MAX_AGREEMENT_SECRET_LEN : usize = AlgorithmID :: ECDH_P521 . private_key_len ( ) ;
732
-
733
- #[ inline]
734
- #[ allow( clippy:: needless_pass_by_value) ]
735
- fn ec_key_ecdh < ' a > (
736
- buffer : & ' a mut [ u8 ; MAX_AGREEMENT_SECRET_LEN ] ,
737
- priv_key : & LcPtr < EVP_PKEY > ,
738
- peer_pub_key_bytes : & [ u8 ] ,
739
- nid : i32 ,
740
- ) -> Result < & ' a [ u8 ] , Unspecified > {
741
- let mut pub_key = encoding:: parse_ec_public_key ( peer_pub_key_bytes, nid) ?;
742
-
743
- let mut pkey_ctx = priv_key. create_EVP_PKEY_CTX ( ) ?;
744
-
745
- if 1 != unsafe { EVP_PKEY_derive_init ( * pkey_ctx. as_mut ( ) ) } {
746
- return Err ( Unspecified ) ;
747
- }
748
-
749
- if 1 != unsafe { EVP_PKEY_derive_set_peer ( * pkey_ctx. as_mut ( ) , * pub_key. as_mut ( ) ) } {
750
- return Err ( Unspecified ) ;
751
- }
752
-
753
- let mut out_key_len = buffer. len ( ) ;
754
-
755
- if 1 != indicator_check ! ( unsafe {
756
- EVP_PKEY_derive ( * pkey_ctx. as_mut( ) , buffer. as_mut_ptr( ) , & mut out_key_len)
757
- } ) {
758
- return Err ( Unspecified ) ;
759
- }
760
719
761
- if 0 == out_key_len {
762
- return Err ( Unspecified ) ;
763
- }
764
-
765
- Ok ( & buffer[ 0 ..out_key_len] )
766
- }
767
-
768
- #[ inline]
769
- fn x25519_diffie_hellman < ' a > (
770
- buffer : & ' a mut [ u8 ; MAX_AGREEMENT_SECRET_LEN ] ,
771
- priv_key : & LcPtr < EVP_PKEY > ,
772
- peer_pub_key : & [ u8 ] ,
773
- ) -> Result < & ' a [ u8 ] , ( ) > {
774
- let mut pkey_ctx = priv_key. create_EVP_PKEY_CTX ( ) ?;
775
-
776
- if 1 != unsafe { EVP_PKEY_derive_init ( * pkey_ctx. as_mut ( ) ) } {
777
- return Err ( ( ) ) ;
778
- }
720
+ if let Ok ( peer_pub_key) = parse_result {
721
+ let secret = my_private_key
722
+ . inner_key
723
+ . get_evp_pkey ( )
724
+ . agree ( & peer_pub_key)
725
+ . or ( Err ( error_value) ) ?;
779
726
780
- let mut pub_key = try_parse_x25519_public_key_bytes ( peer_pub_key) ?;
781
-
782
- if 1 != unsafe { EVP_PKEY_derive_set_peer ( * pkey_ctx. as_mut ( ) , * pub_key. as_mut ( ) ) } {
783
- return Err ( ( ) ) ;
784
- }
785
-
786
- let mut out_key_len = buffer. len ( ) ;
787
-
788
- if 1 != indicator_check ! ( unsafe {
789
- EVP_PKEY_derive ( * pkey_ctx. as_mut( ) , buffer. as_mut_ptr( ) , & mut out_key_len)
790
- } ) {
791
- return Err ( ( ) ) ;
727
+ kdf ( secret. as_ref ( ) )
728
+ } else {
729
+ Err ( error_value)
792
730
}
793
-
794
- debug_assert ! ( out_key_len == AlgorithmID :: X25519 . pub_key_len( ) ) ;
795
-
796
- Ok ( & buffer[ 0 ..AlgorithmID :: X25519 . pub_key_len ( ) ] )
797
731
}
798
732
799
733
pub ( crate ) fn try_parse_x25519_public_key_bytes (
800
734
key_bytes : & [ u8 ] ,
801
- ) -> Result < LcPtr < EVP_PKEY > , Unspecified > {
735
+ ) -> Result < LcPtr < EVP_PKEY > , KeyRejected > {
802
736
LcPtr :: < EVP_PKEY > :: parse_rfc5280_public_key ( key_bytes, EVP_PKEY_X25519 )
803
737
. or ( try_parse_x25519_public_key_raw_bytes ( key_bytes) )
804
738
}
805
739
806
- fn try_parse_x25519_public_key_raw_bytes ( key_bytes : & [ u8 ] ) -> Result < LcPtr < EVP_PKEY > , Unspecified > {
740
+ fn try_parse_x25519_public_key_raw_bytes ( key_bytes : & [ u8 ] ) -> Result < LcPtr < EVP_PKEY > , KeyRejected > {
807
741
let expected_pub_key_len = X25519 . id . pub_key_len ( ) ;
808
742
if key_bytes. len ( ) != expected_pub_key_len {
809
- return Err ( Unspecified ) ;
743
+ return Err ( KeyRejected :: invalid_encoding ( ) ) ;
810
744
}
811
745
812
- Ok ( LcPtr :: < EVP_PKEY > :: parse_raw_public_key (
746
+ LcPtr :: < EVP_PKEY > :: parse_raw_public_key (
813
747
key_bytes,
814
748
EVP_PKEY_X25519 ,
815
- ) ? )
749
+ )
816
750
}
817
751
818
752
#[ cfg( test) ]
0 commit comments