Skip to content

Commit 8bc7442

Browse files
committed
pkey/dh: refactor tests
- Generate smaller parameters in test_new_generate. Generating 2048-bit parameters is slow and sometimes takes a few minutes on GitHub-hosted CI runners. Also test the DH.generate alias, not just DH.new. - Simplify test_new_break to just check exceptions raised in the block because it is redundant. - Remove unnecessary OpenSSL::PKey::DH#public_key calls. - Update bare "assert" with more appropriate methods.
1 parent 4b923b4 commit 8bc7442

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

test/openssl/test_pkey_dh.rb

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,37 @@
44
if defined?(OpenSSL) && defined?(OpenSSL::PKey::DH)
55

66
class 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
216228
end
217229

0 commit comments

Comments
 (0)