pftg-jruby-openssl 0.5.3

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 (58) hide show
  1. data/History.txt +48 -0
  2. data/License.txt +30 -0
  3. data/README.txt +24 -0
  4. data/lib/bcmail-jdk14-139.jar +0 -0
  5. data/lib/bcprov-jdk14-139.jar +0 -0
  6. data/lib/jopenssl.jar +0 -0
  7. data/lib/jopenssl/version.rb +5 -0
  8. data/lib/openssl.rb +24 -0
  9. data/lib/openssl/bn.rb +33 -0
  10. data/lib/openssl/buffering.rb +239 -0
  11. data/lib/openssl/cipher.rb +56 -0
  12. data/lib/openssl/digest.rb +46 -0
  13. data/lib/openssl/dummy.rb +34 -0
  14. data/lib/openssl/dummyssl.rb +13 -0
  15. data/lib/openssl/ssl.rb +135 -0
  16. data/lib/openssl/x509.rb +154 -0
  17. data/test/fixture/cacert.pem +23 -0
  18. data/test/fixture/cert_localhost.pem +19 -0
  19. data/test/fixture/common.pem +48 -0
  20. data/test/fixture/localhost_keypair.pem +18 -0
  21. data/test/fixture/max.pem +29 -0
  22. data/test/openssl/ssl_server.rb +99 -0
  23. data/test/openssl/test_asn1.rb +199 -0
  24. data/test/openssl/test_cipher.rb +196 -0
  25. data/test/openssl/test_digest.rb +88 -0
  26. data/test/openssl/test_hmac.rb +44 -0
  27. data/test/openssl/test_ns_spki.rb +69 -0
  28. data/test/openssl/test_pair.rb +149 -0
  29. data/test/openssl/test_pkcs7.rb +159 -0
  30. data/test/openssl/test_pkey_rsa.rb +49 -0
  31. data/test/openssl/test_ssl.rb +413 -0
  32. data/test/openssl/test_x509cert.rb +236 -0
  33. data/test/openssl/test_x509crl.rb +234 -0
  34. data/test/openssl/test_x509ext.rb +95 -0
  35. data/test/openssl/test_x509name.rb +265 -0
  36. data/test/openssl/test_x509req.rb +178 -0
  37. data/test/openssl/test_x509store.rb +245 -0
  38. data/test/openssl/utils.rb +135 -0
  39. data/test/pkcs7_mime_enveloped.message +19 -0
  40. data/test/pkcs7_mime_signed.message +30 -0
  41. data/test/pkcs7_multipart_signed.message +45 -0
  42. data/test/ref/a.out +0 -0
  43. data/test/ref/compile.rb +8 -0
  44. data/test/ref/pkcs1 +0 -0
  45. data/test/ref/pkcs1.c +21 -0
  46. data/test/test_cipher.rb +90 -0
  47. data/test/test_integration.rb +100 -0
  48. data/test/test_java.rb +98 -0
  49. data/test/test_java_attribute.rb +25 -0
  50. data/test/test_java_bio.rb +42 -0
  51. data/test/test_java_mime.rb +173 -0
  52. data/test/test_java_pkcs7.rb +769 -0
  53. data/test/test_java_smime.rb +177 -0
  54. data/test/test_openssl.rb +34 -0
  55. data/test/test_openssl_x509.rb +34 -0
  56. data/test/test_pkey.rb +46 -0
  57. data/test/ut_eof.rb +128 -0
  58. metadata +124 -0
@@ -0,0 +1,236 @@
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,OpenSSL::TestUtils.get_subject_key_id(cert))
53
+ cert = OpenSSL::X509::Certificate.new(cert.to_der)
54
+ assert_equal(cert.extensions[1].value,
55
+ OpenSSL::TestUtils.get_subject_key_id(cert))
56
+ }
57
+ end
58
+
59
+ def test_validity
60
+ now = Time.now until now && now.usec != 0
61
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
62
+ nil, nil, OpenSSL::Digest::SHA1.new)
63
+ assert_not_equal(now, cert.not_before)
64
+ assert_not_equal(now+3600, cert.not_after)
65
+
66
+ now = Time.at(now.to_i)
67
+ cert = issue_cert(@ca, @rsa2048, 1, now, now+3600, [],
68
+ nil, nil, OpenSSL::Digest::SHA1.new)
69
+ assert_equal(now.getutc, cert.not_before)
70
+ assert_equal((now+3600).getutc, cert.not_after)
71
+
72
+ now = Time.at(0)
73
+ cert = issue_cert(@ca, @rsa2048, 1, now, now, [],
74
+ nil, nil, OpenSSL::Digest::SHA1.new)
75
+ assert_equal(now.getutc, cert.not_before)
76
+ assert_equal(now.getutc, cert.not_after)
77
+
78
+ now = Time.at(0x7fffffff)
79
+ cert = issue_cert(@ca, @rsa2048, 1, now, now, [],
80
+ nil, nil, OpenSSL::Digest::SHA1.new)
81
+ assert_equal(now.getutc, cert.not_before)
82
+ assert_equal(now.getutc, cert.not_after)
83
+ end
84
+
85
+ def test_extension
86
+ ca_exts = [
87
+ ["basicConstraints","CA:TRUE",true],
88
+ ["keyUsage","keyCertSign, cRLSign",true],
89
+ ["subjectKeyIdentifier","hash",false],
90
+ ["authorityKeyIdentifier","keyid:always",false],
91
+ ]
92
+ ca_cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, ca_exts,
93
+ nil, nil, OpenSSL::Digest::SHA1.new)
94
+ ca_cert.extensions.each_with_index{|ext, i|
95
+ assert_equal(ca_exts[i].first, ext.oid)
96
+ assert_equal(ca_exts[i].last, ext.critical?)
97
+ }
98
+
99
+ ee1_exts = [
100
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
101
+ ["subjectKeyIdentifier","hash",false],
102
+ ["authorityKeyIdentifier","keyid:always",false],
103
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
104
+ ["subjectAltName","email:ee1@ruby-lang.org",false],
105
+ ]
106
+ ee1_cert = issue_cert(@ee1, @rsa1024, 2, Time.now, Time.now+1800, ee1_exts,
107
+ ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
108
+ assert_equal(ca_cert.subject.to_der, ee1_cert.issuer.to_der)
109
+ ee1_cert.extensions.each_with_index{|ext, i|
110
+ assert_equal(ee1_exts[i].first, ext.oid)
111
+ assert_equal(ee1_exts[i].last, ext.critical?)
112
+ }
113
+
114
+ ee2_exts = [
115
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
116
+ ["subjectKeyIdentifier","hash",false],
117
+ ["authorityKeyIdentifier","issuer:always",false],
118
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
119
+ ["subjectAltName","email:ee2@ruby-lang.org",false],
120
+ ]
121
+ ee2_cert = issue_cert(@ee2, @rsa1024, 3, Time.now, Time.now+1800, ee2_exts,
122
+ ca_cert, @rsa2048, OpenSSL::Digest::MD5.new)
123
+ assert_equal(ca_cert.subject.to_der, ee2_cert.issuer.to_der)
124
+ ee2_cert.extensions.each_with_index{|ext, i|
125
+ assert_equal(ee2_exts[i].first, ext.oid)
126
+ assert_equal(ee2_exts[i].last, ext.critical?)
127
+ }
128
+
129
+ end
130
+
131
+ def test_sign_and_verify
132
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
133
+ nil, nil, OpenSSL::Digest::SHA1.new)
134
+ assert_equal(false, cert.verify(@rsa1024))
135
+ assert_equal(true, cert.verify(@rsa2048))
136
+ assert_equal(false, cert.verify(@dsa256))
137
+ assert_equal(false, cert.verify(@dsa512))
138
+ cert.serial = 2
139
+ assert_equal(false, cert.verify(@rsa2048))
140
+
141
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
142
+ nil, nil, OpenSSL::Digest::MD5.new)
143
+ assert_equal(false, cert.verify(@rsa1024))
144
+ assert_equal(true, cert.verify(@rsa2048))
145
+ assert_equal(false, cert.verify(@dsa256))
146
+ assert_equal(false, cert.verify(@dsa512))
147
+ cert.subject = @ee1
148
+ assert_equal(false, cert.verify(@rsa2048))
149
+
150
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
151
+ nil, nil, OpenSSL::Digest::DSS1.new)
152
+ assert_equal(false, cert.verify(@rsa1024))
153
+ assert_equal(false, cert.verify(@rsa2048))
154
+ assert_equal(false, cert.verify(@dsa256))
155
+ assert_equal(true, cert.verify(@dsa512))
156
+ cert.not_after = Time.now
157
+ assert_equal(false, cert.verify(@dsa512))
158
+
159
+ assert_raises(OpenSSL::X509::CertificateError){
160
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
161
+ nil, nil, OpenSSL::Digest::DSS1.new)
162
+ }
163
+ assert_raises(OpenSSL::X509::CertificateError){
164
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
165
+ nil, nil, OpenSSL::Digest::MD5.new)
166
+ }
167
+ assert_raises(OpenSSL::X509::CertificateError){
168
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
169
+ nil, nil, OpenSSL::Digest::SHA1.new)
170
+ }
171
+ end
172
+
173
+ def test_check_private_key
174
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
175
+ nil, nil, OpenSSL::Digest::SHA1.new)
176
+ assert_equal(true, cert.check_private_key(@rsa2048))
177
+ end
178
+
179
+ def test_to_text
180
+ cert_pem = <<END
181
+ -----BEGIN CERTIFICATE-----
182
+ MIIC8zCCAdugAwIBAgIBATANBgkqhkiG9w0BAQQFADA9MRMwEQYKCZImiZPyLGQB
183
+ GRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMQswCQYDVQQDDAJDQTAe
184
+ Fw0wOTA1MjMxNTAzNDNaFw0wOTA1MjMxNjAzNDNaMD0xEzARBgoJkiaJk/IsZAEZ
185
+ FgNvcmcxGTAXBgoJkiaJk/IsZAEZFglydWJ5LWxhbmcxCzAJBgNVBAMMAkNBMIIB
186
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuV9ht9J7k4NBs38jOXvvTKY9
187
+ gW8nLICSno5EETR1cuF7i4pNs9I1QJGAFAX0BEO4KbzXmuOvfCpD3CU+Slp1enen
188
+ fzq/t/e/1IRW0wkJUJUFQign4CtrkJL+P07yx18UjyPlBXb81ApEmAB5mrJVSrWm
189
+ qbjs07JbuS4QQGGXLc+Su96DkYKmSNVjBiLxVVSpyZfAY3hD37d60uG+X8xdW5v6
190
+ 8JkRFIhdGlb6JL8fllf/A/blNwdJOhVr9mESHhwGjwfSeTDPfd8ZLE027E5lyAVX
191
+ 9KZYcU00mOX+fdxOSnGqS/8JDRh0EPHDL15RcJjV2J6vZjPb0rOYGDoMcH+94wID
192
+ AQABMA0GCSqGSIb3DQEBBAUAA4IBAQB8UTw1agA9wdXxHMUACduYu6oNL7pdF0dr
193
+ w7a4QPJyj62h4+Umxvp13q0PBw0E+mSjhXMcqUhDLjrmMcvvNGhuh5Sdjbe3GI/M
194
+ 3lCC9OwYYIzzul7omvGC3JEIGfzzdNnPPCPKEWp5X9f0MKLMR79qOf+sjHTjN2BY
195
+ SY3YGsEFxyTXDdqrlaYaOtTAdi/C+g1WxR8fkPLefymVwIFwvyc9/bnp7iBn7Hcw
196
+ mbxtLPbtQ9mURT0GHewZRTGJ1aiTq9Ag3xXME2FPF04eFRd3mclOQZNXKQ+LDxYf
197
+ k0X5FeZvsWf4srFxoVxlcDdJtHh91ZRpDDJYGQlsUm9CPTnO+e4E
198
+ -----END CERTIFICATE-----
199
+ END
200
+
201
+ cert = OpenSSL::X509::Certificate.new(cert_pem)
202
+
203
+ cert_text = <<END
204
+ [0] Version: 3
205
+ SerialNumber: 1
206
+ IssuerDN: DC=org,DC=ruby-lang,CN=CA
207
+ Start Date: Sat May 23 17:03:43 CEST 2009
208
+ Final Date: Sat May 23 18:03:43 CEST 2009
209
+ SubjectDN: DC=org,DC=ruby-lang,CN=CA
210
+ Public Key: RSA Public Key
211
+ modulus: b95f61b7d27b938341b37f23397bef4ca63d816f272c80929e8e4411347572e17b8b8a4db3d2354091801405f40443b829bcd79ae3af7c2a43dc253e4a5a757a77a77f3abfb7f7bfd48456d30909509505422827e02b6b9092fe3f4ef2c75f148f23e50576fcd40a449800799ab2554ab5a6a9b8ecd3b25bb92e104061972dcf92bbde839182a648d5630622f15554a9c997c0637843dfb77ad2e1be5fcc5d5b9bfaf0991114885d1a56fa24bf1f9657ff03f6e53707493a156bf661121e1c068f07d27930cf7ddf192c4d36ec4e65c80557f4a658714d3498e5fe7ddc4e4a71aa4bff090d187410f1c32f5e517098d5d89eaf6633dbd2b398183a0c707fbde3
212
+ public exponent: 10001
213
+
214
+ Signature Algorithm: MD5withRSA
215
+ Signature: 7c513c356a003dc1d5f11cc50009db98bbaa0d2f
216
+ ba5d17476bc3b6b840f2728fada1e3e526c6fa75
217
+ dead0f070d04fa64a385731ca948432e3ae631cb
218
+ ef34686e87949d8db7b7188fccde5082f4ec1860
219
+ 8cf3ba5ee89af182dc910819fcf374d9cf3c23ca
220
+ 116a795fd7f430a2cc47bf6a39ffac8c74e33760
221
+ 58498dd81ac105c724d70ddaab95a61a3ad4c076
222
+ 2fc2fa0d56c51f1f90f2de7f2995c08170bf273d
223
+ fdb9e9ee2067ec773099bc6d2cf6ed43d994453d
224
+ 061dec19453189d5a893abd020df15cc13614f17
225
+ 4e1e15177799c94e419357290f8b0f161f9345f9
226
+ 15e66fb167f8b2b171a15c65703749b4787dd594
227
+ 690c325819096c526f423d39cef9ee04
228
+ END
229
+ assert_not_nil(cert.to_text)
230
+ # This is commented out because it doesn't take timezone into consideration; FIXME
231
+ #assert_equal(cert_text, cert.to_text)
232
+ end
233
+
234
+ end
235
+
236
+ end
@@ -0,0 +1,234 @@
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
194
+ cert = issue_cert(@ca, @rsa2048, 1, Time.now, Time.now+3600, [],
195
+ nil, nil, OpenSSL::Digest::SHA1.new)
196
+ crl = issue_crl([], 1, Time.now, Time.now+1600, [],
197
+ cert, @rsa2048, OpenSSL::Digest::SHA1.new)
198
+ assert_equal(false, crl.verify(@rsa1024))
199
+ assert_equal(true, crl.verify(@rsa2048))
200
+ assert_equal(false, crl.verify(@dsa256))
201
+ assert_equal(false, crl.verify(@dsa512))
202
+ crl.version = 0
203
+ assert_equal(false, crl.verify(@rsa2048))
204
+
205
+ cert = issue_cert(@ca, @dsa512, 1, Time.now, Time.now+3600, [],
206
+ nil, nil, OpenSSL::Digest::DSS1.new)
207
+ crl = issue_crl([], 1, Time.now, Time.now+1600, [],
208
+ cert, @dsa512, OpenSSL::Digest::DSS1.new)
209
+ assert_equal(false, crl.verify(@rsa1024))
210
+ assert_equal(false, crl.verify(@rsa2048))
211
+ assert_equal(false, crl.verify(@dsa256))
212
+ assert_equal(true, crl.verify(@dsa512))
213
+ crl.version = 0
214
+ assert_equal(false, crl.verify(@dsa512))
215
+ end
216
+
217
+ def test_create_from_pem
218
+ crl = <<END
219
+ -----BEGIN X509 CRL-----
220
+ MIHkME8CAQEwDQYJKoZIhvcNAQEFBQAwDTELMAkGA1UEAwwCY2EXDTA5MDUyMzEw
221
+ MTkyM1oXDTE0MDUyMjEwMTkyM1qgDjAMMAoGA1UdFAQDAgEAMA0GCSqGSIb3DQEB
222
+ BQUAA4GBAGrGXN03TQdoluA5Xjv64We9EOvmE0EviKMeaZ/n8krEwFhUK7Yq3GVD
223
+ BFrb40cdFX1433buCZHG7Tq7eGv8cG1eO5RasuiedurMQXmVRDTDjGor/58Dk/Wy
224
+ owO/GR8ASm6Fx6AUKEgLAaoaaptpaWtEB+N4uaGvc0LFO9WY+ZMq
225
+ -----END X509 CRL-----
226
+ END
227
+ crl = OpenSSL::X509::CRL.new(crl)
228
+ assert_equal(1, crl.version)
229
+ assert_equal(OpenSSL::X509::Name.parse("/CN=ca").to_der, crl.issuer.to_der)
230
+ end
231
+
232
+ end
233
+
234
+ end