net-ssh 1.1.4 → 2.0.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 (297) hide show
  1. data/CHANGELOG.rdoc +37 -0
  2. data/Manifest +101 -0
  3. data/README.rdoc +110 -0
  4. data/Rakefile +26 -0
  5. data/{THANKS → THANKS.rdoc} +2 -5
  6. data/lib/net/ssh.rb +189 -57
  7. data/lib/net/ssh/authentication/agent.rb +175 -0
  8. data/lib/net/ssh/authentication/constants.rb +18 -0
  9. data/lib/net/ssh/authentication/key_manager.rb +166 -0
  10. data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  11. data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  12. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  13. data/lib/net/ssh/authentication/methods/password.rb +39 -0
  14. data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  15. data/lib/net/ssh/authentication/pageant.rb +176 -0
  16. data/lib/net/ssh/authentication/session.rb +116 -0
  17. data/lib/net/ssh/buffer.rb +339 -0
  18. data/lib/net/ssh/buffered_io.rb +149 -0
  19. data/lib/net/ssh/config.rb +173 -0
  20. data/lib/net/ssh/connection/channel.rb +575 -454
  21. data/lib/net/ssh/connection/constants.rb +31 -45
  22. data/lib/net/ssh/connection/session.rb +569 -0
  23. data/lib/net/ssh/connection/term.rb +176 -88
  24. data/lib/net/ssh/errors.rb +83 -61
  25. data/lib/net/ssh/key_factory.rb +85 -0
  26. data/lib/net/ssh/known_hosts.rb +129 -0
  27. data/lib/net/ssh/loggable.rb +61 -0
  28. data/lib/net/ssh/packet.rb +102 -0
  29. data/lib/net/ssh/prompt.rb +93 -0
  30. data/lib/net/ssh/proxy/errors.rb +8 -28
  31. data/lib/net/ssh/proxy/http.rb +75 -107
  32. data/lib/net/ssh/proxy/socks4.rb +35 -48
  33. data/lib/net/ssh/proxy/socks5.rb +76 -108
  34. data/lib/net/ssh/service/forward.rb +267 -0
  35. data/lib/net/ssh/test.rb +89 -0
  36. data/lib/net/ssh/test/channel.rb +129 -0
  37. data/lib/net/ssh/test/extensions.rb +152 -0
  38. data/lib/net/ssh/test/kex.rb +44 -0
  39. data/lib/net/ssh/test/local_packet.rb +51 -0
  40. data/lib/net/ssh/test/packet.rb +81 -0
  41. data/lib/net/ssh/test/remote_packet.rb +38 -0
  42. data/lib/net/ssh/test/script.rb +157 -0
  43. data/lib/net/ssh/test/socket.rb +59 -0
  44. data/lib/net/ssh/transport/algorithms.rb +384 -0
  45. data/lib/net/ssh/transport/cipher_factory.rb +72 -0
  46. data/lib/net/ssh/transport/constants.rb +22 -58
  47. data/lib/net/ssh/transport/hmac.rb +31 -0
  48. data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
  49. data/lib/net/ssh/transport/hmac/md5.rb +12 -0
  50. data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  51. data/lib/net/ssh/transport/hmac/none.rb +15 -0
  52. data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  53. data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  54. data/lib/net/ssh/transport/identity_cipher.rb +40 -0
  55. data/lib/net/ssh/transport/kex.rb +13 -0
  56. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  57. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  58. data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
  59. data/lib/net/ssh/transport/packet_stream.rb +230 -0
  60. data/lib/net/ssh/transport/server_version.rb +61 -0
  61. data/lib/net/ssh/transport/session.rb +225 -303
  62. data/lib/net/ssh/transport/state.rb +170 -0
  63. data/lib/net/ssh/verifiers/lenient.rb +30 -0
  64. data/lib/net/ssh/verifiers/null.rb +12 -0
  65. data/lib/net/ssh/verifiers/strict.rb +53 -0
  66. data/lib/net/ssh/version.rb +57 -26
  67. data/net-ssh.gemspec +54 -0
  68. data/setup.rb +1585 -0
  69. data/test/authentication/methods/common.rb +28 -0
  70. data/test/authentication/methods/test_abstract.rb +51 -0
  71. data/test/authentication/methods/test_hostbased.rb +108 -0
  72. data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
  73. data/test/authentication/methods/test_password.rb +50 -0
  74. data/test/authentication/methods/test_publickey.rb +123 -0
  75. data/test/authentication/test_agent.rb +205 -0
  76. data/test/authentication/test_key_manager.rb +100 -0
  77. data/test/authentication/test_session.rb +93 -0
  78. data/test/common.rb +106 -0
  79. data/test/configs/exact_match +8 -0
  80. data/test/configs/wild_cards +14 -0
  81. data/test/connection/test_channel.rb +452 -0
  82. data/test/connection/test_session.rb +483 -0
  83. data/test/test_all.rb +6 -0
  84. data/test/test_buffer.rb +336 -0
  85. data/test/test_buffered_io.rb +63 -0
  86. data/test/test_config.rb +78 -0
  87. data/test/test_key_factory.rb +67 -0
  88. data/test/transport/hmac/test_md5.rb +34 -0
  89. data/test/transport/hmac/test_md5_96.rb +25 -0
  90. data/test/transport/hmac/test_none.rb +34 -0
  91. data/test/transport/hmac/test_sha1.rb +34 -0
  92. data/test/transport/hmac/test_sha1_96.rb +25 -0
  93. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  94. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  95. data/test/transport/test_algorithms.rb +302 -0
  96. data/test/transport/test_cipher_factory.rb +163 -0
  97. data/test/transport/test_hmac.rb +34 -0
  98. data/test/transport/test_identity_cipher.rb +40 -0
  99. data/test/transport/test_packet_stream.rb +433 -0
  100. data/test/transport/test_server_version.rb +55 -0
  101. data/test/transport/test_session.rb +312 -0
  102. data/test/transport/test_state.rb +173 -0
  103. metadata +102 -253
  104. data/ChangeLog +0 -560
  105. data/LICENSE +0 -7
  106. data/NEWS +0 -152
  107. data/README +0 -14
  108. data/bin/rb-keygen +0 -210
  109. data/doc/LICENSE-BSD +0 -27
  110. data/doc/LICENSE-GPL +0 -280
  111. data/doc/LICENSE-RUBY +0 -56
  112. data/doc/manual-html/chapter-1.html +0 -388
  113. data/doc/manual-html/chapter-2.html +0 -552
  114. data/doc/manual-html/chapter-3.html +0 -470
  115. data/doc/manual-html/chapter-4.html +0 -413
  116. data/doc/manual-html/chapter-5.html +0 -525
  117. data/doc/manual-html/chapter-6.html +0 -456
  118. data/doc/manual-html/chapter-7.html +0 -343
  119. data/doc/manual-html/index.html +0 -235
  120. data/doc/manual-html/stylesheets/manual.css +0 -270
  121. data/doc/manual-html/stylesheets/ruby.css +0 -17
  122. data/doc/manual/chapter.erb +0 -38
  123. data/doc/manual/example.erb +0 -18
  124. data/doc/manual/index.erb +0 -29
  125. data/doc/manual/manual.rb +0 -311
  126. data/doc/manual/manual.yml +0 -73
  127. data/doc/manual/page.erb +0 -87
  128. data/doc/manual/parts/0000.txt +0 -5
  129. data/doc/manual/parts/0001.txt +0 -3
  130. data/doc/manual/parts/0002.txt +0 -40
  131. data/doc/manual/parts/0003.txt +0 -6
  132. data/doc/manual/parts/0004.txt +0 -7
  133. data/doc/manual/parts/0005.txt +0 -1
  134. data/doc/manual/parts/0006.txt +0 -49
  135. data/doc/manual/parts/0007.txt +0 -67
  136. data/doc/manual/parts/0008.txt +0 -43
  137. data/doc/manual/parts/0009.txt +0 -14
  138. data/doc/manual/parts/0010.txt +0 -7
  139. data/doc/manual/parts/0011.txt +0 -14
  140. data/doc/manual/parts/0012.txt +0 -3
  141. data/doc/manual/parts/0013.txt +0 -20
  142. data/doc/manual/parts/0014.txt +0 -32
  143. data/doc/manual/parts/0015.txt +0 -14
  144. data/doc/manual/parts/0016.txt +0 -28
  145. data/doc/manual/parts/0017.txt +0 -50
  146. data/doc/manual/parts/0018.txt +0 -35
  147. data/doc/manual/parts/0019.txt +0 -7
  148. data/doc/manual/parts/0020.txt +0 -72
  149. data/doc/manual/parts/0021.txt +0 -50
  150. data/doc/manual/parts/0022.txt +0 -42
  151. data/doc/manual/parts/0023.txt +0 -51
  152. data/doc/manual/parts/0024.txt +0 -18
  153. data/doc/manual/parts/0025.txt +0 -18
  154. data/doc/manual/parts/0026.txt +0 -15
  155. data/doc/manual/parts/0027.txt +0 -37
  156. data/doc/manual/parts/0028.txt +0 -16
  157. data/doc/manual/parts/0029.txt +0 -1
  158. data/doc/manual/parts/0030.txt +0 -52
  159. data/doc/manual/parts/0031.txt +0 -25
  160. data/doc/manual/stylesheets/manual.css +0 -270
  161. data/doc/manual/stylesheets/ruby.css +0 -17
  162. data/doc/manual/tutorial.erb +0 -30
  163. data/examples/auth-forward.rb +0 -41
  164. data/examples/channel-demo.rb +0 -81
  165. data/examples/port-forward.rb +0 -51
  166. data/examples/process-demo.rb +0 -91
  167. data/examples/remote-net-port-forward.rb +0 -45
  168. data/examples/remote-port-forward.rb +0 -80
  169. data/examples/shell-demo.rb +0 -46
  170. data/examples/ssh-client.rb +0 -67
  171. data/examples/sync-shell-demo.rb +0 -69
  172. data/examples/tail-demo.rb +0 -49
  173. data/lib/net/ssh/connection/driver.rb +0 -446
  174. data/lib/net/ssh/connection/services.rb +0 -72
  175. data/lib/net/ssh/host-key-verifier.rb +0 -52
  176. data/lib/net/ssh/known-hosts.rb +0 -96
  177. data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
  178. data/lib/net/ssh/null-host-key-verifier.rb +0 -14
  179. data/lib/net/ssh/service/agentforward/driver.rb +0 -78
  180. data/lib/net/ssh/service/agentforward/services.rb +0 -41
  181. data/lib/net/ssh/service/forward/driver.rb +0 -319
  182. data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
  183. data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
  184. data/lib/net/ssh/service/forward/services.rb +0 -76
  185. data/lib/net/ssh/service/process/driver.rb +0 -153
  186. data/lib/net/ssh/service/process/open.rb +0 -193
  187. data/lib/net/ssh/service/process/popen3.rb +0 -178
  188. data/lib/net/ssh/service/process/services.rb +0 -66
  189. data/lib/net/ssh/service/services.rb +0 -60
  190. data/lib/net/ssh/service/shell/driver.rb +0 -86
  191. data/lib/net/ssh/service/shell/services.rb +0 -54
  192. data/lib/net/ssh/service/shell/shell.rb +0 -222
  193. data/lib/net/ssh/service/shell/sync.rb +0 -114
  194. data/lib/net/ssh/session.rb +0 -305
  195. data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
  196. data/lib/net/ssh/transport/compress/compressor.rb +0 -53
  197. data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
  198. data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
  199. data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
  200. data/lib/net/ssh/transport/compress/services.rb +0 -68
  201. data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
  202. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
  203. data/lib/net/ssh/transport/errors.rb +0 -47
  204. data/lib/net/ssh/transport/identity-cipher.rb +0 -61
  205. data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
  206. data/lib/net/ssh/transport/kex/dh.rb +0 -249
  207. data/lib/net/ssh/transport/kex/services.rb +0 -62
  208. data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
  209. data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
  210. data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
  211. data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
  212. data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
  213. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
  214. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
  215. data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
  216. data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
  217. data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
  218. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
  219. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
  220. data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
  221. data/lib/net/ssh/transport/ossl/services.rb +0 -149
  222. data/lib/net/ssh/transport/packet-stream.rb +0 -236
  223. data/lib/net/ssh/transport/services.rb +0 -146
  224. data/lib/net/ssh/transport/version-negotiator.rb +0 -73
  225. data/lib/net/ssh/userauth/agent.rb +0 -222
  226. data/lib/net/ssh/userauth/constants.rb +0 -35
  227. data/lib/net/ssh/userauth/driver.rb +0 -183
  228. data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
  229. data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
  230. data/lib/net/ssh/userauth/methods/password.rb +0 -70
  231. data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
  232. data/lib/net/ssh/userauth/methods/services.rb +0 -90
  233. data/lib/net/ssh/userauth/pageant.rb +0 -197
  234. data/lib/net/ssh/userauth/services.rb +0 -141
  235. data/lib/net/ssh/userauth/userkeys.rb +0 -258
  236. data/lib/net/ssh/util/buffer.rb +0 -274
  237. data/lib/net/ssh/util/prompter.rb +0 -73
  238. data/test/ALL-TESTS.rb +0 -18
  239. data/test/connection/tc_channel.rb +0 -136
  240. data/test/connection/tc_driver.rb +0 -287
  241. data/test/connection/tc_integration.rb +0 -87
  242. data/test/proxy/tc_http.rb +0 -209
  243. data/test/proxy/tc_socks4.rb +0 -148
  244. data/test/proxy/tc_socks5.rb +0 -214
  245. data/test/service/agentforward/tc_driver.rb +0 -138
  246. data/test/service/forward/tc_driver.rb +0 -289
  247. data/test/service/forward/tc_local_network_handler.rb +0 -123
  248. data/test/service/forward/tc_remote_network_handler.rb +0 -111
  249. data/test/service/process/tc_driver.rb +0 -79
  250. data/test/service/process/tc_integration.rb +0 -119
  251. data/test/service/process/tc_open.rb +0 -179
  252. data/test/service/process/tc_popen3.rb +0 -164
  253. data/test/tc_integration.rb +0 -80
  254. data/test/transport/compress/tc_none_compress.rb +0 -41
  255. data/test/transport/compress/tc_none_decompress.rb +0 -45
  256. data/test/transport/compress/tc_zlib_compress.rb +0 -61
  257. data/test/transport/compress/tc_zlib_decompress.rb +0 -48
  258. data/test/transport/kex/tc_dh.rb +0 -312
  259. data/test/transport/kex/tc_dh_gex.rb +0 -71
  260. data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
  261. data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
  262. data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
  263. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
  264. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
  265. data/test/transport/ossl/fixtures/not-a-private-key +0 -4
  266. data/test/transport/ossl/fixtures/not-supported +0 -2
  267. data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
  268. data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
  269. data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
  270. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
  271. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
  272. data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
  273. data/test/transport/ossl/hmac/tc_md5.rb +0 -50
  274. data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
  275. data/test/transport/ossl/hmac/tc_none.rb +0 -50
  276. data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
  277. data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
  278. data/test/transport/ossl/tc_buffer.rb +0 -97
  279. data/test/transport/ossl/tc_buffer_factory.rb +0 -67
  280. data/test/transport/ossl/tc_cipher_factory.rb +0 -84
  281. data/test/transport/ossl/tc_digest_factory.rb +0 -39
  282. data/test/transport/ossl/tc_hmac_factory.rb +0 -72
  283. data/test/transport/ossl/tc_key_factory.rb +0 -199
  284. data/test/transport/tc_algorithm_negotiator.rb +0 -170
  285. data/test/transport/tc_identity_cipher.rb +0 -52
  286. data/test/transport/tc_integration.rb +0 -115
  287. data/test/transport/tc_packet_stream.rb +0 -184
  288. data/test/transport/tc_session.rb +0 -296
  289. data/test/transport/tc_version_negotiator.rb +0 -86
  290. data/test/userauth/methods/tc_hostbased.rb +0 -136
  291. data/test/userauth/methods/tc_password.rb +0 -89
  292. data/test/userauth/methods/tc_publickey.rb +0 -167
  293. data/test/userauth/tc_agent.rb +0 -223
  294. data/test/userauth/tc_driver.rb +0 -190
  295. data/test/userauth/tc_integration.rb +0 -97
  296. data/test/userauth/tc_userkeys.rb +0 -265
  297. data/test/util/tc_buffer.rb +0 -217
@@ -1,106 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'net/ssh/errors'
18
- require 'net/ssh/transport/constants'
19
- require 'net/ssh/transport/kex/dh.rb'
20
-
21
- module Net
22
- module SSH
23
- module Transport
24
- module Kex
25
-
26
- # A key-exchange service implementing the
27
- # "diffie-hellman-group-exchange-sha1" key-exchange algorithm.
28
- class DiffieHellmanGroupExchangeSHA1 < DiffieHellmanGroup1SHA1
29
-
30
- MINIMUM_BITS = 1024
31
- MAXIMUM_BITS = 8192
32
-
33
- KEXDH_GEX_GROUP = 31
34
- KEXDH_GEX_INIT = 32
35
- KEXDH_GEX_REPLY = 33
36
- KEXDH_GEX_REQUEST = 34
37
-
38
- # Compute the number of bits needed for the given number of bytes.
39
- def compute_need_bits( data )
40
- need_bits = data[:need_bytes] * 8
41
- if need_bits < MINIMUM_BITS
42
- need_bits = MINIMUM_BITS
43
- elsif need_bits > MAXIMUM_BITS
44
- need_bits = MAXIMUM_BITS
45
- end
46
-
47
- data[:need_bits] = need_bits
48
- data[:need_bytes] = need_bits / 8
49
- end
50
- private :compute_need_bits
51
-
52
- # Returns the DH key parameters for the given session.
53
- def get_parms( session, data )
54
- compute_need_bits( data )
55
-
56
- # request the DH key parameters for the given number of bits.
57
- buffer = @buffers.writer
58
- buffer.write_byte KEXDH_GEX_REQUEST
59
- buffer.write_long MINIMUM_BITS
60
- buffer.write_long data[:need_bits]
61
- buffer.write_long MAXIMUM_BITS
62
- session.send_message buffer
63
-
64
- type, buffer = session.wait_for_message
65
- unless type == KEXDH_GEX_GROUP
66
- raise Net::SSH::Exception, "expected KEXDH_GEX_GROUP, got #{type}"
67
- end
68
-
69
- p = buffer.read_bignum
70
- g = buffer.read_bignum
71
-
72
- [ p, g ]
73
- end
74
- private :get_parms
75
-
76
- # Returns the INIT/REPLY constants used by this algorithm.
77
- def get_init_reply
78
- [ KEXDH_GEX_INIT, KEXDH_GEX_REPLY ]
79
- end
80
- private :get_init_reply
81
-
82
- # Build the signature buffer to use when verifying a signature from
83
- # the server.
84
- def build_signature_buffer( dh, data, result )
85
- response = @buffers.writer
86
- response.write_string data[:client_version_string],
87
- data[:server_version_string],
88
- data[:client_algorithm_packet],
89
- data[:server_algorithm_packet],
90
- result[:key_blob]
91
- response.write_long MINIMUM_BITS,
92
- data[:need_bits],
93
- MAXIMUM_BITS
94
- response.write_bignum dh.p, dh.g, dh.pub_key,
95
- result[:server_dh_pubkey],
96
- result[:shared_secret]
97
- response
98
- end
99
- private :build_signature_buffer
100
-
101
- end
102
-
103
- end
104
- end
105
- end
106
- end
@@ -1,249 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'net/ssh/errors'
18
- require 'net/ssh/transport/constants'
19
-
20
- module Net
21
- module SSH
22
- module Transport
23
- module Kex
24
-
25
- # A key-exchange service implementing the "diffie-hellman-group1-sha1"
26
- # key-exchange algorithm.
27
- class DiffieHellmanGroup1SHA1
28
- include Constants
29
-
30
- # The value of 'P', as a string, in hexadecimal
31
- P_s = "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" +
32
- "C4C6628B" "80DC1CD1" "29024E08" "8A67CC74" +
33
- "020BBEA6" "3B139B22" "514A0879" "8E3404DD" +
34
- "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" +
35
- "4FE1356D" "6D51C245" "E485B576" "625E7EC6" +
36
- "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED" +
37
- "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" +
38
- "49286651" "ECE65381" "FFFFFFFF" "FFFFFFFF"
39
-
40
- # The radix in which P_s represents the value of P
41
- P_r = 16
42
-
43
- # The group constant
44
- G = 2
45
-
46
- # The reference to the key factory to use.
47
- attr_writer :keys
48
-
49
- # The reference to the buffer factory to use.
50
- attr_writer :buffers
51
-
52
- # The reference to the host key verifier to use to verify host keys.
53
- attr_writer :host_key_verifier
54
-
55
- # Create a new instance of the DiffieHellmanGroup1SHA1 algorithm.
56
- # The parameters are, respectively, a factory for creating new
57
- # Bignum instances, and a factory for obtaining digester objects.
58
- def initialize( bn, digests )
59
- @bn = bn
60
-
61
- @p = @bn.new( P_s, P_r )
62
- @g = G
63
-
64
- @digester = digests.get( "sha1" )
65
- end
66
-
67
- # Returns the DH key parameters for the given session.
68
- def get_parms( session, data )
69
- [ @p, @g ]
70
- end
71
- private :get_parms
72
-
73
- # Returns the INIT/REPLY constants used by this algorithm.
74
- def get_init_reply
75
- [ KEXDH_INIT, KEXDH_REPLY ]
76
- end
77
- private :get_init_reply
78
-
79
- # Build the signature buffer to use when verifying a signature from
80
- # the server.
81
- def build_signature_buffer( dh, data, result )
82
- response = @buffers.writer
83
- response.write_string data[:client_version_string],
84
- data[:server_version_string],
85
- data[:client_algorithm_packet],
86
- data[:server_algorithm_packet],
87
- result[:key_blob]
88
- response.write_bignum dh.pub_key,
89
- result[:server_dh_pubkey],
90
- result[:shared_secret]
91
- response
92
- end
93
- private :build_signature_buffer
94
-
95
- # Generate a DH key with a private key consisting of the given
96
- # number of bytes.
97
- def generate_key( session, data ) #:nodoc:
98
- dh = @keys.get( "dh" )
99
- dh.p, dh.g = get_parms( session, data )
100
-
101
- dh.priv_key = @bn.rand( data[:need_bytes] * 8 )
102
-
103
- loop do
104
- dh.generate_key!
105
- break if dh.valid?
106
- end
107
-
108
- dh
109
- end
110
-
111
- # Send the KEXDH_INIT message, and expect the KEXDH_REPLY. Return the
112
- # resulting buffer.
113
- def send_kexinit( dh, session ) #:nodoc:
114
- init, reply = get_init_reply
115
-
116
- # send the KEXINIT message
117
- buffer = @buffers.writer
118
- buffer.write_byte init
119
- buffer.write_bignum dh.pub_key
120
- session.send_message buffer
121
-
122
- # expect the KEXDH_REPLY message
123
- type, buffer = session.wait_for_message
124
- raise Net::SSH::Exception,
125
- "expected REPLY" unless type == reply
126
-
127
- return buffer
128
- end
129
-
130
- # Parse the buffer from a KEXDH_REPLY message, returning a hash of
131
- # the extracted values.
132
- def parse_kex_reply( dh, buffer, session ) #:nodoc:
133
- result = Hash.new
134
-
135
- result[:key_blob] = buffer.read_string
136
- result[:server_key] = @buffers.reader( result[:key_blob] ).read_key
137
- result[:server_dh_pubkey] = buffer.read_bignum
138
- result[:shared_secret] =
139
- @bn.new( dh.compute_key( result[:server_dh_pubkey] ), 2 )
140
-
141
- sig_buffer = @buffers.reader( buffer.read_string )
142
- sig_type = sig_buffer.read_string
143
- if sig_type != session.algorithms.host_key
144
- raise Net::SSH::Exception,
145
- "host key algorithm mismatch for signature " +
146
- "'#{sig_type}' != '#{session.algorithms.host_key}'"
147
- end
148
- result[:server_sig] = sig_buffer.read_string
149
-
150
- return result
151
- end
152
-
153
- # Verify that the given key is of the expected type, and that it
154
- # really is the key for the session's host. Raise Net::SSH::Exception
155
- # if it is not.
156
- def verify_server_key( key, session ) #:nodoc:
157
- if key.ssh_type != session.algorithms.host_key
158
- raise Net::SSH::Exception,
159
- "host key algorithm mismatch " +
160
- "'#{key.ssh_type}' != '#{session.algorithms.host_key}'"
161
- end
162
-
163
- blob, fingerprint = generate_key_fingerprint(key)
164
-
165
- unless @host_key_verifier.verify(:key => key, :key_blob => blob, :fingerprint => fingerprint, :peer => session.peer)
166
- raise Net::SSH::Exception, "host key verification failed"
167
- end
168
- end
169
-
170
- def generate_key_fingerprint(key)
171
- writer = @buffers.writer
172
- writer.write_key(key)
173
-
174
- blob = writer.to_s
175
- fingerprint = OpenSSL::Digest::MD5.hexdigest(blob).scan(/../).join(":")
176
-
177
- [blob, fingerprint]
178
- rescue ::Exception => e
179
- [nil, "(could not generate fingerprint: #{e.message})"]
180
- end
181
-
182
- # Verify the signature that was received. Raise Net::SSH::Exception
183
- # if the signature could not be verified. Otherwise, return the new
184
- # session-id.
185
- def verify_signature( dh, data, result ) #:nodoc:
186
- response = build_signature_buffer( dh, data, result )
187
-
188
- hash = @digester.digest( response.to_s )
189
-
190
- unless result[:server_key].ssh_do_verify(
191
- result[:server_sig], hash )
192
- raise Net::SSH::Exception, "could not verify server signature"
193
- end
194
-
195
- return hash
196
- end
197
-
198
- # Send the NEWKEYS message, and expect the NEWKEYS message in
199
- # reply.
200
- def confirm_newkeys( session ) #:nodoc:
201
- # send own NEWKEYS message first (the wodSSHServer won't send first)
202
- response = @buffers.writer
203
- response.write_byte NEWKEYS
204
- session.send_message response
205
-
206
- # wait for the server's NEWKEYS message
207
- type, buffer = session.wait_for_message
208
- raise Net::SSH::Exception, "expected NEWKEYS" unless type == NEWKEYS
209
- end
210
-
211
- # Perform the key-exchange for the given session, with the given
212
- # data. The data is a Hash of symbols representing information
213
- # required by this algorithm, which was acquired during earlier
214
- # processing. This method will return an object consisting of the
215
- # following fields:
216
- #
217
- # * :session_id
218
- # * :server_key
219
- # * :shared_secret
220
- # * :hashing_algorithm
221
- #
222
- # The caller is expected to be able to understand how to use these
223
- # deliverables.
224
- def exchange_keys( session, data )
225
- data = data.dup
226
- dh = generate_key( session, data )
227
-
228
- buffer = send_kexinit( dh, session )
229
-
230
- result = parse_kex_reply( dh, buffer, session )
231
-
232
- verify_server_key( result[:server_key], session )
233
-
234
- session_id = verify_signature( dh, data, result )
235
-
236
- confirm_newkeys( session )
237
-
238
- return Struct.new( :session_id,
239
- :server_key, :shared_secret, :hashing_algorithm ).new(
240
- session_id, result[:server_key], result[:shared_secret],
241
- @digester )
242
- end
243
-
244
- end
245
-
246
- end
247
- end
248
- end
249
- end
@@ -1,62 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'openssl'
18
-
19
- module Net
20
- module SSH
21
- module Transport
22
- module Kex
23
-
24
- # Register the services that perform key-exchanges.
25
- def register_services( container )
26
- container.namespace_define :kex do |b|
27
-
28
- # The :dh service is a standard Diffie-Hellman key exchange
29
- # algorithm using Group-1 and SHA-1.
30
- b.dh :model => :singleton_deferred do
31
- require 'net/ssh/transport/kex/dh'
32
- dh = DiffieHellmanGroup1SHA1.new( b.bns, b.digesters )
33
- dh.keys = b.keys
34
- dh.buffers = b.buffers
35
- dh.host_key_verifier = b.host_key_verifier
36
- dh
37
- end
38
-
39
- # The :dh_gex service is a standard Diffie-Hellman key exchange
40
- # algorithm using SHA-1 and a negotiated group.
41
- b.dh_gex :model => :singleton_deferred do
42
- require 'net/ssh/transport/kex/dh-gex'
43
- dh = DiffieHellmanGroupExchangeSHA1.new( b.bns, b.digesters )
44
- dh.keys = b.keys
45
- dh.buffers = b.buffers
46
- dh.host_key_verifier = b.host_key_verifier
47
- dh
48
- end
49
-
50
- # Add these services to the hash of available kex algorithms.
51
- b.kex_names.update(
52
- "diffie-hellman-group-exchange-sha1" => b.dh_gex,
53
- "diffie-hellman-group1-sha1" => b.dh
54
- )
55
- end
56
- end
57
- module_function :register_services
58
-
59
- end
60
- end
61
- end
62
- end
@@ -1,52 +0,0 @@
1
- #--
2
- # =============================================================================
3
- # Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
4
- # All rights reserved.
5
- #
6
- # This source file is distributed as part of the Net::SSH Secure Shell Client
7
- # library for Ruby. This file (and the library as a whole) may be used only as
8
- # allowed by either the BSD license, or the Ruby license (or, by association
9
- # with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
10
- # distribution for the texts of these licenses.
11
- # -----------------------------------------------------------------------------
12
- # net-ssh website : http://net-ssh.rubyforge.org
13
- # project website: http://rubyforge.org/projects/net-ssh
14
- # =============================================================================
15
- #++
16
-
17
- require 'openssl'
18
- require 'net/ssh/util/buffer'
19
- require 'net/ssh/transport/ossl/buffer'
20
-
21
- module Net
22
- module SSH
23
- module Transport
24
-
25
- module OSSL
26
-
27
- # A factory class for returning new buffer instances that have been
28
- # decorated to also handle OpenSSL specific information.
29
- class BufferFactory
30
-
31
- # Return a new reader buffer that can also read bignums and keys.
32
- def reader( text )
33
- Net::SSH::Transport::OSSL::ReaderBuffer.new( text )
34
- end
35
-
36
- # Return a new writer buffer, initialized with the parameter.
37
- def writer( text="" )
38
- Net::SSH::Util::WriterBuffer.new( text )
39
- end
40
-
41
- # Return a new general buffer that can also read bignums and keys.
42
- def buffer( text="" )
43
- Net::SSH::Transport::OSSL::Buffer.new( text )
44
- end
45
-
46
- end
47
-
48
- end
49
-
50
- end
51
- end
52
- end