jruby-openssl-maven 0.7.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. data/History.txt +171 -0
  2. data/License.txt +30 -0
  3. data/Manifest.txt +115 -0
  4. data/README.txt +13 -0
  5. data/Rakefile +79 -0
  6. data/lib/jopenssl.jar +0 -0
  7. data/lib/jopenssl/version.rb +5 -0
  8. data/lib/openssl.rb +76 -0
  9. data/lib/openssl/bn.rb +35 -0
  10. data/lib/openssl/buffering.rb +239 -0
  11. data/lib/openssl/cipher.rb +65 -0
  12. data/lib/openssl/config.rb +316 -0
  13. data/lib/openssl/digest.rb +61 -0
  14. data/lib/openssl/dummy.rb +33 -0
  15. data/lib/openssl/dummyssl.rb +14 -0
  16. data/lib/openssl/pkcs7.rb +25 -0
  17. data/lib/openssl/ssl.rb +179 -0
  18. data/lib/openssl/x509.rb +154 -0
  19. data/test/cert_with_ec_pk.cer +27 -0
  20. data/test/fixture/ca-bundle.crt +2794 -0
  21. data/test/fixture/ca_path/72fa7371.0 +19 -0
  22. data/test/fixture/ca_path/verisign.pem +19 -0
  23. data/test/fixture/cacert.pem +23 -0
  24. data/test/fixture/cert_localhost.pem +19 -0
  25. data/test/fixture/common.pem +48 -0
  26. data/test/fixture/imaps/cacert.pem +60 -0
  27. data/test/fixture/imaps/server.crt +61 -0
  28. data/test/fixture/imaps/server.key +15 -0
  29. data/test/fixture/key_then_cert.pem +34 -0
  30. data/test/fixture/keypair.pem +27 -0
  31. data/test/fixture/localhost_keypair.pem +18 -0
  32. data/test/fixture/max.pem +29 -0
  33. data/test/fixture/purpose/b70a5bc1.0 +24 -0
  34. data/test/fixture/purpose/ca/PASSWD_OF_CA_KEY_IS_1234 +0 -0
  35. data/test/fixture/purpose/ca/ca_config.rb +37 -0
  36. data/test/fixture/purpose/ca/cacert.pem +24 -0
  37. data/test/fixture/purpose/ca/newcerts/2_cert.pem +19 -0
  38. data/test/fixture/purpose/ca/newcerts/3_cert.pem +19 -0
  39. data/test/fixture/purpose/ca/private/cakeypair.pem +30 -0
  40. data/test/fixture/purpose/ca/serial +1 -0
  41. data/test/fixture/purpose/cacert.pem +24 -0
  42. data/test/fixture/purpose/scripts/gen_cert.rb +127 -0
  43. data/test/fixture/purpose/scripts/gen_csr.rb +50 -0
  44. data/test/fixture/purpose/scripts/init_ca.rb +66 -0
  45. data/test/fixture/purpose/sslclient.pem +19 -0
  46. data/test/fixture/purpose/sslclient/csr.pem +10 -0
  47. data/test/fixture/purpose/sslclient/keypair.pem +15 -0
  48. data/test/fixture/purpose/sslclient/sslclient.pem +19 -0
  49. data/test/fixture/purpose/sslserver.pem +19 -0
  50. data/test/fixture/purpose/sslserver/csr.pem +10 -0
  51. data/test/fixture/purpose/sslserver/keypair.pem +15 -0
  52. data/test/fixture/purpose/sslserver/sslserver.pem +19 -0
  53. data/test/fixture/selfcert.pem +23 -0
  54. data/test/fixture/verisign.pem +19 -0
  55. data/test/fixture/verisign_c3.pem +14 -0
  56. data/test/java/pkcs7_mime_enveloped.message +19 -0
  57. data/test/java/pkcs7_mime_signed.message +30 -0
  58. data/test/java/pkcs7_multipart_signed.message +45 -0
  59. data/test/java/test_java_attribute.rb +25 -0
  60. data/test/java/test_java_bio.rb +42 -0
  61. data/test/java/test_java_mime.rb +173 -0
  62. data/test/java/test_java_pkcs7.rb +772 -0
  63. data/test/java/test_java_smime.rb +177 -0
  64. data/test/openssl/ssl_server.rb +99 -0
  65. data/test/openssl/test_asn1.rb +197 -0
  66. data/test/openssl/test_cipher.rb +193 -0
  67. data/test/openssl/test_config.rb +290 -0
  68. data/test/openssl/test_digest.rb +88 -0
  69. data/test/openssl/test_ec.rb +128 -0
  70. data/test/openssl/test_hmac.rb +46 -0
  71. data/test/openssl/test_ns_spki.rb +59 -0
  72. data/test/openssl/test_pair.rb +141 -0
  73. data/test/openssl/test_pkcs7.rb +489 -0
  74. data/test/openssl/test_pkey_rsa.rb +49 -0
  75. data/test/openssl/test_ssl.rb +1035 -0
  76. data/test/openssl/test_x509cert.rb +277 -0
  77. data/test/openssl/test_x509crl.rb +253 -0
  78. data/test/openssl/test_x509ext.rb +99 -0
  79. data/test/openssl/test_x509name.rb +290 -0
  80. data/test/openssl/test_x509req.rb +195 -0
  81. data/test/openssl/test_x509store.rb +246 -0
  82. data/test/openssl/utils.rb +144 -0
  83. data/test/ref/a.out +0 -0
  84. data/test/ref/compile.rb +8 -0
  85. data/test/ref/pkcs1 +0 -0
  86. data/test/ref/pkcs1.c +21 -0
  87. data/test/test_all.rb +1 -0
  88. data/test/test_certificate.rb +123 -0
  89. data/test/test_cipher.rb +197 -0
  90. data/test/test_imaps.rb +107 -0
  91. data/test/test_integration.rb +144 -0
  92. data/test/test_java.rb +98 -0
  93. data/test/test_openssl.rb +4 -0
  94. data/test/test_parse_certificate.rb +27 -0
  95. data/test/test_pkcs7.rb +40 -0
  96. data/test/test_pkey.rb +204 -0
  97. data/test/test_ssl.rb +97 -0
  98. data/test/test_x509store.rb +160 -0
  99. data/test/ut_eof.rb +128 -0
  100. metadata +161 -0
@@ -0,0 +1,277 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+ class OpenSSL::TestX509Certificate < Test::Unit::TestCase
11
+ def setup
12
+ @rsa1024 = OpenSSL::TestUtils::TEST_KEY_RSA1024
13
+ @rsa2048 = OpenSSL::TestUtils::TEST_KEY_RSA2048
14
+ @dsa256 = OpenSSL::TestUtils::TEST_KEY_DSA256
15
+ @dsa512 = OpenSSL::TestUtils::TEST_KEY_DSA512
16
+ @ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
17
+ @ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1")
18
+ @ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2")
19
+ end
20
+
21
+ def teardown
22
+ end
23
+
24
+ def issue_cert(*args)
25
+ OpenSSL::TestUtils.issue_cert(*args)
26
+ end
27
+
28
+ def test_serial
29
+ [1, 2**32, 2**100].each{|s|
30
+ cert = issue_cert(@ca, @rsa2048, s, Time.now, Time.now+3600, [],
31
+ nil, nil, OpenSSL::Digest::SHA1.new)
32
+ assert_equal(s, cert.serial)
33
+ cert = OpenSSL::X509::Certificate.new(cert.to_der)
34
+ assert_equal(s, cert.serial)
35
+ }
36
+ end
37
+
38
+ def test_public_key
39
+ exts = [
40
+ ["basicConstraints","CA:TRUE",true],
41
+ ["subjectKeyIdentifier","hash",false],
42
+ ["authorityKeyIdentifier","keyid:always",false],
43
+ ]
44
+
45
+ sha1 = OpenSSL::Digest::SHA1.new
46
+ dss1 = OpenSSL::Digest::DSS1.new
47
+ [
48
+ [@rsa1024, sha1], [@rsa2048, sha1], [@dsa256, dss1], [@dsa512, dss1],
49
+ ].each{|pk, digest|
50
+ cert = issue_cert(@ca, pk, 1, Time.now, Time.now+3600, exts,
51
+ nil, nil, digest)
52
+ assert_equal(cert.extensions[1].value,
53
+ OpenSSL::TestUtils.get_subject_key_id(cert))
54
+ cert = OpenSSL::X509::Certificate.new(cert.to_der)
55
+ assert_equal(cert.extensions[1].value,
56
+ OpenSSL::TestUtils.get_subject_key_id(cert))
57
+ }
58
+ end
59
+
60
+ def test_validity
61
+ now = Time.now until now && now.usec != 0
62
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
63
+ nil, nil, OpenSSL::Digest::SHA1.new)
64
+ assert_not_equal(now, cert.not_before)
65
+ assert_not_equal(now+3600, cert.not_after)
66
+
67
+ now = Time.at(now.to_i)
68
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
69
+ nil, nil, OpenSSL::Digest::SHA1.new)
70
+ assert_equal(now.getutc, cert.not_before)
71
+ assert_equal((now+3600).getutc, cert.not_after)
72
+
73
+ now = Time.at(0)
74
+ cert = issue_cert(@ca, @rsa2048, 1, now, now, [],
75
+ nil, nil, OpenSSL::Digest::SHA1.new)
76
+ assert_equal(now.getutc, cert.not_before)
77
+ assert_equal(now.getutc, cert.not_after)
78
+
79
+ now = Time.at(0x7fffffff)
80
+ cert = issue_cert(@ca, @rsa2048, 1, now, now, [],
81
+ nil, nil, OpenSSL::Digest::SHA1.new)
82
+ assert_equal(now.getutc, cert.not_before)
83
+ assert_equal(now.getutc, cert.not_after)
84
+ end
85
+
86
+ def test_extension
87
+ ca_exts = [
88
+ ["basicConstraints","CA:TRUE",true],
89
+ ["keyUsage","keyCertSign, cRLSign",true],
90
+ ["subjectKeyIdentifier","hash",false],
91
+ ["authorityKeyIdentifier","keyid:always",false],
92
+ ]
93
+ ca_cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, ca_exts,
94
+ nil, nil, OpenSSL::Digest::SHA1.new)
95
+ ca_cert.extensions.each_with_index{|ext, i|
96
+ assert_equal(ca_exts[i].first, ext.oid)
97
+ assert_equal(ca_exts[i].last, ext.critical?)
98
+ }
99
+
100
+ ee1_exts = [
101
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
102
+ ["subjectKeyIdentifier","hash",false],
103
+ ["authorityKeyIdentifier","keyid:always",false],
104
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
105
+ ["subjectAltName","email:ee1@ruby-lang.org",false],
106
+ ]
107
+ ee1_cert = issue_cert(@ee1, @rsa1024, 2, Time.now, Time.now+1800, ee1_exts,
108
+ ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
109
+ assert_equal(ca_cert.subject.to_der, ee1_cert.issuer.to_der)
110
+ ee1_cert.extensions.each_with_index{|ext, i|
111
+ assert_equal(ee1_exts[i].first, ext.oid)
112
+ assert_equal(ee1_exts[i].last, ext.critical?)
113
+ }
114
+
115
+ ee2_exts = [
116
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
117
+ ["subjectKeyIdentifier","hash",false],
118
+ ["authorityKeyIdentifier","issuer:always",false],
119
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
120
+ ["subjectAltName","email:ee2@ruby-lang.org",false],
121
+ ]
122
+ ee2_cert = issue_cert(@ee2, @rsa1024, 3, Time.now, Time.now+1800, ee2_exts,
123
+ ca_cert, @rsa2048, OpenSSL::Digest::MD5.new)
124
+ assert_equal(ca_cert.subject.to_der, ee2_cert.issuer.to_der)
125
+ ee2_cert.extensions.each_with_index{|ext, i|
126
+ assert_equal(ee2_exts[i].first, ext.oid)
127
+ assert_equal(ee2_exts[i].last, ext.critical?)
128
+ }
129
+
130
+ end
131
+
132
+ def test_sign_and_verify_wrong_key_type
133
+ cert_rsa = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
134
+ nil, nil, OpenSSL::Digest::SHA1.new)
135
+ cert_dsa = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
136
+ nil, nil, OpenSSL::Digest::DSS1.new)
137
+ begin
138
+ assert_equal(false, cert_rsa.verify(@dsa256))
139
+ rescue OpenSSL::X509::CertificateError => e
140
+ # OpenSSL 1.0.0 added checks for pkey OID
141
+ assert_equal('wrong public key type', e.message)
142
+ end
143
+
144
+ begin
145
+ assert_equal(false, cert_dsa.verify(@rsa1024))
146
+ rescue OpenSSL::X509::CertificateError => e
147
+ # OpenSSL 1.0.0 added checks for pkey OID
148
+ assert_equal('wrong public key type', e.message)
149
+ end
150
+ end
151
+
152
+ def test_sign_and_verify
153
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
154
+ nil, nil, OpenSSL::Digest::SHA1.new)
155
+ assert_equal("sha1WithRSAEncryption", cert.signature_algorithm)
156
+ assert_equal(false, cert.verify(@rsa1024))
157
+ assert_equal(true, cert.verify(@rsa2048))
158
+ cert.serial = 2
159
+ assert_equal(false, cert.verify(@rsa2048))
160
+
161
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
162
+ nil, nil, OpenSSL::Digest::MD5.new)
163
+ assert_equal("md5WithRSAEncryption", cert.signature_algorithm)
164
+ assert_equal(false, cert.verify(@rsa1024))
165
+ assert_equal(true, cert.verify(@rsa2048))
166
+ cert.subject = @ee1
167
+ assert_equal(false, cert.verify(@rsa2048))
168
+
169
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
170
+ nil, nil, OpenSSL::Digest::DSS1.new)
171
+ assert_equal("dsaWithSHA1", cert.signature_algorithm)
172
+ assert_equal(false, cert.verify(@dsa256))
173
+ assert_equal(true, cert.verify(@dsa512))
174
+ cert.not_after = Time.now
175
+ assert_equal(false, cert.verify(@dsa512))
176
+
177
+ assert_raise(OpenSSL::X509::CertificateError){
178
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
179
+ nil, nil, OpenSSL::Digest::DSS1.new)
180
+ }
181
+ assert_raise(OpenSSL::X509::CertificateError){
182
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
183
+ nil, nil, OpenSSL::Digest::MD5.new)
184
+ }
185
+ end
186
+
187
+ def test_dsig_algorithm_mismatch
188
+ assert_raise(OpenSSL::X509::CertificateError) do
189
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
190
+ nil, nil, OpenSSL::Digest::DSS1.new)
191
+ end
192
+ assert_raise(OpenSSL::X509::CertificateError) do
193
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
194
+ nil, nil, OpenSSL::Digest::MD5.new)
195
+ end
196
+ end
197
+
198
+ def test_dsa_with_sha2
199
+ begin
200
+ cert = issue_cert(@ca, @dsa256, 1, Time.now, Time.now+3600, [],
201
+ nil, nil, OpenSSL::Digest::SHA256.new)
202
+ assert_equal("dsa_with_SHA256", cert.signature_algorithm)
203
+ rescue OpenSSL::X509::CertificateError
204
+ # dsa_with_sha2 not supported. skip following test.
205
+ return
206
+ end
207
+ # TODO: need more tests for dsa + sha2
208
+
209
+ # SHA1 is allowed from OpenSSL 1.0.0 (0.9.8 requireds DSS1)
210
+ cert = issue_cert(@ca, @dsa256, 1, Time.now, Time.now+3600, [],
211
+ nil, nil, OpenSSL::Digest::SHA1.new)
212
+ assert_equal("dsaWithSHA1", cert.signature_algorithm)
213
+ end
214
+
215
+ def test_check_private_key
216
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
217
+ nil, nil, OpenSSL::Digest::SHA1.new)
218
+ assert_equal(true, cert.check_private_key(@rsa2048))
219
+ end
220
+
221
+ def test_to_text
222
+ cert_pem = <<END
223
+ -----BEGIN CERTIFICATE-----
224
+ MIIC8zCCAdugAwIBAgIBATANBgkqhkiG9w0BAQQFADA9MRMwEQYKCZImiZPyLGQB
225
+ GRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMQswCQYDVQQDDAJDQTAe
226
+ Fw0wOTA1MjMxNTAzNDNaFw0wOTA1MjMxNjAzNDNaMD0xEzARBgoJkiaJk/IsZAEZ
227
+ FgNvcmcxGTAXBgoJkiaJk/IsZAEZFglydWJ5LWxhbmcxCzAJBgNVBAMMAkNBMIIB
228
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuV9ht9J7k4NBs38jOXvvTKY9
229
+ gW8nLICSno5EETR1cuF7i4pNs9I1QJGAFAX0BEO4KbzXmuOvfCpD3CU+Slp1enen
230
+ fzq/t/e/1IRW0wkJUJUFQign4CtrkJL+P07yx18UjyPlBXb81ApEmAB5mrJVSrWm
231
+ qbjs07JbuS4QQGGXLc+Su96DkYKmSNVjBiLxVVSpyZfAY3hD37d60uG+X8xdW5v6
232
+ 8JkRFIhdGlb6JL8fllf/A/blNwdJOhVr9mESHhwGjwfSeTDPfd8ZLE027E5lyAVX
233
+ 9KZYcU00mOX+fdxOSnGqS/8JDRh0EPHDL15RcJjV2J6vZjPb0rOYGDoMcH+94wID
234
+ AQABMA0GCSqGSIb3DQEBBAUAA4IBAQB8UTw1agA9wdXxHMUACduYu6oNL7pdF0dr
235
+ w7a4QPJyj62h4+Umxvp13q0PBw0E+mSjhXMcqUhDLjrmMcvvNGhuh5Sdjbe3GI/M
236
+ 3lCC9OwYYIzzul7omvGC3JEIGfzzdNnPPCPKEWp5X9f0MKLMR79qOf+sjHTjN2BY
237
+ SY3YGsEFxyTXDdqrlaYaOtTAdi/C+g1WxR8fkPLefymVwIFwvyc9/bnp7iBn7Hcw
238
+ mbxtLPbtQ9mURT0GHewZRTGJ1aiTq9Ag3xXME2FPF04eFRd3mclOQZNXKQ+LDxYf
239
+ k0X5FeZvsWf4srFxoVxlcDdJtHh91ZRpDDJYGQlsUm9CPTnO+e4E
240
+ -----END CERTIFICATE-----
241
+ END
242
+
243
+ cert = OpenSSL::X509::Certificate.new(cert_pem)
244
+
245
+ cert_text = <<END
246
+ [0] Version: 3
247
+ SerialNumber: 1
248
+ IssuerDN: DC=org,DC=ruby-lang,CN=CA
249
+ Start Date: Sat May 23 17:03:43 CEST 2009
250
+ Final Date: Sat May 23 18:03:43 CEST 2009
251
+ SubjectDN: DC=org,DC=ruby-lang,CN=CA
252
+ Public Key: RSA Public Key
253
+ modulus: b95f61b7d27b938341b37f23397bef4ca63d816f272c80929e8e4411347572e17b8b8a4db3d2354091801405f40443b829bcd79ae3af7c2a43dc253e4a5a757a77a77f3abfb7f7bfd48456d30909509505422827e02b6b9092fe3f4ef2c75f148f23e50576fcd40a449800799ab2554ab5a6a9b8ecd3b25bb92e104061972dcf92bbde839182a648d5630622f15554a9c997c0637843dfb77ad2e1be5fcc5d5b9bfaf0991114885d1a56fa24bf1f9657ff03f6e53707493a156bf661121e1c068f07d27930cf7ddf192c4d36ec4e65c80557f4a658714d3498e5fe7ddc4e4a71aa4bff090d187410f1c32f5e517098d5d89eaf6633dbd2b398183a0c707fbde3
254
+ public exponent: 10001
255
+
256
+ Signature Algorithm: MD5withRSA
257
+ Signature: 7c513c356a003dc1d5f11cc50009db98bbaa0d2f
258
+ ba5d17476bc3b6b840f2728fada1e3e526c6fa75
259
+ dead0f070d04fa64a385731ca948432e3ae631cb
260
+ ef34686e87949d8db7b7188fccde5082f4ec1860
261
+ 8cf3ba5ee89af182dc910819fcf374d9cf3c23ca
262
+ 116a795fd7f430a2cc47bf6a39ffac8c74e33760
263
+ 58498dd81ac105c724d70ddaab95a61a3ad4c076
264
+ 2fc2fa0d56c51f1f90f2de7f2995c08170bf273d
265
+ fdb9e9ee2067ec773099bc6d2cf6ed43d994453d
266
+ 061dec19453189d5a893abd020df15cc13614f17
267
+ 4e1e15177799c94e419357290f8b0f161f9345f9
268
+ 15e66fb167f8b2b171a15c65703749b4787dd594
269
+ 690c325819096c526f423d39cef9ee04
270
+ END
271
+ assert_not_nil(cert.to_text)
272
+ # This is commented out because it doesn't take timezone into consideration; FIXME
273
+ #assert_equal(cert_text, cert.to_text)
274
+ end
275
+ end
276
+
277
+ end
@@ -0,0 +1,253 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+ class OpenSSL::TestX509CRL < Test::Unit::TestCase
11
+ def setup
12
+ @rsa1024 = OpenSSL::TestUtils::TEST_KEY_RSA1024
13
+ @rsa2048 = OpenSSL::TestUtils::TEST_KEY_RSA2048
14
+ @dsa256 = OpenSSL::TestUtils::TEST_KEY_DSA256
15
+ @dsa512 = OpenSSL::TestUtils::TEST_KEY_DSA512
16
+ @ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
17
+ @ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1")
18
+ @ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2")
19
+ end
20
+
21
+ def teardown
22
+ end
23
+
24
+ def issue_crl(*args)
25
+ OpenSSL::TestUtils.issue_crl(*args)
26
+ end
27
+
28
+ def issue_cert(*args)
29
+ OpenSSL::TestUtils.issue_cert(*args)
30
+ end
31
+
32
+ def test_basic
33
+ now = Time.at(Time.now.to_i)
34
+
35
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
36
+ nil, nil, OpenSSL::Digest::SHA1.new)
37
+ crl = issue_crl([], 1, now, now+1600, [],
38
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
39
+ assert_equal(1, crl.version)
40
+ assert_equal(cert.issuer.to_der, crl.issuer.to_der)
41
+ assert_equal(now, crl.last_update)
42
+ assert_equal(now+1600, crl.next_update)
43
+
44
+ crl = OpenSSL::X509::CRL.new(crl.to_der)
45
+ assert_equal(1, crl.version)
46
+ assert_equal(cert.issuer.to_der, crl.issuer.to_der)
47
+ assert_equal(now, crl.last_update)
48
+ assert_equal(now+1600, crl.next_update)
49
+ end
50
+
51
+ def test_revoked
52
+
53
+ # CRLReason ::= ENUMERATED {
54
+ # unspecified (0),
55
+ # keyCompromise (1),
56
+ # cACompromise (2),
57
+ # affiliationChanged (3),
58
+ # superseded (4),
59
+ # cessationOfOperation (5),
60
+ # certificateHold (6),
61
+ # removeFromCRL (8),
62
+ # privilegeWithdrawn (9),
63
+ # aACompromise (10) }
64
+
65
+ now = Time.at(Time.now.to_i)
66
+ revoke_info = [
67
+ [1, Time.at(0), 1],
68
+ [2, Time.at(0x7fffffff), 2],
69
+ [3, now, 3],
70
+ [4, now, 4],
71
+ [5, now, 5],
72
+ ]
73
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
74
+ nil, nil, OpenSSL::Digest::SHA1.new)
75
+ crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
76
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
77
+ revoked = crl.revoked
78
+ assert_equal(5, revoked.size)
79
+ assert_equal(1, revoked[0].serial)
80
+ assert_equal(2, revoked[1].serial)
81
+ assert_equal(3, revoked[2].serial)
82
+ assert_equal(4, revoked[3].serial)
83
+ assert_equal(5, revoked[4].serial)
84
+
85
+ assert_equal(Time.at(0), revoked[0].time)
86
+ assert_equal(Time.at(0x7fffffff), revoked[1].time)
87
+ assert_equal(now, revoked[2].time)
88
+ assert_equal(now, revoked[3].time)
89
+ assert_equal(now, revoked[4].time)
90
+
91
+ assert_equal("CRLReason", revoked[0].extensions[0].oid)
92
+ assert_equal("CRLReason", revoked[1].extensions[0].oid)
93
+ assert_equal("CRLReason", revoked[2].extensions[0].oid)
94
+ assert_equal("CRLReason", revoked[3].extensions[0].oid)
95
+ assert_equal("CRLReason", revoked[4].extensions[0].oid)
96
+
97
+ assert_equal("Key Compromise", revoked[0].extensions[0].value)
98
+ assert_equal("CA Compromise", revoked[1].extensions[0].value)
99
+ assert_equal("Affiliation Changed", revoked[2].extensions[0].value)
100
+ assert_equal("Superseded", revoked[3].extensions[0].value)
101
+ assert_equal("Cessation Of Operation", revoked[4].extensions[0].value)
102
+
103
+ assert_equal(false, revoked[0].extensions[0].critical?)
104
+ assert_equal(false, revoked[1].extensions[0].critical?)
105
+ assert_equal(false, revoked[2].extensions[0].critical?)
106
+ assert_equal(false, revoked[3].extensions[0].critical?)
107
+ assert_equal(false, revoked[4].extensions[0].critical?)
108
+
109
+ crl = OpenSSL::X509::CRL.new(crl.to_der)
110
+ assert_equal("Key Compromise", revoked[0].extensions[0].value)
111
+ assert_equal("CA Compromise", revoked[1].extensions[0].value)
112
+ assert_equal("Affiliation Changed", revoked[2].extensions[0].value)
113
+ assert_equal("Superseded", revoked[3].extensions[0].value)
114
+ assert_equal("Cessation Of Operation", revoked[4].extensions[0].value)
115
+
116
+ revoke_info = (1..1000).collect{|i| [i, now, 0] }
117
+ crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
118
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
119
+ revoked = crl.revoked
120
+ assert_equal(1000, revoked.size)
121
+ assert_equal(1, revoked[0].serial)
122
+ assert_equal(1000, revoked[999].serial)
123
+ end
124
+
125
+ def test_extension
126
+ cert_exts = [
127
+ ["basicConstraints", "CA:TRUE", true],
128
+ ["subjectKeyIdentifier", "hash", false],
129
+ ["authorityKeyIdentifier", "keyid:always", false],
130
+ ["subjectAltName", "email:xyzzy@ruby-lang.org", false],
131
+ ["keyUsage", "cRLSign, keyCertSign", true],
132
+ ]
133
+ crl_exts = [
134
+ ["authorityKeyIdentifier", "keyid:always", false],
135
+ ["issuerAltName", "issuer:copy", false],
136
+ ]
137
+
138
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, cert_exts,
139
+ nil, nil, OpenSSL::Digest::SHA1.new)
140
+ crl = issue_crl([], 1, Time.now, Time.now+1600, crl_exts,
141
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
142
+ exts = crl.extensions
143
+ assert_equal(3, exts.size)
144
+ assert_equal("1", exts[0].value)
145
+ assert_equal("crlNumber", exts[0].oid)
146
+ assert_equal(false, exts[0].critical?)
147
+
148
+ assert_equal("authorityKeyIdentifier", exts[1].oid)
149
+ keyid = OpenSSL::TestUtils.get_subject_key_id(cert)
150
+ assert_match(/^keyid:#{keyid}/, exts[1].value)
151
+ assert_equal(false, exts[1].critical?)
152
+
153
+ assert_equal("issuerAltName", exts[2].oid)
154
+ assert_equal("email:xyzzy@ruby-lang.org", exts[2].value)
155
+ assert_equal(false, exts[2].critical?)
156
+
157
+ crl = OpenSSL::X509::CRL.new(crl.to_der)
158
+ exts = crl.extensions
159
+ assert_equal(3, exts.size)
160
+ assert_equal("1", exts[0].value)
161
+ assert_equal("crlNumber", exts[0].oid)
162
+ assert_equal(false, exts[0].critical?)
163
+
164
+ assert_equal("authorityKeyIdentifier", exts[1].oid)
165
+ keyid = OpenSSL::TestUtils.get_subject_key_id(cert)
166
+ assert_match(/^keyid:#{keyid}/, exts[1].value)
167
+ assert_equal(false, exts[1].critical?)
168
+
169
+ assert_equal("issuerAltName", exts[2].oid)
170
+ assert_equal("email:xyzzy@ruby-lang.org", exts[2].value)
171
+ assert_equal(false, exts[2].critical?)
172
+ end
173
+
174
+ def test_crlnumber
175
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
176
+ nil, nil, OpenSSL::Digest::SHA1.new)
177
+ crl = issue_crl([], 1, Time.now, Time.now+1600, [],
178
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
179
+ assert_match(1.to_s, crl.extensions[0].value)
180
+ assert_match(/X509v3 CRL Number:\s+#{1}/m, crl.to_text)
181
+
182
+ crl = issue_crl([], 2**32, Time.now, Time.now+1600, [],
183
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
184
+ assert_match((2**32).to_s, crl.extensions[0].value)
185
+ assert_match(/X509v3 CRL Number:\s+#{2**32}/m, crl.to_text)
186
+
187
+ crl = issue_crl([], 2**100, Time.now, Time.now+1600, [],
188
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
189
+ assert_match(/X509v3 CRL Number:\s+#{2**100}/m, crl.to_text)
190
+ assert_match((2**100).to_s, crl.extensions[0].value)
191
+ end
192
+
193
+ def test_sign_and_verify_wrong_key_type
194
+ cert_rsa = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
195
+ nil, nil, OpenSSL::Digest::SHA1.new)
196
+ crl_rsa = issue_crl([], 1, Time.now, Time.now+1600, [],
197
+ cert_rsa, @rsa2048, OpenSSL::Digest::SHA1.new)
198
+ cert_dsa = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
199
+ nil, nil, OpenSSL::Digest::DSS1.new)
200
+ crl_dsa = issue_crl([], 1, Time.now, Time.now+1600, [],
201
+ cert_dsa, @dsa512, OpenSSL::Digest::DSS1.new)
202
+ begin
203
+ assert_equal(false, crl_rsa.verify(@dsa256))
204
+ rescue OpenSSL::X509::CRLError => e
205
+ # OpenSSL 1.0.0 added checks for pkey OID
206
+ assert_equal('wrong public key type', e.message)
207
+ end
208
+
209
+ begin
210
+ assert_equal(false, crl_dsa.verify(@rsa1024))
211
+ rescue OpenSSL::X509::CRLError => e
212
+ # OpenSSL 1.0.0 added checks for pkey OID
213
+ assert_equal('wrong public key type', e.message)
214
+ end
215
+ end
216
+
217
+ def test_sign_and_verify
218
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
219
+ nil, nil, OpenSSL::Digest::SHA1.new)
220
+ crl = issue_crl([], 1, Time.now, Time.now+1600, [],
221
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
222
+ assert_equal(false, crl.verify(@rsa1024))
223
+ assert_equal(true, crl.verify(@rsa2048))
224
+ crl.version = 0
225
+ assert_equal(false, crl.verify(@rsa2048))
226
+
227
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
228
+ nil, nil, OpenSSL::Digest::DSS1.new)
229
+ crl = issue_crl([], 1, Time.now, Time.now+1600, [],
230
+ cert, @dsa512, OpenSSL::Digest::DSS1.new)
231
+ assert_equal(false, crl.verify(@dsa256))
232
+ assert_equal(true, crl.verify(@dsa512))
233
+ crl.version = 0
234
+ assert_equal(false, crl.verify(@dsa512))
235
+ end
236
+
237
+ def test_create_from_pem
238
+ crl = <<END
239
+ -----BEGIN X509 CRL-----
240
+ MIHkME8CAQEwDQYJKoZIhvcNAQEFBQAwDTELMAkGA1UEAwwCY2EXDTA5MDUyMzEw
241
+ MTkyM1oXDTE0MDUyMjEwMTkyM1qgDjAMMAoGA1UdFAQDAgEAMA0GCSqGSIb3DQEB
242
+ BQUAA4GBAGrGXN03TQdoluA5Xjv64We9EOvmE0EviKMeaZ/n8krEwFhUK7Yq3GVD
243
+ BFrb40cdFX1433buCZHG7Tq7eGv8cG1eO5RasuiedurMQXmVRDTDjGor/58Dk/Wy
244
+ owO/GR8ASm6Fx6AUKEgLAaoaaptpaWtEB+N4uaGvc0LFO9WY+ZMq
245
+ -----END X509 CRL-----
246
+ END
247
+ crl = OpenSSL::X509::CRL.new(crl)
248
+ assert_equal(1, crl.version)
249
+ assert_equal(OpenSSL::X509::Name.parse("/CN=ca").to_der, crl.issuer.to_der)
250
+ end
251
+ end
252
+
253
+ end