Skip to content

Commit b9ef9cc

Browse files
authored
Merge pull request #834 from rhenium/ky/pkey-test-cleanup-20250107
Various cleanups in pkey tests
2 parents 49f9fd0 + 6cb6663 commit b9ef9cc

File tree

11 files changed

+73
-135
lines changed

11 files changed

+73
-135
lines changed
-1.29 KB
Binary file not shown.

test/openssl/fixtures/pkey/empty.der

Whitespace-only changes.

test/openssl/fixtures/pkey/empty.pem

Whitespace-only changes.

test/openssl/fixtures/pkey/fullchain.pem

Lines changed: 0 additions & 56 deletions
This file was deleted.

test/openssl/fixtures/pkey/garbage.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/openssl/fixtures/pkey/p256_too_large.pem

Lines changed: 0 additions & 5 deletions
This file was deleted.

test/openssl/fixtures/pkey/p384_invalid.pem

Lines changed: 0 additions & 6 deletions
This file was deleted.

test/openssl/test_pkey.rb

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,20 @@
22
require_relative "utils"
33

44
class OpenSSL::TestPKey < OpenSSL::PKeyTestCase
5-
def test_generic_oid_inspect
5+
def test_generic_oid_inspect_rsa
66
# RSA private key
77
rsa = Fixtures.pkey("rsa-1")
88
assert_instance_of OpenSSL::PKey::RSA, rsa
99
assert_equal "rsaEncryption", rsa.oid
1010
assert_match %r{oid=rsaEncryption}, rsa.inspect
11+
end
12+
13+
def test_generic_oid_inspect_x25519
14+
omit "X25519 not supported" unless openssl?(1, 1, 0) || libressl?(3, 7, 0)
15+
omit_on_fips
1116

1217
# X25519 private key
13-
x25519_pem = <<~EOF
14-
-----BEGIN PRIVATE KEY-----
15-
MC4CAQAwBQYDK2VuBCIEIHcHbQpzGKV9PBbBclGyZkXfTC+H68CZKrF3+6UduSwq
16-
-----END PRIVATE KEY-----
17-
EOF
18-
begin
19-
x25519 = OpenSSL::PKey.read(x25519_pem)
20-
rescue OpenSSL::PKey::PKeyError
21-
# OpenSSL < 1.1.0
22-
pend "X25519 is not implemented"
23-
end
18+
x25519 = OpenSSL::PKey.generate_key("X25519")
2419
assert_instance_of OpenSSL::PKey::PKey, x25519
2520
assert_equal "X25519", x25519.oid
2621
assert_match %r{oid=X25519}, x25519.inspect
@@ -112,18 +107,14 @@ def test_ed25519
112107
assert_equal pub_pem, priv.public_to_pem
113108
assert_equal pub_pem, pub.public_to_pem
114109

115-
begin
116-
assert_equal "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb",
117-
priv.raw_private_key.unpack1("H*")
118-
assert_equal OpenSSL::PKey.new_raw_private_key("ED25519", priv.raw_private_key).private_to_pem,
119-
priv.private_to_pem
120-
assert_equal "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c",
121-
priv.raw_public_key.unpack1("H*")
122-
assert_equal OpenSSL::PKey.new_raw_public_key("ED25519", priv.raw_public_key).public_to_pem,
123-
pub.public_to_pem
124-
rescue NoMethodError
125-
pend "running OpenSSL version does not have raw public key support"
126-
end
110+
assert_equal "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb",
111+
priv.raw_private_key.unpack1("H*")
112+
assert_equal OpenSSL::PKey.new_raw_private_key("ED25519", priv.raw_private_key).private_to_pem,
113+
priv.private_to_pem
114+
assert_equal "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c",
115+
priv.raw_public_key.unpack1("H*")
116+
assert_equal OpenSSL::PKey.new_raw_public_key("ED25519", priv.raw_public_key).public_to_pem,
117+
pub.public_to_pem
127118

128119
sig = [<<~EOF.gsub(/[^0-9a-f]/, "")].pack("H*")
129120
92a009a9f0d4cab8720e820b5f642540
@@ -146,6 +137,9 @@ def test_ed25519
146137
end
147138

148139
def test_x25519
140+
omit "X25519 not supported" unless openssl?(1, 1, 0) || libressl?(3, 7, 0)
141+
omit_on_fips
142+
149143
# Test vector from RFC 7748 Section 6.1
150144
alice_pem = <<~EOF
151145
-----BEGIN PRIVATE KEY-----
@@ -158,38 +152,31 @@ def test_x25519
158152
-----END PUBLIC KEY-----
159153
EOF
160154
shared_secret = "4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742"
161-
begin
162-
alice = OpenSSL::PKey.read(alice_pem)
163-
bob = OpenSSL::PKey.read(bob_pem)
164-
rescue OpenSSL::PKey::PKeyError
165-
# OpenSSL < 1.1.0
166-
pend "X25519 is not implemented"
167-
end
155+
156+
alice = OpenSSL::PKey.read(alice_pem)
157+
bob = OpenSSL::PKey.read(bob_pem)
168158
assert_instance_of OpenSSL::PKey::PKey, alice
169159
assert_equal alice_pem, alice.private_to_pem
170160
assert_equal bob_pem, bob.public_to_pem
171161
assert_equal [shared_secret].pack("H*"), alice.derive(bob)
172-
begin
173-
alice_private = OpenSSL::PKey.new_raw_private_key("X25519", alice.raw_private_key)
174-
bob_public = OpenSSL::PKey.new_raw_public_key("X25519", bob.raw_public_key)
175-
alice_private_raw = alice.raw_private_key.unpack1("H*")
176-
bob_public_raw = bob.raw_public_key.unpack1("H*")
177-
rescue NoMethodError
178-
# OpenSSL < 1.1.1
179-
pend "running OpenSSL version does not have raw public key support"
162+
163+
unless openssl?(1, 1, 1) || libressl?(3, 7, 0)
164+
omit "running OpenSSL version does not have raw public key support"
180165
end
166+
alice_private = OpenSSL::PKey.new_raw_private_key("X25519", alice.raw_private_key)
167+
bob_public = OpenSSL::PKey.new_raw_public_key("X25519", bob.raw_public_key)
181168
assert_equal alice_private.private_to_pem,
182169
alice.private_to_pem
183170
assert_equal bob_public.public_to_pem,
184171
bob.public_to_pem
185172
assert_equal "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a",
186-
alice_private_raw
173+
alice.raw_private_key.unpack1("H*")
187174
assert_equal "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f",
188-
bob_public_raw
175+
bob.raw_public_key.unpack1("H*")
189176
end
190177

191-
def raw_initialize
192-
pend "Ed25519 is not implemented" unless openssl?(1, 1, 1) # >= v1.1.1
178+
def test_raw_initialize_errors
179+
omit "Ed25519 not supported" unless openssl?(1, 1, 1) || libressl?(3, 7, 0)
193180

194181
assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.new_raw_private_key("foo123", "xxx") }
195182
assert_raise(OpenSSL::PKey::PKeyError) { OpenSSL::PKey.new_raw_private_key("ED25519", "xxx") }

test/openssl/test_pkey_ec.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,16 @@ def test_check_key
8888
assert_equal(true, key2.check_key)
8989

9090
# Behavior of EVP_PKEY_public_check changes between OpenSSL 1.1.1 and 3.0
91-
key4 = Fixtures.pkey("p256_too_large")
91+
# The public key does not match the private key
92+
key4 = OpenSSL::PKey.read(<<~EOF)
93+
-----BEGIN EC PRIVATE KEY-----
94+
MHcCAQEEIP+TT0V8Fndsnacji9tyf6hmhHywcOWTee9XkiBeJoVloAoGCCqGSM49
95+
AwEHoUQDQgAEBkhhJIU/2/YdPSlY2I1k25xjK4trr5OXSgXvBC21PtY0HQ7lor7A
96+
jzT0giJITqmcd81fwGw5+96zLcdxTF1hVQ==
97+
-----END EC PRIVATE KEY-----
98+
EOF
9299
assert_raise(OpenSSL::PKey::ECError) { key4.check_key }
93100

94-
key5 = Fixtures.pkey("p384_invalid")
95-
assert_raise(OpenSSL::PKey::ECError) { key5.check_key }
96-
97101
# EC#private_key= is deprecated in 3.0 and won't work on OpenSSL 3.0
98102
if !openssl?(3, 0, 0)
99103
key2.private_key += 1

test/openssl/test_x509cert.rb

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -370,34 +370,53 @@ def test_marshal
370370
end
371371

372372
def test_load_file_empty_pem
373-
empty_path = Fixtures.file_path("pkey", "empty.pem")
374-
assert_raise(OpenSSL::X509::CertificateError) do
375-
OpenSSL::X509::Certificate.load_file(empty_path)
373+
Tempfile.create("empty.pem") do |f|
374+
f.close
375+
376+
assert_raise(OpenSSL::X509::CertificateError) do
377+
OpenSSL::X509::Certificate.load_file(f.path)
378+
end
376379
end
377380
end
378381

379382
def test_load_file_fullchain_pem
380-
fullchain_path = Fixtures.file_path("pkey", "fullchain.pem")
381-
certificates = OpenSSL::X509::Certificate.load_file(fullchain_path)
382-
assert_equal 2, certificates.size
383-
assert_equal "/CN=www.codeotaku.com", certificates[0].subject.to_s
384-
assert_equal "/C=US/O=Let's Encrypt/CN=R3", certificates[1].subject.to_s
383+
cert1 = issue_cert(@ee1, @rsa2048, 1, [], nil, nil)
384+
cert2 = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
385+
386+
Tempfile.create("fullchain.pem") do |f|
387+
f.puts cert1.to_pem
388+
f.puts cert2.to_pem
389+
f.close
390+
391+
certificates = OpenSSL::X509::Certificate.load_file(f.path)
392+
assert_equal 2, certificates.size
393+
assert_equal @ee1, certificates[0].subject
394+
assert_equal @ca, certificates[1].subject
395+
end
385396
end
386397

387398
def test_load_file_certificate_der
388-
fullchain_path = Fixtures.file_path("pkey", "certificate.der")
389-
certificates = OpenSSL::X509::Certificate.load_file(fullchain_path)
399+
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
400+
Tempfile.create("certificate.der", binmode: true) do |f|
401+
f.write cert.to_der
402+
f.close
390403

391-
# DER encoding can only contain one certificate:
392-
assert_equal 1, certificates.size
393-
assert_equal "/CN=www.codeotaku.com", certificates[0].subject.to_s
404+
certificates = OpenSSL::X509::Certificate.load_file(f.path)
405+
406+
# DER encoding can only contain one certificate:
407+
assert_equal 1, certificates.size
408+
assert_equal cert.to_der, certificates[0].to_der
409+
end
394410
end
395411

396412
def test_load_file_fullchain_garbage
397-
fullchain_path = Fixtures.file_path("pkey", "garbage.txt")
413+
Tempfile.create("garbage.txt") do |f|
414+
f.puts "not a certificate"
415+
f.close
398416

399-
assert_raise(OpenSSL::X509::CertificateError) do
400-
OpenSSL::X509::Certificate.load_file(fullchain_path)
417+
assert_raise(OpenSSL::X509::CertificateError) do
418+
OpenSSL::X509::Certificate.load_file(f.path)
419+
end
401420
end
402421
end
403422

0 commit comments

Comments
 (0)