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.
- data/History.txt +12 -0
- data/License.txt +30 -0
- data/README.txt +18 -0
- data/lib/bcmail-jdk14-135.jar +0 -0
- data/lib/bcprov-jdk14-135.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/openssl/ssl_server.rb +81 -0
- data/test/openssl/test_asn1.rb +199 -0
- data/test/openssl/test_cipher.rb +151 -0
- data/test/openssl/test_digest.rb +88 -0
- data/test/openssl/test_hmac.rb +34 -0
- data/test/openssl/test_ns_spki.rb +69 -0
- data/test/openssl/test_pair.rb +149 -0
- data/test/openssl/test_pkey_rsa.rb +49 -0
- data/test/openssl/test_ssl.rb +284 -0
- data/test/openssl/test_x509cert.rb +174 -0
- data/test/openssl/test_x509crl.rb +218 -0
- data/test/openssl/test_x509ext.rb +74 -0
- data/test/openssl/test_x509name.rb +265 -0
- data/test/openssl/test_x509req.rb +140 -0
- data/test/openssl/test_x509store.rb +217 -0
- data/test/openssl/utils.rb +135 -0
- data/test/test_openssl.rb +21 -0
- data/test/ut_eof.rb +128 -0
- metadata +85 -0
| @@ -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
         |