|
2 | 2 |
|
3 | 3 | class TestX509Request < TestCase
|
4 | 4 |
|
| 5 | + def setup! |
| 6 | + @rsa1024 = Fixtures.pkey("rsa1024") |
| 7 | + @rsa2048 = Fixtures.pkey("rsa2048") |
| 8 | + @dsa256 = Fixtures.pkey("dsa256") |
| 9 | + @dsa512 = Fixtures.pkey("dsa512") |
| 10 | + @dn = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou") |
| 11 | + end |
| 12 | + private :setup! |
| 13 | + |
| 14 | + def test_public_key; setup! |
| 15 | + req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256')) |
| 16 | + assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der) |
| 17 | + req = OpenSSL::X509::Request.new(req.to_der) |
| 18 | + assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der) |
| 19 | + |
| 20 | + req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256')) |
| 21 | + assert_equal(@dsa512.public_key.to_der, req.public_key.to_der) |
| 22 | + req = OpenSSL::X509::Request.new(req.to_der) |
| 23 | + assert_equal(@dsa512.public_key.to_der, req.public_key.to_der) |
| 24 | + end |
| 25 | + |
| 26 | + def test_sign_and_verify_rsa_sha1; setup! |
| 27 | + req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1')) |
| 28 | + assert_equal(true, req.verify(@rsa1024)) |
| 29 | + assert_equal(false, req.verify(@rsa2048)) |
| 30 | + assert_equal(false, request_error_returns_false { req.verify(@dsa256) }) |
| 31 | + assert_equal(false, request_error_returns_false { req.verify(@dsa512) }) |
| 32 | + # req.version = 1 |
| 33 | + # assert_equal(false, req.verify(@rsa1024)) |
| 34 | + #rescue OpenSSL::X509::RequestError # RHEL 9 disables SHA1 |
| 35 | + end |
| 36 | + |
| 37 | + def test_sign_and_verify_rsa_md5; setup! |
| 38 | + req = issue_csr(0, @dn, @rsa2048, OpenSSL::Digest.new('MD5')) |
| 39 | + assert_equal(false, req.verify(@rsa1024)) |
| 40 | + assert_equal(true, req.verify(@rsa2048)) |
| 41 | + assert_equal(false, request_error_returns_false { req.verify(@dsa256) }) |
| 42 | + assert_equal(false, request_error_returns_false { req.verify(@dsa512) }) |
| 43 | + req.subject = OpenSSL::X509::Name.parse("/C=JP/CN=FooBar") |
| 44 | + assert_equal(false, req.verify(@rsa2048)) |
| 45 | + #rescue OpenSSL::X509::RequestError # RHEL7 disables MD5 |
| 46 | + end |
| 47 | + |
| 48 | + def test_sign_and_verify_dsa; setup! |
| 49 | + req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256')) |
| 50 | + assert_equal(false, request_error_returns_false { req.verify(@rsa1024) }) |
| 51 | + assert_equal(false, request_error_returns_false { req.verify(@rsa2048) }) |
| 52 | + assert_equal(false, req.verify(@dsa256)) |
| 53 | + assert_equal(true, req.verify(@dsa512)) |
| 54 | + req.public_key = @rsa1024.public_key |
| 55 | + assert_equal(false, req.verify(@dsa512)) |
| 56 | + end |
| 57 | + |
5 | 58 | def test_csr_request_extensions
|
6 | 59 | key = OpenSSL::PKey::RSA.new(512)
|
7 | 60 | csr = OpenSSL::X509::Request.new
|
@@ -77,6 +130,23 @@ def test_to_der_new_from_der; require 'base64'
|
77 | 130 | OpenSSL::X509::Request.new(decoded) #=> OpenSSL::X509::RequestError: invalid certificate request data
|
78 | 131 | end
|
79 | 132 |
|
| 133 | + private |
| 134 | + |
| 135 | + def issue_csr(ver, dn, key, digest) |
| 136 | + req = OpenSSL::X509::Request.new |
| 137 | + req.version = ver |
| 138 | + req.subject = dn |
| 139 | + req.public_key = key.public_key |
| 140 | + req.sign(key, digest) |
| 141 | + req |
| 142 | + end |
| 143 | + |
| 144 | + def request_error_returns_false |
| 145 | + yield |
| 146 | + rescue OpenSSL::X509::RequestError |
| 147 | + false |
| 148 | + end |
| 149 | + |
80 | 150 | TEST_KEY_RSA1024 = <<-_end_of_pem_
|
81 | 151 | -----BEGIN RSA PRIVATE KEY-----
|
82 | 152 | MIICXgIBAAKBgQDLwsSw1ECnPtT+PkOgHhcGA71nwC2/nL85VBGnRqDxOqjVh7Cx
|
|
0 commit comments