JRuby-OpenSSL 0.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.
@@ -0,0 +1,151 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require "test/unit"
6
+
7
+ if defined?(OpenSSL)
8
+
9
+ class OpenSSL::TestCipher < Test::Unit::TestCase
10
+ def setup
11
+ @c1 = OpenSSL::Cipher::Cipher.new("DES-EDE3-CBC")
12
+ @c2 = OpenSSL::Cipher::DES.new(:EDE3, "CBC")
13
+ @key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
14
+ @iv = "\0\0\0\0\0\0\0\0"
15
+ @hexkey = "0000000000000000000000000000000000000000000000"
16
+ @hexiv = "0000000000000000"
17
+ @data = "DATA"
18
+ end
19
+
20
+ def teardown
21
+ @c1 = @c2 = nil
22
+ end
23
+
24
+ def test_crypt
25
+ @c1.encrypt.pkcs5_keyivgen(@key, @iv)
26
+ @c2.encrypt.pkcs5_keyivgen(@key, @iv)
27
+ s1 = @c1.update(@data) + @c1.final
28
+ s2 = @c2.update(@data) + @c2.final
29
+ assert_equal(s1, s2, "encrypt")
30
+
31
+ @c1.decrypt.pkcs5_keyivgen(@key, @iv)
32
+ @c2.decrypt.pkcs5_keyivgen(@key, @iv)
33
+ assert_equal(@data, @c1.update(s1)+@c1.final, "decrypt")
34
+ assert_equal(@data, @c2.update(s2)+@c2.final, "decrypt")
35
+ end
36
+
37
+ def test_info
38
+ assert_equal("DES-EDE3-CBC", @c1.name, "name")
39
+ assert_equal("DES-EDE3-CBC", @c2.name, "name")
40
+ assert_kind_of(Fixnum, @c1.key_len, "key_len")
41
+ assert_kind_of(Fixnum, @c1.iv_len, "iv_len")
42
+ end
43
+
44
+ def test_dup
45
+ assert_equal(@c1.name, @c1.dup.name, "dup")
46
+ assert_equal(@c1.name, @c1.clone.name, "clone")
47
+ @c1.encrypt
48
+ @c1.key = @key
49
+ @c1.iv = @iv
50
+ tmpc = @c1.dup
51
+ s1 = @c1.update(@data) + @c1.final
52
+ s2 = tmpc.update(@data) + tmpc.final
53
+ assert_equal(s1, s2, "encrypt dup")
54
+ end
55
+
56
+ def test_reset
57
+ @c1.encrypt
58
+ @c1.key = @key
59
+ @c1.iv = @iv
60
+ s1 = @c1.update(@data) + @c1.final
61
+ @c1.reset
62
+ s2 = @c1.update(@data) + @c1.final
63
+ assert_equal(s1, s2, "encrypt reset")
64
+ end
65
+
66
+ def test_empty_data
67
+ @c1.encrypt
68
+ assert_raises(ArgumentError){ @c1.update("") }
69
+ end
70
+
71
+ def test_disable_padding(padding=0)
72
+ # assume a padding size of 8
73
+ # encrypt the data with padding
74
+ @c1.encrypt
75
+ @c1.key = @key
76
+ @c1.iv = @iv
77
+ encrypted_data = @c1.update(@data) + @c1.final
78
+ assert_equal(8, encrypted_data.size)
79
+ # decrypt with padding disabled
80
+ @c1.decrypt
81
+ @c1.padding = padding
82
+ decrypted_data = @c1.update(encrypted_data) + @c1.final
83
+ # check that the result contains the padding
84
+ assert_equal(8, decrypted_data.size)
85
+ assert_equal(@data, decrypted_data[0...@data.size])
86
+ end
87
+
88
+ if PLATFORM =~ /java/
89
+ # JRuby extension - using Java padding types
90
+
91
+ def test_disable_padding_javastyle
92
+ test_disable_padding('NoPadding')
93
+ end
94
+
95
+ def test_iso10126_padding
96
+ @c1.encrypt
97
+ @c1.key = @key
98
+ @c1.iv = @iv
99
+ @c1.padding = 'ISO10126Padding'
100
+ encrypted_data = @c1.update(@data) + @c1.final
101
+ # decrypt with padding disabled to see the padding
102
+ @c1.decrypt
103
+ @c1.padding = 0
104
+ decrypted_data = @c1.update(encrypted_data) + @c1.final
105
+ assert_equal(@data, decrypted_data[0...@data.size])
106
+ # last byte should be the amount of padding
107
+ assert_equal(4, decrypted_data[-1])
108
+ end
109
+
110
+ def test_iso10126_padding_boundry
111
+ @data = 'HELODATA' # 8 bytes, same as padding size
112
+ @c1.encrypt
113
+ @c1.key = @key
114
+ @c1.iv = @iv
115
+ @c1.padding = 'ISO10126Padding'
116
+ encrypted_data = @c1.update(@data) + @c1.final
117
+ # decrypt with padding disabled to see the padding
118
+ @c1.decrypt
119
+ @c1.padding = 0
120
+ decrypted_data = @c1.update(encrypted_data) + @c1.final
121
+ assert_equal(@data, decrypted_data[0...@data.size])
122
+ # padding should be one whole block
123
+ assert_equal(8, decrypted_data[-1])
124
+ end
125
+ end
126
+
127
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00907000
128
+ def test_ciphers
129
+ OpenSSL::Cipher.ciphers.each{|name|
130
+ assert(OpenSSL::Cipher::Cipher.new(name).is_a?(OpenSSL::Cipher::Cipher))
131
+ }
132
+ end
133
+
134
+ def test_AES
135
+ pt = File.read(__FILE__)
136
+ %w(ECB CBC CFB OFB).each{|mode|
137
+ c1 = OpenSSL::Cipher::AES256.new(mode)
138
+ c1.encrypt
139
+ c1.pkcs5_keyivgen("passwd")
140
+ ct = c1.update(pt) + c1.final
141
+
142
+ c2 = OpenSSL::Cipher::AES256.new(mode)
143
+ c2.decrypt
144
+ c2.pkcs5_keyivgen("passwd")
145
+ assert_equal(pt, c2.update(ct) + c2.final)
146
+ }
147
+ end
148
+ end
149
+ end
150
+
151
+ end
@@ -0,0 +1,88 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require "digest/md5"
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+ class OpenSSL::TestDigest < Test::Unit::TestCase
11
+ def setup
12
+ @d1 = OpenSSL::Digest::Digest::new("MD5")
13
+ @d2 = OpenSSL::Digest::MD5.new
14
+ @md = Digest::MD5.new
15
+ @data = "DATA"
16
+ end
17
+
18
+ def teardown
19
+ @d1 = @d2 = @md = nil
20
+ end
21
+
22
+ def test_digest
23
+ assert_equal(@md.digest, @d1.digest)
24
+ assert_equal(@md.hexdigest, @d1.hexdigest)
25
+ @d1 << @data
26
+ @d2 << @data
27
+ @md << @data
28
+ assert_equal(@md.digest, @d1.digest)
29
+ assert_equal(@md.hexdigest, @d1.hexdigest)
30
+ assert_equal(@d1.digest, @d2.digest)
31
+ assert_equal(@d1.hexdigest, @d2.hexdigest)
32
+ assert_equal(@md.digest, OpenSSL::Digest::MD5.digest(@data))
33
+ assert_equal(@md.hexdigest, OpenSSL::Digest::MD5.hexdigest(@data))
34
+ end
35
+
36
+ def test_eql
37
+ assert(@d1 == @d2, "==")
38
+ d = @d1.clone
39
+ assert(d == @d1, "clone")
40
+ end
41
+
42
+ def test_info
43
+ assert_equal("MD5", @d1.name, "name")
44
+ assert_equal("MD5", @d2.name, "name")
45
+ assert_equal(16, @d1.size, "size")
46
+ end
47
+
48
+ def test_dup
49
+ @d1.update(@data)
50
+ assert_equal(@d1.name, @d1.dup.name, "dup")
51
+ assert_equal(@d1.name, @d1.clone.name, "clone")
52
+ assert_equal(@d1.digest, @d1.clone.digest, "clone .digest")
53
+ end
54
+
55
+ def test_reset
56
+ @d1.update(@data)
57
+ dig1 = @d1.digest
58
+ @d1.reset
59
+ @d1.update(@data)
60
+ dig2 = @d1.digest
61
+ assert_equal(dig1, dig2, "reset")
62
+ end
63
+
64
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
65
+ def encode16(str)
66
+ str.unpack("H*").first
67
+ end
68
+
69
+ def test_098_features
70
+ sha224_a = "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5"
71
+ sha256_a = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
72
+ sha384_a = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31"
73
+ sha512_a = "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75"
74
+
75
+ assert_equal(sha224_a, OpenSSL::Digest::SHA224.hexdigest("a"))
76
+ assert_equal(sha256_a, OpenSSL::Digest::SHA256.hexdigest("a"))
77
+ assert_equal(sha384_a, OpenSSL::Digest::SHA384.hexdigest("a"))
78
+ assert_equal(sha512_a, OpenSSL::Digest::SHA512.hexdigest("a"))
79
+
80
+ assert_equal(sha224_a, encode16(OpenSSL::Digest::SHA224.digest("a")))
81
+ assert_equal(sha256_a, encode16(OpenSSL::Digest::SHA256.digest("a")))
82
+ assert_equal(sha384_a, encode16(OpenSSL::Digest::SHA384.digest("a")))
83
+ assert_equal(sha512_a, encode16(OpenSSL::Digest::SHA512.digest("a")))
84
+ end
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,34 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require "test/unit"
6
+
7
+ if defined?(OpenSSL)
8
+
9
+ class OpenSSL::TestHMAC < Test::Unit::TestCase
10
+ def setup
11
+ @digest = OpenSSL::Digest::MD5.new
12
+ @key = "KEY"
13
+ @data = "DATA"
14
+ @h1 = OpenSSL::HMAC.new(@key, @digest)
15
+ @h2 = OpenSSL::HMAC.new(@key, @digest)
16
+ end
17
+
18
+ def teardown
19
+ end
20
+
21
+ def test_hmac
22
+ @h1.update(@data)
23
+ assert_equal(OpenSSL::HMAC.digest(@digest, @key, @data), @h1.digest, "digest")
24
+ assert_equal(OpenSSL::HMAC.hexdigest(@digest, @key, @data), @h1.hexdigest, "hexdigest")
25
+ end
26
+
27
+ def test_dup
28
+ @h1.update(@data)
29
+ h = @h1.dup
30
+ assert_equal(@h1.digest, h.digest, "dup digest")
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,69 @@
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
+
11
+ class OpenSSL::TestNSSPI < Test::Unit::TestCase
12
+ def setup
13
+ # This request data is adopt from the specification of
14
+ # "Netscape Extensions for User Key Generation".
15
+ # -- http://wp.netscape.com/eng/security/comm4-keygen.html
16
+ @b64 = "MIHFMHEwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAnX0TILJrOMUue+PtwBRE6XfV"
17
+ @b64 << "WtKQbsshxk5ZhcUwcwyvcnIq9b82QhJdoACdD34rqfCAIND46fXKQUnb0mvKzQID"
18
+ @b64 << "AQABFhFNb3ppbGxhSXNNeUZyaWVuZDANBgkqhkiG9w0BAQQFAANBAAKv2Eex2n/S"
19
+ @b64 << "r/7iJNroWlSzSMtTiQTEB+ADWHGj9u1xrUrOilq/o2cuQxIfZcNZkYAkWP4DubqW"
20
+ @b64 << "i0//rgBvmco="
21
+ end
22
+
23
+ def teardown
24
+ end
25
+ def pr(obj, ind=0)
26
+ if obj.respond_to?(:value)
27
+ puts((" "*ind) + obj.class.to_s + ":")
28
+ pr(obj.value,(ind+1))
29
+ elsif obj.respond_to?(:each) && !(String===obj)
30
+ obj.each {|v| pr(v,ind+1) }
31
+ else
32
+ puts((" "*ind) + obj.inspect)
33
+ end
34
+ end
35
+
36
+ def test_build_data
37
+ key1 = OpenSSL::TestUtils::TEST_KEY_RSA1024
38
+ key2 = OpenSSL::TestUtils::TEST_KEY_RSA2048
39
+ spki = OpenSSL::Netscape::SPKI.new
40
+ spki.challenge = "RandomString"
41
+ spki.public_key = key1.public_key
42
+ spki.sign(key1, OpenSSL::Digest::SHA1.new)
43
+ assert(spki.verify(spki.public_key))
44
+ assert(spki.verify(key1.public_key))
45
+ assert(!spki.verify(key2.public_key))
46
+
47
+ der = spki.to_der
48
+ spki = OpenSSL::Netscape::SPKI.new(der)
49
+ assert_equal("RandomString", spki.challenge)
50
+ assert_equal(key1.public_key.to_der, spki.public_key.to_der)
51
+ assert(spki.verify(spki.public_key))
52
+ end
53
+
54
+ def test_decode_data
55
+ spki = OpenSSL::Netscape::SPKI.new(@b64)
56
+ assert_equal(@b64, spki.to_pem)
57
+ assert_equal(@b64.unpack("m").first, spki.to_der)
58
+ assert_equal("MozillaIsMyFriend", spki.challenge)
59
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
60
+
61
+ spki = OpenSSL::Netscape::SPKI.new(@b64.unpack("m").first)
62
+ assert_equal(@b64, spki.to_pem)
63
+ assert_equal(@b64.unpack("m").first, spki.to_der)
64
+ assert_equal("MozillaIsMyFriend", spki.challenge)
65
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,149 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require 'test/unit'
6
+
7
+ if defined?(OpenSSL)
8
+
9
+ require 'socket'
10
+ dir = File.expand_path(__FILE__)
11
+ 2.times {dir = File.dirname(dir)}
12
+ $:.replace([File.join(dir, "ruby")] | $:)
13
+ require 'ut_eof'
14
+
15
+ module SSLPair
16
+ def server
17
+ host = "127.0.0.1"
18
+ port = 0
19
+ ctx = OpenSSL::SSL::SSLContext.new()
20
+ ctx.ciphers = "ADH"
21
+ tcps = TCPServer.new(host, port)
22
+ ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
23
+ return ssls
24
+ end
25
+
26
+ def client(port)
27
+ host = "127.0.0.1"
28
+ ctx = OpenSSL::SSL::SSLContext.new()
29
+ ctx.ciphers = "ADH"
30
+ s = TCPSocket.new(host, port)
31
+ ssl = OpenSSL::SSL::SSLSocket.new(s, ctx)
32
+ ssl.connect
33
+ ssl.sync_close = true
34
+ ssl
35
+ end
36
+
37
+ def ssl_pair
38
+ ssls = server
39
+ tv = nil
40
+ th = Thread.new {
41
+ ns = ssls.accept
42
+ ssls.close
43
+ tv = ns
44
+ }
45
+ port = ssls.to_io.addr[1]
46
+ c = client(port)
47
+ th.join
48
+ s = tv
49
+ if block_given?
50
+ begin
51
+ yield c, s
52
+ ensure
53
+ c.close unless c.closed?
54
+ s.close unless s.closed?
55
+ end
56
+ else
57
+ return c, s
58
+ end
59
+ end
60
+ end
61
+
62
+ class OpenSSL::TestEOF1 < Test::Unit::TestCase
63
+ include TestEOF
64
+ include SSLPair
65
+
66
+ def open_file(content)
67
+ s1, s2 = ssl_pair
68
+ Thread.new {
69
+ s2 << content;
70
+ s2.close
71
+ }
72
+ yield s1
73
+ end
74
+ end
75
+
76
+ class OpenSSL::TestEOF2 < Test::Unit::TestCase
77
+ include TestEOF
78
+ include SSLPair
79
+
80
+ def open_file(content)
81
+ s1, s2 = ssl_pair
82
+ Thread.new { s1 << content; s1.close }
83
+ yield s2
84
+ end
85
+ end
86
+
87
+ class OpenSSL::TestPair < Test::Unit::TestCase
88
+ include SSLPair
89
+
90
+ def test_getc
91
+ ssl_pair {|s1, s2|
92
+ s1 << "a"
93
+ assert_equal(?a, s2.getc)
94
+ }
95
+ end
96
+
97
+ def test_readpartial
98
+ ssl_pair {|s1, s2|
99
+ s2.write "a\nbcd"
100
+ assert_equal("a\n", s1.gets)
101
+ assert_equal("bcd", s1.readpartial(10))
102
+ s2.write "efg"
103
+ assert_equal("efg", s1.readpartial(10))
104
+ s2.close
105
+ assert_raise(EOFError) { s1.readpartial(10) }
106
+ assert_raise(EOFError) { s1.readpartial(10) }
107
+ assert_equal("", s1.readpartial(0))
108
+ }
109
+ end
110
+
111
+ def test_readall
112
+ ssl_pair {|s1, s2|
113
+ s2.close
114
+ assert_equal("", s1.read)
115
+ }
116
+ end
117
+
118
+ def test_readline
119
+ ssl_pair {|s1, s2|
120
+ s2.close
121
+ assert_raise(EOFError) { s1.readline }
122
+ }
123
+ end
124
+
125
+ def test_puts_meta
126
+ ssl_pair {|s1, s2|
127
+ begin
128
+ old = $/
129
+ $/ = '*'
130
+ s1.puts 'a'
131
+ ensure
132
+ $/ = old
133
+ end
134
+ s1.close
135
+ assert_equal("a\n", s2.read)
136
+ }
137
+ end
138
+
139
+ def test_puts_empty
140
+ ssl_pair {|s1, s2|
141
+ s1.puts
142
+ s1.close
143
+ assert_equal("\n", s2.read)
144
+ }
145
+ end
146
+
147
+ end
148
+
149
+ end