@@ -26,14 +26,19 @@ def test_new_break
2626 end
2727
2828 def test_derive_key
29- dh1 = Fixtures . pkey ( "dh1024" ) . generate_key!
30- dh2 = Fixtures . pkey ( "dh1024" ) . generate_key!
29+ params = Fixtures . pkey ( "dh1024" )
30+ dh1 = OpenSSL ::PKey . generate_key ( params )
31+ dh2 = OpenSSL ::PKey . generate_key ( params )
3132 dh1_pub = OpenSSL ::PKey . read ( dh1 . public_to_der )
3233 dh2_pub = OpenSSL ::PKey . read ( dh2 . public_to_der )
34+
3335 z = dh1 . g . mod_exp ( dh1 . priv_key , dh1 . p ) . mod_exp ( dh2 . priv_key , dh1 . p ) . to_s ( 2 )
3436 assert_equal z , dh1 . derive ( dh2_pub )
3537 assert_equal z , dh2 . derive ( dh1_pub )
3638
39+ assert_raise ( OpenSSL ::PKey ::PKeyError ) { params . derive ( dh1_pub ) }
40+ assert_raise ( OpenSSL ::PKey ::PKeyError ) { dh1_pub . derive ( params ) }
41+
3742 assert_equal z , dh1 . compute_key ( dh2 . pub_key )
3843 assert_equal z , dh2 . compute_key ( dh1 . pub_key )
3944 end
@@ -74,19 +79,16 @@ def test_public_key
7479 end
7580
7681 def test_generate_key
77- dh = Fixtures . pkey ( "dh1024" ) . public_key # creates a copy
82+ # Deprecated in v3.0.0; incompatible with OpenSSL 3.0
83+ dh = Fixtures . pkey ( "dh1024" ) . public_key # creates a copy with params only
7884 assert_no_key ( dh )
7985 dh . generate_key!
8086 assert_key ( dh )
81- end
8287
83- def test_key_exchange
84- dh = Fixtures . pkey ( "dh1024" )
8588 dh2 = dh . public_key
86- dh . generate_key!
8789 dh2 . generate_key!
8890 assert_equal ( dh . compute_key ( dh2 . pub_key ) , dh2 . compute_key ( dh . pub_key ) )
89- end
91+ end if ! openssl? ( 3 , 0 , 0 )
9092
9193 def test_params_ok?
9294 dh0 = Fixtures . pkey ( "dh1024" )
@@ -105,13 +107,32 @@ def test_params_ok?
105107 end
106108
107109 def test_dup
108- dh = Fixtures . pkey ( "dh1024" )
109- dh2 = dh . dup
110- assert_equal dh . to_der , dh2 . to_der # params
111- assert_equal_params dh , dh2 # keys
112- dh2 . set_pqg ( dh2 . p + 1 , nil , dh2 . g )
113- assert_not_equal dh2 . p , dh . p
114- assert_equal dh2 . g , dh . g
110+ # Parameters only
111+ dh1 = Fixtures . pkey ( "dh1024" )
112+ dh2 = dh1 . dup
113+ assert_equal dh1 . to_der , dh2 . to_der
114+ assert_not_equal nil , dh1 . p
115+ assert_not_equal nil , dh1 . g
116+ assert_equal [ dh1 . p , dh1 . g ] , [ dh2 . p , dh2 . g ]
117+ assert_equal nil , dh1 . pub_key
118+ assert_equal nil , dh1 . priv_key
119+ assert_equal [ dh1 . pub_key , dh1 . priv_key ] , [ dh2 . pub_key , dh2 . priv_key ]
120+
121+ # PKey is immutable in OpenSSL >= 3.0
122+ if !openssl? ( 3 , 0 , 0 )
123+ dh2 . set_pqg ( dh2 . p + 1 , nil , dh2 . g )
124+ assert_not_equal dh2 . p , dh1 . p
125+ end
126+
127+ # With a key pair
128+ dh3 = OpenSSL ::PKey . generate_key ( Fixtures . pkey ( "dh1024" ) )
129+ dh4 = dh3 . dup
130+ assert_equal dh3 . to_der , dh4 . to_der
131+ assert_equal dh1 . to_der , dh4 . to_der # encodes parameters only
132+ assert_equal [ dh1 . p , dh1 . g ] , [ dh4 . p , dh4 . g ]
133+ assert_not_equal nil , dh3 . pub_key
134+ assert_not_equal nil , dh3 . priv_key
135+ assert_equal [ dh3 . pub_key , dh3 . priv_key ] , [ dh4 . pub_key , dh4 . priv_key ]
115136 end
116137
117138 def test_marshal
@@ -123,11 +144,6 @@ def test_marshal
123144
124145 private
125146
126- def assert_equal_params ( dh1 , dh2 )
127- assert_equal ( dh1 . g , dh2 . g )
128- assert_equal ( dh1 . p , dh2 . p )
129- end
130-
131147 def assert_no_key ( dh )
132148 assert_equal ( false , dh . public? )
133149 assert_equal ( false , dh . private? )
0 commit comments