jruby-openssl-maven 0.7.4.1

Sign up to get free protection for your applications and to get access to all the features.
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