jruby-jruby-openssl 0.5.0.4
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.
- data/History.txt +34 -0
- data/License.txt +30 -0
- data/README.txt +24 -0
- data/lib/bcmail-jdk14-139.jar +0 -0
- data/lib/bcprov-jdk14-139.jar +0 -0
- data/lib/jopenssl.jar +0 -0
- data/lib/jopenssl/version.rb +5 -0
- data/lib/openssl.rb +24 -0
- data/lib/openssl/bn.rb +35 -0
- data/lib/openssl/buffering.rb +239 -0
- data/lib/openssl/cipher.rb +58 -0
- data/lib/openssl/digest.rb +48 -0
- data/lib/openssl/dummy.rb +34 -0
- data/lib/openssl/dummyssl.rb +13 -0
- data/lib/openssl/ssl.rb +135 -0
- data/lib/openssl/x509.rb +154 -0
- data/test/fixture/cacert.pem +23 -0
- data/test/fixture/cert_localhost.pem +19 -0
- data/test/fixture/localhost_keypair.pem +18 -0
- data/test/openssl/ssl_server.rb +99 -0
- data/test/openssl/test_asn1.rb +199 -0
- data/test/openssl/test_cipher.rb +174 -0
- data/test/openssl/test_digest.rb +88 -0
- data/test/openssl/test_hmac.rb +44 -0
- data/test/openssl/test_ns_spki.rb +69 -0
- data/test/openssl/test_pair.rb +149 -0
- data/test/openssl/test_pkcs7.rb +159 -0
- data/test/openssl/test_pkey_rsa.rb +49 -0
- data/test/openssl/test_ssl.rb +307 -0
- data/test/openssl/test_x509cert.rb +236 -0
- data/test/openssl/test_x509crl.rb +234 -0
- data/test/openssl/test_x509ext.rb +74 -0
- data/test/openssl/test_x509name.rb +265 -0
- data/test/openssl/test_x509req.rb +178 -0
- data/test/openssl/test_x509store.rb +245 -0
- data/test/openssl/utils.rb +135 -0
- data/test/pkcs7_mime_enveloped.message +19 -0
- data/test/pkcs7_mime_signed.message +30 -0
- data/test/pkcs7_multipart_signed.message +45 -0
- data/test/ref/a.out +0 -0
- data/test/ref/compile.rb +8 -0
- data/test/ref/pkcs1 +0 -0
- data/test/ref/pkcs1.c +21 -0
- data/test/test_cipher.rb +81 -0
- data/test/test_integration.rb +100 -0
- data/test/test_java.rb +98 -0
- data/test/test_java_attribute.rb +25 -0
- data/test/test_java_bio.rb +42 -0
- data/test/test_java_mime.rb +173 -0
- data/test/test_java_pkcs7.rb +769 -0
- data/test/test_java_smime.rb +177 -0
- data/test/test_openssl.rb +34 -0
- data/test/test_openssl_x509.rb +34 -0
- data/test/test_pkey.rb +46 -0
- data/test/ut_eof.rb +128 -0
- metadata +120 -0
@@ -0,0 +1,49 @@
|
|
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::TestPKeyRSA < Test::Unit::TestCase
|
11
|
+
def test_padding
|
12
|
+
key = OpenSSL::PKey::RSA.new(512, 3)
|
13
|
+
|
14
|
+
# Need right size for raw mode
|
15
|
+
plain0 = "x" * (512/8)
|
16
|
+
cipher = key.private_encrypt(plain0, OpenSSL::PKey::RSA::NO_PADDING)
|
17
|
+
plain1 = key.public_decrypt(cipher, OpenSSL::PKey::RSA::NO_PADDING)
|
18
|
+
assert_equal(plain0, plain1)
|
19
|
+
|
20
|
+
# Need smaller size for pkcs1 mode
|
21
|
+
plain0 = "x" * (512/8 - 11)
|
22
|
+
cipher1 = key.private_encrypt(plain0, OpenSSL::PKey::RSA::PKCS1_PADDING)
|
23
|
+
plain1 = key.public_decrypt(cipher1, OpenSSL::PKey::RSA::PKCS1_PADDING)
|
24
|
+
assert_equal(plain0, plain1)
|
25
|
+
|
26
|
+
cipherdef = key.private_encrypt(plain0) # PKCS1_PADDING is default
|
27
|
+
plain1 = key.public_decrypt(cipherdef)
|
28
|
+
assert_equal(plain0, plain1)
|
29
|
+
assert_equal(cipher1, cipherdef)
|
30
|
+
|
31
|
+
# Failure cases
|
32
|
+
assert_raise(ArgumentError){ key.private_encrypt() }
|
33
|
+
assert_raise(ArgumentError){ key.private_encrypt("hi", 1, nil) }
|
34
|
+
assert_raise(OpenSSL::PKey::RSAError){ key.private_encrypt(plain0, 666) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_private
|
38
|
+
key = OpenSSL::PKey::RSA.new(512, 3)
|
39
|
+
assert(key.private?)
|
40
|
+
key2 = OpenSSL::PKey::RSA.new(key.to_der)
|
41
|
+
assert(key2.private?)
|
42
|
+
key3 = key.public_key
|
43
|
+
assert(!key3.private?)
|
44
|
+
key4 = OpenSSL::PKey::RSA.new(key3.to_der)
|
45
|
+
assert(!key4.private?)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
begin
|
2
|
+
require "openssl"
|
3
|
+
require File.join(File.dirname(__FILE__), "utils.rb")
|
4
|
+
rescue LoadError
|
5
|
+
end
|
6
|
+
require "rbconfig"
|
7
|
+
require "socket"
|
8
|
+
require "test/unit"
|
9
|
+
require "jruby"
|
10
|
+
|
11
|
+
if defined?(OpenSSL)
|
12
|
+
|
13
|
+
class OpenSSL::TestSSL < Test::Unit::TestCase
|
14
|
+
RUBY = ENV["RUBY"] || File.join(
|
15
|
+
::Config::CONFIG["bindir"],
|
16
|
+
::Config::CONFIG["ruby_install_name"] + ::Config::CONFIG["EXEEXT"]
|
17
|
+
)
|
18
|
+
SSL_SERVER = File.join(File.dirname(__FILE__), "ssl_server.rb")
|
19
|
+
PORT = 20443
|
20
|
+
ITERATIONS = ($0 == __FILE__) ? 5 : 5
|
21
|
+
|
22
|
+
# Disable in-proc process launching and either run jruby with specified args
|
23
|
+
# or yield args to a given block
|
24
|
+
def jruby_oop(*args)
|
25
|
+
prev_in_process = JRuby.runtime.instance_config.run_ruby_in_process
|
26
|
+
JRuby.runtime.instance_config.run_ruby_in_process = false
|
27
|
+
if block_given?
|
28
|
+
yield args
|
29
|
+
else
|
30
|
+
`#{RUBY} #{args.join(' ')}`
|
31
|
+
end
|
32
|
+
ensure
|
33
|
+
JRuby.runtime.instance_config.run_ruby_in_process = prev_in_process
|
34
|
+
end
|
35
|
+
|
36
|
+
def setup
|
37
|
+
@ca_key = OpenSSL::TestUtils::TEST_KEY_RSA2048
|
38
|
+
@svr_key = OpenSSL::TestUtils::TEST_KEY_RSA1024
|
39
|
+
@cli_key = OpenSSL::TestUtils::TEST_KEY_DSA256
|
40
|
+
@ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
|
41
|
+
@svr = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=localhost")
|
42
|
+
@cli = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=localhost")
|
43
|
+
|
44
|
+
now = Time.at(Time.now.to_i)
|
45
|
+
ca_exts = [
|
46
|
+
["basicConstraints","CA:TRUE",true],
|
47
|
+
["keyUsage","cRLSign,keyCertSign",true],
|
48
|
+
]
|
49
|
+
ee_exts = [
|
50
|
+
["keyUsage","keyEncipherment,digitalSignature",true],
|
51
|
+
]
|
52
|
+
@ca_cert = issue_cert(@ca, @ca_key, 1, now, now+3600, ca_exts,
|
53
|
+
nil, nil, OpenSSL::Digest::SHA1.new)
|
54
|
+
@svr_cert = issue_cert(@svr, @svr_key, 2, now, now+1800, ee_exts,
|
55
|
+
@ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
|
56
|
+
@cli_cert = issue_cert(@cli, @cli_key, 3, now, now+1800, ee_exts,
|
57
|
+
@ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
|
58
|
+
@server = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def teardown
|
62
|
+
end
|
63
|
+
|
64
|
+
def issue_cert(*arg)
|
65
|
+
OpenSSL::TestUtils.issue_cert(*arg)
|
66
|
+
end
|
67
|
+
|
68
|
+
def issue_crl(*arg)
|
69
|
+
OpenSSL::TestUtils.issue_crl(*arg)
|
70
|
+
end
|
71
|
+
|
72
|
+
def start_server(port0, verify_mode, start_immediately, &block)
|
73
|
+
server = nil
|
74
|
+
jruby_oop {
|
75
|
+
begin
|
76
|
+
cmd = [RUBY]
|
77
|
+
cmd << "-Ilib"
|
78
|
+
cmd << "-d" if $DEBUG
|
79
|
+
cmd << SSL_SERVER << port0.to_s << verify_mode.to_s
|
80
|
+
cmd << (start_immediately ? "yes" : "no")
|
81
|
+
server = IO.popen(cmd.join(" "), "w+")
|
82
|
+
server.write(@ca_cert.to_pem)
|
83
|
+
server.write(@svr_cert.to_pem)
|
84
|
+
server.write(@svr_key.to_pem)
|
85
|
+
$stderr.puts "sent certs to server" if $DEBUG
|
86
|
+
str = server.gets
|
87
|
+
$stderr.puts "got pid from server: #{str}" if $DEBUG
|
88
|
+
pid = Integer(str)
|
89
|
+
if port = server.gets
|
90
|
+
if $DEBUG
|
91
|
+
$stderr.printf("%s started: pid=%d port=%d\n", SSL_SERVER, pid, port)
|
92
|
+
end
|
93
|
+
block.call(server, port.to_i)
|
94
|
+
end
|
95
|
+
ensure
|
96
|
+
if server
|
97
|
+
$stderr.puts "killing: #{pid}" if $DEBUG
|
98
|
+
Process.kill(:KILL, pid)
|
99
|
+
server.close
|
100
|
+
end
|
101
|
+
end
|
102
|
+
}
|
103
|
+
end
|
104
|
+
|
105
|
+
def starttls(ssl)
|
106
|
+
ssl.puts("STARTTLS")
|
107
|
+
|
108
|
+
sleep 1 # When this line is eliminated, process on Cygwin blocks
|
109
|
+
# forever at ssl.connect. But I don't know why it does.
|
110
|
+
|
111
|
+
ssl.connect
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_connect_and_close
|
115
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
|
116
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
117
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
118
|
+
assert(ssl.connect)
|
119
|
+
ssl.close
|
120
|
+
assert(!sock.closed?)
|
121
|
+
sock.close
|
122
|
+
|
123
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
124
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
125
|
+
ssl.sync_close = true # !!
|
126
|
+
assert(ssl.connect)
|
127
|
+
ssl.close
|
128
|
+
assert(sock.closed?)
|
129
|
+
}
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_read_and_write
|
133
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
|
134
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
135
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
136
|
+
ssl.sync_close = true
|
137
|
+
ssl.connect
|
138
|
+
|
139
|
+
# syswrite and sysread
|
140
|
+
ITERATIONS.times{|i|
|
141
|
+
str = "x" * 100 + "\n"
|
142
|
+
ssl.syswrite(str)
|
143
|
+
assert_equal(str, ssl.sysread(str.size))
|
144
|
+
|
145
|
+
str = "x" * i * 100 + "\n"
|
146
|
+
buf = ""
|
147
|
+
ssl.syswrite(str)
|
148
|
+
assert_equal(buf.object_id, ssl.sysread(str.size, buf).object_id)
|
149
|
+
assert_equal(str, buf)
|
150
|
+
}
|
151
|
+
|
152
|
+
# puts and gets
|
153
|
+
ITERATIONS.times{
|
154
|
+
str = "x" * 100 + "\n"
|
155
|
+
ssl.puts(str)
|
156
|
+
assert_equal(str, ssl.gets)
|
157
|
+
}
|
158
|
+
|
159
|
+
# read and write
|
160
|
+
ITERATIONS.times{|i|
|
161
|
+
str = "x" * 100 + "\n"
|
162
|
+
ssl.write(str)
|
163
|
+
assert_equal(str, ssl.read(str.size))
|
164
|
+
|
165
|
+
str = "x" * i * 100 + "\n"
|
166
|
+
buf = ""
|
167
|
+
ssl.write(str)
|
168
|
+
assert_equal(buf.object_id, ssl.read(str.size, buf).object_id)
|
169
|
+
assert_equal(str, buf)
|
170
|
+
}
|
171
|
+
|
172
|
+
ssl.close
|
173
|
+
}
|
174
|
+
end
|
175
|
+
|
176
|
+
# Temporarily disabled...see JRUBY-1888
|
177
|
+
# def test_client_auth
|
178
|
+
# vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
|
179
|
+
# start_server(PORT, vflag, true){|s, p|
|
180
|
+
# assert_raises(OpenSSL::SSL::SSLError){
|
181
|
+
# sock = TCPSocket.new("127.0.0.1", p)
|
182
|
+
# ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
183
|
+
# ssl.connect
|
184
|
+
# }
|
185
|
+
# ctx = OpenSSL::SSL::SSLContext.new
|
186
|
+
# ctx.key = @cli_key
|
187
|
+
# ctx.cert = @cli_cert
|
188
|
+
# sock = TCPSocket.new("127.0.0.1", p)
|
189
|
+
# ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
|
190
|
+
# ssl.sync_close = true
|
191
|
+
# ssl.connect
|
192
|
+
# ssl.puts("foo")
|
193
|
+
# assert_equal("foo\n", ssl.gets)
|
194
|
+
# ssl.close
|
195
|
+
#
|
196
|
+
# called = nil
|
197
|
+
# ctx = OpenSSL::SSL::SSLContext.new
|
198
|
+
# ctx.client_cert_cb = Proc.new{|ssl|
|
199
|
+
# called = true
|
200
|
+
# [@cli_cert, @cli_key]
|
201
|
+
# }
|
202
|
+
# sock = TCPSocket.new("127.0.0.1", p)
|
203
|
+
# ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
|
204
|
+
# ssl.sync_close = true
|
205
|
+
# ssl.connect
|
206
|
+
## assert(called)
|
207
|
+
# ssl.puts("foo")
|
208
|
+
# assert_equal("foo\n", ssl.gets)
|
209
|
+
# ssl.close
|
210
|
+
# }
|
211
|
+
# end
|
212
|
+
|
213
|
+
def test_starttls
|
214
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, false){|s, p|
|
215
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
216
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
217
|
+
ssl.sync_close = true
|
218
|
+
str = "x" * 1000 + "\n"
|
219
|
+
ITERATIONS.times{
|
220
|
+
ssl.puts(str)
|
221
|
+
assert_equal(str, ssl.gets)
|
222
|
+
}
|
223
|
+
|
224
|
+
starttls(ssl)
|
225
|
+
|
226
|
+
ITERATIONS.times{
|
227
|
+
ssl.puts(str)
|
228
|
+
assert_equal(str, ssl.gets)
|
229
|
+
}
|
230
|
+
|
231
|
+
ssl.close
|
232
|
+
}
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_parallel
|
236
|
+
GC.start
|
237
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
|
238
|
+
ssls = []
|
239
|
+
10.times{
|
240
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
241
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
242
|
+
ssl.connect
|
243
|
+
ssl.sync_close = true
|
244
|
+
ssls << ssl
|
245
|
+
}
|
246
|
+
str = "x" * 1000 + "\n"
|
247
|
+
ITERATIONS.times{
|
248
|
+
ssls.each{|ssl|
|
249
|
+
ssl.puts(str)
|
250
|
+
assert_equal(str, ssl.gets)
|
251
|
+
}
|
252
|
+
}
|
253
|
+
ssls.each{|ssl| ssl.close }
|
254
|
+
}
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_post_connection_check
|
258
|
+
sslerr = OpenSSL::SSL::SSLError
|
259
|
+
|
260
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
|
261
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
262
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
263
|
+
ssl.connect
|
264
|
+
assert_raises(sslerr){ssl.post_connection_check("localhost.localdomain")}
|
265
|
+
assert_raises(sslerr){ssl.post_connection_check("127.0.0.1")}
|
266
|
+
assert(ssl.post_connection_check("localhost"))
|
267
|
+
assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
|
268
|
+
}
|
269
|
+
|
270
|
+
now = Time.now
|
271
|
+
exts = [
|
272
|
+
["keyUsage","keyEncipherment,digitalSignature",true],
|
273
|
+
["subjectAltName","DNS:localhost.localdomain",false],
|
274
|
+
["subjectAltName","IP:127.0.0.1",false],
|
275
|
+
]
|
276
|
+
@svr_cert = issue_cert(@svr, @svr_key, 4, now, now+1800, exts,
|
277
|
+
@ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
|
278
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
|
279
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
280
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
281
|
+
ssl.connect
|
282
|
+
assert(ssl.post_connection_check("localhost.localdomain"))
|
283
|
+
assert(ssl.post_connection_check("127.0.0.1"))
|
284
|
+
assert_raises(sslerr){ssl.post_connection_check("localhost")}
|
285
|
+
assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
|
286
|
+
}
|
287
|
+
|
288
|
+
now = Time.now
|
289
|
+
exts = [
|
290
|
+
["keyUsage","keyEncipherment,digitalSignature",true],
|
291
|
+
["subjectAltName","DNS:*.localdomain",false],
|
292
|
+
]
|
293
|
+
@svr_cert = issue_cert(@svr, @svr_key, 5, now, now+1800, exts,
|
294
|
+
@ca_cert, @ca_key, OpenSSL::Digest::SHA1.new)
|
295
|
+
start_server(PORT, OpenSSL::SSL::VERIFY_NONE, true){|s, p|
|
296
|
+
sock = TCPSocket.new("127.0.0.1", p)
|
297
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
298
|
+
ssl.connect
|
299
|
+
assert(ssl.post_connection_check("localhost.localdomain"))
|
300
|
+
assert_raises(sslerr){ssl.post_connection_check("127.0.0.1")}
|
301
|
+
assert_raises(sslerr){ssl.post_connection_check("localhost")}
|
302
|
+
assert_raises(sslerr){ssl.post_connection_check("foo.example.com")}
|
303
|
+
}
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
@@ -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
|