net-ssh 5.0.2 → 7.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.dockerignore +6 -0
- data/.github/config/rubocop_linter_action.yml +4 -0
- data/.github/workflows/ci-with-docker.yml +44 -0
- data/.github/workflows/ci.yml +87 -0
- data/.github/workflows/rubocop.yml +13 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +19 -2
- data/.rubocop_todo.yml +623 -511
- data/CHANGES.txt +76 -0
- data/Dockerfile +27 -0
- data/Dockerfile.openssl3 +17 -0
- data/Gemfile +2 -0
- data/Gemfile.noed25519 +2 -0
- data/Manifest +0 -1
- data/README.md +293 -0
- data/Rakefile +6 -2
- data/appveyor.yml +4 -2
- data/docker-compose.yml +23 -0
- data/lib/net/ssh/authentication/agent.rb +36 -14
- data/lib/net/ssh/authentication/certificate.rb +19 -7
- data/lib/net/ssh/authentication/constants.rb +0 -1
- data/lib/net/ssh/authentication/ed25519.rb +83 -50
- data/lib/net/ssh/authentication/ed25519_loader.rb +5 -8
- data/lib/net/ssh/authentication/key_manager.rb +74 -33
- data/lib/net/ssh/authentication/methods/abstract.rb +12 -3
- data/lib/net/ssh/authentication/methods/hostbased.rb +3 -5
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +5 -3
- data/lib/net/ssh/authentication/methods/none.rb +6 -9
- data/lib/net/ssh/authentication/methods/password.rb +2 -3
- data/lib/net/ssh/authentication/methods/publickey.rb +58 -16
- data/lib/net/ssh/authentication/pageant.rb +97 -97
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +2 -3
- data/lib/net/ssh/authentication/session.rb +27 -23
- data/lib/net/ssh/buffer.rb +91 -40
- data/lib/net/ssh/buffered_io.rb +24 -26
- data/lib/net/ssh/config.rb +99 -53
- data/lib/net/ssh/connection/channel.rb +101 -87
- data/lib/net/ssh/connection/constants.rb +0 -4
- data/lib/net/ssh/connection/event_loop.rb +30 -25
- data/lib/net/ssh/connection/keepalive.rb +12 -12
- data/lib/net/ssh/connection/session.rb +115 -111
- data/lib/net/ssh/connection/term.rb +56 -58
- data/lib/net/ssh/errors.rb +12 -12
- data/lib/net/ssh/key_factory.rb +108 -22
- data/lib/net/ssh/known_hosts.rb +120 -36
- data/lib/net/ssh/loggable.rb +10 -11
- data/lib/net/ssh/packet.rb +1 -1
- data/lib/net/ssh/prompt.rb +9 -11
- data/lib/net/ssh/proxy/command.rb +1 -2
- data/lib/net/ssh/proxy/errors.rb +2 -4
- data/lib/net/ssh/proxy/http.rb +18 -20
- data/lib/net/ssh/proxy/https.rb +8 -10
- data/lib/net/ssh/proxy/jump.rb +8 -10
- data/lib/net/ssh/proxy/socks4.rb +2 -4
- data/lib/net/ssh/proxy/socks5.rb +3 -6
- data/lib/net/ssh/service/forward.rb +9 -8
- data/lib/net/ssh/test/channel.rb +24 -26
- data/lib/net/ssh/test/extensions.rb +37 -35
- data/lib/net/ssh/test/kex.rb +6 -8
- data/lib/net/ssh/test/local_packet.rb +0 -2
- data/lib/net/ssh/test/packet.rb +3 -3
- data/lib/net/ssh/test/remote_packet.rb +6 -8
- data/lib/net/ssh/test/script.rb +25 -27
- data/lib/net/ssh/test/socket.rb +12 -15
- data/lib/net/ssh/test.rb +12 -12
- data/lib/net/ssh/transport/algorithms.rb +177 -118
- data/lib/net/ssh/transport/cipher_factory.rb +34 -50
- data/lib/net/ssh/transport/constants.rb +13 -9
- data/lib/net/ssh/transport/ctr.rb +8 -14
- data/lib/net/ssh/transport/hmac/abstract.rb +20 -5
- data/lib/net/ssh/transport/hmac/md5.rb +0 -2
- data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/none.rb +0 -2
- data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
- data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
- data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac.rb +13 -11
- data/lib/net/ssh/transport/identity_cipher.rb +11 -13
- data/lib/net/ssh/transport/kex/abstract.rb +130 -0
- data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +5 -19
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +30 -139
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +1 -8
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +20 -81
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +5 -4
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +5 -4
- data/lib/net/ssh/transport/kex.rb +15 -10
- data/lib/net/ssh/transport/key_expander.rb +7 -8
- data/lib/net/ssh/transport/openssl.rb +149 -111
- data/lib/net/ssh/transport/packet_stream.rb +53 -22
- data/lib/net/ssh/transport/server_version.rb +17 -16
- data/lib/net/ssh/transport/session.rb +35 -11
- data/lib/net/ssh/transport/state.rb +44 -44
- data/lib/net/ssh/verifiers/accept_new.rb +7 -2
- data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +1 -2
- data/lib/net/ssh/verifiers/always.rb +10 -4
- data/lib/net/ssh/verifiers/never.rb +4 -2
- data/lib/net/ssh/version.rb +2 -2
- data/lib/net/ssh.rb +17 -9
- data/net-ssh-public_cert.pem +18 -19
- data/net-ssh.gemspec +9 -7
- data/support/ssh_tunnel_bug.rb +3 -3
- data.tar.gz.sig +0 -0
- metadata +65 -41
- metadata.gz.sig +0 -0
- data/.travis.yml +0 -52
- data/Gemfile.noed25519.lock +0 -41
- data/README.rdoc +0 -169
- data/lib/net/ssh/ruby_compat.rb +0 -13
- data/support/arcfour_check.rb +0 -20
|
@@ -3,68 +3,56 @@ require 'net/ssh/transport/ctr.rb'
|
|
|
3
3
|
require 'net/ssh/transport/key_expander'
|
|
4
4
|
require 'net/ssh/transport/identity_cipher'
|
|
5
5
|
|
|
6
|
-
module Net
|
|
7
|
-
module SSH
|
|
6
|
+
module Net
|
|
7
|
+
module SSH
|
|
8
8
|
module Transport
|
|
9
|
-
|
|
10
9
|
# Implements a factory of OpenSSL cipher algorithms.
|
|
11
10
|
class CipherFactory
|
|
12
11
|
# Maps the SSH name of a cipher to it's corresponding OpenSSL name
|
|
13
12
|
SSH_TO_OSSL = {
|
|
14
|
-
"3des-cbc"
|
|
15
|
-
"blowfish-cbc"
|
|
16
|
-
"aes256-cbc"
|
|
17
|
-
"aes192-cbc"
|
|
18
|
-
"aes128-cbc"
|
|
19
|
-
"idea-cbc"
|
|
20
|
-
"cast128-cbc"
|
|
13
|
+
"3des-cbc" => "des-ede3-cbc",
|
|
14
|
+
"blowfish-cbc" => "bf-cbc",
|
|
15
|
+
"aes256-cbc" => "aes-256-cbc",
|
|
16
|
+
"aes192-cbc" => "aes-192-cbc",
|
|
17
|
+
"aes128-cbc" => "aes-128-cbc",
|
|
18
|
+
"idea-cbc" => "idea-cbc",
|
|
19
|
+
"cast128-cbc" => "cast-cbc",
|
|
21
20
|
"rijndael-cbc@lysator.liu.se" => "aes-256-cbc",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"aes192-ctr" => ::OpenSSL::Cipher.ciphers.include?("aes-192-ctr") ? "aes-192-ctr" : "aes-192-ecb",
|
|
32
|
-
"aes128-ctr" => ::OpenSSL::Cipher.ciphers.include?("aes-128-ctr") ? "aes-128-ctr" : "aes-128-ecb",
|
|
33
|
-
"cast128-ctr" => "cast5-ecb",
|
|
34
|
-
|
|
35
|
-
"none" => "none"
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
# Ruby's OpenSSL bindings always return a key length of 16 for RC4 ciphers
|
|
39
|
-
# resulting in the error: OpenSSL::CipherError: key length too short.
|
|
40
|
-
# The following ciphers will override this key length.
|
|
41
|
-
KEY_LEN_OVERRIDE = {
|
|
42
|
-
"arcfour256" => 32,
|
|
43
|
-
"arcfour512" => 64
|
|
21
|
+
"3des-ctr" => "des-ede3",
|
|
22
|
+
"blowfish-ctr" => "bf-ecb",
|
|
23
|
+
|
|
24
|
+
"aes256-ctr" => ::OpenSSL::Cipher.ciphers.include?("aes-256-ctr") ? "aes-256-ctr" : "aes-256-ecb",
|
|
25
|
+
"aes192-ctr" => ::OpenSSL::Cipher.ciphers.include?("aes-192-ctr") ? "aes-192-ctr" : "aes-192-ecb",
|
|
26
|
+
"aes128-ctr" => ::OpenSSL::Cipher.ciphers.include?("aes-128-ctr") ? "aes-128-ctr" : "aes-128-ecb",
|
|
27
|
+
'cast128-ctr' => 'cast5-ecb',
|
|
28
|
+
|
|
29
|
+
'none' => 'none'
|
|
44
30
|
}
|
|
45
|
-
|
|
31
|
+
|
|
46
32
|
# Returns true if the underlying OpenSSL library supports the given cipher,
|
|
47
33
|
# and false otherwise.
|
|
48
34
|
def self.supported?(name)
|
|
49
35
|
ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
|
|
50
36
|
return true if ossl_name == "none"
|
|
37
|
+
|
|
51
38
|
return OpenSSL::Cipher.ciphers.include?(ossl_name)
|
|
52
39
|
end
|
|
53
|
-
|
|
40
|
+
|
|
54
41
|
# Retrieves a new instance of the named algorithm. The new instance
|
|
55
42
|
# will be initialized using an iv and key generated from the given
|
|
56
43
|
# iv, key, shared, hash and digester values. Additionally, the
|
|
57
44
|
# cipher will be put into encryption or decryption mode, based on the
|
|
58
45
|
# value of the +encrypt+ parameter.
|
|
59
|
-
def self.get(name, options={})
|
|
46
|
+
def self.get(name, options = {})
|
|
60
47
|
ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
|
|
61
48
|
return IdentityCipher if ossl_name == "none"
|
|
49
|
+
|
|
62
50
|
cipher = OpenSSL::Cipher.new(ossl_name)
|
|
63
|
-
|
|
51
|
+
|
|
64
52
|
cipher.send(options[:encrypt] ? :encrypt : :decrypt)
|
|
65
|
-
|
|
53
|
+
|
|
66
54
|
cipher.padding = 0
|
|
67
|
-
|
|
55
|
+
|
|
68
56
|
if name =~ /-ctr(@openssh.org)?$/
|
|
69
57
|
if ossl_name !~ /-ctr/
|
|
70
58
|
cipher.extend(Net::SSH::Transport::CTR)
|
|
@@ -72,16 +60,15 @@ module Net
|
|
|
72
60
|
cipher = Net::SSH::Transport::OpenSSLAESCTR.new(cipher)
|
|
73
61
|
end
|
|
74
62
|
end
|
|
75
|
-
cipher.iv = Net::SSH::Transport::KeyExpander.expand_key(cipher.iv_len, options[:iv], options)
|
|
76
|
-
|
|
77
|
-
key_len =
|
|
63
|
+
cipher.iv = Net::SSH::Transport::KeyExpander.expand_key(cipher.iv_len, options[:iv], options)
|
|
64
|
+
|
|
65
|
+
key_len = cipher.key_len
|
|
78
66
|
cipher.key_len = key_len
|
|
79
67
|
cipher.key = Net::SSH::Transport::KeyExpander.expand_key(key_len, options[:key], options)
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
|
|
82
69
|
return cipher
|
|
83
70
|
end
|
|
84
|
-
|
|
71
|
+
|
|
85
72
|
# Returns a two-element array containing the [ key-length,
|
|
86
73
|
# block-size ] for the named cipher algorithm. If the cipher
|
|
87
74
|
# algorithm is unknown, or is "none", 0 is returned for both elements
|
|
@@ -94,26 +81,23 @@ module Net
|
|
|
94
81
|
result << 0 if options[:iv_len]
|
|
95
82
|
else
|
|
96
83
|
cipher = OpenSSL::Cipher.new(ossl_name)
|
|
97
|
-
key_len =
|
|
84
|
+
key_len = cipher.key_len
|
|
98
85
|
cipher.key_len = key_len
|
|
99
|
-
|
|
86
|
+
|
|
100
87
|
block_size =
|
|
101
88
|
case ossl_name
|
|
102
|
-
when "rc4"
|
|
103
|
-
8
|
|
104
89
|
when /\-ctr/
|
|
105
90
|
Net::SSH::Transport::OpenSSLAESCTR.block_size
|
|
106
91
|
else
|
|
107
92
|
cipher.block_size
|
|
108
93
|
end
|
|
109
|
-
|
|
94
|
+
|
|
110
95
|
result = [key_len, block_size]
|
|
111
96
|
result << cipher.iv_len if options[:iv_len]
|
|
112
97
|
end
|
|
113
98
|
result
|
|
114
99
|
end
|
|
115
100
|
end
|
|
116
|
-
|
|
117
101
|
end
|
|
118
102
|
end
|
|
119
103
|
end
|
|
@@ -1,35 +1,39 @@
|
|
|
1
|
-
module Net
|
|
2
|
-
module SSH
|
|
1
|
+
module Net
|
|
2
|
+
module SSH
|
|
3
3
|
module Transport
|
|
4
4
|
module Constants
|
|
5
|
-
|
|
6
5
|
#--
|
|
7
6
|
# Transport layer generic messages
|
|
8
7
|
#++
|
|
9
|
-
|
|
8
|
+
|
|
10
9
|
DISCONNECT = 1
|
|
11
10
|
IGNORE = 2
|
|
12
11
|
UNIMPLEMENTED = 3
|
|
13
12
|
DEBUG = 4
|
|
14
13
|
SERVICE_REQUEST = 5
|
|
15
14
|
SERVICE_ACCEPT = 6
|
|
16
|
-
|
|
15
|
+
|
|
17
16
|
#--
|
|
18
17
|
# Algorithm negotiation messages
|
|
19
18
|
#++
|
|
20
|
-
|
|
19
|
+
|
|
21
20
|
KEXINIT = 20
|
|
22
21
|
NEWKEYS = 21
|
|
23
|
-
|
|
22
|
+
|
|
24
23
|
#--
|
|
25
24
|
# Key exchange method specific messages
|
|
26
25
|
#++
|
|
27
|
-
|
|
26
|
+
|
|
28
27
|
KEXDH_INIT = 30
|
|
29
28
|
KEXDH_REPLY = 31
|
|
30
|
-
|
|
29
|
+
|
|
31
30
|
KEXECDH_INIT = 30
|
|
32
31
|
KEXECDH_REPLY = 31
|
|
32
|
+
|
|
33
|
+
KEXDH_GEX_GROUP = 31
|
|
34
|
+
KEXDH_GEX_INIT = 32
|
|
35
|
+
KEXDH_GEX_REPLY = 33
|
|
36
|
+
KEXDH_GEX_REQUEST = 34
|
|
33
37
|
end
|
|
34
38
|
end
|
|
35
39
|
end
|
|
@@ -2,7 +2,7 @@ require 'openssl'
|
|
|
2
2
|
require 'delegate'
|
|
3
3
|
|
|
4
4
|
module Net::SSH::Transport
|
|
5
|
-
|
|
5
|
+
# :nodoc:
|
|
6
6
|
class OpenSSLAESCTR < SimpleDelegator
|
|
7
7
|
def initialize(original)
|
|
8
8
|
super
|
|
@@ -26,13 +26,13 @@ module Net::SSH::Transport
|
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
# :nodoc:
|
|
30
30
|
# Pure-Ruby implementation of Stateful Decryption Counter(SDCTR) Mode
|
|
31
31
|
# for Block Ciphers. See RFC4344 for detail.
|
|
32
32
|
module CTR
|
|
33
33
|
def self.extended(orig)
|
|
34
34
|
orig.instance_eval {
|
|
35
|
-
@remaining =
|
|
35
|
+
@remaining = String.new
|
|
36
36
|
@counter = nil
|
|
37
37
|
@counter_len = orig.block_size
|
|
38
38
|
orig.encrypt
|
|
@@ -67,13 +67,13 @@ module Net::SSH::Transport
|
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def reset
|
|
70
|
-
@remaining =
|
|
70
|
+
@remaining = String.new
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
def update(data)
|
|
74
74
|
@remaining += data
|
|
75
75
|
|
|
76
|
-
encrypted =
|
|
76
|
+
encrypted = String.new
|
|
77
77
|
|
|
78
78
|
offset = 0
|
|
79
79
|
while (@remaining.bytesize - offset) >= block_size
|
|
@@ -88,20 +88,14 @@ module Net::SSH::Transport
|
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
def final
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
else
|
|
94
|
-
s = ""
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
@remaining = ""
|
|
98
|
-
|
|
91
|
+
s = @remaining.empty? ? '' : xor!(@remaining, _update(@counter))
|
|
92
|
+
@remaining = String.new
|
|
99
93
|
s
|
|
100
94
|
end
|
|
101
95
|
|
|
102
96
|
def xor!(s1, s2)
|
|
103
97
|
s = []
|
|
104
|
-
s1.unpack('Q*').zip(s2.unpack('Q*')) {|a,b| s.push(a ^ b) }
|
|
98
|
+
s1.unpack('Q*').zip(s2.unpack('Q*')) {|a, b| s.push(a ^ b) }
|
|
105
99
|
s.pack('Q*')
|
|
106
100
|
end
|
|
107
101
|
singleton_class.send(:private, :xor!)
|
|
@@ -5,10 +5,21 @@ module Net
|
|
|
5
5
|
module SSH
|
|
6
6
|
module Transport
|
|
7
7
|
module HMAC
|
|
8
|
-
|
|
9
8
|
# The base class of all OpenSSL-based HMAC algorithm wrappers.
|
|
10
9
|
class Abstract
|
|
11
|
-
class <<self
|
|
10
|
+
class << self
|
|
11
|
+
def etm(*v)
|
|
12
|
+
@etm = false if !defined?(@etm)
|
|
13
|
+
if v.empty?
|
|
14
|
+
@etm = superclass.etm if @etm.nil? && superclass.respond_to?(:etm)
|
|
15
|
+
return @etm
|
|
16
|
+
elsif v.length == 1
|
|
17
|
+
@etm = v.first
|
|
18
|
+
else
|
|
19
|
+
raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
12
23
|
def key_length(*v)
|
|
13
24
|
@key_length = nil if !defined?(@key_length)
|
|
14
25
|
if v.empty?
|
|
@@ -46,6 +57,10 @@ module Net
|
|
|
46
57
|
end
|
|
47
58
|
end
|
|
48
59
|
|
|
60
|
+
def etm
|
|
61
|
+
self.class.etm
|
|
62
|
+
end
|
|
63
|
+
|
|
49
64
|
def key_length
|
|
50
65
|
self.class.key_length
|
|
51
66
|
end
|
|
@@ -61,19 +76,19 @@ module Net
|
|
|
61
76
|
# The key in use for this instance.
|
|
62
77
|
attr_reader :key
|
|
63
78
|
|
|
64
|
-
def initialize(key=nil)
|
|
79
|
+
def initialize(key = nil)
|
|
65
80
|
self.key = key
|
|
66
81
|
end
|
|
67
82
|
|
|
68
83
|
# Sets the key to the given value, truncating it so that it is the correct
|
|
69
84
|
# length.
|
|
70
85
|
def key=(value)
|
|
71
|
-
@key = value ? value.to_s[0,key_length] : nil
|
|
86
|
+
@key = value ? value.to_s[0, key_length] : nil
|
|
72
87
|
end
|
|
73
88
|
|
|
74
89
|
# Compute the HMAC digest for the given data string.
|
|
75
90
|
def digest(data)
|
|
76
|
-
OpenSSL::HMAC.digest(digest_class.new, key, data)[0,mac_length]
|
|
91
|
+
OpenSSL::HMAC.digest(digest_class.new, key, data)[0, mac_length]
|
|
77
92
|
end
|
|
78
93
|
end
|
|
79
94
|
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
3
|
module Net::SSH::Transport::HMAC
|
|
4
|
-
|
|
5
4
|
# The "none" algorithm. This has a key and mac length of 0.
|
|
6
5
|
class None < Abstract
|
|
7
6
|
key_length 0
|
|
@@ -11,5 +10,4 @@ module Net::SSH::Transport::HMAC
|
|
|
11
10
|
""
|
|
12
11
|
end
|
|
13
12
|
end
|
|
14
|
-
|
|
15
13
|
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
3
|
module Net::SSH::Transport::HMAC
|
|
4
|
-
|
|
5
4
|
# The RIPEMD-160 HMAC algorithm. This has a mac and key length of 20, and
|
|
6
5
|
# uses the RIPEMD-160 digest algorithm.
|
|
7
6
|
class RIPEMD160 < Abstract
|
|
@@ -9,5 +8,4 @@ module Net::SSH::Transport::HMAC
|
|
|
9
8
|
key_length 20
|
|
10
9
|
digest_class OpenSSL::Digest::RIPEMD160
|
|
11
10
|
end
|
|
12
|
-
|
|
13
11
|
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
3
|
module Net::SSH::Transport::HMAC
|
|
4
|
-
|
|
5
4
|
# The SHA1 HMAC algorithm. This has a mac and key length of 20, and
|
|
6
5
|
# uses the SHA1 digest algorithm.
|
|
7
6
|
class SHA1 < Abstract
|
|
@@ -9,5 +8,4 @@ module Net::SSH::Transport::HMAC
|
|
|
9
8
|
key_length 20
|
|
10
9
|
digest_class OpenSSL::Digest::SHA1
|
|
11
10
|
end
|
|
12
|
-
|
|
13
11
|
end
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
key_length 32
|
|
11
|
-
digest_class OpenSSL::Digest::SHA256
|
|
12
|
-
end
|
|
13
|
-
|
|
3
|
+
module Net::SSH::Transport::HMAC
|
|
4
|
+
# The SHA-256 HMAC algorithm. This has a mac and key length of 32, and
|
|
5
|
+
# uses the SHA-256 digest algorithm.
|
|
6
|
+
class SHA2_256 < Abstract
|
|
7
|
+
mac_length 32
|
|
8
|
+
key_length 32
|
|
9
|
+
digest_class OpenSSL::Digest::SHA256
|
|
14
10
|
end
|
|
15
11
|
end
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
3
|
module Net::SSH::Transport::HMAC
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class SHA2_256_96 < SHA2_256
|
|
9
|
-
mac_length 12
|
|
10
|
-
end
|
|
4
|
+
# The SHA256-96 HMAC algorithm. This returns only the first 12 bytes of
|
|
5
|
+
# the digest.
|
|
6
|
+
class SHA2_256_96 < SHA2_256
|
|
7
|
+
mac_length 12
|
|
11
8
|
end
|
|
12
|
-
|
|
13
9
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'net/ssh/transport/hmac/abstract'
|
|
2
|
+
|
|
3
|
+
module Net::SSH::Transport::HMAC
|
|
4
|
+
# The SHA-256 Encrypt-Then-Mac HMAC algorithm. This has a mac and
|
|
5
|
+
# key length of 32, and uses the SHA-256 digest algorithm.
|
|
6
|
+
class SHA2_256_Etm < Abstract
|
|
7
|
+
etm true
|
|
8
|
+
mac_length 32
|
|
9
|
+
key_length 32
|
|
10
|
+
digest_class OpenSSL::Digest::SHA256
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
3
|
module Net::SSH::Transport::HMAC
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
key_length 64
|
|
11
|
-
digest_class OpenSSL::Digest::SHA512
|
|
12
|
-
end
|
|
4
|
+
# The SHA-512 HMAC algorithm. This has a mac and key length of 64, and
|
|
5
|
+
# uses the SHA-512 digest algorithm.
|
|
6
|
+
class SHA2_512 < Abstract
|
|
7
|
+
mac_length 64
|
|
8
|
+
key_length 64
|
|
9
|
+
digest_class OpenSSL::Digest::SHA512
|
|
13
10
|
end
|
|
14
11
|
end
|
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
require 'net/ssh/transport/hmac/abstract'
|
|
2
2
|
|
|
3
3
|
module Net::SSH::Transport::HMAC
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class SHA2_512_96 < SHA2_512
|
|
9
|
-
mac_length 12
|
|
10
|
-
end
|
|
4
|
+
# The SHA2-512-96 HMAC algorithm. This returns only the first 12 bytes of
|
|
5
|
+
# the digest.
|
|
6
|
+
class SHA2_512_96 < SHA2_512
|
|
7
|
+
mac_length 12
|
|
11
8
|
end
|
|
12
|
-
|
|
13
9
|
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'net/ssh/transport/hmac/abstract'
|
|
2
|
+
|
|
3
|
+
module Net::SSH::Transport::HMAC
|
|
4
|
+
# The SHA-512 Encrypt-Then-Mac HMAC algorithm. This has a mac and
|
|
5
|
+
# key length of 64, and uses the SHA-512 digest algorithm.
|
|
6
|
+
class SHA2_512_Etm < Abstract
|
|
7
|
+
etm true
|
|
8
|
+
mac_length 64
|
|
9
|
+
key_length 64
|
|
10
|
+
digest_class OpenSSL::Digest::SHA512
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -7,6 +7,8 @@ require 'net/ssh/transport/hmac/sha2_256'
|
|
|
7
7
|
require 'net/ssh/transport/hmac/sha2_256_96'
|
|
8
8
|
require 'net/ssh/transport/hmac/sha2_512'
|
|
9
9
|
require 'net/ssh/transport/hmac/sha2_512_96'
|
|
10
|
+
require 'net/ssh/transport/hmac/sha2_256_etm'
|
|
11
|
+
require 'net/ssh/transport/hmac/sha2_512_etm'
|
|
10
12
|
require 'net/ssh/transport/hmac/ripemd160'
|
|
11
13
|
require 'net/ssh/transport/hmac/none'
|
|
12
14
|
|
|
@@ -15,24 +17,24 @@ require 'net/ssh/transport/hmac/none'
|
|
|
15
17
|
module Net::SSH::Transport::HMAC
|
|
16
18
|
# The mapping of SSH hmac algorithms to their implementations
|
|
17
19
|
MAP = {
|
|
18
|
-
'hmac-md5'
|
|
19
|
-
'hmac-md5-96'
|
|
20
|
-
'hmac-sha1'
|
|
21
|
-
'hmac-sha1-96'
|
|
20
|
+
'hmac-md5' => MD5,
|
|
21
|
+
'hmac-md5-96' => MD5_96,
|
|
22
|
+
'hmac-sha1' => SHA1,
|
|
23
|
+
'hmac-sha1-96' => SHA1_96,
|
|
24
|
+
'hmac-sha2-256' => SHA2_256,
|
|
25
|
+
'hmac-sha2-256-96' => SHA2_256_96,
|
|
26
|
+
'hmac-sha2-512' => SHA2_512,
|
|
27
|
+
'hmac-sha2-512-96' => SHA2_512_96,
|
|
28
|
+
'hmac-sha2-256-etm@openssh.com' => SHA2_256_Etm,
|
|
29
|
+
'hmac-sha2-512-etm@openssh.com' => SHA2_512_Etm,
|
|
22
30
|
'hmac-ripemd160' => RIPEMD160,
|
|
23
31
|
'hmac-ripemd160@openssh.com' => RIPEMD160,
|
|
24
32
|
'none' => None
|
|
25
33
|
}
|
|
26
34
|
|
|
27
|
-
# add mapping to sha2 hmac algorithms if they're available
|
|
28
|
-
MAP['hmac-sha2-256'] = SHA2_256 if defined?(::Net::SSH::Transport::HMAC::SHA2_256)
|
|
29
|
-
MAP['hmac-sha2-256-96'] = SHA2_256_96 if defined?(::Net::SSH::Transport::HMAC::SHA2_256_96)
|
|
30
|
-
MAP['hmac-sha2-512'] = SHA2_512 if defined?(::Net::SSH::Transport::HMAC::SHA2_512)
|
|
31
|
-
MAP['hmac-sha2-512-96'] = SHA2_512_96 if defined?(::Net::SSH::Transport::HMAC::SHA2_512_96)
|
|
32
|
-
|
|
33
35
|
# Retrieves a new hmac instance of the given SSH type (+name+). If +key+ is
|
|
34
36
|
# given, the new instance will be initialized with that key.
|
|
35
|
-
def self.get(name, key="", parameters = {})
|
|
37
|
+
def self.get(name, key = "", parameters = {})
|
|
36
38
|
impl = MAP[name] or raise ArgumentError, "hmac not found: #{name.inspect}"
|
|
37
39
|
impl.new(Net::SSH::Transport::KeyExpander.expand_key(impl.key_length, key, parameters))
|
|
38
40
|
end
|
|
@@ -1,59 +1,57 @@
|
|
|
1
|
-
module Net
|
|
2
|
-
module SSH
|
|
1
|
+
module Net
|
|
2
|
+
module SSH
|
|
3
3
|
module Transport
|
|
4
|
-
|
|
5
4
|
# A cipher that does nothing but pass the data through, unchanged. This
|
|
6
5
|
# keeps things in the code nice and clean when a cipher has not yet been
|
|
7
6
|
# determined (i.e., during key exchange).
|
|
8
7
|
class IdentityCipher
|
|
9
|
-
class <<self
|
|
8
|
+
class << self
|
|
10
9
|
# A default block size of 8 is required by the SSH2 protocol.
|
|
11
10
|
def block_size
|
|
12
11
|
8
|
|
13
12
|
end
|
|
14
|
-
|
|
13
|
+
|
|
15
14
|
# Returns an arbitrary integer.
|
|
16
15
|
def iv_len
|
|
17
16
|
4
|
|
18
17
|
end
|
|
19
|
-
|
|
18
|
+
|
|
20
19
|
# Does nothing. Returns self.
|
|
21
20
|
def encrypt
|
|
22
21
|
self
|
|
23
22
|
end
|
|
24
|
-
|
|
23
|
+
|
|
25
24
|
# Does nothing. Returns self.
|
|
26
25
|
def decrypt
|
|
27
26
|
self
|
|
28
27
|
end
|
|
29
|
-
|
|
28
|
+
|
|
30
29
|
# Passes its single argument through unchanged.
|
|
31
30
|
def update(text)
|
|
32
31
|
text
|
|
33
32
|
end
|
|
34
|
-
|
|
33
|
+
|
|
35
34
|
# Returns the empty string.
|
|
36
35
|
def final
|
|
37
36
|
""
|
|
38
37
|
end
|
|
39
|
-
|
|
38
|
+
|
|
40
39
|
# The name of this cipher, which is "identity".
|
|
41
40
|
def name
|
|
42
41
|
"identity"
|
|
43
42
|
end
|
|
44
|
-
|
|
43
|
+
|
|
45
44
|
# Does nothing. Returns nil.
|
|
46
45
|
def iv=(v)
|
|
47
46
|
nil
|
|
48
47
|
end
|
|
49
|
-
|
|
48
|
+
|
|
50
49
|
# Does nothing. Returns self.
|
|
51
50
|
def reset
|
|
52
51
|
self
|
|
53
52
|
end
|
|
54
53
|
end
|
|
55
54
|
end
|
|
56
|
-
|
|
57
55
|
end
|
|
58
56
|
end
|
|
59
57
|
end
|