net-ssh 2.7.0 → 7.3.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 (199) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.dockerignore +6 -0
  4. data/.github/FUNDING.yml +1 -0
  5. data/.github/config/rubocop_linter_action.yml +4 -0
  6. data/.github/workflows/ci-with-docker.yml +44 -0
  7. data/.github/workflows/ci.yml +94 -0
  8. data/.github/workflows/rubocop.yml +16 -0
  9. data/.gitignore +15 -0
  10. data/.rubocop.yml +22 -0
  11. data/.rubocop_todo.yml +1081 -0
  12. data/CHANGES.txt +387 -0
  13. data/DEVELOPMENT.md +23 -0
  14. data/Dockerfile +29 -0
  15. data/Dockerfile.openssl3 +17 -0
  16. data/Gemfile +13 -0
  17. data/Gemfile.noed25519 +12 -0
  18. data/Gemfile.norbnacl +12 -0
  19. data/ISSUE_TEMPLATE.md +30 -0
  20. data/Manifest +4 -5
  21. data/README.md +303 -0
  22. data/Rakefile +174 -40
  23. data/SECURITY.md +4 -0
  24. data/THANKS.txt +25 -0
  25. data/appveyor.yml +58 -0
  26. data/docker-compose.yml +25 -0
  27. data/lib/net/ssh/authentication/agent.rb +279 -18
  28. data/lib/net/ssh/authentication/certificate.rb +183 -0
  29. data/lib/net/ssh/authentication/constants.rb +17 -15
  30. data/lib/net/ssh/authentication/ed25519.rb +184 -0
  31. data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
  32. data/lib/net/ssh/authentication/key_manager.rb +125 -54
  33. data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
  34. data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
  35. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +19 -12
  36. data/lib/net/ssh/authentication/methods/none.rb +16 -19
  37. data/lib/net/ssh/authentication/methods/password.rb +56 -19
  38. data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
  39. data/lib/net/ssh/authentication/pageant.rb +483 -246
  40. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
  41. data/lib/net/ssh/authentication/session.rb +138 -120
  42. data/lib/net/ssh/buffer.rb +399 -300
  43. data/lib/net/ssh/buffered_io.rb +154 -150
  44. data/lib/net/ssh/config.rb +361 -166
  45. data/lib/net/ssh/connection/channel.rb +640 -596
  46. data/lib/net/ssh/connection/constants.rb +29 -29
  47. data/lib/net/ssh/connection/event_loop.rb +123 -0
  48. data/lib/net/ssh/connection/keepalive.rb +59 -0
  49. data/lib/net/ssh/connection/session.rb +628 -548
  50. data/lib/net/ssh/connection/term.rb +125 -123
  51. data/lib/net/ssh/errors.rb +101 -95
  52. data/lib/net/ssh/key_factory.rb +198 -100
  53. data/lib/net/ssh/known_hosts.rb +221 -98
  54. data/lib/net/ssh/loggable.rb +50 -49
  55. data/lib/net/ssh/packet.rb +83 -79
  56. data/lib/net/ssh/prompt.rb +50 -81
  57. data/lib/net/ssh/proxy/command.rb +108 -60
  58. data/lib/net/ssh/proxy/errors.rb +12 -10
  59. data/lib/net/ssh/proxy/http.rb +82 -78
  60. data/lib/net/ssh/proxy/https.rb +50 -0
  61. data/lib/net/ssh/proxy/jump.rb +54 -0
  62. data/lib/net/ssh/proxy/socks4.rb +5 -8
  63. data/lib/net/ssh/proxy/socks5.rb +18 -20
  64. data/lib/net/ssh/service/forward.rb +383 -255
  65. data/lib/net/ssh/test/channel.rb +145 -136
  66. data/lib/net/ssh/test/extensions.rb +131 -110
  67. data/lib/net/ssh/test/kex.rb +34 -32
  68. data/lib/net/ssh/test/local_packet.rb +46 -44
  69. data/lib/net/ssh/test/packet.rb +89 -70
  70. data/lib/net/ssh/test/remote_packet.rb +32 -30
  71. data/lib/net/ssh/test/script.rb +156 -142
  72. data/lib/net/ssh/test/socket.rb +49 -48
  73. data/lib/net/ssh/test.rb +82 -77
  74. data/lib/net/ssh/transport/aes128_gcm.rb +40 -0
  75. data/lib/net/ssh/transport/aes256_gcm.rb +40 -0
  76. data/lib/net/ssh/transport/algorithms.rb +472 -348
  77. data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
  78. data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
  79. data/lib/net/ssh/transport/cipher_factory.rb +124 -100
  80. data/lib/net/ssh/transport/constants.rb +32 -24
  81. data/lib/net/ssh/transport/ctr.rb +42 -22
  82. data/lib/net/ssh/transport/gcm_cipher.rb +207 -0
  83. data/lib/net/ssh/transport/hmac/abstract.rb +97 -63
  84. data/lib/net/ssh/transport/hmac/md5.rb +0 -2
  85. data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
  86. data/lib/net/ssh/transport/hmac/none.rb +0 -2
  87. data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
  88. data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
  89. data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
  90. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  91. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  92. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  93. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  94. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  95. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  96. data/lib/net/ssh/transport/hmac.rb +14 -12
  97. data/lib/net/ssh/transport/identity_cipher.rb +54 -44
  98. data/lib/net/ssh/transport/kex/abstract.rb +130 -0
  99. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  100. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
  101. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  102. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
  103. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
  104. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
  105. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
  106. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  107. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
  108. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
  109. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
  110. data/lib/net/ssh/transport/kex.rb +15 -12
  111. data/lib/net/ssh/transport/key_expander.rb +24 -20
  112. data/lib/net/ssh/transport/openssl.rb +161 -124
  113. data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
  114. data/lib/net/ssh/transport/packet_stream.rb +246 -183
  115. data/lib/net/ssh/transport/server_version.rb +57 -51
  116. data/lib/net/ssh/transport/session.rb +307 -235
  117. data/lib/net/ssh/transport/state.rb +178 -176
  118. data/lib/net/ssh/verifiers/accept_new.rb +33 -0
  119. data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
  120. data/lib/net/ssh/verifiers/always.rb +58 -0
  121. data/lib/net/ssh/verifiers/never.rb +19 -0
  122. data/lib/net/ssh/version.rb +57 -51
  123. data/lib/net/ssh.rb +140 -40
  124. data/net-ssh-public_cert.pem +21 -0
  125. data/net-ssh.gemspec +39 -184
  126. data/support/ssh_tunnel_bug.rb +5 -5
  127. data.tar.gz.sig +0 -0
  128. metadata +205 -99
  129. metadata.gz.sig +0 -0
  130. data/README.rdoc +0 -219
  131. data/Rudyfile +0 -96
  132. data/gem-public_cert.pem +0 -20
  133. data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
  134. data/lib/net/ssh/authentication/agent/socket.rb +0 -170
  135. data/lib/net/ssh/ruby_compat.rb +0 -51
  136. data/lib/net/ssh/verifiers/lenient.rb +0 -30
  137. data/lib/net/ssh/verifiers/null.rb +0 -12
  138. data/lib/net/ssh/verifiers/secure.rb +0 -54
  139. data/lib/net/ssh/verifiers/strict.rb +0 -24
  140. data/setup.rb +0 -1585
  141. data/support/arcfour_check.rb +0 -20
  142. data/test/README.txt +0 -47
  143. data/test/authentication/methods/common.rb +0 -28
  144. data/test/authentication/methods/test_abstract.rb +0 -51
  145. data/test/authentication/methods/test_hostbased.rb +0 -114
  146. data/test/authentication/methods/test_keyboard_interactive.rb +0 -100
  147. data/test/authentication/methods/test_none.rb +0 -41
  148. data/test/authentication/methods/test_password.rb +0 -52
  149. data/test/authentication/methods/test_publickey.rb +0 -148
  150. data/test/authentication/test_agent.rb +0 -205
  151. data/test/authentication/test_key_manager.rb +0 -218
  152. data/test/authentication/test_session.rb +0 -108
  153. data/test/common.rb +0 -108
  154. data/test/configs/eqsign +0 -3
  155. data/test/configs/exact_match +0 -8
  156. data/test/configs/host_plus +0 -10
  157. data/test/configs/multihost +0 -4
  158. data/test/configs/nohost +0 -19
  159. data/test/configs/numeric_host +0 -4
  160. data/test/configs/send_env +0 -2
  161. data/test/configs/substitutes +0 -8
  162. data/test/configs/wild_cards +0 -14
  163. data/test/connection/test_channel.rb +0 -467
  164. data/test/connection/test_session.rb +0 -526
  165. data/test/known_hosts/github +0 -1
  166. data/test/manual/test_forward.rb +0 -223
  167. data/test/start/test_options.rb +0 -36
  168. data/test/start/test_transport.rb +0 -28
  169. data/test/test_all.rb +0 -11
  170. data/test/test_buffer.rb +0 -433
  171. data/test/test_buffered_io.rb +0 -63
  172. data/test/test_config.rb +0 -151
  173. data/test/test_key_factory.rb +0 -173
  174. data/test/test_known_hosts.rb +0 -13
  175. data/test/transport/hmac/test_md5.rb +0 -41
  176. data/test/transport/hmac/test_md5_96.rb +0 -27
  177. data/test/transport/hmac/test_none.rb +0 -34
  178. data/test/transport/hmac/test_ripemd160.rb +0 -36
  179. data/test/transport/hmac/test_sha1.rb +0 -36
  180. data/test/transport/hmac/test_sha1_96.rb +0 -27
  181. data/test/transport/hmac/test_sha2_256.rb +0 -37
  182. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  183. data/test/transport/hmac/test_sha2_512.rb +0 -37
  184. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  185. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  186. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -146
  187. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
  188. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
  189. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  190. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  191. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  192. data/test/transport/test_algorithms.rb +0 -330
  193. data/test/transport/test_cipher_factory.rb +0 -443
  194. data/test/transport/test_hmac.rb +0 -34
  195. data/test/transport/test_identity_cipher.rb +0 -40
  196. data/test/transport/test_packet_stream.rb +0 -1755
  197. data/test/transport/test_server_version.rb +0 -78
  198. data/test/transport/test_session.rb +0 -319
  199. data/test/transport/test_state.rb +0 -181
@@ -0,0 +1,43 @@
1
+ require 'openssl'
2
+
3
+ module Net
4
+ module SSH
5
+ module Authentication
6
+ # Public key fingerprinting utility module - internal not part of API.
7
+ # This is included in pubkey classes and called from there. All RSA, DSA, and ECC keys
8
+ # are supported.
9
+ #
10
+ # require 'net/ssh'
11
+ # my_pubkey_text = File.read('/path/to/id_ed25519.pub')
12
+ # #=> "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDB2NBh4GJPPUN1kXPMu8b633Xcv55WoKC3OkBjFAbzJ alice@example.com"
13
+ # my_pubkey = Net::SSH::KeyFactory.load_data_public_key(my_pubkey_text)
14
+ # #=> #<Net::SSH::Authentication::ED25519::PubKey:0x00007fc8e91819b0
15
+ # my_pubkey.fingerprint
16
+ # #=> "2f:7f:97:21:76:a4:0f:38:c4:fe:d8:b4:6a:39:72:30"
17
+ # my_pubkey.fingerprint('SHA256')
18
+ # #=> "SHA256:u6mXnY8P1b0FODGp8mckqOB33u8+jvkSCtJbD5Q9klg"
19
+ module PubKeyFingerprint # :nodoc:
20
+ # Return the key's fingerprint. Algorithm may be either +MD5+ (default),
21
+ # or +SHA256+. For +SHA256+, fingerprints are in the same format
22
+ # returned by OpenSSH's <tt>`ssh-add -l -E SHA256`</tt>, i.e.,
23
+ # trailing base64 padding '=' characters are stripped and the
24
+ # literal string +SHA256:+ is prepended.
25
+ def fingerprint(algorithm = 'MD5')
26
+ @fingerprint ||= {}
27
+ @fingerprint[algorithm] ||= PubKeyFingerprint.fingerprint(to_blob, algorithm)
28
+ end
29
+
30
+ def self.fingerprint(blob, algorithm = 'MD5')
31
+ case algorithm.to_s.upcase
32
+ when 'MD5'
33
+ OpenSSL::Digest.hexdigest(algorithm, blob).scan(/../).join(":")
34
+ when 'SHA256'
35
+ "SHA256:#{[OpenSSL::Digest.digest(algorithm, blob)].pack('m').chomp.gsub(/=+\z/, '')}"
36
+ else
37
+ raise OpenSSL::Digest::DigestError, "unsupported ssh key digest #{algorithm}"
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -2,153 +2,171 @@ require 'net/ssh/loggable'
2
2
  require 'net/ssh/transport/constants'
3
3
  require 'net/ssh/authentication/constants'
4
4
  require 'net/ssh/authentication/key_manager'
5
+ require 'net/ssh/authentication/methods/none'
5
6
  require 'net/ssh/authentication/methods/publickey'
6
7
  require 'net/ssh/authentication/methods/hostbased'
7
8
  require 'net/ssh/authentication/methods/password'
8
9
  require 'net/ssh/authentication/methods/keyboard_interactive'
9
10
 
10
- module Net; module SSH; module Authentication
11
-
12
- # Raised if the current authentication method is not allowed
13
- class DisallowedMethod < Net::SSH::Exception
14
- end
15
-
16
- # Represents an authentication session. It manages the authentication of
17
- # a user over an established connection (the "transport" object, see
18
- # Net::SSH::Transport::Session).
19
- #
20
- # The use of an authentication session to manage user authentication is
21
- # internal to Net::SSH (specifically Net::SSH.start). Consumers of the
22
- # Net::SSH library will never need to access this class directly.
23
- class Session
24
- include Transport::Constants, Constants, Loggable
25
-
26
- # transport layer abstraction
27
- attr_reader :transport
28
-
29
- # the list of authentication methods to try
30
- attr_reader :auth_methods
31
-
32
- # the list of authentication methods that are allowed
33
- attr_reader :allowed_auth_methods
34
-
35
- # a hash of options, given at construction time
36
- attr_reader :options
11
+ module Net
12
+ module SSH
13
+ module Authentication
14
+ # Raised if the current authentication method is not allowed
15
+ class DisallowedMethod < Net::SSH::Exception
16
+ end
37
17
 
38
- # Instantiates a new Authentication::Session object over the given
39
- # transport layer abstraction.
40
- def initialize(transport, options={})
41
- self.logger = transport.logger
42
- @transport = transport
18
+ # Represents an authentication session. It manages the authentication of
19
+ # a user over an established connection (the "transport" object, see
20
+ # Net::SSH::Transport::Session).
21
+ #
22
+ # The use of an authentication session to manage user authentication is
23
+ # internal to Net::SSH (specifically Net::SSH.start). Consumers of the
24
+ # Net::SSH library will never need to access this class directly.
25
+ class Session
26
+ include Loggable
27
+ include Constants
28
+ include Transport::Constants
43
29
 
44
- @auth_methods = options[:auth_methods] || %w(none publickey hostbased password keyboard-interactive)
45
- @options = options
30
+ # transport layer abstraction
31
+ attr_reader :transport
46
32
 
47
- @allowed_auth_methods = @auth_methods
48
- end
33
+ # the list of authentication methods to try
34
+ attr_reader :auth_methods
49
35
 
50
- # Attempts to authenticate the given user, in preparation for the next
51
- # service request. Returns true if an authentication method succeeds in
52
- # authenticating the user, and false otherwise.
53
- def authenticate(next_service, username, password=nil)
54
- debug { "beginning authentication of `#{username}'" }
36
+ # the list of authentication methods that are allowed
37
+ attr_reader :allowed_auth_methods
55
38
 
56
- transport.send_message(transport.service_request("ssh-userauth"))
57
- expect_message(SERVICE_ACCEPT)
39
+ # a hash of options, given at construction time
40
+ attr_reader :options
58
41
 
59
- key_manager = KeyManager.new(logger, options)
60
- keys.each { |key| key_manager.add(key) } unless keys.empty?
61
- key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?
42
+ # Instantiates a new Authentication::Session object over the given
43
+ # transport layer abstraction.
44
+ def initialize(transport, options = {})
45
+ self.logger = transport.logger
46
+ @transport = transport
62
47
 
63
- attempted = []
48
+ @auth_methods = options[:auth_methods] || Net::SSH::Config.default_auth_methods
49
+ @options = options
64
50
 
65
- @auth_methods.each do |name|
66
- begin
67
- next unless @allowed_auth_methods.include?(name)
68
- attempted << name
51
+ @allowed_auth_methods = @auth_methods
52
+ end
69
53
 
70
- debug { "trying #{name}" }
71
- begin
72
- method = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join).new(self, :key_manager => key_manager)
73
- rescue NameError
74
- debug{"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
75
- next
54
+ # Attempts to authenticate the given user, in preparation for the next
55
+ # service request. Returns true if an authentication method succeeds in
56
+ # authenticating the user, and false otherwise.
57
+ def authenticate(next_service, username, password = nil)
58
+ debug { "beginning authentication of `#{username}'" }
59
+
60
+ transport.send_message(transport.service_request("ssh-userauth"))
61
+ expect_message(SERVICE_ACCEPT)
62
+
63
+ key_manager = KeyManager.new(logger, options)
64
+ keys.each { |key| key_manager.add(key) } unless keys.empty?
65
+ keycerts.each { |keycert| key_manager.add_keycert(keycert) } unless keycerts.empty?
66
+ keycert_data.each { |data| key_manager.add_keycert_data(data) } unless keycert_data.empty?
67
+ key_data.each { |key2| key_manager.add_key_data(key2) } unless key_data.empty?
68
+ default_keys.each { |key| key_manager.add(key) } unless options.key?(:keys) || options.key?(:key_data)
69
+
70
+ attempted = []
71
+
72
+ @auth_methods.each do |name|
73
+ next unless @allowed_auth_methods.include?(name)
74
+
75
+ attempted << name
76
+
77
+ debug { "trying #{name}" }
78
+ begin
79
+ auth_class = Methods.const_get(name.split(/\W+/).map { |p| p.capitalize }.join)
80
+ method = auth_class.new(self,
81
+ key_manager: key_manager, password_prompt: options[:password_prompt],
82
+ pubkey_algorithms: options[:pubkey_algorithms] || nil)
83
+ rescue NameError
84
+ debug {"Mechanism #{name} was requested, but isn't a known type. Ignoring it."}
85
+ next
86
+ end
87
+
88
+ return true if method.authenticate(next_service, username, password)
89
+ rescue Net::SSH::Authentication::DisallowedMethod
76
90
  end
77
91
 
78
- return true if method.authenticate(next_service, username, password)
79
- rescue Net::SSH::Authentication::DisallowedMethod
92
+ error { "all authorization methods failed (tried #{attempted.join(', ')})" }
93
+ return false
94
+ ensure
95
+ key_manager.finish if key_manager
80
96
  end
81
- end
82
-
83
- error { "all authorization methods failed (tried #{attempted.join(', ')})" }
84
- return false
85
- ensure
86
- key_manager.finish if key_manager
87
- end
88
-
89
- # Blocks until a packet is received. It silently handles USERAUTH_BANNER
90
- # packets, and will raise an error if any packet is received that is not
91
- # valid during user authentication.
92
- def next_message
93
- loop do
94
- packet = transport.next_message
95
97
 
96
- case packet.type
97
- when USERAUTH_BANNER
98
- info { packet[:message] }
99
- # TODO add a hook for people to retrieve the banner when it is sent
98
+ # Blocks until a packet is received. It silently handles USERAUTH_BANNER
99
+ # packets, and will raise an error if any packet is received that is not
100
+ # valid during user authentication.
101
+ def next_message
102
+ loop do
103
+ packet = transport.next_message
104
+
105
+ case packet.type
106
+ when USERAUTH_BANNER
107
+ info { packet[:message] }
108
+ # TODO add a hook for people to retrieve the banner when it is sent
109
+
110
+ when USERAUTH_FAILURE
111
+ @allowed_auth_methods = packet[:authentications].split(/,/)
112
+ debug { "allowed methods: #{packet[:authentications]}" }
113
+ return packet
114
+
115
+ when USERAUTH_METHOD_RANGE, SERVICE_ACCEPT
116
+ return packet
117
+
118
+ when USERAUTH_SUCCESS
119
+ transport.hint :authenticated
120
+ return packet
121
+
122
+ else
123
+ raise Net::SSH::Exception, "unexpected message #{packet.type} (#{packet})"
124
+ end
125
+ end
126
+ end
100
127
 
101
- when USERAUTH_FAILURE
102
- @allowed_auth_methods = packet[:authentications].split(/,/)
103
- debug { "allowed methods: #{packet[:authentications]}" }
104
- return packet
128
+ # Blocks until a packet is received, and returns it if it is of the given
129
+ # type. If it is not, an exception is raised.
130
+ def expect_message(type)
131
+ message = next_message
132
+ raise Net::SSH::Exception, "expected #{type}, got #{message.type} (#{message})" unless message.type == type
105
133
 
106
- when USERAUTH_METHOD_RANGE, SERVICE_ACCEPT
107
- return packet
134
+ message
135
+ end
108
136
 
109
- when USERAUTH_SUCCESS
110
- transport.hint :authenticated
111
- return packet
137
+ private
112
138
 
113
- else
114
- raise Net::SSH::Exception, "unexpected message #{packet.type} (#{packet})"
139
+ # Returns an array of paths to the key files usually defined
140
+ # by system default.
141
+ def default_keys
142
+ %w[~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/id_ecdsa
143
+ ~/.ssh2/id_ed25519 ~/.ssh2/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_ecdsa]
115
144
  end
116
- end
117
- end
118
-
119
- # Blocks until a packet is received, and returns it if it is of the given
120
- # type. If it is not, an exception is raised.
121
- def expect_message(type)
122
- message = next_message
123
- unless message.type == type
124
- raise Net::SSH::Exception, "expected #{type}, got #{message.type} (#{message})"
125
- end
126
- message
127
- end
128
145
 
129
- private
146
+ # Returns an array of paths to the key files that should be used when
147
+ # attempting any key-based authentication mechanism.
148
+ def keys
149
+ Array(options[:keys])
150
+ end
130
151
 
131
- # Returns an array of paths to the key files usually defined
132
- # by system default.
133
- def default_keys
134
- if defined?(OpenSSL::PKey::EC)
135
- %w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh/id_ecdsa
136
- ~/.ssh2/id_dsa ~/.ssh2/id_rsa ~/.ssh2/id_ecdsa)
137
- else
138
- %w(~/.ssh/id_dsa ~/.ssh/id_rsa ~/.ssh2/id_dsa ~/.ssh2/id_rsa)
152
+ # Returns an array of paths to the keycert files that should be used when
153
+ # attempting any key-based authentication mechanism.
154
+ def keycerts
155
+ Array(options[:keycerts])
139
156
  end
140
- end
141
157
 
142
- # Returns an array of paths to the key files that should be used when
143
- # attempting any key-based authentication mechanism.
144
- def keys
145
- Array(options[:keys] || default_keys)
146
- end
158
+ # Returns an array of the keycert data that should be used when
159
+ # attempting any key-based authentication mechanism.
160
+ def keycert_data
161
+ Array(options[:keycert_data])
162
+ end
147
163
 
148
- # Returns an array of the key data that should be used when
149
- # attempting any key-based authentication mechanism.
150
- def key_data
151
- Array(options[:key_data])
164
+ # Returns an array of the key data that should be used when
165
+ # attempting any key-based authentication mechanism.
166
+ def key_data
167
+ Array(options[:key_data])
168
+ end
152
169
  end
170
+ end
153
171
  end
154
- end; end; end
172
+ end