JRuby-OpenSSL 0.1

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