44if defined? ( OpenSSL ) && defined? ( OpenSSL ::PKey ::DH )
55
66class OpenSSL ::TestPKeyDH < OpenSSL ::PKeyTestCase
7- NEW_KEYLEN = 2048
8-
97 def test_new_empty
108 dh = OpenSSL ::PKey ::DH . new
119 assert_equal nil , dh . p
1210 assert_equal nil , dh . priv_key
1311 end
1412
1513 def test_new_generate
16- # This test is slow
17- dh = OpenSSL ::PKey ::DH . new ( NEW_KEYLEN )
18- assert_key ( dh )
14+ begin
15+ dh1 = OpenSSL ::PKey ::DH . new ( 512 )
16+ rescue OpenSSL ::PKey ::PKeyError
17+ omit "generating 512-bit DH parameters failed; " \
18+ "likely not supported by this OpenSSL build"
19+ end
20+ assert_equal ( 512 , dh1 . p . num_bits )
21+ assert_key ( dh1 )
22+
23+ dh2 = OpenSSL ::PKey ::DH . generate ( 512 )
24+ assert_equal ( 512 , dh2 . p . num_bits )
25+ assert_key ( dh2 )
26+ assert_not_equal ( dh1 . p , dh2 . p )
1927 end if ENV [ "OSSL_TEST_ALL" ] == "1"
2028
2129 def test_new_break
2230 unless openssl? && OpenSSL . fips_mode
23- assert_nil ( OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { break } )
2431 assert_raise ( RuntimeError ) do
25- OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { raise }
32+ OpenSSL ::PKey ::DH . new ( 2048 ) { raise }
2633 end
2734 else
2835 # The block argument is not executed in FIPS case.
2936 # See https://github.com/ruby/openssl/issues/692 for details.
30- assert ( OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { break } )
31- assert ( OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { raise } )
37+ assert_kind_of ( OpenSSL ::PKey ::DH , OpenSSL ::PKey ::DH . new ( 2048 ) { raise } )
3238 end
3339 end
3440
@@ -51,15 +57,15 @@ def test_derive_key
5157 end
5258
5359 def test_DHparams
54- dh = Fixtures . pkey ( "dh2048_ffdhe2048" )
55- dh_params = dh . public_key
60+ dh_params = Fixtures . pkey ( "dh2048_ffdhe2048" )
5661
5762 asn1 = OpenSSL ::ASN1 ::Sequence ( [
58- OpenSSL ::ASN1 ::Integer ( dh . p ) ,
59- OpenSSL ::ASN1 ::Integer ( dh . g )
63+ OpenSSL ::ASN1 ::Integer ( dh_params . p ) ,
64+ OpenSSL ::ASN1 ::Integer ( dh_params . g )
6065 ] )
66+ assert_equal ( asn1 . to_der , dh_params . to_der )
6167 key = OpenSSL ::PKey ::DH . new ( asn1 . to_der )
62- assert_same_dh dh_params , key
68+ assert_same_dh_params ( dh_params , key )
6369
6470 pem = <<~EOF
6571 -----BEGIN DH PARAMETERS-----
@@ -71,14 +77,20 @@ def test_DHparams
7177 ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
7278 -----END DH PARAMETERS-----
7379 EOF
80+ assert_equal ( pem , dh_params . export )
7481
7582 key = OpenSSL ::PKey ::DH . new ( pem )
76- assert_same_dh dh_params , key
83+ assert_same_dh_params ( dh_params , key )
84+ assert_no_key ( key )
7785 key = OpenSSL ::PKey . read ( pem )
78- assert_same_dh dh_params , key
79-
80- assert_equal asn1 . to_der , dh . to_der
81- assert_equal pem , dh . export
86+ assert_same_dh_params ( dh_params , key )
87+ assert_no_key ( key )
88+
89+ key = OpenSSL ::PKey . generate_key ( dh_params )
90+ assert_same_dh_params ( dh_params , key )
91+ assert_key ( key )
92+ assert_equal ( dh_params . to_der , key . to_der )
93+ assert_equal ( dh_params . to_pem , key . to_pem )
8294 end
8395
8496 def test_public_key
@@ -91,14 +103,14 @@ def test_public_key
91103
92104 def test_generate_key
93105 # Deprecated in v3.0.0; incompatible with OpenSSL 3.0
94- # Creates a copy with params only
95- dh = Fixtures . pkey ( "dh2048_ffdhe2048" ) . public_key
106+ dh = Fixtures . pkey ( "dh2048_ffdhe2048" )
96107 assert_no_key ( dh )
97108 dh . generate_key!
98109 assert_key ( dh )
99110
100- dh2 = dh . public_key
111+ dh2 = OpenSSL :: PKey :: DH . new ( dh . to_der )
101112 dh2 . generate_key!
113+ assert_not_equal ( dh . pub_key , dh2 . pub_key )
102114 assert_equal ( dh . compute_key ( dh2 . pub_key ) , dh2 . compute_key ( dh . pub_key ) )
103115 end if !openssl? ( 3 , 0 , 0 )
104116
@@ -204,14 +216,14 @@ def assert_no_key(dh)
204216 end
205217
206218 def assert_key ( dh )
207- assert ( dh . public? )
208- assert ( dh . private? )
209- assert ( dh . pub_key )
210- assert ( dh . priv_key )
219+ assert_true ( dh . public? )
220+ assert_true ( dh . private? )
221+ assert_kind_of ( OpenSSL :: BN , dh . pub_key )
222+ assert_kind_of ( OpenSSL :: BN , dh . priv_key )
211223 end
212224
213- def assert_same_dh ( expected , key )
214- check_component ( expected , key , [ :p , :q , :g , :pub_key , :priv_key ] )
225+ def assert_same_dh_params ( expected , key )
226+ check_component ( expected , key , [ :p , :q , :g ] )
215227 end
216228end
217229
0 commit comments