Skip to content

Commit b77aef4

Browse files
authored
Merge pull request #947 from rhenium/ky/pkey-dh-refactor-tests
pkey/dh: refactor tests
2 parents c89f4e6 + 8bc7442 commit b77aef4

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,8 +4,6 @@
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
# 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
221233
end
222234

0 commit comments

Comments
 (0)