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,246 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "test/unit"
7
+ require "tempfile"
8
+
9
+ if defined?(OpenSSL)
10
+
11
+ class OpenSSL::TestX509Store < Test::Unit::TestCase
12
+ def setup
13
+ @rsa1024 = OpenSSL::TestUtils::TEST_KEY_RSA1024
14
+ @rsa2048 = OpenSSL::TestUtils::TEST_KEY_RSA2048
15
+ @dsa256 = OpenSSL::TestUtils::TEST_KEY_DSA256
16
+ @dsa512 = OpenSSL::TestUtils::TEST_KEY_DSA512
17
+ @ca1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA1")
18
+ @ca2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA2")
19
+ @ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1")
20
+ @ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2")
21
+ end
22
+
23
+ def teardown
24
+ end
25
+
26
+ def issue_cert(*args)
27
+ OpenSSL::TestUtils.issue_cert(*args)
28
+ end
29
+
30
+ def issue_crl(*args)
31
+ OpenSSL::TestUtils.issue_crl(*args)
32
+ end
33
+
34
+ def test_verify
35
+ now = Time.at(Time.now.to_i)
36
+ ca_exts = [
37
+ ["basicConstraints","CA:TRUE",true],
38
+ ["keyUsage","cRLSign,keyCertSign",true],
39
+ ]
40
+ ee_exts = [
41
+ ["keyUsage","keyEncipherment,digitalSignature",true],
42
+ ]
43
+ ca1_cert = issue_cert(@ca1, @rsa2048, 1, now, now+3600, ca_exts,
44
+ nil, nil, OpenSSL::Digest::SHA1.new)
45
+ ca2_cert = issue_cert(@ca2, @rsa1024, 2, now, now+1800, ca_exts,
46
+ ca1_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
47
+ ee1_cert = issue_cert(@ee1, @dsa256, 10, now, now+1800, ee_exts,
48
+ ca2_cert, @rsa1024, OpenSSL::Digest::SHA1.new)
49
+ ee2_cert = issue_cert(@ee2, @dsa512, 20, now, now+1800, ee_exts,
50
+ ca2_cert, @rsa1024, OpenSSL::Digest::SHA1.new)
51
+ ee3_cert = issue_cert(@ee2, @dsa512, 30, now-100, now-1, ee_exts,
52
+ ca2_cert, @rsa1024, OpenSSL::Digest::SHA1.new)
53
+ ee4_cert = issue_cert(@ee2, @dsa512, 40, now+1000, now+2000, ee_exts,
54
+ ca2_cert, @rsa1024, OpenSSL::Digest::SHA1.new)
55
+
56
+ revoke_info = []
57
+ crl1 = issue_crl(revoke_info, 1, now, now+1800, [],
58
+ ca1_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
59
+ revoke_info = [ [2, now, 1], ]
60
+ crl1_2 = issue_crl(revoke_info, 2, now, now+1800, [],
61
+ ca1_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
62
+ revoke_info = [ [20, now, 1], ]
63
+ crl2 = issue_crl(revoke_info, 1, now, now+1800, [],
64
+ ca2_cert, @rsa1024, OpenSSL::Digest::SHA1.new)
65
+ revoke_info = []
66
+ crl2_2 = issue_crl(revoke_info, 2, now-100, now-1, [],
67
+ ca2_cert, @rsa1024, OpenSSL::Digest::SHA1.new)
68
+
69
+ assert(true, ca1_cert.verify(ca1_cert.public_key)) # self signed
70
+ assert(true, ca2_cert.verify(ca1_cert.public_key)) # issued by ca1
71
+ assert(true, ee1_cert.verify(ca2_cert.public_key)) # issued by ca2
72
+ assert(true, ee2_cert.verify(ca2_cert.public_key)) # issued by ca2
73
+ assert(true, ee3_cert.verify(ca2_cert.public_key)) # issued by ca2
74
+ assert(true, crl1.verify(ca1_cert.public_key)) # issued by ca1
75
+ assert(true, crl1_2.verify(ca1_cert.public_key)) # issued by ca1
76
+ assert(true, crl2.verify(ca2_cert.public_key)) # issued by ca2
77
+ assert(true, crl2_2.verify(ca2_cert.public_key)) # issued by ca2
78
+
79
+ store = OpenSSL::X509::Store.new
80
+ assert_equal(false, store.verify(ca1_cert))
81
+ assert_not_equal(OpenSSL::X509::V_OK, store.error)
82
+
83
+ assert_equal(false, store.verify(ca2_cert))
84
+ assert_not_equal(OpenSSL::X509::V_OK, store.error)
85
+
86
+ store.add_cert(ca1_cert)
87
+ assert_equal(true, store.verify(ca2_cert))
88
+ assert_equal(OpenSSL::X509::V_OK, store.error)
89
+ assert_equal("ok", store.error_string)
90
+ chain = store.chain
91
+ assert_equal(2, chain.size)
92
+ assert_equal(@ca2.to_der, chain[0].subject.to_der)
93
+ assert_equal(@ca1.to_der, chain[1].subject.to_der)
94
+
95
+ store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
96
+ assert_equal(false, store.verify(ca2_cert))
97
+ assert_not_equal(OpenSSL::X509::V_OK, store.error)
98
+
99
+ store.purpose = OpenSSL::X509::PURPOSE_CRL_SIGN
100
+ assert_equal(true, store.verify(ca2_cert))
101
+ assert_equal(OpenSSL::X509::V_OK, store.error)
102
+
103
+ store.add_cert(ca2_cert)
104
+ store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
105
+ assert_equal(true, store.verify(ee1_cert))
106
+ assert_equal(true, store.verify(ee2_cert))
107
+ assert_equal(OpenSSL::X509::V_OK, store.error)
108
+ assert_equal("ok", store.error_string)
109
+ chain = store.chain
110
+ assert_equal(3, chain.size)
111
+ assert_equal(@ee2.to_der, chain[0].subject.to_der)
112
+ assert_equal(@ca2.to_der, chain[1].subject.to_der)
113
+ assert_equal(@ca1.to_der, chain[2].subject.to_der)
114
+ assert_equal(false, store.verify(ee3_cert))
115
+ assert_equal(OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED, store.error)
116
+ assert_match(/expire/i, store.error_string)
117
+ assert_equal(false, store.verify(ee4_cert))
118
+ assert_equal(OpenSSL::X509::V_ERR_CERT_NOT_YET_VALID, store.error)
119
+ assert_match(/not yet valid/i, store.error_string)
120
+
121
+ store = OpenSSL::X509::Store.new
122
+ store.add_cert(ca1_cert)
123
+ store.add_cert(ca2_cert)
124
+ store.time = now + 1500
125
+ assert_equal(true, store.verify(ca1_cert))
126
+ assert_equal(true, store.verify(ca2_cert))
127
+ assert_equal(true, store.verify(ee4_cert))
128
+ store.time = now + 1900
129
+ assert_equal(true, store.verify(ca1_cert))
130
+ assert_equal(false, store.verify(ca2_cert))
131
+ assert_equal(OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED, store.error)
132
+ assert_equal(false, store.verify(ee4_cert))
133
+ assert_equal(OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED, store.error)
134
+ store.time = now + 4000
135
+ assert_equal(false, store.verify(ee1_cert))
136
+ assert_equal(OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED, store.error)
137
+ assert_equal(false, store.verify(ee4_cert))
138
+ assert_equal(OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED, store.error)
139
+
140
+ # the underlying X509 struct caches the result of the last
141
+ # verification for signature and not-before. so the following code
142
+ # rebuilds new objects to avoid site effect.
143
+ store.time = Time.now - 4000
144
+ assert_equal(false, store.verify(OpenSSL::X509::Certificate.new(ca2_cert)))
145
+ assert_equal(OpenSSL::X509::V_ERR_CERT_NOT_YET_VALID, store.error)
146
+ assert_equal(false, store.verify(OpenSSL::X509::Certificate.new(ee1_cert)))
147
+ assert_equal(OpenSSL::X509::V_ERR_CERT_NOT_YET_VALID, store.error)
148
+
149
+ return unless defined?(OpenSSL::X509::V_FLAG_CRL_CHECK)
150
+
151
+ store = OpenSSL::X509::Store.new
152
+ store.purpose = OpenSSL::X509::PURPOSE_ANY
153
+ store.flags = OpenSSL::X509::V_FLAG_CRL_CHECK
154
+ store.add_cert(ca1_cert)
155
+ store.add_crl(crl1) # revoke no cert
156
+ store.add_crl(crl2) # revoke ee2_cert
157
+ assert_equal(true, store.verify(ca1_cert))
158
+ assert_equal(true, store.verify(ca2_cert))
159
+ assert_equal(true, store.verify(ee1_cert, [ca2_cert]))
160
+ assert_equal(false, store.verify(ee2_cert, [ca2_cert]))
161
+
162
+ store = OpenSSL::X509::Store.new
163
+ store.purpose = OpenSSL::X509::PURPOSE_ANY
164
+ store.flags = OpenSSL::X509::V_FLAG_CRL_CHECK
165
+ store.add_cert(ca1_cert)
166
+ store.add_crl(crl1_2) # revoke ca2_cert
167
+ store.add_crl(crl2) # revoke ee2_cert
168
+ assert_equal(true, store.verify(ca1_cert))
169
+ assert_equal(false, store.verify(ca2_cert))
170
+ assert_equal(true, store.verify(ee1_cert, [ca2_cert]),
171
+ "This test is expected to be success with OpenSSL 0.9.7c or later.")
172
+ assert_equal(false, store.verify(ee2_cert, [ca2_cert]))
173
+
174
+ store.flags =
175
+ OpenSSL::X509::V_FLAG_CRL_CHECK|OpenSSL::X509::V_FLAG_CRL_CHECK_ALL
176
+ assert_equal(true, store.verify(ca1_cert))
177
+ assert_equal(false, store.verify(ca2_cert))
178
+ assert_equal(false, store.verify(ee1_cert, [ca2_cert]))
179
+ assert_equal(false, store.verify(ee2_cert, [ca2_cert]))
180
+
181
+ store = OpenSSL::X509::Store.new
182
+ store.purpose = OpenSSL::X509::PURPOSE_ANY
183
+ store.flags =
184
+ OpenSSL::X509::V_FLAG_CRL_CHECK|OpenSSL::X509::V_FLAG_CRL_CHECK_ALL
185
+ store.add_cert(ca1_cert)
186
+ store.add_cert(ca2_cert)
187
+ store.add_crl(crl1)
188
+ store.add_crl(crl2_2) # issued by ca2 but expired.
189
+ assert_equal(true, store.verify(ca1_cert))
190
+ assert_equal(true, store.verify(ca2_cert))
191
+ assert_equal(false, store.verify(ee1_cert))
192
+ assert_equal(OpenSSL::X509::V_ERR_CRL_HAS_EXPIRED, store.error)
193
+ assert_equal(false, store.verify(ee2_cert))
194
+ end
195
+
196
+ def test_set_errors
197
+ now = Time.now
198
+ ca1_cert = issue_cert(@ca1, @rsa2048, 1, now, now+3600, [],
199
+ nil, nil, OpenSSL::Digest::SHA1.new)
200
+ store = OpenSSL::X509::Store.new
201
+ store.add_cert(ca1_cert)
202
+ assert_raise(OpenSSL::X509::StoreError){
203
+ store.add_cert(ca1_cert) # add same certificate twice
204
+ }
205
+
206
+ revoke_info = []
207
+ crl1 = issue_crl(revoke_info, 1, now, now+1800, [],
208
+ ca1_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
209
+ revoke_info = [ [2, now, 1], ]
210
+ crl2 = issue_crl(revoke_info, 2, now+1800, now+3600, [],
211
+ ca1_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
212
+ store.add_crl(crl1)
213
+ assert_raise(OpenSSL::X509::StoreError){
214
+ store.add_crl(crl2) # add CRL issued by same CA twice.
215
+ }
216
+ end
217
+
218
+ def test_add_file
219
+ ca1_cert = <<END
220
+ -----BEGIN CERTIFICATE-----
221
+ MIIBzzCCATigAwIBAgIBATANBgkqhkiG9w0BAQUFADANMQswCQYDVQQDDAJjYTAe
222
+ Fw0wOTA1MjIxMDE5MjNaFw0xNDA1MjExMDE5MjNaMA0xCzAJBgNVBAMMAmNhMIGf
223
+ MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcTL520vsbXHXPfkHKrcgWbk2zVf0y
224
+ oK7bPg06kjCghs8KYsi9b/tT9KpkpejD0KucDBSmDILD3PvIWrNFcBRWf6ZC5vA5
225
+ YuF6ueATuFhsXjUFuNLqyPcIX+XrOQmXgjiyO9nc5vzQwWRRhdyyT8DgCRUD/yHW
226
+ pjD2ZEGIAVLY/wIDAQABoz8wPTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQf
227
+ 923P/SgiCcbiN20bbmuFM6SLxzALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEFBQAD
228
+ gYEAE0CpCo8MxhfUNWMHF5GsGEG2+1LdE+aUX7gSb6d4vn1WjusrM2FoOFTomt32
229
+ YPqJwMEbcqILq2v9Kkao4QNJRlK+z1xpRDnt1iBrHdXrYJFvYnfMqv3z7XAFPfQZ
230
+ yMP+P2sR0jPzy4UNZfDIMmMUqQdhkz7onKWOGjXwLEtkCMs=
231
+ -----END CERTIFICATE-----
232
+ END
233
+
234
+ f = Tempfile.new("ca1_cert")
235
+ f << ca1_cert
236
+ f.close
237
+
238
+ store = OpenSSL::X509::Store.new
239
+ store.add_file(f.path)
240
+ assert_equal(true, store.verify(OpenSSL::X509::Certificate.new(ca1_cert)))
241
+ f.unlink
242
+ end
243
+
244
+ end
245
+
246
+ end
@@ -0,0 +1,144 @@
1
+ require "openssl"
2
+ require "test/unit"
3
+
4
+ module OpenSSL::TestUtils
5
+ TEST_KEY_RSA1024 = OpenSSL::PKey::RSA.new <<-_end_of_pem_
6
+ -----BEGIN RSA PRIVATE KEY-----
7
+ MIICXgIBAAKBgQDLwsSw1ECnPtT+PkOgHhcGA71nwC2/nL85VBGnRqDxOqjVh7Cx
8
+ aKPERYHsk4BPCkE3brtThPWc9kjHEQQ7uf9Y1rbCz0layNqHyywQEVLFmp1cpIt/
9
+ Q3geLv8ZD9pihowKJDyMDiN6ArYUmZczvW4976MU3+l54E6lF/JfFEU5hwIDAQAB
10
+ AoGBAKSl/MQarye1yOysqX6P8fDFQt68VvtXkNmlSiKOGuzyho0M+UVSFcs6k1L0
11
+ maDE25AMZUiGzuWHyaU55d7RXDgeskDMakD1v6ZejYtxJkSXbETOTLDwUWTn618T
12
+ gnb17tU1jktUtU67xK/08i/XodlgnQhs6VoHTuCh3Hu77O6RAkEA7+gxqBuZR572
13
+ 74/akiW/SuXm0SXPEviyO1MuSRwtI87B02D0qgV8D1UHRm4AhMnJ8MCs1809kMQE
14
+ JiQUCrp9mQJBANlt2ngBO14us6NnhuAseFDTBzCHXwUUu1YKHpMMmxpnGqaldGgX
15
+ sOZB3lgJsT9VlGf3YGYdkLTNVbogQKlKpB8CQQDiSwkb4vyQfDe8/NpU5Not0fII
16
+ 8jsDUCb+opWUTMmfbxWRR3FBNu8wnym/m19N4fFj8LqYzHX4KY0oVPu6qvJxAkEA
17
+ wa5snNekFcqONLIE4G5cosrIrb74sqL8GbGb+KuTAprzj5z1K8Bm0UW9lTjVDjDi
18
+ qRYgZfZSL+x1P/54+xTFSwJAY1FxA/N3QPCXCjPh5YqFxAMQs2VVYTfg+t0MEcJD
19
+ dPMQD5JX6g5HKnHFg2mZtoXQrWmJSn7p8GJK8yNTopEErA==
20
+ -----END RSA PRIVATE KEY-----
21
+ _end_of_pem_
22
+
23
+ TEST_KEY_RSA2048 = OpenSSL::PKey::RSA.new <<-_end_of_pem_
24
+ -----BEGIN RSA PRIVATE KEY-----
25
+ MIIEpAIBAAKCAQEAuV9ht9J7k4NBs38jOXvvTKY9gW8nLICSno5EETR1cuF7i4pN
26
+ s9I1QJGAFAX0BEO4KbzXmuOvfCpD3CU+Slp1enenfzq/t/e/1IRW0wkJUJUFQign
27
+ 4CtrkJL+P07yx18UjyPlBXb81ApEmAB5mrJVSrWmqbjs07JbuS4QQGGXLc+Su96D
28
+ kYKmSNVjBiLxVVSpyZfAY3hD37d60uG+X8xdW5v68JkRFIhdGlb6JL8fllf/A/bl
29
+ NwdJOhVr9mESHhwGjwfSeTDPfd8ZLE027E5lyAVX9KZYcU00mOX+fdxOSnGqS/8J
30
+ DRh0EPHDL15RcJjV2J6vZjPb0rOYGDoMcH+94wIDAQABAoIBAAzsamqfYQAqwXTb
31
+ I0CJtGg6msUgU7HVkOM+9d3hM2L791oGHV6xBAdpXW2H8LgvZHJ8eOeSghR8+dgq
32
+ PIqAffo4x1Oma+FOg3A0fb0evyiACyrOk+EcBdbBeLo/LcvahBtqnDfiUMQTpy6V
33
+ seSoFCwuN91TSCeGIsDpRjbG1vxZgtx+uI+oH5+ytqJOmfCksRDCkMglGkzyfcl0
34
+ Xc5CUhIJ0my53xijEUQl19rtWdMnNnnkdbG8PT3LZlOta5Do86BElzUYka0C6dUc
35
+ VsBDQ0Nup0P6rEQgy7tephHoRlUGTYamsajGJaAo1F3IQVIrRSuagi7+YpSpCqsW
36
+ wORqorkCgYEA7RdX6MDVrbw7LePnhyuaqTiMK+055/R1TqhB1JvvxJ1CXk2rDL6G
37
+ 0TLHQ7oGofd5LYiemg4ZVtWdJe43BPZlVgT6lvL/iGo8JnrncB9Da6L7nrq/+Rvj
38
+ XGjf1qODCK+LmreZWEsaLPURIoR/Ewwxb9J2zd0CaMjeTwafJo1CZvcCgYEAyCgb
39
+ aqoWvUecX8VvARfuA593Lsi50t4MEArnOXXcd1RnXoZWhbx5rgO8/ATKfXr0BK/n
40
+ h2GF9PfKzHFm/4V6e82OL7gu/kLy2u9bXN74vOvWFL5NOrOKPM7Kg+9I131kNYOw
41
+ Ivnr/VtHE5s0dY7JChYWE1F3vArrOw3T00a4CXUCgYEA0SqY+dS2LvIzW4cHCe9k
42
+ IQqsT0yYm5TFsUEr4sA3xcPfe4cV8sZb9k/QEGYb1+SWWZ+AHPV3UW5fl8kTbSNb
43
+ v4ng8i8rVVQ0ANbJO9e5CUrepein2MPL0AkOATR8M7t7dGGpvYV0cFk8ZrFx0oId
44
+ U0PgYDotF/iueBWlbsOM430CgYEAqYI95dFyPI5/AiSkY5queeb8+mQH62sdcCCr
45
+ vd/w/CZA/K5sbAo4SoTj8dLk4evU6HtIa0DOP63y071eaxvRpTNqLUOgmLh+D6gS
46
+ Cc7TfLuFrD+WDBatBd5jZ+SoHccVrLR/4L8jeodo5FPW05A+9gnKXEXsTxY4LOUC
47
+ 9bS4e1kCgYAqVXZh63JsMwoaxCYmQ66eJojKa47VNrOeIZDZvd2BPVf30glBOT41
48
+ gBoDG3WMPZoQj9pb7uMcrnvs4APj2FIhMU8U15LcPAj59cD6S6rWnAxO8NFK7HQG
49
+ 4Jxg3JNNf8ErQoCHb1B3oVdXJkmbJkARoDpBKmTCgKtP8ADYLmVPQw==
50
+ -----END RSA PRIVATE KEY-----
51
+ _end_of_pem_
52
+
53
+ TEST_KEY_DSA256 = OpenSSL::PKey::DSA.new <<-_end_of_pem_
54
+ -----BEGIN DSA PRIVATE KEY-----
55
+ MIH3AgEAAkEAhk2libbY2a8y2Pt21+YPYGZeW6wzaW2yfj5oiClXro9XMR7XWLkE
56
+ 9B7XxLNFCS2gmCCdMsMW1HulaHtLFQmB2wIVAM43JZrcgpu6ajZ01VkLc93gu/Ed
57
+ AkAOhujZrrKV5CzBKutKLb0GVyVWmdC7InoNSMZEeGU72rT96IjM59YzoqmD0pGM
58
+ 3I1o4cGqg1D1DfM1rQlnN1eSAkBq6xXfEDwJ1mLNxF6q8Zm/ugFYWR5xcX/3wFiT
59
+ b4+EjHP/DbNh9Vm5wcfnDBJ1zKvrMEf2xqngYdrV/3CiGJeKAhRvL57QvJZcQGvn
60
+ ISNX5cMzFHRW3Q==
61
+ -----END DSA PRIVATE KEY-----
62
+ _end_of_pem_
63
+
64
+ TEST_KEY_DSA512 = OpenSSL::PKey::DSA.new <<-_end_of_pem_
65
+ -----BEGIN DSA PRIVATE KEY-----
66
+ MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
67
+ RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
68
+ AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
69
+ S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
70
+ Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
71
+ 55jreJD3Se3slps=
72
+ -----END DSA PRIVATE KEY-----
73
+ _end_of_pem_
74
+
75
+ module_function
76
+
77
+ def issue_cert(dn, key, serial, not_before, not_after, extensions,
78
+ issuer, issuer_key, digest)
79
+ cert = OpenSSL::X509::Certificate.new
80
+ issuer = cert unless issuer
81
+ issuer_key = key unless issuer_key
82
+ cert.version = 2
83
+ cert.serial = serial
84
+ cert.subject = dn
85
+ cert.issuer = issuer.subject
86
+ cert.public_key = key.public_key
87
+ cert.not_before = not_before
88
+ cert.not_after = not_after
89
+ ef = OpenSSL::X509::ExtensionFactory.new
90
+ ef.subject_certificate = cert
91
+ ef.issuer_certificate = issuer
92
+ extensions.each{|oid, value, critical|
93
+ cert.add_extension(ef.create_extension(oid, value, critical))
94
+ }
95
+ cert.sign(issuer_key, digest)
96
+ cert
97
+ end
98
+
99
+ def issue_crl(revoke_info, serial, lastup, nextup, extensions,
100
+ issuer, issuer_key, digest)
101
+ crl = OpenSSL::X509::CRL.new
102
+ crl.issuer = issuer.subject
103
+ crl.version = 1
104
+ crl.last_update = lastup
105
+ crl.next_update = nextup
106
+ revoke_info.each{|rserial, time, reason_code|
107
+ revoked = OpenSSL::X509::Revoked.new
108
+ revoked.serial = rserial
109
+ revoked.time = time
110
+ enum = OpenSSL::ASN1::Enumerated(reason_code)
111
+ ext = OpenSSL::X509::Extension.new("CRLReason", enum)
112
+ revoked.add_extension(ext)
113
+ crl.add_revoked(revoked)
114
+ }
115
+ ef = OpenSSL::X509::ExtensionFactory.new
116
+ ef.issuer_certificate = issuer
117
+ ef.crl = crl
118
+ crlnum = OpenSSL::ASN1::Integer(serial)
119
+ crl.add_extension(OpenSSL::X509::Extension.new("crlNumber", crlnum))
120
+ extensions.each{|oid, value, critical|
121
+ crl.add_extension(ef.create_extension(oid, value, critical))
122
+ }
123
+ crl.sign(issuer_key, digest)
124
+ crl
125
+ end
126
+
127
+ def get_subject_key_id(cert)
128
+ asn1_cert = OpenSSL::ASN1.decode(cert)
129
+ tbscert = asn1_cert.value[0]
130
+ pkinfo = tbscert.value[6]
131
+ publickey = pkinfo.value[1]
132
+ pkvalue = publickey.value
133
+ OpenSSL::Digest::SHA1.hexdigest(pkvalue).scan(/../).join(":").upcase
134
+ end
135
+
136
+ def silent
137
+ begin
138
+ back, $VERBOSE = $VERBOSE, nil
139
+ yield
140
+ ensure
141
+ $VERBOSE = back if back
142
+ end
143
+ end
144
+ end
File without changes
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ name = ARGV[0]
4
+ system("rm -rf #{name}")
5
+ system("gcc -lssl -lcrypto -o #{name} #{name}.c")
6
+ system("chmod +x #{name}")
7
+ system("./#{name}")
8
+
Binary file
@@ -0,0 +1,21 @@
1
+
2
+ #include <openssl/pkcs7.h>
3
+
4
+ void print_pkcs7(PKCS7* p7) {
5
+ printf(" | asn1 : %s\n", p7->asn1);
6
+ printf(" | len : %d\n", p7->length);
7
+ printf(" | state : %d\n", p7->state);
8
+ printf(" | detached : %d\n", p7->detached);
9
+ printf(" | type : %d\n", OBJ_nid2obj(p7->type));
10
+ }
11
+
12
+ int main(int argc, char** argv) {
13
+ PKCS7* p7;
14
+ p7 = PKCS7_new();
15
+
16
+ printf("--before:\n");
17
+ print_pkcs7(p7);
18
+
19
+ PKCS7_free(p7);
20
+ return 0;
21
+ }
@@ -0,0 +1 @@
1
+ Dir.glob("test/test_*.rb").sort.reject{|t| t =~ /test_all/}.each {|t| require t }
@@ -0,0 +1,123 @@
1
+ require 'openssl'
2
+ require "test/unit"
3
+
4
+ class TestCertificate < Test::Unit::TestCase
5
+ def setup
6
+ cert_file = File.expand_path('fixture/selfcert.pem', File.dirname(__FILE__))
7
+ key_file = File.expand_path('fixture/keypair.pem', File.dirname(__FILE__))
8
+ @cert = OpenSSL::X509::Certificate.new(File.read(cert_file))
9
+ @key = OpenSSL::PKey::RSA.new(File.read(key_file))
10
+ end
11
+
12
+ def test_sign_for_pem_initialized_certificate
13
+ pem = @cert.to_pem
14
+ exts = @cert.extensions
15
+ assert_nothing_raised do
16
+ @cert.sign(@key, OpenSSL::Digest::SHA1.new)
17
+ end
18
+ # TODO: for now, jruby-openssl cannot keep order of extensions after sign.
19
+ # assert_equal(pem, @cert.to_pem)
20
+ assert_equal(exts.size, @cert.extensions.size)
21
+ exts.each do |ext|
22
+ found = @cert.extensions.find { |e| e.oid == ext.oid }
23
+ assert_not_nil(found)
24
+ assert_equal(ext.value, found.value)
25
+ end
26
+ end
27
+
28
+ def test_set_public_key
29
+ pkey = @cert.public_key
30
+ newkey = OpenSSL::PKey::RSA.new(1024)
31
+ @cert.public_key = newkey
32
+ assert_equal(newkey.public_key.to_pem, @cert.public_key.to_pem)
33
+ end
34
+
35
+ # JRUBY-3468
36
+ def test_jruby3468
37
+ pem_cert = <<END
38
+ -----BEGIN CERTIFICATE-----
39
+ MIIC/jCCAmegAwIBAgIBATANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJKUDER
40
+ MA8GA1UECgwIY3Rvci5vcmcxFDASBgNVBAsMC0RldmVsb3BtZW50MRUwEwYDVQQD
41
+ DAxodHRwLWFjY2VzczIwHhcNMDcwOTExMTM1ODMxWhcNMDkwOTEwMTM1ODMxWjBN
42
+ MQswCQYDVQQGEwJKUDERMA8GA1UECgwIY3Rvci5vcmcxFDASBgNVBAsMC0RldmVs
43
+ b3BtZW50MRUwEwYDVQQDDAxodHRwLWFjY2VzczIwgZ8wDQYJKoZIhvcNAQEBBQAD
44
+ gY0AMIGJAoGBALi66ujWtUCQm5HpMSyr/AAIFYVXC/dmn7C8TR/HMiUuW3waY4uX
45
+ LFqCDAGOX4gf177pX+b99t3mpaiAjJuqc858D9xEECzhDWgXdLbhRqWhUOble4RY
46
+ c1yWYC990IgXJDMKx7VAuZ3cBhdBxtlE9sb1ZCzmHQsvTy/OoRzcJCrTAgMBAAGj
47
+ ge0wgeowDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9PcGVu
48
+ U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUJNE0GGaRKmN2qhnO
49
+ FyBWVl4Qj6owDgYDVR0PAQH/BAQDAgEGMHUGA1UdIwRuMGyAFCTRNBhmkSpjdqoZ
50
+ zhcgVlZeEI+qoVGkTzBNMQswCQYDVQQGEwJKUDERMA8GA1UECgwIY3Rvci5vcmcx
51
+ FDASBgNVBAsMC0RldmVsb3BtZW50MRUwEwYDVQQDDAxodHRwLWFjY2VzczKCAQEw
52
+ DQYJKoZIhvcNAQEFBQADgYEAH11tstSUuqFpMqoh/vM5l3Nqb8ygblbqEYQs/iG/
53
+ UeQkOZk/P1TxB6Ozn2htJ1srqDpUsncFVZ/ecP19GkeOZ6BmIhppcHhE5WyLBcPX
54
+ It5q1BW0PiAzT9LlEGoaiW0nw39so0Pr1whJDfc1t4fjdk+kSiMIzRHbTDvHWfpV
55
+ nTA=
56
+ -----END CERTIFICATE-----
57
+ END
58
+
59
+ cert = OpenSSL::X509::Certificate.new(pem_cert)
60
+ cert.extensions.each do |ext|
61
+ value = ext.value
62
+ crit = ext.critical?
63
+ case ext.oid
64
+ when "keyUsage"
65
+ assert_equal true, crit
66
+ assert_equal "Key Cert Sign, cRLSign", value
67
+ when "basicConstraints"
68
+ assert_equal true, crit
69
+ assert_equal "CA:TRUE", value
70
+ when "authorityKeyIdentifier"
71
+ assert_equal false, crit
72
+ assert_equal "keyid:80:14:24:D1:34:18:66:91:2A:63:76:AA:19:CE:17:20:56:56:5E:10:8F:AA", value
73
+ when "subjectKeyIdentifier"
74
+ assert_equal false, crit
75
+ assert_equal "24:D1:34:18:66:91:2A:63:76:AA:19:CE:17:20:56:56:5E:10:8F:AA", value
76
+ when "nsComment"
77
+ assert_equal false, crit
78
+ assert_equal "Ruby/OpenSSL Generated Certificate", value
79
+ end
80
+ end
81
+ end
82
+
83
+ # JRUBY-5060
84
+ def test_to_pem_with_empty_object
85
+ empty_cert = "MCUwGwIAMAMGAQAwADAEHwAfADAAMAgwAwYBAAMBADADBgEAAwEA"
86
+ empty_req = "MBowEAIAMAAwCDADBgEAAwEAoAAwAwYBAAMBAA=="
87
+ empty_crl = "MBMwCTADBgEAMAAfADADBgEAAwEA"
88
+ empty_key = "MAA="
89
+ #assert_equal(empty_cert, OpenSSL::X509::Certificate.new.to_pem.split("\n")[1])
90
+ #assert_equal(empty_req, OpenSSL::X509::Request.new.to_pem.split("\n")[1])
91
+ #assert_equal(empty_crl, OpenSSL::X509::CRL.new.to_pem.split("\n")[1])
92
+ assert_nothing_raised do
93
+ OpenSSL::X509::Certificate.new.to_pem
94
+ end
95
+ assert_nothing_raised do
96
+ OpenSSL::X509::Request.new.to_pem
97
+ end
98
+ assert_nothing_raised do
99
+ OpenSSL::X509::CRL.new.to_pem
100
+ end
101
+ assert_equal(empty_key, OpenSSL::PKey::RSA.new.to_pem.split("\n")[1].chomp)
102
+ assert_equal(empty_key, OpenSSL::PKey::DSA.new.to_pem.split("\n")[1].chomp)
103
+ assert_equal(empty_key, OpenSSL::PKey::DH.new.to_pem.split("\n")[1].chomp)
104
+ end
105
+
106
+ # JRUBY-5096
107
+ def test_verify_failed_by_lazy_public_key_initialization
108
+ msg = 'hello,world'
109
+ digester = OpenSSL::Digest::SHA1.new
110
+ sig = @key.sign(digester, msg)
111
+ assert(@cert.public_key.verify(digester, sig, msg))
112
+ assert(@cert.verify(@cert.public_key))
113
+ end
114
+
115
+ # JRUBY-5253
116
+ def test_load_key_and_cert_in_one_file
117
+ file = File.read(File.expand_path('fixture/key_then_cert.pem', File.dirname(__FILE__)))
118
+ cert = OpenSSL::X509::Certificate.new(file)
119
+ key = OpenSSL::PKey::RSA.new(file)
120
+ assert_equal("Tue Dec 7 04:34:54 2010", cert.not_before.asctime)
121
+ assert_equal(155138628173305760586484923990788939560020632428367464748448028799529480209574373402763304069949574437177088605664104864141770364385183263453740781162330879666907894314877641447552442838727890327086630369910941911916802731723019019303432276515402934176273116832204529025371212188573318159421452591783377914839, key.n)
122
+ end
123
+ end