net-ssh 3.3.0.beta1 → 4.0.0.alpha1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +2 -1
- data/CHANGES.txt +3 -16
- data/Gemfile +17 -0
- data/README.rdoc +1 -1
- data/Rakefile +16 -9
- data/lib/net/ssh.rb +1 -5
- data/lib/net/ssh/authentication/agent/java_pageant.rb +1 -1
- data/lib/net/ssh/authentication/agent/socket.rb +5 -5
- data/lib/net/ssh/authentication/ed25519.rb +140 -0
- data/lib/net/ssh/authentication/key_manager.rb +2 -2
- data/lib/net/ssh/authentication/pageant.rb +1 -1
- data/lib/net/ssh/buffer.rb +5 -23
- data/lib/net/ssh/connection/session.rb +3 -20
- data/lib/net/ssh/key_factory.rb +14 -4
- data/lib/net/ssh/proxy/http.rb +2 -2
- data/lib/net/ssh/service/forward.rb +1 -1
- data/lib/net/ssh/test/socket.rb +1 -1
- data/lib/net/ssh/transport/algorithms.rb +2 -16
- data/lib/net/ssh/transport/cipher_factory.rb +16 -22
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +1 -1
- data/lib/net/ssh/transport/key_expander.rb +1 -0
- data/lib/net/ssh/transport/openssl.rb +1 -1
- data/lib/net/ssh/transport/session.rb +0 -1
- data/lib/net/ssh/version.rb +3 -3
- data/net-ssh.gemspec +28 -9
- data/test/authentication/test_agent.rb +1 -9
- data/test/authentication/test_ed25519.rb +77 -0
- data/test/common.rb +0 -16
- data/test/connection/test_channel.rb +3 -3
- data/test/connection/test_session.rb +0 -1
- data/test/integration/{README.txt → README.md} +2 -1
- data/test/integration/common.rb +8 -6
- data/test/integration/playbook.yml +8 -7
- data/test/integration/test_ed25519_pkeys.rb +70 -0
- data/test/integration/test_forward.rb +15 -120
- data/test/integration/test_id_rsa_keys.rb +11 -11
- data/test/integration/test_proxy.rb +2 -2
- data/test/test_buffer.rb +1 -29
- data/test/transport/kex/test_ecdh_sha2_nistp384.rb +1 -1
- data/test/transport/test_algorithms.rb +6 -6
- data/test/transport/test_cipher_factory.rb +0 -119
- data/test/transport/test_packet_stream.rb +0 -576
- data/test/transport/test_session.rb +1 -1
- metadata +79 -6
- metadata.gz.sig +0 -0
- data/test/integration/test_encoding.rb +0 -23
    
        data/lib/net/ssh/key_factory.rb
    CHANGED
    
    | @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require 'net/ssh/transport/openssl'
         | 
| 2 2 | 
             
            require 'net/ssh/prompt'
         | 
| 3 | 
            +
            require 'net/ssh/authentication/ed25519'
         | 
| 3 4 |  | 
| 4 5 | 
             
            module Net; module SSH
         | 
| 5 6 |  | 
| @@ -21,6 +22,7 @@ module Net; module SSH | |
| 21 22 | 
             
                }
         | 
| 22 23 | 
             
                if defined?(OpenSSL::PKey::EC)
         | 
| 23 24 | 
             
                  MAP["ecdsa"] = OpenSSL::PKey::EC
         | 
| 25 | 
            +
                  MAP["ed25519"] = ED25519::PrivKey
         | 
| 24 26 | 
             
                end
         | 
| 25 27 |  | 
| 26 28 | 
             
                class <<self
         | 
| @@ -62,6 +64,9 @@ module Net; module SSH | |
| 62 64 | 
             
                      elsif data.match(/-----BEGIN EC PRIVATE KEY-----/) && defined?(OpenSSL::PKey::EC)
         | 
| 63 65 | 
             
                        key_type = OpenSSL::PKey::EC
         | 
| 64 66 | 
             
                        error_class = OpenSSL::PKey::ECError
         | 
| 67 | 
            +
                      elsif data.match(/-----BEGIN OPENSSH PRIVATE KEY-----/)
         | 
| 68 | 
            +
                        openssh_key = true
         | 
| 69 | 
            +
                        key_type = ED25519::PrivKey
         | 
| 65 70 | 
             
                      elsif data.match(/-----BEGIN (.+) PRIVATE KEY-----/)
         | 
| 66 71 | 
             
                        raise OpenSSL::PKey::PKeyError, "not a supported key type '#{$1}'"
         | 
| 67 72 | 
             
                      else
         | 
| @@ -70,13 +75,18 @@ module Net; module SSH | |
| 70 75 | 
             
                    end
         | 
| 71 76 |  | 
| 72 77 | 
             
                    encrypted_key = data.match(/ENCRYPTED/)
         | 
| 78 | 
            +
                    openssh_key = data.match(/-----BEGIN OPENSSH PRIVATE KEY-----/)
         | 
| 73 79 | 
             
                    tries = 0
         | 
| 74 80 |  | 
| 75 81 | 
             
                    begin
         | 
| 76 | 
            -
                      if  | 
| 77 | 
            -
                         | 
| 82 | 
            +
                      if openssh_key
         | 
| 83 | 
            +
                        ED25519::PrivKey.read(data, passphrase || 'invalid')
         | 
| 78 84 | 
             
                      else
         | 
| 79 | 
            -
                         | 
| 85 | 
            +
                        if pkey_read
         | 
| 86 | 
            +
                          return OpenSSL::PKey.read(data, passphrase || 'invalid')
         | 
| 87 | 
            +
                        else
         | 
| 88 | 
            +
                          return key_type.new(data, passphrase || 'invalid')
         | 
| 89 | 
            +
                        end
         | 
| 80 90 | 
             
                      end
         | 
| 81 91 | 
             
                    rescue error_class
         | 
| 82 92 | 
             
                      if encrypted_key && ask_passphrase
         | 
| @@ -110,7 +120,7 @@ module Net; module SSH | |
| 110 120 | 
             
                    blob = nil
         | 
| 111 121 | 
             
                    begin
         | 
| 112 122 | 
             
                      blob = fields.shift
         | 
| 113 | 
            -
                    end while !blob.nil? && !/^(ssh-(rsa|dss)|ecdsa-sha2-nistp\d+)$/.match(blob)
         | 
| 123 | 
            +
                    end while !blob.nil? && !/^(ssh-(rsa|dss|ed25519)|ecdsa-sha2-nistp\d+)$/.match(blob)
         | 
| 114 124 | 
             
                    blob = fields.shift
         | 
| 115 125 |  | 
| 116 126 | 
             
                    raise Net::SSH::Exception, "public key at #{filename} is not valid" if blob.nil?
         | 
    
        data/lib/net/ssh/proxy/http.rb
    CHANGED
    
    | @@ -8,7 +8,7 @@ module Net; module SSH; module Proxy | |
| 8 8 | 
             
              #
         | 
| 9 9 | 
             
              #   require 'net/ssh/proxy/http'
         | 
| 10 10 | 
             
              #
         | 
| 11 | 
            -
              #   proxy = Net::SSH::Proxy::HTTP.new(' | 
| 11 | 
            +
              #   proxy = Net::SSH::Proxy::HTTP.new('proxy_host', proxy_port)
         | 
| 12 12 | 
             
              #   Net::SSH.start('host', 'user', :proxy => proxy) do |ssh|
         | 
| 13 13 | 
             
              #     ...
         | 
| 14 14 | 
             
              #   end
         | 
| @@ -16,7 +16,7 @@ module Net; module SSH; module Proxy | |
| 16 16 | 
             
              # If the proxy requires authentication, you can pass :user and :password
         | 
| 17 17 | 
             
              # to the proxy's constructor:
         | 
| 18 18 | 
             
              #
         | 
| 19 | 
            -
              #   proxy = Net::SSH::Proxy::HTTP.new(' | 
| 19 | 
            +
              #   proxy = Net::SSH::Proxy::HTTP.new('proxy_host', proxy_port,
         | 
| 20 20 | 
             
              #      :user => "user", :password => "password")
         | 
| 21 21 | 
             
              #
         | 
| 22 22 | 
             
              # Note that HTTP digest authentication is not supported; Basic only at
         | 
| @@ -357,7 +357,7 @@ module Net; module SSH; module Service | |
| 357 357 | 
             
                    channel[:invisible] = true
         | 
| 358 358 |  | 
| 359 359 | 
             
                    begin
         | 
| 360 | 
            -
                      agent = Authentication::Agent.connect(logger | 
| 360 | 
            +
                      agent = Authentication::Agent.connect(logger)
         | 
| 361 361 | 
             
                      if (agent.socket.is_a? ::IO)
         | 
| 362 362 | 
             
                        prepare_client(agent.socket, channel, :agent)
         | 
| 363 363 | 
             
                      else
         | 
    
        data/lib/net/ssh/test/socket.rb
    CHANGED
    
    | @@ -25,8 +25,8 @@ module Net; module SSH; module Test | |
| 25 25 |  | 
| 26 26 | 
             
                  @script = Script.new
         | 
| 27 27 |  | 
| 28 | 
            -
                  script.sends(:kexinit)
         | 
| 29 28 | 
             
                  script.gets(:kexinit, 1, 2, 3, 4, "test", "ssh-rsa", "none", "none", "none", "none", "none", "none", "", "", false)
         | 
| 29 | 
            +
                  script.sends(:kexinit)
         | 
| 30 30 | 
             
                  script.sends(:newkeys)
         | 
| 31 31 | 
             
                  script.gets(:newkeys)
         | 
| 32 32 | 
             
                end
         | 
| @@ -33,14 +33,6 @@ module Net; module SSH; module Transport | |
| 33 33 | 
             
                                     aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se
         | 
| 34 34 | 
             
                                     idea-cbc none arcfour128 arcfour256 arcfour
         | 
| 35 35 | 
             
                                     aes128-ctr aes192-ctr aes256-ctr
         | 
| 36 | 
            -
                                     camellia128-cbc camellia192-cbc camellia256-cbc
         | 
| 37 | 
            -
                                     camellia128-cbc@openssh.org
         | 
| 38 | 
            -
                                     camellia192-cbc@openssh.org
         | 
| 39 | 
            -
                                     camellia256-cbc@openssh.org
         | 
| 40 | 
            -
                                     camellia128-ctr camellia192-ctr camellia256-ctr
         | 
| 41 | 
            -
                                     camellia128-ctr@openssh.org
         | 
| 42 | 
            -
                                     camellia192-ctr@openssh.org
         | 
| 43 | 
            -
                                     camellia256-ctr@openssh.org
         | 
| 44 36 | 
             
                                     cast128-ctr blowfish-ctr 3des-ctr
         | 
| 45 37 | 
             
                                    ),
         | 
| 46 38 |  | 
| @@ -124,12 +116,6 @@ module Net; module SSH; module Transport | |
| 124 116 | 
             
                  prepare_preferred_algorithms!
         | 
| 125 117 | 
             
                end
         | 
| 126 118 |  | 
| 127 | 
            -
                # Start the algorithm negotation
         | 
| 128 | 
            -
                def start
         | 
| 129 | 
            -
                  raise ArgumentError, "Cannot call start if it's negoitation started or done" if @pending || @initialized
         | 
| 130 | 
            -
                  send_kexinit
         | 
| 131 | 
            -
                end
         | 
| 132 | 
            -
             | 
| 133 119 | 
             
                # Request a rekey operation. This will return immediately, and does not
         | 
| 134 120 | 
             
                # actually perform the rekey operation. It does cause the session to change
         | 
| 135 121 | 
             
                # state, however--until the key exchange finishes, no new packets will be
         | 
| @@ -295,8 +281,8 @@ module Net; module SSH; module Transport | |
| 295 281 |  | 
| 296 282 | 
             
                    Net::SSH::Buffer.from(:byte, KEXINIT,
         | 
| 297 283 | 
             
                      :long, [rand(0xFFFFFFFF), rand(0xFFFFFFFF), rand(0xFFFFFFFF), rand(0xFFFFFFFF)],
         | 
| 298 | 
            -
                      : | 
| 299 | 
            -
                      : | 
| 284 | 
            +
                      :string, [kex, host_key, encryption, encryption, hmac, hmac],
         | 
| 285 | 
            +
                      :string, [compression, compression, language, language],
         | 
| 300 286 | 
             
                      :bool, false, :long, 0)
         | 
| 301 287 | 
             
                  end
         | 
| 302 288 |  | 
| @@ -21,12 +21,6 @@ module Net; module SSH; module Transport | |
| 21 21 | 
             
                  "arcfour256"                  => "rc4",
         | 
| 22 22 | 
             
                  "arcfour512"                  => "rc4",
         | 
| 23 23 | 
             
                  "arcfour"                     => "rc4",
         | 
| 24 | 
            -
                  "camellia128-cbc"             => "camellia-128-cbc",
         | 
| 25 | 
            -
                  "camellia192-cbc"             => "camellia-192-cbc",
         | 
| 26 | 
            -
                  "camellia256-cbc"             => "camellia-256-cbc",
         | 
| 27 | 
            -
                  "camellia128-cbc@openssh.org" => "camellia-128-cbc",
         | 
| 28 | 
            -
                  "camellia192-cbc@openssh.org" => "camellia-192-cbc",
         | 
| 29 | 
            -
                  "camellia256-cbc@openssh.org" => "camellia-256-cbc",
         | 
| 30 24 |  | 
| 31 25 | 
             
                  "3des-ctr"                    => "des-ede3",
         | 
| 32 26 | 
             
                  "blowfish-ctr"                => "bf-ecb",
         | 
| @@ -34,12 +28,6 @@ module Net; module SSH; module Transport | |
| 34 28 | 
             
                  "aes192-ctr"                  => "aes-192-ecb",
         | 
| 35 29 | 
             
                  "aes128-ctr"                  => "aes-128-ecb",
         | 
| 36 30 | 
             
                  "cast128-ctr"                 => "cast5-ecb",
         | 
| 37 | 
            -
                  "camellia128-ctr"             => "camellia-128-ecb",
         | 
| 38 | 
            -
                  "camellia192-ctr"             => "camellia-192-ecb",
         | 
| 39 | 
            -
                  "camellia256-ctr"             => "camellia-256-ecb",
         | 
| 40 | 
            -
                  "camellia128-ctr@openssh.org" => "camellia-128-ecb",
         | 
| 41 | 
            -
                  "camellia192-ctr@openssh.org" => "camellia-192-ecb",
         | 
| 42 | 
            -
                  "camellia256-ctr@openssh.org" => "camellia-256-ecb",
         | 
| 43 31 |  | 
| 44 32 | 
             
                  "none"                        => "none",
         | 
| 45 33 | 
             
                }
         | 
| @@ -76,11 +64,11 @@ module Net; module SSH; module Transport | |
| 76 64 | 
             
                  cipher.padding = 0
         | 
| 77 65 |  | 
| 78 66 | 
             
                  cipher.extend(Net::SSH::Transport::CTR) if (name =~ /-ctr(@openssh.org)?$/)
         | 
| 79 | 
            -
                  cipher.iv | 
| 67 | 
            +
                  cipher.iv = Net::SSH::Transport::KeyExpander.expand_key(cipher.iv_len, options[:iv], options) if ossl_name != "rc4"
         | 
| 80 68 |  | 
| 81 69 | 
             
                  key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
         | 
| 82 70 | 
             
                  cipher.key_len = key_len
         | 
| 83 | 
            -
                  cipher.key | 
| 71 | 
            +
                  cipher.key = Net::SSH::Transport::KeyExpander.expand_key(key_len, options[:key], options)
         | 
| 84 72 | 
             
                  cipher.update(" " * 1536) if (ossl_name == "rc4" && name != "arcfour")
         | 
| 85 73 |  | 
| 86 74 | 
             
                  return cipher
         | 
| @@ -90,15 +78,21 @@ module Net; module SSH; module Transport | |
| 90 78 | 
             
                # block-size ] for the named cipher algorithm. If the cipher
         | 
| 91 79 | 
             
                # algorithm is unknown, or is "none", 0 is returned for both elements
         | 
| 92 80 | 
             
                # of the tuple.
         | 
| 93 | 
            -
                 | 
| 81 | 
            +
                # if :iv_len option is supplied the third return value will be ivlen
         | 
| 82 | 
            +
                def self.get_lengths(name, options = {})
         | 
| 94 83 | 
             
                  ossl_name = SSH_TO_OSSL[name]
         | 
| 95 | 
            -
                   | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
                   | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 84 | 
            +
                  if ossl_name.nil? || ossl_name == "none"
         | 
| 85 | 
            +
                    result = [0, 0]
         | 
| 86 | 
            +
                    result << 0 if options[:iv_len]
         | 
| 87 | 
            +
                  else
         | 
| 88 | 
            +
                    cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
         | 
| 89 | 
            +
                    key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
         | 
| 90 | 
            +
                    cipher.key_len = key_len
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                    result = [key_len, ossl_name=="rc4" ? 8 : cipher.block_size]
         | 
| 93 | 
            +
                    result << cipher.iv_len if options[:iv_len]
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
                  result
         | 
| 102 96 | 
             
                end
         | 
| 103 97 | 
             
              end
         | 
| 104 98 |  | 
| @@ -57,7 +57,7 @@ module Net; module SSH; module Transport; module Kex | |
| 57 57 | 
             
                  # send the KEXECDH_INIT message
         | 
| 58 58 | 
             
                  ## byte     SSH_MSG_KEX_ECDH_INIT
         | 
| 59 59 | 
             
                  ## string   Q_C, client's ephemeral public key octet string
         | 
| 60 | 
            -
                  buffer = Net::SSH::Buffer.from(:byte, init, : | 
| 60 | 
            +
                  buffer = Net::SSH::Buffer.from(:byte, init, :string, ecdh.public_key.to_bn.to_s(2))
         | 
| 61 61 | 
             
                  connection.send_message(buffer)
         | 
| 62 62 |  | 
| 63 63 | 
             
                  # expect the following KEXECDH_REPLY message
         | 
| @@ -185,7 +185,7 @@ module OpenSSL | |
| 185 185 | 
             
                    def to_blob
         | 
| 186 186 | 
             
                      @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
         | 
| 187 187 | 
             
                                                      :string, CurveNameAliasInv[self.group.curve_name],
         | 
| 188 | 
            -
                                                      : | 
| 188 | 
            +
                                                      :string, self.public_key.to_bn.to_s(2)).to_s
         | 
| 189 189 | 
             
                      @blob
         | 
| 190 190 | 
             
                    end
         | 
| 191 191 |  | 
| @@ -84,7 +84,6 @@ module Net; module SSH; module Transport | |
| 84 84 | 
             
                  @server_version = ServerVersion.new(socket, logger, options[:timeout])
         | 
| 85 85 |  | 
| 86 86 | 
             
                  @algorithms = Algorithms.new(self, options)
         | 
| 87 | 
            -
                  @algorithms.start
         | 
| 88 87 | 
             
                  wait { algorithms.initialized? }
         | 
| 89 88 | 
             
                rescue Errno::ETIMEDOUT
         | 
| 90 89 | 
             
                  raise Net::SSH::ConnectionTimeout
         | 
    
        data/lib/net/ssh/version.rb
    CHANGED
    
    | @@ -45,17 +45,17 @@ module Net; module SSH | |
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 47 | 
             
                # The major component of this version of the Net::SSH library
         | 
| 48 | 
            -
                MAJOR =  | 
| 48 | 
            +
                MAJOR = 4
         | 
| 49 49 |  | 
| 50 50 | 
             
                # The minor component of this version of the Net::SSH library
         | 
| 51 | 
            -
                MINOR =  | 
| 51 | 
            +
                MINOR = 0
         | 
| 52 52 |  | 
| 53 53 | 
             
                # The tiny component of this version of the Net::SSH library
         | 
| 54 54 | 
             
                TINY  = 0
         | 
| 55 55 |  | 
| 56 56 | 
             
                # The prerelease component of this version of the Net::SSH library 
         | 
| 57 57 | 
             
                # nil allowed
         | 
| 58 | 
            -
                PRE   =  | 
| 58 | 
            +
                PRE   = "alpha1"
         | 
| 59 59 |  | 
| 60 60 | 
             
                # The current version of the Net::SSH library as a Version instance
         | 
| 61 61 | 
             
                CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact)
         | 
    
        data/net-ssh.gemspec
    CHANGED
    
    | @@ -2,17 +2,17 @@ | |
| 2 2 | 
             
            # DO NOT EDIT THIS FILE DIRECTLY
         | 
| 3 3 | 
             
            # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
         | 
| 4 4 | 
             
            # -*- encoding: utf-8 -*-
         | 
| 5 | 
            -
            # stub: net-ssh  | 
| 5 | 
            +
            # stub: net-ssh 4.0.0.alpha1 ruby lib
         | 
| 6 6 |  | 
| 7 7 | 
             
            Gem::Specification.new do |s|
         | 
| 8 8 | 
             
              s.name = "net-ssh"
         | 
| 9 | 
            -
              s.version = " | 
| 9 | 
            +
              s.version = "4.0.0.alpha1"
         | 
| 10 10 |  | 
| 11 11 | 
             
              s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
         | 
| 12 12 | 
             
              s.require_paths = ["lib"]
         | 
| 13 13 | 
             
              s.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"]
         | 
| 14 14 | 
             
              s.cert_chain = ["net-ssh-public_cert.pem"]
         | 
| 15 | 
            -
              s.date = "2016- | 
| 15 | 
            +
              s.date = "2016-03-19"
         | 
| 16 16 | 
             
              s.description = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows you to write programs that invoke and interact with processes on remote servers, via SSH2."
         | 
| 17 17 | 
             
              s.email = "net-ssh@solutious.com"
         | 
| 18 18 | 
             
              s.extra_rdoc_files = [
         | 
| @@ -22,6 +22,7 @@ Gem::Specification.new do |s| | |
| 22 22 | 
             
              s.files = [
         | 
| 23 23 | 
             
                ".travis.yml",
         | 
| 24 24 | 
             
                "CHANGES.txt",
         | 
| 25 | 
            +
                "Gemfile",
         | 
| 25 26 | 
             
                "LICENSE.txt",
         | 
| 26 27 | 
             
                "Manifest",
         | 
| 27 28 | 
             
                "README.rdoc",
         | 
| @@ -32,6 +33,7 @@ Gem::Specification.new do |s| | |
| 32 33 | 
             
                "lib/net/ssh/authentication/agent/java_pageant.rb",
         | 
| 33 34 | 
             
                "lib/net/ssh/authentication/agent/socket.rb",
         | 
| 34 35 | 
             
                "lib/net/ssh/authentication/constants.rb",
         | 
| 36 | 
            +
                "lib/net/ssh/authentication/ed25519.rb",
         | 
| 35 37 | 
             
                "lib/net/ssh/authentication/key_manager.rb",
         | 
| 36 38 | 
             
                "lib/net/ssh/authentication/methods/abstract.rb",
         | 
| 37 39 | 
             
                "lib/net/ssh/authentication/methods/hostbased.rb",
         | 
| @@ -121,6 +123,7 @@ Gem::Specification.new do |s| | |
| 121 123 | 
             
                "test/authentication/methods/test_password.rb",
         | 
| 122 124 | 
             
                "test/authentication/methods/test_publickey.rb",
         | 
| 123 125 | 
             
                "test/authentication/test_agent.rb",
         | 
| 126 | 
            +
                "test/authentication/test_ed25519.rb",
         | 
| 124 127 | 
             
                "test/authentication/test_key_manager.rb",
         | 
| 125 128 | 
             
                "test/authentication/test_session.rb",
         | 
| 126 129 | 
             
                "test/common.rb",
         | 
| @@ -140,11 +143,11 @@ Gem::Specification.new do |s| | |
| 140 143 | 
             
                "test/configs/wild_cards",
         | 
| 141 144 | 
             
                "test/connection/test_channel.rb",
         | 
| 142 145 | 
             
                "test/connection/test_session.rb",
         | 
| 143 | 
            -
                "test/integration/README. | 
| 146 | 
            +
                "test/integration/README.md",
         | 
| 144 147 | 
             
                "test/integration/Vagrantfile",
         | 
| 145 148 | 
             
                "test/integration/common.rb",
         | 
| 146 149 | 
             
                "test/integration/playbook.yml",
         | 
| 147 | 
            -
                "test/integration/ | 
| 150 | 
            +
                "test/integration/test_ed25519_pkeys.rb",
         | 
| 148 151 | 
             
                "test/integration/test_forward.rb",
         | 
| 149 152 | 
             
                "test/integration/test_id_rsa_keys.rb",
         | 
| 150 153 | 
             
                "test/integration/test_proxy.rb",
         | 
| @@ -192,7 +195,7 @@ Gem::Specification.new do |s| | |
| 192 195 | 
             
              s.licenses = ["MIT"]
         | 
| 193 196 | 
             
              s.required_ruby_version = Gem::Requirement.new(">= 2.0")
         | 
| 194 197 | 
             
              s.rubyforge_project = "net-ssh"
         | 
| 195 | 
            -
              s.rubygems_version = "2. | 
| 198 | 
            +
              s.rubygems_version = "2.4.6"
         | 
| 196 199 | 
             
              s.signing_key = "/mnt/gem/net-ssh-private_key.pem"
         | 
| 197 200 | 
             
              s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
         | 
| 198 201 |  | 
| @@ -200,15 +203,31 @@ Gem::Specification.new do |s| | |
| 200 203 | 
             
                s.specification_version = 4
         | 
| 201 204 |  | 
| 202 205 | 
             
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         | 
| 203 | 
            -
                  s. | 
| 206 | 
            +
                  s.add_runtime_dependency(%q<rbnacl-libsodium>, [">= 1.0.2"])
         | 
| 207 | 
            +
                  s.add_runtime_dependency(%q<rbnacl>, [">= 3.1.2"])
         | 
| 208 | 
            +
                  s.add_runtime_dependency(%q<bcrypt_pbkdf>, ["= 1.0.0.alpha1"]) unless RUBY_PLATFORM == "java"
         | 
| 209 | 
            +
                  s.add_development_dependency(%q<rake>, [">= 0"])
         | 
| 210 | 
            +
                  s.add_development_dependency(%q<test-unit>, [">= 0.8.5"])
         | 
| 204 211 | 
             
                  s.add_development_dependency(%q<mocha>, [">= 0"])
         | 
| 212 | 
            +
                  s.add_development_dependency(%q<jeweler>, [">= 0"])
         | 
| 205 213 | 
             
                else
         | 
| 206 | 
            -
                  s.add_dependency(%q< | 
| 214 | 
            +
                  s.add_dependency(%q<rbnacl-libsodium>, [">= 1.0.2"])
         | 
| 215 | 
            +
                  s.add_dependency(%q<rbnacl>, [">= 3.1.2"])
         | 
| 216 | 
            +
                  s.add_dependency(%q<bcrypt_pbkdf>, ["= 1.0.0.alpha1"]) unless RUBY_PLATFORM == "java"
         | 
| 217 | 
            +
                  s.add_dependency(%q<rake>, [">= 0"])
         | 
| 218 | 
            +
                  s.add_dependency(%q<test-unit>, [">= 0.8.5"])
         | 
| 207 219 | 
             
                  s.add_dependency(%q<mocha>, [">= 0"])
         | 
| 220 | 
            +
                  s.add_dependency(%q<jeweler>, [">= 0"])
         | 
| 208 221 | 
             
                end
         | 
| 209 222 | 
             
              else
         | 
| 210 | 
            -
                s.add_dependency(%q< | 
| 223 | 
            +
                s.add_dependency(%q<rbnacl-libsodium>, [">= 1.0.2"])
         | 
| 224 | 
            +
                s.add_dependency(%q<rbnacl>, [">= 3.1.2"])
         | 
| 225 | 
            +
                s.add_dependency(%q<bcrypt_pbkdf>, ["= 1.0.0.alpha1"]) unless RUBY_PLATFORM == "java"
         | 
| 226 | 
            +
                s.add_dependency(%q<rake>, [">= 0"])
         | 
| 227 | 
            +
                s.add_dependency(%q<test-unit>, [">= 0.8.5"])
         | 
| 211 228 | 
             
                s.add_dependency(%q<mocha>, [">= 0"])
         | 
| 229 | 
            +
                s.add_dependency(%q<jeweler>, [">= 0"])
         | 
| 212 230 | 
             
              end
         | 
| 231 | 
            +
              s.add_dependency('jruby-pageant', ['>= 1.1.1']) if RUBY_PLATFORM == 'jruby'
         | 
| 213 232 | 
             
            end
         | 
| 214 233 |  | 
| @@ -32,11 +32,6 @@ module Authentication | |
| 32 32 | 
             
                  agent(false).connect!
         | 
| 33 33 | 
             
                end
         | 
| 34 34 |  | 
| 35 | 
            -
                def test_connect_should_use_agent_socket_factory_instead_of_factory
         | 
| 36 | 
            -
                  assert_equal agent.connect!, socket
         | 
| 37 | 
            -
                  assert_equal agent.connect!(agent_socket_factory), "/foo/bar.sock"
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
             | 
| 40 35 | 
             
                def test_connect_should_raise_error_if_connection_could_not_be_established
         | 
| 41 36 | 
             
                  factory.expects(:open).raises(SocketError)
         | 
| 42 37 | 
             
                  assert_raises(Net::SSH::Authentication::AgentNotAvailable) { agent(false).connect! }
         | 
| @@ -218,15 +213,12 @@ module Authentication | |
| 218 213 | 
             
                  def agent(auto=:connect)
         | 
| 219 214 | 
             
                    @agent ||= begin
         | 
| 220 215 | 
             
                      agent = Net::SSH::Authentication::Agent.new
         | 
| 221 | 
            -
                      agent.stubs(: | 
| 216 | 
            +
                      agent.stubs(:agent_socket_factory).returns(factory)
         | 
| 222 217 | 
             
                      agent.connect! if auto == :connect
         | 
| 223 218 | 
             
                      agent
         | 
| 224 219 | 
             
                    end
         | 
| 225 220 | 
             
                  end
         | 
| 226 221 |  | 
| 227 | 
            -
                  def agent_socket_factory
         | 
| 228 | 
            -
                    @agent_socket_factory ||= ->{"/foo/bar.sock"}
         | 
| 229 | 
            -
                  end
         | 
| 230 222 | 
             
              end
         | 
| 231 223 |  | 
| 232 224 | 
             
            end
         | 
| @@ -0,0 +1,77 @@ | |
| 1 | 
            +
            require 'common'
         | 
| 2 | 
            +
            require 'net/ssh/authentication/ed25519'
         | 
| 3 | 
            +
            require 'base64'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Authentication
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class TestED25519 < Test::Unit::TestCase
         | 
| 8 | 
            +
                def test_no_pwd_key
         | 
| 9 | 
            +
                  pub = Net::SSH::Buffer.new(Base64.decode64(public_key_no_pwd.split(' ')[1]))
         | 
| 10 | 
            +
                  _type = pub.read_string
         | 
| 11 | 
            +
                  pub_data = pub.read_string
         | 
| 12 | 
            +
                  priv = private_key_no_pwd
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  pub_key = ED25519::PubKey.new(pub_data)
         | 
| 15 | 
            +
                  priv_key = ED25519::PrivKey.new(priv,nil)
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  shared_secret = "Hello"
         | 
| 18 | 
            +
                  signed = priv_key.ssh_do_sign(shared_secret)
         | 
| 19 | 
            +
                  self.assert_equal(true,pub_key.ssh_do_verify(signed,shared_secret))
         | 
| 20 | 
            +
                  self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def test_pwd_key
         | 
| 24 | 
            +
                  if defined?(JRUBY_VERSION)
         | 
| 25 | 
            +
                    puts "Skipping password protected ED25519 for JRuby"
         | 
| 26 | 
            +
                    return
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                  pub = Net::SSH::Buffer.new(Base64.decode64(public_key_pwd.split(' ')[1]))
         | 
| 29 | 
            +
                  _type = pub.read_string
         | 
| 30 | 
            +
                  pub_data = pub.read_string
         | 
| 31 | 
            +
                  priv = private_key_pwd
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  pub_key = ED25519::PubKey.new(pub_data)
         | 
| 34 | 
            +
                  priv_key = ED25519::PrivKey.new(priv,'pwd')
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  shared_secret = "Hello"
         | 
| 37 | 
            +
                  signed = priv_key.ssh_do_sign(shared_secret)
         | 
| 38 | 
            +
                  self.assert_equal(true,pub_key.ssh_do_verify(signed,shared_secret))
         | 
| 39 | 
            +
                  self.assert_equal(priv_key.public_key.fingerprint, pub_key.fingerprint)
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def private_key_pwd
         | 
| 43 | 
            +
                  @pwd_key = <<-EOF
         | 
| 44 | 
            +
            -----BEGIN OPENSSH PRIVATE KEY-----
         | 
| 45 | 
            +
            b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jYmMAAAAGYmNyeXB0AAAAGAAAABBxwCvr3V
         | 
| 46 | 
            +
            /8pWhC/xvTnGJhAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAICaHkFaGXqYhUVFc
         | 
| 47 | 
            +
            aZ10TPUbkIvmaFXwYRoOS5qE8MciAAAAsNUAhbNQKwNcOr0eNq3nhtjoyeVyH8hRrpWsiY
         | 
| 48 | 
            +
            46vPiECi6R6OdYGSd7W3fdzUDeyOYCY9ZVIjAzENG+9FsygYzMi6XCuw00OuDFLUp4fL4K
         | 
| 49 | 
            +
            i/coUIVqouB4TPQAmsCVXiIRVTWQtRG0kWfFaV3qRt/bc22ZCvCT6ZZ1UmtulqqfUhSlKM
         | 
| 50 | 
            +
            oPcTikV1iWH5Xc+GxRFRRGTN/6HvBf0AKDB1kMXlDhGnBnHGeNH1pk44xG
         | 
| 51 | 
            +
            -----END OPENSSH PRIVATE KEY-----
         | 
| 52 | 
            +
                  EOF
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def public_key_pwd
         | 
| 56 | 
            +
                  'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICaHkFaGXqYhUVFcaZ10TPUbkIvmaFXwYRoOS5qE8Mci vagrant@vagrant-ubuntu-trusty-64'
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                def private_key_no_pwd
         | 
| 60 | 
            +
                  @anonymous_key = <<-EOF
         | 
| 61 | 
            +
            -----BEGIN OPENSSH PRIVATE KEY-----
         | 
| 62 | 
            +
            b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
         | 
| 63 | 
            +
            QyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQAAAKjlHzLo5R8y
         | 
| 64 | 
            +
            6AAAAAtzc2gtZWQyNTUxOQAAACAwdjQYeBiTz1DdZFzzLvG+t913L+eVqCgtzpAYxQG8yQ
         | 
| 65 | 
            +
            AAAEBPrD+n4901Y+NYJ2sry+EWRdltGFhMISvp91TywJ//mTB2NBh4GJPPUN1kXPMu8b63
         | 
| 66 | 
            +
            3Xcv55WoKC3OkBjFAbzJAAAAIHZhZ3JhbnRAdmFncmFudC11YnVudHUtdHJ1c3R5LTY0AQ
         | 
| 67 | 
            +
            IDBAU=
         | 
| 68 | 
            +
            -----END OPENSSH PRIVATE KEY-----
         | 
| 69 | 
            +
                  EOF
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def public_key_no_pwd
         | 
| 73 | 
            +
                  'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDB2NBh4GJPPUN1kXPMu8b633Xcv55WoKC3OkBjFAbzJ vagrant@vagrant-ubuntu-trusty-64'
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            end
         |