44if defined? ( OpenSSL ) && defined? ( OpenSSL ::PKey ::DH )
55
66class OpenSSL ::TestPKeyDH < OpenSSL ::PKeyTestCase
7- NEW_KEYLEN = 2048
8-
97 def test_new_empty
108 # pkeys are immutable with OpenSSL >= 3.0
119 if openssl? ( 3 , 0 , 0 )
@@ -18,22 +16,30 @@ def test_new_empty
1816 end
1917
2018 def test_new_generate
21- # This test is slow
22- dh = OpenSSL ::PKey ::DH . new ( NEW_KEYLEN )
23- assert_key ( dh )
19+ begin
20+ dh1 = OpenSSL ::PKey ::DH . new ( 512 )
21+ rescue OpenSSL ::PKey ::PKeyError
22+ omit "generating 512-bit DH parameters failed; " \
23+ "likely not supported by this OpenSSL build"
24+ end
25+ assert_equal ( 512 , dh1 . p . num_bits )
26+ assert_key ( dh1 )
27+
28+ dh2 = OpenSSL ::PKey ::DH . generate ( 512 )
29+ assert_equal ( 512 , dh2 . p . num_bits )
30+ assert_key ( dh2 )
31+ assert_not_equal ( dh1 . p , dh2 . p )
2432 end if ENV [ "OSSL_TEST_ALL" ] == "1"
2533
2634 def test_new_break
2735 unless openssl? && OpenSSL . fips_mode
28- assert_nil ( OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { break } )
2936 assert_raise ( RuntimeError ) do
30- OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { raise }
37+ OpenSSL ::PKey ::DH . new ( 2048 ) { raise }
3138 end
3239 else
3340 # The block argument is not executed in FIPS case.
3441 # See https://github.com/ruby/openssl/issues/692 for details.
35- assert ( OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { break } )
36- assert ( OpenSSL ::PKey ::DH . new ( NEW_KEYLEN ) { raise } )
42+ assert_kind_of ( OpenSSL ::PKey ::DH , OpenSSL ::PKey ::DH . new ( 2048 ) { raise } )
3743 end
3844 end
3945
@@ -56,15 +62,15 @@ def test_derive_key
5662 end
5763
5864 def test_DHparams
59- dh = Fixtures . pkey ( "dh2048_ffdhe2048" )
60- dh_params = dh . public_key
65+ dh_params = Fixtures . pkey ( "dh2048_ffdhe2048" )
6166
6267 asn1 = OpenSSL ::ASN1 ::Sequence ( [
63- OpenSSL ::ASN1 ::Integer ( dh . p ) ,
64- OpenSSL ::ASN1 ::Integer ( dh . g )
68+ OpenSSL ::ASN1 ::Integer ( dh_params . p ) ,
69+ OpenSSL ::ASN1 ::Integer ( dh_params . g )
6570 ] )
71+ assert_equal ( asn1 . to_der , dh_params . to_der )
6672 key = OpenSSL ::PKey ::DH . new ( asn1 . to_der )
67- assert_same_dh dh_params , key
73+ assert_same_dh_params ( dh_params , key )
6874
6975 pem = <<~EOF
7076 -----BEGIN DH PARAMETERS-----
@@ -76,14 +82,20 @@ def test_DHparams
7682 ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
7783 -----END DH PARAMETERS-----
7884 EOF
85+ assert_equal ( pem , dh_params . export )
7986
8087 key = OpenSSL ::PKey ::DH . new ( pem )
81- assert_same_dh dh_params , key
88+ assert_same_dh_params ( dh_params , key )
89+ assert_no_key ( key )
8290 key = OpenSSL ::PKey . read ( pem )
83- assert_same_dh dh_params , key
84-
85- assert_equal asn1 . to_der , dh . to_der
86- assert_equal pem , dh . export
91+ assert_same_dh_params ( dh_params , key )
92+ assert_no_key ( key )
93+
94+ key = OpenSSL ::PKey . generate_key ( dh_params )
95+ assert_same_dh_params ( dh_params , key )
96+ assert_key ( key )
97+ assert_equal ( dh_params . to_der , key . to_der )
98+ assert_equal ( dh_params . to_pem , key . to_pem )
8799 end
88100
89101 def test_public_key
@@ -96,14 +108,14 @@ def test_public_key
96108
97109 def test_generate_key
98110 # Deprecated in v3.0.0; incompatible with OpenSSL 3.0
99- # Creates a copy with params only
100- dh = Fixtures . pkey ( "dh2048_ffdhe2048" ) . public_key
111+ dh = Fixtures . pkey ( "dh2048_ffdhe2048" )
101112 assert_no_key ( dh )
102113 dh . generate_key!
103114 assert_key ( dh )
104115
105- dh2 = dh . public_key
116+ dh2 = OpenSSL :: PKey :: DH . new ( dh . to_der )
106117 dh2 . generate_key!
118+ assert_not_equal ( dh . pub_key , dh2 . pub_key )
107119 assert_equal ( dh . compute_key ( dh2 . pub_key ) , dh2 . compute_key ( dh . pub_key ) )
108120 end if !openssl? ( 3 , 0 , 0 )
109121
@@ -209,14 +221,14 @@ def assert_no_key(dh)
209221 end
210222
211223 def assert_key ( dh )
212- assert ( dh . public? )
213- assert ( dh . private? )
214- assert ( dh . pub_key )
215- assert ( dh . priv_key )
224+ assert_true ( dh . public? )
225+ assert_true ( dh . private? )
226+ assert_kind_of ( OpenSSL :: BN , dh . pub_key )
227+ assert_kind_of ( OpenSSL :: BN , dh . priv_key )
216228 end
217229
218- def assert_same_dh ( expected , key )
219- check_component ( expected , key , [ :p , :q , :g , :pub_key , :priv_key ] )
230+ def assert_same_dh_params ( expected , key )
231+ check_component ( expected , key , [ :p , :q , :g ] )
220232 end
221233end
222234
0 commit comments