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.
- data/CHANGELOG.rdoc +37 -0
- data/Manifest +101 -0
- data/README.rdoc +110 -0
- data/Rakefile +26 -0
- data/{THANKS → THANKS.rdoc} +2 -5
- data/lib/net/ssh.rb +189 -57
- data/lib/net/ssh/authentication/agent.rb +175 -0
- data/lib/net/ssh/authentication/constants.rb +18 -0
- data/lib/net/ssh/authentication/key_manager.rb +166 -0
- data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
- data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
- data/lib/net/ssh/authentication/methods/password.rb +39 -0
- data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
- data/lib/net/ssh/authentication/pageant.rb +176 -0
- data/lib/net/ssh/authentication/session.rb +116 -0
- data/lib/net/ssh/buffer.rb +339 -0
- data/lib/net/ssh/buffered_io.rb +149 -0
- data/lib/net/ssh/config.rb +173 -0
- data/lib/net/ssh/connection/channel.rb +575 -454
- data/lib/net/ssh/connection/constants.rb +31 -45
- data/lib/net/ssh/connection/session.rb +569 -0
- data/lib/net/ssh/connection/term.rb +176 -88
- data/lib/net/ssh/errors.rb +83 -61
- data/lib/net/ssh/key_factory.rb +85 -0
- data/lib/net/ssh/known_hosts.rb +129 -0
- data/lib/net/ssh/loggable.rb +61 -0
- data/lib/net/ssh/packet.rb +102 -0
- data/lib/net/ssh/prompt.rb +93 -0
- data/lib/net/ssh/proxy/errors.rb +8 -28
- data/lib/net/ssh/proxy/http.rb +75 -107
- data/lib/net/ssh/proxy/socks4.rb +35 -48
- data/lib/net/ssh/proxy/socks5.rb +76 -108
- data/lib/net/ssh/service/forward.rb +267 -0
- data/lib/net/ssh/test.rb +89 -0
- data/lib/net/ssh/test/channel.rb +129 -0
- data/lib/net/ssh/test/extensions.rb +152 -0
- data/lib/net/ssh/test/kex.rb +44 -0
- data/lib/net/ssh/test/local_packet.rb +51 -0
- data/lib/net/ssh/test/packet.rb +81 -0
- data/lib/net/ssh/test/remote_packet.rb +38 -0
- data/lib/net/ssh/test/script.rb +157 -0
- data/lib/net/ssh/test/socket.rb +59 -0
- data/lib/net/ssh/transport/algorithms.rb +384 -0
- data/lib/net/ssh/transport/cipher_factory.rb +72 -0
- data/lib/net/ssh/transport/constants.rb +22 -58
- data/lib/net/ssh/transport/hmac.rb +31 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
- data/lib/net/ssh/transport/hmac/md5.rb +12 -0
- data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
- data/lib/net/ssh/transport/hmac/none.rb +15 -0
- data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
- data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
- data/lib/net/ssh/transport/identity_cipher.rb +40 -0
- data/lib/net/ssh/transport/kex.rb +13 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
- data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
- data/lib/net/ssh/transport/packet_stream.rb +230 -0
- data/lib/net/ssh/transport/server_version.rb +61 -0
- data/lib/net/ssh/transport/session.rb +225 -303
- data/lib/net/ssh/transport/state.rb +170 -0
- data/lib/net/ssh/verifiers/lenient.rb +30 -0
- data/lib/net/ssh/verifiers/null.rb +12 -0
- data/lib/net/ssh/verifiers/strict.rb +53 -0
- data/lib/net/ssh/version.rb +57 -26
- data/net-ssh.gemspec +54 -0
- data/setup.rb +1585 -0
- data/test/authentication/methods/common.rb +28 -0
- data/test/authentication/methods/test_abstract.rb +51 -0
- data/test/authentication/methods/test_hostbased.rb +108 -0
- data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
- data/test/authentication/methods/test_password.rb +50 -0
- data/test/authentication/methods/test_publickey.rb +123 -0
- data/test/authentication/test_agent.rb +205 -0
- data/test/authentication/test_key_manager.rb +100 -0
- data/test/authentication/test_session.rb +93 -0
- data/test/common.rb +106 -0
- data/test/configs/exact_match +8 -0
- data/test/configs/wild_cards +14 -0
- data/test/connection/test_channel.rb +452 -0
- data/test/connection/test_session.rb +483 -0
- data/test/test_all.rb +6 -0
- data/test/test_buffer.rb +336 -0
- data/test/test_buffered_io.rb +63 -0
- data/test/test_config.rb +78 -0
- data/test/test_key_factory.rb +67 -0
- data/test/transport/hmac/test_md5.rb +34 -0
- data/test/transport/hmac/test_md5_96.rb +25 -0
- data/test/transport/hmac/test_none.rb +34 -0
- data/test/transport/hmac/test_sha1.rb +34 -0
- data/test/transport/hmac/test_sha1_96.rb +25 -0
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
- data/test/transport/test_algorithms.rb +302 -0
- data/test/transport/test_cipher_factory.rb +163 -0
- data/test/transport/test_hmac.rb +34 -0
- data/test/transport/test_identity_cipher.rb +40 -0
- data/test/transport/test_packet_stream.rb +433 -0
- data/test/transport/test_server_version.rb +55 -0
- data/test/transport/test_session.rb +312 -0
- data/test/transport/test_state.rb +173 -0
- metadata +102 -253
- data/ChangeLog +0 -560
- data/LICENSE +0 -7
- data/NEWS +0 -152
- data/README +0 -14
- data/bin/rb-keygen +0 -210
- data/doc/LICENSE-BSD +0 -27
- data/doc/LICENSE-GPL +0 -280
- data/doc/LICENSE-RUBY +0 -56
- data/doc/manual-html/chapter-1.html +0 -388
- data/doc/manual-html/chapter-2.html +0 -552
- data/doc/manual-html/chapter-3.html +0 -470
- data/doc/manual-html/chapter-4.html +0 -413
- data/doc/manual-html/chapter-5.html +0 -525
- data/doc/manual-html/chapter-6.html +0 -456
- data/doc/manual-html/chapter-7.html +0 -343
- data/doc/manual-html/index.html +0 -235
- data/doc/manual-html/stylesheets/manual.css +0 -270
- data/doc/manual-html/stylesheets/ruby.css +0 -17
- data/doc/manual/chapter.erb +0 -38
- data/doc/manual/example.erb +0 -18
- data/doc/manual/index.erb +0 -29
- data/doc/manual/manual.rb +0 -311
- data/doc/manual/manual.yml +0 -73
- data/doc/manual/page.erb +0 -87
- data/doc/manual/parts/0000.txt +0 -5
- data/doc/manual/parts/0001.txt +0 -3
- data/doc/manual/parts/0002.txt +0 -40
- data/doc/manual/parts/0003.txt +0 -6
- data/doc/manual/parts/0004.txt +0 -7
- data/doc/manual/parts/0005.txt +0 -1
- data/doc/manual/parts/0006.txt +0 -49
- data/doc/manual/parts/0007.txt +0 -67
- data/doc/manual/parts/0008.txt +0 -43
- data/doc/manual/parts/0009.txt +0 -14
- data/doc/manual/parts/0010.txt +0 -7
- data/doc/manual/parts/0011.txt +0 -14
- data/doc/manual/parts/0012.txt +0 -3
- data/doc/manual/parts/0013.txt +0 -20
- data/doc/manual/parts/0014.txt +0 -32
- data/doc/manual/parts/0015.txt +0 -14
- data/doc/manual/parts/0016.txt +0 -28
- data/doc/manual/parts/0017.txt +0 -50
- data/doc/manual/parts/0018.txt +0 -35
- data/doc/manual/parts/0019.txt +0 -7
- data/doc/manual/parts/0020.txt +0 -72
- data/doc/manual/parts/0021.txt +0 -50
- data/doc/manual/parts/0022.txt +0 -42
- data/doc/manual/parts/0023.txt +0 -51
- data/doc/manual/parts/0024.txt +0 -18
- data/doc/manual/parts/0025.txt +0 -18
- data/doc/manual/parts/0026.txt +0 -15
- data/doc/manual/parts/0027.txt +0 -37
- data/doc/manual/parts/0028.txt +0 -16
- data/doc/manual/parts/0029.txt +0 -1
- data/doc/manual/parts/0030.txt +0 -52
- data/doc/manual/parts/0031.txt +0 -25
- data/doc/manual/stylesheets/manual.css +0 -270
- data/doc/manual/stylesheets/ruby.css +0 -17
- data/doc/manual/tutorial.erb +0 -30
- data/examples/auth-forward.rb +0 -41
- data/examples/channel-demo.rb +0 -81
- data/examples/port-forward.rb +0 -51
- data/examples/process-demo.rb +0 -91
- data/examples/remote-net-port-forward.rb +0 -45
- data/examples/remote-port-forward.rb +0 -80
- data/examples/shell-demo.rb +0 -46
- data/examples/ssh-client.rb +0 -67
- data/examples/sync-shell-demo.rb +0 -69
- data/examples/tail-demo.rb +0 -49
- data/lib/net/ssh/connection/driver.rb +0 -446
- data/lib/net/ssh/connection/services.rb +0 -72
- data/lib/net/ssh/host-key-verifier.rb +0 -52
- data/lib/net/ssh/known-hosts.rb +0 -96
- data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
- data/lib/net/ssh/null-host-key-verifier.rb +0 -14
- data/lib/net/ssh/service/agentforward/driver.rb +0 -78
- data/lib/net/ssh/service/agentforward/services.rb +0 -41
- data/lib/net/ssh/service/forward/driver.rb +0 -319
- data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
- data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
- data/lib/net/ssh/service/forward/services.rb +0 -76
- data/lib/net/ssh/service/process/driver.rb +0 -153
- data/lib/net/ssh/service/process/open.rb +0 -193
- data/lib/net/ssh/service/process/popen3.rb +0 -178
- data/lib/net/ssh/service/process/services.rb +0 -66
- data/lib/net/ssh/service/services.rb +0 -60
- data/lib/net/ssh/service/shell/driver.rb +0 -86
- data/lib/net/ssh/service/shell/services.rb +0 -54
- data/lib/net/ssh/service/shell/shell.rb +0 -222
- data/lib/net/ssh/service/shell/sync.rb +0 -114
- data/lib/net/ssh/session.rb +0 -305
- data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
- data/lib/net/ssh/transport/compress/compressor.rb +0 -53
- data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
- data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
- data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
- data/lib/net/ssh/transport/compress/services.rb +0 -68
- data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
- data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
- data/lib/net/ssh/transport/errors.rb +0 -47
- data/lib/net/ssh/transport/identity-cipher.rb +0 -61
- data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
- data/lib/net/ssh/transport/kex/dh.rb +0 -249
- data/lib/net/ssh/transport/kex/services.rb +0 -62
- data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
- data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
- data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
- data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
- data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
- data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
- data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
- data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
- data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
- data/lib/net/ssh/transport/ossl/services.rb +0 -149
- data/lib/net/ssh/transport/packet-stream.rb +0 -236
- data/lib/net/ssh/transport/services.rb +0 -146
- data/lib/net/ssh/transport/version-negotiator.rb +0 -73
- data/lib/net/ssh/userauth/agent.rb +0 -222
- data/lib/net/ssh/userauth/constants.rb +0 -35
- data/lib/net/ssh/userauth/driver.rb +0 -183
- data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
- data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
- data/lib/net/ssh/userauth/methods/password.rb +0 -70
- data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
- data/lib/net/ssh/userauth/methods/services.rb +0 -90
- data/lib/net/ssh/userauth/pageant.rb +0 -197
- data/lib/net/ssh/userauth/services.rb +0 -141
- data/lib/net/ssh/userauth/userkeys.rb +0 -258
- data/lib/net/ssh/util/buffer.rb +0 -274
- data/lib/net/ssh/util/prompter.rb +0 -73
- data/test/ALL-TESTS.rb +0 -18
- data/test/connection/tc_channel.rb +0 -136
- data/test/connection/tc_driver.rb +0 -287
- data/test/connection/tc_integration.rb +0 -87
- data/test/proxy/tc_http.rb +0 -209
- data/test/proxy/tc_socks4.rb +0 -148
- data/test/proxy/tc_socks5.rb +0 -214
- data/test/service/agentforward/tc_driver.rb +0 -138
- data/test/service/forward/tc_driver.rb +0 -289
- data/test/service/forward/tc_local_network_handler.rb +0 -123
- data/test/service/forward/tc_remote_network_handler.rb +0 -111
- data/test/service/process/tc_driver.rb +0 -79
- data/test/service/process/tc_integration.rb +0 -119
- data/test/service/process/tc_open.rb +0 -179
- data/test/service/process/tc_popen3.rb +0 -164
- data/test/tc_integration.rb +0 -80
- data/test/transport/compress/tc_none_compress.rb +0 -41
- data/test/transport/compress/tc_none_decompress.rb +0 -45
- data/test/transport/compress/tc_zlib_compress.rb +0 -61
- data/test/transport/compress/tc_zlib_decompress.rb +0 -48
- data/test/transport/kex/tc_dh.rb +0 -312
- data/test/transport/kex/tc_dh_gex.rb +0 -71
- data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
- data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
- data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
- data/test/transport/ossl/fixtures/not-a-private-key +0 -4
- data/test/transport/ossl/fixtures/not-supported +0 -2
- data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
- data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
- data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
- data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
- data/test/transport/ossl/hmac/tc_md5.rb +0 -50
- data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
- data/test/transport/ossl/hmac/tc_none.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
- data/test/transport/ossl/tc_buffer.rb +0 -97
- data/test/transport/ossl/tc_buffer_factory.rb +0 -67
- data/test/transport/ossl/tc_cipher_factory.rb +0 -84
- data/test/transport/ossl/tc_digest_factory.rb +0 -39
- data/test/transport/ossl/tc_hmac_factory.rb +0 -72
- data/test/transport/ossl/tc_key_factory.rb +0 -199
- data/test/transport/tc_algorithm_negotiator.rb +0 -170
- data/test/transport/tc_identity_cipher.rb +0 -52
- data/test/transport/tc_integration.rb +0 -115
- data/test/transport/tc_packet_stream.rb +0 -184
- data/test/transport/tc_session.rb +0 -296
- data/test/transport/tc_version_negotiator.rb +0 -86
- data/test/userauth/methods/tc_hostbased.rb +0 -136
- data/test/userauth/methods/tc_password.rb +0 -89
- data/test/userauth/methods/tc_publickey.rb +0 -167
- data/test/userauth/tc_agent.rb +0 -223
- data/test/userauth/tc_driver.rb +0 -190
- data/test/userauth/tc_integration.rb +0 -97
- data/test/userauth/tc_userkeys.rb +0 -265
- 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
|