net-ssh 3.2.0.rc2 → 7.1.0

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.
Files changed (204) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +2 -2
  3. data/.dockerignore +6 -0
  4. data/.github/config/rubocop_linter_action.yml +4 -0
  5. data/.github/workflows/ci-with-docker.yml +44 -0
  6. data/.github/workflows/ci.yml +87 -0
  7. data/.github/workflows/rubocop.yml +16 -0
  8. data/.gitignore +13 -0
  9. data/.rubocop.yml +22 -0
  10. data/.rubocop_todo.yml +1081 -0
  11. data/CHANGES.txt +228 -7
  12. data/Dockerfile +27 -0
  13. data/Dockerfile.openssl3 +17 -0
  14. data/Gemfile +13 -0
  15. data/Gemfile.noed25519 +12 -0
  16. data/ISSUE_TEMPLATE.md +30 -0
  17. data/Manifest +4 -5
  18. data/README.md +297 -0
  19. data/Rakefile +125 -74
  20. data/SECURITY.md +4 -0
  21. data/appveyor.yml +58 -0
  22. data/docker-compose.yml +23 -0
  23. data/lib/net/ssh/authentication/agent.rb +279 -18
  24. data/lib/net/ssh/authentication/certificate.rb +183 -0
  25. data/lib/net/ssh/authentication/constants.rb +17 -15
  26. data/lib/net/ssh/authentication/ed25519.rb +186 -0
  27. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  28. data/lib/net/ssh/authentication/key_manager.rb +86 -39
  29. data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
  30. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  31. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +13 -13
  32. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  33. data/lib/net/ssh/authentication/methods/password.rb +27 -17
  34. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  35. data/lib/net/ssh/authentication/pageant.rb +471 -367
  36. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  37. data/lib/net/ssh/authentication/session.rb +131 -121
  38. data/lib/net/ssh/buffer.rb +399 -300
  39. data/lib/net/ssh/buffered_io.rb +154 -150
  40. data/lib/net/ssh/config.rb +308 -185
  41. data/lib/net/ssh/connection/channel.rb +635 -613
  42. data/lib/net/ssh/connection/constants.rb +29 -29
  43. data/lib/net/ssh/connection/event_loop.rb +123 -0
  44. data/lib/net/ssh/connection/keepalive.rb +55 -51
  45. data/lib/net/ssh/connection/session.rb +620 -551
  46. data/lib/net/ssh/connection/term.rb +125 -123
  47. data/lib/net/ssh/errors.rb +101 -99
  48. data/lib/net/ssh/key_factory.rb +197 -105
  49. data/lib/net/ssh/known_hosts.rb +214 -127
  50. data/lib/net/ssh/loggable.rb +50 -49
  51. data/lib/net/ssh/packet.rb +83 -79
  52. data/lib/net/ssh/prompt.rb +50 -81
  53. data/lib/net/ssh/proxy/command.rb +105 -90
  54. data/lib/net/ssh/proxy/errors.rb +12 -10
  55. data/lib/net/ssh/proxy/http.rb +82 -79
  56. data/lib/net/ssh/proxy/https.rb +50 -0
  57. data/lib/net/ssh/proxy/jump.rb +54 -0
  58. data/lib/net/ssh/proxy/socks4.rb +2 -6
  59. data/lib/net/ssh/proxy/socks5.rb +14 -17
  60. data/lib/net/ssh/service/forward.rb +370 -317
  61. data/lib/net/ssh/test/channel.rb +145 -136
  62. data/lib/net/ssh/test/extensions.rb +131 -110
  63. data/lib/net/ssh/test/kex.rb +34 -32
  64. data/lib/net/ssh/test/local_packet.rb +46 -44
  65. data/lib/net/ssh/test/packet.rb +89 -70
  66. data/lib/net/ssh/test/remote_packet.rb +32 -30
  67. data/lib/net/ssh/test/script.rb +156 -142
  68. data/lib/net/ssh/test/socket.rb +49 -48
  69. data/lib/net/ssh/test.rb +82 -77
  70. data/lib/net/ssh/transport/algorithms.rb +441 -360
  71. data/lib/net/ssh/transport/cipher_factory.rb +96 -98
  72. data/lib/net/ssh/transport/constants.rb +32 -24
  73. data/lib/net/ssh/transport/ctr.rb +42 -22
  74. data/lib/net/ssh/transport/hmac/abstract.rb +81 -63
  75. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  76. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  77. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  78. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  79. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  80. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  81. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  82. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  83. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  84. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  85. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  86. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  87. data/lib/net/ssh/transport/hmac.rb +14 -12
  88. data/lib/net/ssh/transport/identity_cipher.rb +54 -52
  89. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  90. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  91. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  92. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  93. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  94. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  95. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
  96. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
  97. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  98. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  99. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  100. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  101. data/lib/net/ssh/transport/kex.rb +15 -12
  102. data/lib/net/ssh/transport/key_expander.rb +24 -20
  103. data/lib/net/ssh/transport/openssl.rb +161 -124
  104. data/lib/net/ssh/transport/packet_stream.rb +225 -185
  105. data/lib/net/ssh/transport/server_version.rb +55 -56
  106. data/lib/net/ssh/transport/session.rb +306 -255
  107. data/lib/net/ssh/transport/state.rb +178 -176
  108. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  109. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  110. data/lib/net/ssh/verifiers/always.rb +58 -0
  111. data/lib/net/ssh/verifiers/never.rb +19 -0
  112. data/lib/net/ssh/version.rb +55 -53
  113. data/lib/net/ssh.rb +110 -47
  114. data/net-ssh-public_cert.pem +18 -18
  115. data/net-ssh.gemspec +36 -205
  116. data/support/ssh_tunnel_bug.rb +5 -5
  117. data.tar.gz.sig +0 -0
  118. metadata +153 -118
  119. metadata.gz.sig +0 -0
  120. data/.travis.yml +0 -18
  121. data/README.rdoc +0 -182
  122. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  123. data/lib/net/ssh/authentication/agent/socket.rb +0 -178
  124. data/lib/net/ssh/ruby_compat.rb +0 -46
  125. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  126. data/lib/net/ssh/verifiers/null.rb +0 -12
  127. data/lib/net/ssh/verifiers/secure.rb +0 -52
  128. data/lib/net/ssh/verifiers/strict.rb +0 -24
  129. data/setup.rb +0 -1585
  130. data/support/arcfour_check.rb +0 -20
  131. data/test/README.txt +0 -18
  132. data/test/authentication/methods/common.rb +0 -28
  133. data/test/authentication/methods/test_abstract.rb +0 -51
  134. data/test/authentication/methods/test_hostbased.rb +0 -114
  135. data/test/authentication/methods/test_keyboard_interactive.rb +0 -121
  136. data/test/authentication/methods/test_none.rb +0 -41
  137. data/test/authentication/methods/test_password.rb +0 -95
  138. data/test/authentication/methods/test_publickey.rb +0 -148
  139. data/test/authentication/test_agent.rb +0 -232
  140. data/test/authentication/test_key_manager.rb +0 -240
  141. data/test/authentication/test_session.rb +0 -107
  142. data/test/common.rb +0 -125
  143. data/test/configs/auth_off +0 -5
  144. data/test/configs/auth_on +0 -4
  145. data/test/configs/empty +0 -0
  146. data/test/configs/eqsign +0 -3
  147. data/test/configs/exact_match +0 -8
  148. data/test/configs/host_plus +0 -10
  149. data/test/configs/multihost +0 -4
  150. data/test/configs/negative_match +0 -6
  151. data/test/configs/nohost +0 -19
  152. data/test/configs/numeric_host +0 -4
  153. data/test/configs/proxy_remote_user +0 -2
  154. data/test/configs/send_env +0 -2
  155. data/test/configs/substitutes +0 -8
  156. data/test/configs/wild_cards +0 -14
  157. data/test/connection/test_channel.rb +0 -487
  158. data/test/connection/test_session.rb +0 -564
  159. data/test/integration/README.txt +0 -17
  160. data/test/integration/Vagrantfile +0 -12
  161. data/test/integration/common.rb +0 -63
  162. data/test/integration/playbook.yml +0 -56
  163. data/test/integration/test_forward.rb +0 -637
  164. data/test/integration/test_id_rsa_keys.rb +0 -96
  165. data/test/integration/test_proxy.rb +0 -93
  166. data/test/known_hosts/github +0 -1
  167. data/test/known_hosts/github_hash +0 -1
  168. data/test/manual/test_pageant.rb +0 -37
  169. data/test/start/test_connection.rb +0 -53
  170. data/test/start/test_options.rb +0 -57
  171. data/test/start/test_transport.rb +0 -28
  172. data/test/start/test_user_nil.rb +0 -27
  173. data/test/test_all.rb +0 -12
  174. data/test/test_buffer.rb +0 -433
  175. data/test/test_buffered_io.rb +0 -63
  176. data/test/test_config.rb +0 -268
  177. data/test/test_key_factory.rb +0 -191
  178. data/test/test_known_hosts.rb +0 -66
  179. data/test/transport/hmac/test_md5.rb +0 -41
  180. data/test/transport/hmac/test_md5_96.rb +0 -27
  181. data/test/transport/hmac/test_none.rb +0 -34
  182. data/test/transport/hmac/test_ripemd160.rb +0 -36
  183. data/test/transport/hmac/test_sha1.rb +0 -36
  184. data/test/transport/hmac/test_sha1_96.rb +0 -27
  185. data/test/transport/hmac/test_sha2_256.rb +0 -37
  186. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  187. data/test/transport/hmac/test_sha2_512.rb +0 -37
  188. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  189. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  190. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -150
  191. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -96
  192. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -19
  193. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  194. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  195. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  196. data/test/transport/test_algorithms.rb +0 -328
  197. data/test/transport/test_cipher_factory.rb +0 -443
  198. data/test/transport/test_hmac.rb +0 -34
  199. data/test/transport/test_identity_cipher.rb +0 -40
  200. data/test/transport/test_packet_stream.rb +0 -1762
  201. data/test/transport/test_server_version.rb +0 -74
  202. data/test/transport/test_session.rb +0 -331
  203. data/test/transport/test_state.rb +0 -181
  204. data/test/verifiers/test_secure.rb +0 -40
@@ -3,103 +3,101 @@ 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; module SSH; module Transport
7
-
8
- # Implements a factory of OpenSSL cipher algorithms.
9
- class CipherFactory
10
- # Maps the SSH name of a cipher to it's corresponding OpenSSL name
11
- SSH_TO_OSSL = {
12
- "3des-cbc" => "des-ede3-cbc",
13
- "blowfish-cbc" => "bf-cbc",
14
- "aes256-cbc" => "aes-256-cbc",
15
- "aes192-cbc" => "aes-192-cbc",
16
- "aes128-cbc" => "aes-128-cbc",
17
- "idea-cbc" => "idea-cbc",
18
- "cast128-cbc" => "cast-cbc",
19
- "rijndael-cbc@lysator.liu.se" => "aes-256-cbc",
20
- "arcfour128" => "rc4",
21
- "arcfour256" => "rc4",
22
- "arcfour512" => "rc4",
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
-
31
- "3des-ctr" => "des-ede3",
32
- "blowfish-ctr" => "bf-ecb",
33
- "aes256-ctr" => "aes-256-ecb",
34
- "aes192-ctr" => "aes-192-ecb",
35
- "aes128-ctr" => "aes-128-ecb",
36
- "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
-
44
- "none" => "none",
45
- }
46
-
47
- # Ruby's OpenSSL bindings always return a key length of 16 for RC4 ciphers
48
- # resulting in the error: OpenSSL::CipherError: key length too short.
49
- # The following ciphers will override this key length.
50
- KEY_LEN_OVERRIDE = {
51
- "arcfour256" => 32,
52
- "arcfour512" => 64
53
- }
54
-
55
-
56
- # Returns true if the underlying OpenSSL library supports the given cipher,
57
- # and false otherwise.
58
- def self.supported?(name)
59
- ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
60
- return true if ossl_name == "none"
61
- return OpenSSL::Cipher.ciphers.include?(ossl_name)
62
- end
63
-
64
- # Retrieves a new instance of the named algorithm. The new instance
65
- # will be initialized using an iv and key generated from the given
66
- # iv, key, shared, hash and digester values. Additionally, the
67
- # cipher will be put into encryption or decryption mode, based on the
68
- # value of the +encrypt+ parameter.
69
- def self.get(name, options={})
70
- ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
71
- return IdentityCipher if ossl_name == "none"
72
- cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
73
-
74
- cipher.send(options[:encrypt] ? :encrypt : :decrypt)
75
-
76
- cipher.padding = 0
77
-
78
- cipher.extend(Net::SSH::Transport::CTR) if (name =~ /-ctr(@openssh.org)?$/)
79
- cipher.iv = Net::SSH::Transport::KeyExpander.expand_key(cipher.iv_len, options[:iv], options) if ossl_name != "rc4"
80
-
81
- key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
82
- cipher.key_len = key_len
83
- cipher.key = Net::SSH::Transport::KeyExpander.expand_key(key_len, options[:key], options)
84
- cipher.update(" " * 1536) if (ossl_name == "rc4" && name != "arcfour")
85
-
86
- return cipher
87
- end
88
-
89
- # Returns a two-element array containing the [ key-length,
90
- # block-size ] for the named cipher algorithm. If the cipher
91
- # algorithm is unknown, or is "none", 0 is returned for both elements
92
- # of the tuple.
93
- def self.get_lengths(name)
94
- ossl_name = SSH_TO_OSSL[name]
95
- return [0, 0] if ossl_name.nil? || ossl_name == "none"
96
-
97
- cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
98
- key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
99
- cipher.key_len = key_len
100
-
101
- return [key_len, ossl_name=="rc4" ? 8 : cipher.block_size]
6
+ module Net
7
+ module SSH
8
+ module Transport
9
+ # Implements a factory of OpenSSL cipher algorithms.
10
+ class CipherFactory
11
+ # Maps the SSH name of a cipher to it's corresponding OpenSSL name
12
+ SSH_TO_OSSL = {
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",
20
+ "rijndael-cbc@lysator.liu.se" => "aes-256-cbc",
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'
30
+ }
31
+
32
+ # Returns true if the underlying OpenSSL library supports the given cipher,
33
+ # and false otherwise.
34
+ def self.supported?(name)
35
+ ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
36
+ return true if ossl_name == "none"
37
+
38
+ return OpenSSL::Cipher.ciphers.include?(ossl_name)
39
+ end
40
+
41
+ # Retrieves a new instance of the named algorithm. The new instance
42
+ # will be initialized using an iv and key generated from the given
43
+ # iv, key, shared, hash and digester values. Additionally, the
44
+ # cipher will be put into encryption or decryption mode, based on the
45
+ # value of the +encrypt+ parameter.
46
+ def self.get(name, options = {})
47
+ ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
48
+ return IdentityCipher if ossl_name == "none"
49
+
50
+ cipher = OpenSSL::Cipher.new(ossl_name)
51
+
52
+ cipher.send(options[:encrypt] ? :encrypt : :decrypt)
53
+
54
+ cipher.padding = 0
55
+
56
+ if name =~ /-ctr(@openssh.org)?$/
57
+ if ossl_name !~ /-ctr/
58
+ cipher.extend(Net::SSH::Transport::CTR)
59
+ else
60
+ cipher = Net::SSH::Transport::OpenSSLAESCTR.new(cipher)
61
+ end
62
+ end
63
+ cipher.iv = Net::SSH::Transport::KeyExpander.expand_key(cipher.iv_len, options[:iv], options)
64
+
65
+ key_len = cipher.key_len
66
+ cipher.key_len = key_len
67
+ cipher.key = Net::SSH::Transport::KeyExpander.expand_key(key_len, options[:key], options)
68
+
69
+ return cipher
70
+ end
71
+
72
+ # Returns a two-element array containing the [ key-length,
73
+ # block-size ] for the named cipher algorithm. If the cipher
74
+ # algorithm is unknown, or is "none", 0 is returned for both elements
75
+ # of the tuple.
76
+ # if :iv_len option is supplied the third return value will be ivlen
77
+ def self.get_lengths(name, options = {})
78
+ ossl_name = SSH_TO_OSSL[name]
79
+ if ossl_name.nil? || ossl_name == "none"
80
+ result = [0, 0]
81
+ result << 0 if options[:iv_len]
82
+ else
83
+ cipher = OpenSSL::Cipher.new(ossl_name)
84
+ key_len = cipher.key_len
85
+ cipher.key_len = key_len
86
+
87
+ block_size =
88
+ case ossl_name
89
+ when /\-ctr/
90
+ Net::SSH::Transport::OpenSSLAESCTR.block_size
91
+ else
92
+ cipher.block_size
93
+ end
94
+
95
+ result = [key_len, block_size]
96
+ result << cipher.iv_len if options[:iv_len]
97
+ end
98
+ result
99
+ end
100
+ end
102
101
  end
103
102
  end
104
-
105
- end; end; end
103
+ end
@@ -1,32 +1,40 @@
1
- module Net; module SSH; module Transport
2
- module Constants
1
+ module Net
2
+ module SSH
3
+ module Transport
4
+ module Constants
5
+ #--
6
+ # Transport layer generic messages
7
+ #++
3
8
 
4
- #--
5
- # Transport layer generic messages
6
- #++
9
+ DISCONNECT = 1
10
+ IGNORE = 2
11
+ UNIMPLEMENTED = 3
12
+ DEBUG = 4
13
+ SERVICE_REQUEST = 5
14
+ SERVICE_ACCEPT = 6
7
15
 
8
- DISCONNECT = 1
9
- IGNORE = 2
10
- UNIMPLEMENTED = 3
11
- DEBUG = 4
12
- SERVICE_REQUEST = 5
13
- SERVICE_ACCEPT = 6
16
+ #--
17
+ # Algorithm negotiation messages
18
+ #++
14
19
 
15
- #--
16
- # Algorithm negotiation messages
17
- #++
20
+ KEXINIT = 20
21
+ NEWKEYS = 21
18
22
 
19
- KEXINIT = 20
20
- NEWKEYS = 21
23
+ #--
24
+ # Key exchange method specific messages
25
+ #++
21
26
 
22
- #--
23
- # Key exchange method specific messages
24
- #++
27
+ KEXDH_INIT = 30
28
+ KEXDH_REPLY = 31
25
29
 
26
- KEXDH_INIT = 30
27
- KEXDH_REPLY = 31
30
+ KEXECDH_INIT = 30
31
+ KEXECDH_REPLY = 31
28
32
 
29
- KEXECDH_INIT = 30
30
- KEXECDH_REPLY = 31
33
+ KEXDH_GEX_GROUP = 31
34
+ KEXDH_GEX_INIT = 32
35
+ KEXDH_GEX_REPLY = 33
36
+ KEXDH_GEX_REQUEST = 34
37
+ end
38
+ end
31
39
  end
32
- end; end; end
40
+ end
@@ -1,23 +1,46 @@
1
1
  require 'openssl'
2
+ require 'delegate'
2
3
 
3
4
  module Net::SSH::Transport
5
+ # :nodoc:
6
+ class OpenSSLAESCTR < SimpleDelegator
7
+ def initialize(original)
8
+ super
9
+ @was_reset = false
10
+ end
11
+
12
+ def block_size
13
+ 16
14
+ end
15
+
16
+ def self.block_size
17
+ 16
18
+ end
19
+
20
+ def reset
21
+ @was_reset = true
22
+ end
23
+
24
+ def iv=(iv_s)
25
+ super unless @was_reset
26
+ end
27
+ end
4
28
 
29
+ # :nodoc:
5
30
  # Pure-Ruby implementation of Stateful Decryption Counter(SDCTR) Mode
6
31
  # for Block Ciphers. See RFC4344 for detail.
7
32
  module CTR
8
33
  def self.extended(orig)
9
34
  orig.instance_eval {
10
- @remaining = ""
35
+ @remaining = String.new
11
36
  @counter = nil
12
37
  @counter_len = orig.block_size
13
38
  orig.encrypt
14
39
  orig.padding = 0
15
- }
16
40
 
17
- class <<orig
18
- alias :_update :update
19
- private :_update
20
- undef :update
41
+ singleton_class.send(:alias_method, :_update, :update)
42
+ singleton_class.send(:private, :_update)
43
+ singleton_class.send(:undef_method, :update)
21
44
 
22
45
  def iv
23
46
  @counter
@@ -44,42 +67,38 @@ module Net::SSH::Transport
44
67
  end
45
68
 
46
69
  def reset
47
- @remaining = ""
70
+ @remaining = String.new
48
71
  end
49
72
 
50
73
  def update(data)
51
74
  @remaining += data
52
75
 
53
- encrypted = ""
76
+ encrypted = String.new
54
77
 
55
- while @remaining.bytesize >= block_size
56
- encrypted += xor!(@remaining.slice!(0, block_size),
78
+ offset = 0
79
+ while (@remaining.bytesize - offset) >= block_size
80
+ encrypted += xor!(@remaining.slice(offset, block_size),
57
81
  _update(@counter))
58
82
  increment_counter!
83
+ offset += block_size
59
84
  end
85
+ @remaining = @remaining.slice(offset..-1)
60
86
 
61
87
  encrypted
62
88
  end
63
89
 
64
90
  def final
65
- unless @remaining.empty?
66
- s = xor!(@remaining, _update(@counter))
67
- else
68
- s = ""
69
- end
70
-
71
- @remaining = ""
72
-
91
+ s = @remaining.empty? ? '' : xor!(@remaining, _update(@counter))
92
+ @remaining = String.new
73
93
  s
74
94
  end
75
95
 
76
- private
77
-
78
96
  def xor!(s1, s2)
79
97
  s = []
80
- 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) }
81
99
  s.pack('Q*')
82
100
  end
101
+ singleton_class.send(:private, :xor!)
83
102
 
84
103
  def increment_counter!
85
104
  c = @counter_len
@@ -89,7 +108,8 @@ module Net::SSH::Transport
89
108
  end
90
109
  end
91
110
  end
92
- end
111
+ singleton_class.send(:private, :increment_counter!)
112
+ }
93
113
  end
94
114
  end
95
115
  end
@@ -1,79 +1,97 @@
1
1
  require 'openssl'
2
2
  require 'openssl/digest'
3
3
 
4
- module Net; module SSH; module Transport; module HMAC
4
+ module Net
5
+ module SSH
6
+ module Transport
7
+ module HMAC
8
+ # The base class of all OpenSSL-based HMAC algorithm wrappers.
9
+ class Abstract
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
5
22
 
6
- # The base class of all OpenSSL-based HMAC algorithm wrappers.
7
- class Abstract
23
+ def key_length(*v)
24
+ @key_length = nil if !defined?(@key_length)
25
+ if v.empty?
26
+ @key_length = superclass.key_length if @key_length.nil? && superclass.respond_to?(:key_length)
27
+ return @key_length
28
+ elsif v.length == 1
29
+ @key_length = v.first
30
+ else
31
+ raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
32
+ end
33
+ end
8
34
 
9
- class <<self
10
- def key_length(*v)
11
- @key_length = nil if !defined?(@key_length)
12
- if v.empty?
13
- @key_length = superclass.key_length if @key_length.nil? && superclass.respond_to?(:key_length)
14
- return @key_length
15
- elsif v.length == 1
16
- @key_length = v.first
17
- else
18
- raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
19
- end
20
- end
35
+ def mac_length(*v)
36
+ @mac_length = nil if !defined?(@mac_length)
37
+ if v.empty?
38
+ @mac_length = superclass.mac_length if @mac_length.nil? && superclass.respond_to?(:mac_length)
39
+ return @mac_length
40
+ elsif v.length == 1
41
+ @mac_length = v.first
42
+ else
43
+ raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
44
+ end
45
+ end
21
46
 
22
- def mac_length(*v)
23
- @mac_length = nil if !defined?(@mac_length)
24
- if v.empty?
25
- @mac_length = superclass.mac_length if @mac_length.nil? && superclass.respond_to?(:mac_length)
26
- return @mac_length
27
- elsif v.length == 1
28
- @mac_length = v.first
29
- else
30
- raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
31
- end
32
- end
47
+ def digest_class(*v)
48
+ @digest_class = nil if !defined?(@digest_class)
49
+ if v.empty?
50
+ @digest_class = superclass.digest_class if @digest_class.nil? && superclass.respond_to?(:digest_class)
51
+ return @digest_class
52
+ elsif v.length == 1
53
+ @digest_class = v.first
54
+ else
55
+ raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
56
+ end
57
+ end
58
+ end
33
59
 
34
- def digest_class(*v)
35
- @digest_class = nil if !defined?(@digest_class)
36
- if v.empty?
37
- @digest_class = superclass.digest_class if @digest_class.nil? && superclass.respond_to?(:digest_class)
38
- return @digest_class
39
- elsif v.length == 1
40
- @digest_class = v.first
41
- else
42
- raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
43
- end
44
- end
45
- end
60
+ def etm
61
+ self.class.etm
62
+ end
46
63
 
47
- def key_length
48
- self.class.key_length
49
- end
64
+ def key_length
65
+ self.class.key_length
66
+ end
50
67
 
51
- def mac_length
52
- self.class.mac_length
53
- end
68
+ def mac_length
69
+ self.class.mac_length
70
+ end
54
71
 
55
- def digest_class
56
- self.class.digest_class
57
- end
72
+ def digest_class
73
+ self.class.digest_class
74
+ end
58
75
 
59
- # The key in use for this instance.
60
- attr_reader :key
76
+ # The key in use for this instance.
77
+ attr_reader :key
61
78
 
62
- def initialize(key=nil)
63
- self.key = key
64
- end
79
+ def initialize(key = nil)
80
+ self.key = key
81
+ end
65
82
 
66
- # Sets the key to the given value, truncating it so that it is the correct
67
- # length.
68
- def key=(value)
69
- @key = value ? value.to_s[0,key_length] : nil
70
- end
83
+ # Sets the key to the given value, truncating it so that it is the correct
84
+ # length.
85
+ def key=(value)
86
+ @key = value ? value.to_s[0, key_length] : nil
87
+ end
71
88
 
72
- # Compute the HMAC digest for the given data string.
73
- def digest(data)
74
- OpenSSL::HMAC.digest(digest_class.new, key, data)[0,mac_length]
89
+ # Compute the HMAC digest for the given data string.
90
+ def digest(data)
91
+ OpenSSL::HMAC.digest(digest_class.new, key, data)[0, mac_length]
92
+ end
93
+ end
94
+ end
75
95
  end
76
-
77
96
  end
78
-
79
- end; end; end; end
97
+ end
@@ -1,12 +1,10 @@
1
1
  require 'net/ssh/transport/hmac/abstract'
2
2
 
3
3
  module Net::SSH::Transport::HMAC
4
-
5
4
  # The MD5 HMAC algorithm.
6
5
  class MD5 < Abstract
7
6
  mac_length 16
8
7
  key_length 16
9
8
  digest_class OpenSSL::Digest::MD5
10
9
  end
11
-
12
10
  end
@@ -1,11 +1,9 @@
1
1
  require 'net/ssh/transport/hmac/md5'
2
2
 
3
3
  module Net::SSH::Transport::HMAC
4
-
5
4
  # The MD5-96 HMAC algorithm. This returns only the first 12 bytes of
6
5
  # the digest.
7
6
  class MD5_96 < MD5
8
7
  mac_length 12
9
8
  end
10
-
11
9
  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,11 +1,9 @@
1
1
  require 'net/ssh/transport/hmac/sha1'
2
2
 
3
3
  module Net::SSH::Transport::HMAC
4
-
5
4
  # The SHA1-96 HMAC algorithm. This returns only the first 12 bytes of
6
5
  # the digest.
7
6
  class SHA1_96 < SHA1
8
7
  mac_length 12
9
8
  end
10
-
11
9
  end
@@ -1,15 +1,11 @@
1
1
  require 'net/ssh/transport/hmac/abstract'
2
2
 
3
- if defined?(OpenSSL::Digest::SHA256) # need openssl support
4
- module Net::SSH::Transport::HMAC
5
-
6
- # The SHA-256 HMAC algorithm. This has a mac and key length of 32, and
7
- # uses the SHA-256 digest algorithm.
8
- class SHA2_256 < Abstract
9
- mac_length 32
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