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
@@ -1,173 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/key_factory'
3
-
4
- class TestKeyFactory < Test::Unit::TestCase
5
- def setup
6
- @key_file = File.expand_path("/key-file")
7
- end
8
-
9
- def test_load_unencrypted_private_RSA_key_should_return_key
10
- File.expects(:read).with(@key_file).returns(rsa_key.export)
11
- assert_equal rsa_key.to_der, Net::SSH::KeyFactory.load_private_key(@key_file).to_der
12
- end
13
-
14
- def test_load_unencrypted_private_DSA_key_should_return_key
15
- File.expects(:read).with(@key_file).returns(dsa_key.export)
16
- assert_equal dsa_key.to_der, Net::SSH::KeyFactory.load_private_key(@key_file).to_der
17
- end
18
-
19
- def test_load_encrypted_private_RSA_key_should_prompt_for_password_and_return_key
20
- File.expects(:read).with(@key_file).returns(encrypted(rsa_key, "password"))
21
- Net::SSH::KeyFactory.expects(:prompt).with("Enter passphrase for #{@key_file}:", false).returns("password")
22
- assert_equal rsa_key.to_der, Net::SSH::KeyFactory.load_private_key(@key_file).to_der
23
- end
24
-
25
- def test_load_encrypted_private_RSA_key_with_password_should_not_prompt_and_return_key
26
- File.expects(:read).with(@key_file).returns(encrypted(rsa_key, "password"))
27
- assert_equal rsa_key.to_der, Net::SSH::KeyFactory.load_private_key(@key_file, "password").to_der
28
- end
29
-
30
- def test_load_encrypted_private_DSA_key_should_prompt_for_password_and_return_key
31
- File.expects(:read).with(@key_file).returns(encrypted(dsa_key, "password"))
32
- Net::SSH::KeyFactory.expects(:prompt).with("Enter passphrase for #{@key_file}:", false).returns("password")
33
- assert_equal dsa_key.to_der, Net::SSH::KeyFactory.load_private_key(@key_file).to_der
34
- end
35
-
36
- def test_load_encrypted_private_DSA_key_with_password_should_not_prompt_and_return_key
37
- File.expects(:read).with(@key_file).returns(encrypted(dsa_key, "password"))
38
- assert_equal dsa_key.to_der, Net::SSH::KeyFactory.load_private_key(@key_file, "password").to_der
39
- end
40
-
41
- def test_load_encrypted_private_key_should_give_three_tries_for_the_password_and_then_raise_exception
42
- File.expects(:read).with(@key_file).returns(encrypted(rsa_key, "password"))
43
- Net::SSH::KeyFactory.expects(:prompt).times(3).with("Enter passphrase for #{@key_file}:", false).returns("passwod","passphrase","passwd")
44
- if OpenSSL::PKey.respond_to?(:read)
45
- error_class = ArgumentError
46
- else
47
- error_class = OpenSSL::PKey::RSAError
48
- end
49
- assert_raises(error_class) { Net::SSH::KeyFactory.load_private_key(@key_file) }
50
- end
51
-
52
- def test_load_encrypted_private_key_should_raise_exception_without_asking_passphrase
53
- File.expects(:read).with(@key_file).returns(encrypted(rsa_key, "password"))
54
- Net::SSH::KeyFactory.expects(:prompt).never
55
- if OpenSSL::PKey.respond_to?(:read)
56
- error_class = ArgumentError
57
- else
58
- error_class = OpenSSL::PKey::RSAError
59
- end
60
- assert_raises(error_class) { Net::SSH::KeyFactory.load_private_key(@key_file, nil, false) }
61
- end
62
-
63
- def test_load_public_rsa_key_should_return_key
64
- File.expects(:read).with(@key_file).returns(public(rsa_key))
65
- assert_equal rsa_key.to_blob, Net::SSH::KeyFactory.load_public_key(@key_file).to_blob
66
- end
67
-
68
- if defined?(OpenSSL::PKey::EC)
69
- def test_load_unencrypted_private_ecdsa_sha2_nistp256_key_should_return_key
70
- File.expects(:read).with("/key-file").returns(ecdsa_sha2_nistp256_key.to_pem)
71
- assert_equal ecdsa_sha2_nistp256_key.to_der, Net::SSH::KeyFactory.load_private_key("/key-file").to_der
72
- end
73
- def test_load_unencrypted_private_ecdsa_sha2_nistp384_key_should_return_key
74
- File.expects(:read).with("/key-file").returns(ecdsa_sha2_nistp384_key.to_pem)
75
- assert_equal ecdsa_sha2_nistp384_key.to_der, Net::SSH::KeyFactory.load_private_key("/key-file").to_der
76
- end
77
- def test_load_unencrypted_private_ecdsa_sha2_nistp521_key_should_return_key
78
- File.expects(:read).with("/key-file").returns(ecdsa_sha2_nistp521_key.to_pem)
79
- assert_equal ecdsa_sha2_nistp521_key.to_der, Net::SSH::KeyFactory.load_private_key("/key-file").to_der
80
- end
81
-
82
- def test_load_public_ecdsa_sha2_nistp256_key_should_return_key
83
- File.expects(:read).with("/key-file").returns(public(ecdsa_sha2_nistp256_key))
84
- assert_equal ecdsa_sha2_nistp256_key.to_blob, Net::SSH::KeyFactory.load_public_key("/key-file").to_blob
85
- end
86
- def test_load_public_ecdsa_sha2_nistp384_key_should_return_key
87
- File.expects(:read).with("/key-file").returns(public(ecdsa_sha2_nistp384_key))
88
- assert_equal ecdsa_sha2_nistp384_key.to_blob, Net::SSH::KeyFactory.load_public_key("/key-file").to_blob
89
- end
90
- def test_load_public_ecdsa_sha2_nistp521_key_should_return_key
91
- File.expects(:read).with("/key-file").returns(public(ecdsa_sha2_nistp521_key))
92
- assert_equal ecdsa_sha2_nistp521_key.to_blob, Net::SSH::KeyFactory.load_public_key("/key-file").to_blob
93
- end
94
- end
95
-
96
- def test_load_anonymous_private_key_should_return_key_or_raise_exception
97
- File.expects(:read).with(@key_file).returns(anonymous_private_key)
98
- if OpenSSL::PKey.respond_to?(:read)
99
- assert_equal OpenSSL::PKey::RSA.new(anonymous_private_key).to_der, Net::SSH::KeyFactory.load_private_key(@key_file).to_der
100
- else
101
- assert_raises(OpenSSL::PKey::PKeyError) { Net::SSH::KeyFactory.load_private_key(@key_file) }
102
- end
103
- end
104
-
105
- private
106
-
107
- def rsa_key
108
- # 512 bits
109
- @rsa_key ||= OpenSSL::PKey::RSA.new("0\202\001;\002\001\000\002A\000\235\236\374N\e@2E\321\3757\003\354c\276N\f\003\3479Ko\005\317\0027\a\255=\345!\306\220\340\211;\027u\331\260\362\2063x\332\301y4\353\v%\032\214v\312\304\212\271GJ\353\2701\031\002\003\001\000\001\002@\022Y\306*\031\306\031\224Cde\231QV3{\306\256U\2477\377\017\000\020\323\363R\332\027\351\034\224OU\020\227H|pUS\n\263+%\304\341\321\273/\271\e\004L\250\273\020&,\t\304By\002!\000\311c\246%a\002\305\277\262R\266\244\250\025V_\351]\264\016\265\341\355\305\223\347Z$8\205#\023\002!\000\310\\\367|\243I\363\350\020\307\246\302\365\ed\212L\273\2158M\223w\a\367 C\t\224A4\243\002!\000\262]+}\327\231\331\002\2331^\312\036\204'g\363\f&\271\020\245\365-\024}\306\374e\202\2459\002 }\231\341\276\3551\277\307{5\\\361\233\353G\024wS\237\fk}\004\302&\205\277\340rb\211\327\002!\000\223\307\025I:\215_\260\370\252\3757\256Y&X\364\354\342\215\350\203E8\227|\f\237M\375D|")
110
- end
111
-
112
- def dsa_key
113
- # 512 bits
114
- @dsa_key ||= OpenSSL::PKey::DSA.new("0\201\367\002\001\000\002A\000\203\316/\037u\272&J\265\003l3\315d\324h\372{\t8\252#\331_\026\006\035\270\266\255\343\353Z\302\276\335\336\306\220\375\202L\244\244J\206>\346\b\315\211\302L\246x\247u\a\376\366\345\302\016#\002\025\000\244\274\302\221Og\275/\302+\356\346\360\024\373wI\2573\361\002@\027\215\270r*\f\213\350C\245\021:\350 \006\\\376\345\022`\210b\262\3643\023XLKS\320\370\002\276\347A\nU\204\276\324\256`=\026\240\330\306J\316V\213\024\e\030\215\355\006\037q\337\356ln\002@\017\257\034\f\260\333'S\271#\237\230E\321\312\027\021\226\331\251Vj\220\305\316\036\v\266+\000\230\270\177B\003?t\a\305]e\344\261\334\023\253\323\251\223M\2175)a(\004\"lI8\312\303\307\a\002\024_\aznW\345\343\203V\326\246ua\203\376\201o\350\302\002")
115
- end
116
-
117
- if defined?(OpenSSL::PKey::EC)
118
- def ecdsa_sha2_nistp256_key
119
- @ecdsa_sha2_nistp256_key ||= OpenSSL::PKey::EC.new("-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEINv6pPVLlkqvT1v5MJlWgaSWGwqupISG4U79bUXQDNCaoAoGCCqGSM49\nAwEHoUQDQgAElqubvi/GkSme+bwtncU1NiE0dWQ0EO07VufUQg8lUJ5+Fi6f96qa\n95T1zwOMQhY1h8PP9rQIZr4S48vN/ZnQLw==\n-----END EC PRIVATE KEY-----\n")
120
- end
121
-
122
- def ecdsa_sha2_nistp384_key
123
- @ecdsa_sha2_nistp384_key ||= OpenSSL::PKey::EC.new("-----BEGIN EC PRIVATE KEY-----\nMIGkAgEBBDBxwkmydCn4mP4KMhlMpeBvIroQolWKVNoRPXpG7brFgK+Yiikqw8wd\nIZW5OlL4y3mgBwYFK4EEACKhZANiAARkoIR1oABi+aQJbKcmvzeYSKURQOyXM0HU\nR4T68v4hd/lJE4fFQRczj3wAaECe9u3CWI/oDlow4Vr0vab82ZGjIoblxblKQWYl\nyzENgzl226waGg1bLBo8Auilyf1B5yI=\n-----END EC PRIVATE KEY-----\n")
124
- end
125
-
126
- def ecdsa_sha2_nistp521_key
127
- @ecdsa_sha2_nistp521_key ||= OpenSSL::PKey::EC.new("-----BEGIN EC PRIVATE KEY-----\nMIHbAgEBBEHQ2i7kjEGQHQB4pUQW9a2eCLWR2S5Go8U3CDyfbRCrYEp/pTSgI8uu\nMXyR3bf3SjqFQgZ6MZk5lkyrissJuwmvZKAHBgUrgQQAI6GBiQOBhgAEAN14FACK\nbs/KTqw4rxijeozGTVJTh1hNzBl2XaIhM4Fv8o3fE/pvogymyFu53GCng6gC4dmx\n/hycF41iIM29xVKPAeBnRNl6MdFBjuthOmE8eCRezgk1Bak8aBDUrzNT8OQssscw\npvQK4nc6ga/wTDaQGy5kV8tCOHNs2wKH+p2LpWTJ\n-----END EC PRIVATE KEY-----\n")
128
- end
129
- end
130
-
131
- def anonymous_private_key
132
- @anonymous_key = <<-EOF
133
- -----BEGIN PRIVATE KEY-----
134
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3id5gZ6bglJth
135
- yli8JNaRxhsqKwwPlReEI/mplzz5IP6gWQ92LogXbdBXtHf9ZpA53BeLmtcNBEY0
136
- Ygd7sPBhlHABS5D5///zltSSX2+L5GCEiC6dpfGsySjqymWF+SZ2PaqfZbkWLmCD
137
- 9u4ysueaHf7xbF6txGprNp69efttWxdy+vU5tno7HVxemMZQUalpShFrdAYKKXEo
138
- cV7MtbkQjzubS14gaWGpWCXIl9uNKQeHpLKtre1Qn5Ft/zVpCHmhLQcYDuB1LAj9
139
- 7eoev4rIiOE2sfdkvKDlmFxvzq3myYH4o27WwAg9OZ5SBusn2zesKkRCBBEZ55rl
140
- uVknOGHXAgMBAAECggEAZE0U2OxsNxkfXS6+lXswQ5PW7pF90towcsdSPgrniGIu
141
- pKRnHbfKKbuaewOl+zZcpTIRL/rbgUKPtzrHSiJlC36aQyrvvJ/ZWV5ZJvC+vd19
142
- nY/qob65NyrrkHwxRSjmiwGiR9/IaUXI+vUsMUqx5Ph1hawqhZ3sZlEAKR4LeDO8
143
- M+OguG77jLaqj5/SNfi+GwyUDe85de4VfEG4S9HrMQk2Cp66rx0BqDnCLacyFQaI
144
- R0VczMXTU52q0uETmgUr8G9A1SaRc5ZWKAfZwxJTvqdIImWC9E+CY7wm+mZD4FE6
145
- iVzVC0ngcdEd596kTDdU2BPVMluWzLkfqIrTt/5CeQKBgQDzgRzCPNxFtai6RAIi
146
- ekBSHqrDnrbeTaw32GVq5ACk1Zfk2I0svctz1iQ9qJ2SRINpygQhcyJKQ4r/LXi1
147
- 7Av9H/d6QV4T2AZzS4WcqBkxxRXFUfARtnKChzuCzNt9tNz4EZiv75RyQmztGZjV
148
- i94+ZvCyqup5be4Svf4MBxin9QKBgQDA9P4nHzFWZakTMei78LGb/4Auc+r0rZp7
149
- 8xg8Z92tvrDeJjMdesdhiFrPP1qiSYHnQ81MSWpn6BycBsHZqitejQmYnYput/s4
150
- qG+m7SrkN8WL6rijYsbB+U14VDjMlBlOgcEgjlSNU2oeS+68u+uVI/fgyXcXn4Jq
151
- 33TSWSgfGwKBgA2tRdE/G9wqfOShZ0FKfoxePpcoNfs8f5zPYbrkPYkEmjh3VU6b
152
- Bm9mKrjv3JHXmU3608qRLe7f5lG42xvUu0OnZP4P59nTe2FEb6fB5VBfUn63wHUu
153
- OzZLpDMPkJB59SNV0a6oFT1pr7aNhoEQDxaQL5rJcMwLOaEB3OAOEft1AoGASz7+
154
- 4Zi7b7rDPVYIMUpCqNfxT6wqovIUPWPmPqAuhXPIm0kAQ+2+VN2MtCc7m+/Ydawu
155
- IiK7GPweNAY6kDxZH00WweolstmSYVzl9Y2lXUwWgGKvUB/T7I7g1Bzb7YOPftsA
156
- ykZW2Kn/xwLLfdQ2oXleT82g4Jh2jmDHuMPF7qMCgYEA6QF45PvOgnrJessgmwO/
157
- dEmkLl07PQYJPGZLaZteuWrvfMrn+AiW5aAdHzhzNaOtNy5B3T7zGUHtgxXegqgd
158
- /QdCVCJgnZUO/zdAxkr22dDn+WEXkL4wgBVStQvvnQp9C2NJcoOExvex5PLzKWQg
159
- WEKt5v3QsUEgVrzkM4K9UbI=
160
- -----END PRIVATE KEY-----
161
- EOF
162
- end
163
-
164
- def encrypted(key, password)
165
- key.export(OpenSSL::Cipher::Cipher.new("des-ede3-cbc"), password)
166
- end
167
-
168
- def public(key)
169
- result = "#{key.ssh_type} "
170
- result << [Net::SSH::Buffer.from(:key, key).to_s].pack("m*").strip.tr("\n\r\t ", "")
171
- result << " joe@host.test"
172
- end
173
- end
@@ -1,13 +0,0 @@
1
- require 'common'
2
-
3
- class TestKnownHosts < Test::Unit::TestCase
4
-
5
- def test_key_for_when_all_hosts_are_recognized
6
- source = File.join(File.dirname(__FILE__),"known_hosts/github")
7
- kh = Net::SSH::KnownHosts.new(source)
8
- keys = kh.keys_for("github.com")
9
- assert_equal(1, keys.count)
10
- assert_equal("ssh-rsa", keys[0].ssh_type)
11
- end
12
-
13
- end
@@ -1,41 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'net/ssh/transport/hmac/md5'
5
-
6
- module Transport; module HMAC
7
-
8
- class TestMD5 < Test::Unit::TestCase
9
- def test_expected_digest_class
10
- assert_equal OpenSSL::Digest::MD5, subject.digest_class
11
- assert_equal OpenSSL::Digest::MD5, subject.new.digest_class
12
- end
13
-
14
- def test_expected_key_length
15
- assert_equal 16, subject.key_length
16
- assert_equal 16, subject.new.key_length
17
- end
18
-
19
- def test_expected_mac_length
20
- assert_equal 16, subject.mac_length
21
- assert_equal 16, subject.new.mac_length
22
- end
23
-
24
- def test_expected_digest
25
- hmac = subject.new("1234567890123456")
26
- assert_equal "\275\345\006\307y~Oi\035<.\341\031\250<\257", hmac.digest("hello world")
27
- end
28
-
29
- def test_key_should_be_truncated_to_required_length
30
- hmac = subject.new("12345678901234567890")
31
- assert_equal "1234567890123456", hmac.key
32
- end
33
-
34
- private
35
-
36
- def subject
37
- Net::SSH::Transport::HMAC::MD5
38
- end
39
- end
40
-
41
- end; end
@@ -1,27 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'transport/hmac/test_md5'
5
- require 'net/ssh/transport/hmac/md5_96'
6
-
7
- module Transport; module HMAC
8
-
9
- class TestMD5_96 < TestMD5
10
- def test_expected_mac_length
11
- assert_equal 12, subject.mac_length
12
- assert_equal 12, subject.new.mac_length
13
- end
14
-
15
- def test_expected_digest
16
- hmac = subject.new("1234567890123456")
17
- assert_equal "\275\345\006\307y~Oi\035<.\341", hmac.digest("hello world")
18
- end
19
-
20
- private
21
-
22
- def subject
23
- Net::SSH::Transport::HMAC::MD5_96
24
- end
25
- end
26
-
27
- end; end
@@ -1,34 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/transport/hmac/none'
3
-
4
- module Transport; module HMAC
5
-
6
- class TestNone < Test::Unit::TestCase
7
- def test_expected_digest_class
8
- assert_equal nil, subject.digest_class
9
- assert_equal nil, subject.new.digest_class
10
- end
11
-
12
- def test_expected_key_length
13
- assert_equal 0, subject.key_length
14
- assert_equal 0, subject.new.key_length
15
- end
16
-
17
- def test_expected_mac_length
18
- assert_equal 0, subject.mac_length
19
- assert_equal 0, subject.new.mac_length
20
- end
21
-
22
- def test_expected_digest
23
- hmac = subject.new("1234567890123456")
24
- assert_equal "", hmac.digest("hello world")
25
- end
26
-
27
- private
28
-
29
- def subject
30
- Net::SSH::Transport::HMAC::None
31
- end
32
- end
33
-
34
- end; end
@@ -1,36 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'net/ssh/transport/hmac/ripemd160'
5
-
6
- module Transport; module HMAC
7
-
8
- class TestRipemd160 < Test::Unit::TestCase
9
- def test_expected_digest_class
10
- assert_equal OpenSSL::Digest::RIPEMD160, subject.digest_class
11
- assert_equal OpenSSL::Digest::RIPEMD160, subject.new.digest_class
12
- end
13
-
14
- def test_expected_key_length
15
- assert_equal 20, subject.key_length
16
- assert_equal 20, subject.new.key_length
17
- end
18
-
19
- def test_expected_mac_length
20
- assert_equal 20, subject.mac_length
21
- assert_equal 20, subject.new.mac_length
22
- end
23
-
24
- def test_expected_digest
25
- hmac = subject.new("1234567890123456")
26
- assert_equal "\xE4\x10\t\xB3\xD8,\x14\xA0k\x10\xB5\x0F?\x0E\x96q\x02\x16;E", hmac.digest("hello world")
27
- end
28
-
29
- private
30
-
31
- def subject
32
- Net::SSH::Transport::HMAC::RIPEMD160
33
- end
34
- end
35
-
36
- end; end
@@ -1,36 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'net/ssh/transport/hmac/sha1'
5
-
6
- module Transport; module HMAC
7
-
8
- class TestSHA1 < Test::Unit::TestCase
9
- def test_expected_digest_class
10
- assert_equal OpenSSL::Digest::SHA1, subject.digest_class
11
- assert_equal OpenSSL::Digest::SHA1, subject.new.digest_class
12
- end
13
-
14
- def test_expected_key_length
15
- assert_equal 20, subject.key_length
16
- assert_equal 20, subject.new.key_length
17
- end
18
-
19
- def test_expected_mac_length
20
- assert_equal 20, subject.mac_length
21
- assert_equal 20, subject.new.mac_length
22
- end
23
-
24
- def test_expected_digest
25
- hmac = subject.new("1234567890123456")
26
- assert_equal "\000\004W\202\204+&\335\311\251P\266\250\214\276\206;\022U\365", hmac.digest("hello world")
27
- end
28
-
29
- private
30
-
31
- def subject
32
- Net::SSH::Transport::HMAC::SHA1
33
- end
34
- end
35
-
36
- end; end
@@ -1,27 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'transport/hmac/test_sha1'
5
- require 'net/ssh/transport/hmac/sha1_96'
6
-
7
- module Transport; module HMAC
8
-
9
- class TestSHA1_96 < TestSHA1
10
- def test_expected_mac_length
11
- assert_equal 12, subject.mac_length
12
- assert_equal 12, subject.new.mac_length
13
- end
14
-
15
- def test_expected_digest
16
- hmac = subject.new("1234567890123456")
17
- assert_equal "\000\004W\202\204+&\335\311\251P\266", hmac.digest("hello world")
18
- end
19
-
20
- private
21
-
22
- def subject
23
- Net::SSH::Transport::HMAC::SHA1_96
24
- end
25
- end
26
-
27
- end; end
@@ -1,37 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'net/ssh/transport/hmac/sha2_256'
5
-
6
- module Transport; module HMAC
7
-
8
- class TestSHA2_256 < Test::Unit::TestCase
9
- def test_expected_digest_class
10
- assert_equal OpenSSL::Digest::SHA256, subject.digest_class
11
- assert_equal OpenSSL::Digest::SHA256, subject.new.digest_class
12
- end
13
-
14
- def test_expected_key_length
15
- assert_equal 32, subject.key_length
16
- assert_equal 32, subject.new.key_length
17
- end
18
-
19
- def test_expected_mac_length
20
- assert_equal 32, subject.mac_length
21
- assert_equal 32, subject.new.mac_length
22
- end
23
-
24
- def test_expected_digest
25
- hmac = subject.new("1234567890123456")
26
- assert_equal "\x16^>\x9FhO}\xB1>(\xBAF\xFBW\xB8\xF2\xFA\x824+\xC0\x94\x95\xC2\r\xE6\x88/\xEF\t\xF5%", hmac.digest("hello world")
27
-
28
- end
29
-
30
- private
31
-
32
- def subject
33
- Net::SSH::Transport::HMAC::SHA2_256
34
- end
35
- end
36
-
37
- end; end
@@ -1,27 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'transport/hmac/test_sha2_256'
5
- require 'net/ssh/transport/hmac/sha2_256_96'
6
-
7
- module Transport; module HMAC
8
-
9
- class TestSHA2_256_96 < TestSHA2_256
10
- def test_expected_mac_length
11
- assert_equal 12, subject.mac_length
12
- assert_equal 12, subject.new.mac_length
13
- end
14
-
15
- def test_expected_digest
16
- hmac = subject.new("1234567890123456")
17
- assert_equal "\x16^>\x9FhO}\xB1>(\xBAF", hmac.digest("hello world")
18
- end
19
-
20
- private
21
-
22
- def subject
23
- Net::SSH::Transport::HMAC::SHA2_256_96
24
- end
25
- end
26
-
27
- end; end
@@ -1,37 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'net/ssh/transport/hmac/sha2_512'
5
-
6
- module Transport; module HMAC
7
-
8
- class TestSHA2_512 < Test::Unit::TestCase
9
- def test_expected_digest_class
10
- assert_equal OpenSSL::Digest::SHA512, subject.digest_class
11
- assert_equal OpenSSL::Digest::SHA512, subject.new.digest_class
12
- end
13
-
14
- def test_expected_key_length
15
- assert_equal 64, subject.key_length
16
- assert_equal 64, subject.new.key_length
17
- end
18
-
19
- def test_expected_mac_length
20
- assert_equal 64, subject.mac_length
21
- assert_equal 64, subject.new.mac_length
22
- end
23
-
24
- def test_expected_digest
25
- hmac = subject.new("1234567890123456")
26
- assert_equal "^\xB6\"\xED\x8B\xC4\xDE\xD4\xCF\xD0\r\x18\xA0<\xF4\xB5\x01Efz\xA80i\xFC\x18\xC1\x9A+\xDD\xFE<\xA2\xFDE1Ac\xF4\xADU\r\xFB^0\x90= \x837z\xCC\xD5p4a4\x83\xC6\x04m\xAA\xC1\xC0m", hmac.digest("hello world")
27
-
28
- end
29
-
30
- private
31
-
32
- def subject
33
- Net::SSH::Transport::HMAC::SHA2_512
34
- end
35
- end
36
-
37
- end; end
@@ -1,27 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'transport/hmac/test_sha2_512'
5
- require 'net/ssh/transport/hmac/sha2_512_96'
6
-
7
- module Transport; module HMAC
8
-
9
- class TestSHA2_512_96 < TestSHA2_512
10
- def test_expected_mac_length
11
- assert_equal 12, subject.mac_length
12
- assert_equal 12, subject.new.mac_length
13
- end
14
-
15
- def test_expected_digest
16
- hmac = subject.new("1234567890123456")
17
- assert_equal "^\xB6\"\xED\x8B\xC4\xDE\xD4\xCF\xD0\r\x18", hmac.digest("hello world")
18
- end
19
-
20
- private
21
-
22
- def subject
23
- Net::SSH::Transport::HMAC::SHA2_512_96
24
- end
25
- end
26
-
27
- end; end
@@ -1,13 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/transport/kex/diffie_hellman_group14_sha1'
3
- require 'transport/kex/test_diffie_hellman_group1_sha1'
4
- require 'ostruct'
5
-
6
- module Transport; module Kex
7
-
8
- class TestDiffieHellmanGroup14SHA1 < TestDiffieHellmanGroup1SHA1
9
- def subject
10
- Net::SSH::Transport::Kex::DiffieHellmanGroup14SHA1
11
- end
12
- end
13
- end; end
@@ -1,146 +0,0 @@
1
- require 'common'
2
- require 'net/ssh/transport/kex/diffie_hellman_group1_sha1'
3
- require 'ostruct'
4
-
5
- module Transport; module Kex
6
-
7
- class TestDiffieHellmanGroup1SHA1 < Test::Unit::TestCase
8
- include Net::SSH::Transport::Constants
9
-
10
- def setup
11
- @dh_options = @dh = @algorithms = @connection = @server_key =
12
- @packet_data = @shared_secret = nil
13
- end
14
-
15
- def test_exchange_keys_should_return_expected_results_when_successful
16
- result = exchange!
17
- assert_equal session_id, result[:session_id]
18
- assert_equal server_key.to_blob, result[:server_key].to_blob
19
- assert_equal shared_secret, result[:shared_secret]
20
- assert_equal OpenSSL::Digest::SHA1, result[:hashing_algorithm]
21
- end
22
-
23
- def test_exchange_keys_with_unverifiable_host_should_raise_exception
24
- connection.verifier { false }
25
- assert_raises(Net::SSH::Exception) { exchange! }
26
- end
27
-
28
- def test_exchange_keys_with_signature_key_type_mismatch_should_raise_exception
29
- assert_raises(Net::SSH::Exception) { exchange! :key_type => "ssh-dss" }
30
- end
31
-
32
- def test_exchange_keys_with_host_key_type_mismatch_should_raise_exception
33
- algorithms :host_key => "ssh-dss"
34
- assert_raises(Net::SSH::Exception) { exchange! :key_type => "ssh-dss" }
35
- end
36
-
37
- def test_exchange_keys_when_server_signature_could_not_be_verified_should_raise_exception
38
- @signature = "1234567890"
39
- assert_raises(Net::SSH::Exception) { exchange! }
40
- end
41
-
42
- def test_exchange_keys_should_pass_expected_parameters_to_host_key_verifier
43
- verified = false
44
- connection.verifier do |data|
45
- verified = true
46
- assert_equal server_key.to_blob, data[:key].to_blob
47
-
48
- blob = b(:key, data[:key]).to_s
49
- fingerprint = OpenSSL::Digest::MD5.hexdigest(blob).scan(/../).join(":")
50
-
51
- assert_equal blob, data[:key_blob]
52
- assert_equal fingerprint, data[:fingerprint]
53
- assert_equal connection, data[:session]
54
-
55
- true
56
- end
57
-
58
- assert_nothing_raised { exchange! }
59
- assert verified
60
- end
61
-
62
- private
63
-
64
- def exchange!(options={})
65
- connection.expect do |t, buffer|
66
- assert_equal KEXDH_INIT, buffer.type
67
- assert_equal dh.dh.pub_key, buffer.read_bignum
68
- t.return(KEXDH_REPLY, :string, b(:key, server_key), :bignum, server_dh_pubkey, :string, b(:string, options[:key_type] || "ssh-rsa", :string, signature))
69
- connection.expect do |t2, buffer2|
70
- assert_equal NEWKEYS, buffer2.type
71
- t2.return(NEWKEYS)
72
- end
73
- end
74
-
75
- dh.exchange_keys
76
- end
77
-
78
- def dh_options(options={})
79
- @dh_options = options
80
- end
81
-
82
- def dh
83
- @dh ||= subject.new(algorithms, connection, packet_data.merge(:need_bytes => 20).merge(@dh_options || {}))
84
- end
85
-
86
- def algorithms(options={})
87
- @algorithms ||= OpenStruct.new(:host_key => options[:host_key] || "ssh-rsa")
88
- end
89
-
90
- def connection
91
- @connection ||= MockTransport.new
92
- end
93
-
94
- def subject
95
- Net::SSH::Transport::Kex::DiffieHellmanGroup1SHA1
96
- end
97
-
98
- # 512 bits is the smallest possible key that will work with this, so
99
- # we use it for speed reasons
100
- def server_key(bits=512)
101
- @server_key ||= OpenSSL::PKey::RSA.new(bits)
102
- end
103
-
104
- def packet_data
105
- @packet_data ||= { :client_version_string => "client version string",
106
- :server_version_string => "server version string",
107
- :server_algorithm_packet => "server algorithm packet",
108
- :client_algorithm_packet => "client algorithm packet" }
109
- end
110
-
111
- def server_dh_pubkey
112
- @server_dh_pubkey ||= bn(1234567890)
113
- end
114
-
115
- def shared_secret
116
- @shared_secret ||= OpenSSL::BN.new(dh.dh.compute_key(server_dh_pubkey), 2)
117
- end
118
-
119
- def session_id
120
- @session_id ||= begin
121
- buffer = Net::SSH::Buffer.from(:string, packet_data[:client_version_string],
122
- :string, packet_data[:server_version_string],
123
- :string, packet_data[:client_algorithm_packet],
124
- :string, packet_data[:server_algorithm_packet],
125
- :string, Net::SSH::Buffer.from(:key, server_key),
126
- :bignum, dh.dh.pub_key,
127
- :bignum, server_dh_pubkey,
128
- :bignum, shared_secret)
129
- OpenSSL::Digest::SHA1.digest(buffer.to_s)
130
- end
131
- end
132
-
133
- def signature
134
- @signature ||= server_key.ssh_do_sign(session_id)
135
- end
136
-
137
- def bn(number, base=10)
138
- OpenSSL::BN.new(number.to_s, base)
139
- end
140
-
141
- def b(*args)
142
- Net::SSH::Buffer.from(*args)
143
- end
144
- end
145
-
146
- end; end