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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/.dockerignore +6 -0
- data/.github/FUNDING.yml +1 -0
- data/.github/config/rubocop_linter_action.yml +4 -0
- data/.github/workflows/ci-with-docker.yml +44 -0
- data/.github/workflows/ci.yml +94 -0
- data/.github/workflows/rubocop.yml +16 -0
- data/.gitignore +15 -0
- data/.rubocop.yml +22 -0
- data/.rubocop_todo.yml +1081 -0
- data/CHANGES.txt +387 -0
- data/DEVELOPMENT.md +23 -0
- data/Dockerfile +29 -0
- data/Dockerfile.openssl3 +17 -0
- data/Gemfile +13 -0
- data/Gemfile.noed25519 +12 -0
- data/Gemfile.norbnacl +12 -0
- data/ISSUE_TEMPLATE.md +30 -0
- data/Manifest +4 -5
- data/README.md +303 -0
- data/Rakefile +174 -40
- data/SECURITY.md +4 -0
- data/THANKS.txt +25 -0
- data/appveyor.yml +58 -0
- data/docker-compose.yml +25 -0
- data/lib/net/ssh/authentication/agent.rb +279 -18
- data/lib/net/ssh/authentication/certificate.rb +183 -0
- data/lib/net/ssh/authentication/constants.rb +17 -15
- data/lib/net/ssh/authentication/ed25519.rb +184 -0
- data/lib/net/ssh/authentication/ed25519_loader.rb +31 -0
- data/lib/net/ssh/authentication/key_manager.rb +125 -54
- data/lib/net/ssh/authentication/methods/abstract.rb +67 -48
- data/lib/net/ssh/authentication/methods/hostbased.rb +34 -37
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +19 -12
- data/lib/net/ssh/authentication/methods/none.rb +16 -19
- data/lib/net/ssh/authentication/methods/password.rb +56 -19
- data/lib/net/ssh/authentication/methods/publickey.rb +96 -55
- data/lib/net/ssh/authentication/pageant.rb +483 -246
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +43 -0
- data/lib/net/ssh/authentication/session.rb +138 -120
- data/lib/net/ssh/buffer.rb +399 -300
- data/lib/net/ssh/buffered_io.rb +154 -150
- data/lib/net/ssh/config.rb +361 -166
- data/lib/net/ssh/connection/channel.rb +640 -596
- data/lib/net/ssh/connection/constants.rb +29 -29
- data/lib/net/ssh/connection/event_loop.rb +123 -0
- data/lib/net/ssh/connection/keepalive.rb +59 -0
- data/lib/net/ssh/connection/session.rb +628 -548
- data/lib/net/ssh/connection/term.rb +125 -123
- data/lib/net/ssh/errors.rb +101 -95
- data/lib/net/ssh/key_factory.rb +198 -100
- data/lib/net/ssh/known_hosts.rb +221 -98
- data/lib/net/ssh/loggable.rb +50 -49
- data/lib/net/ssh/packet.rb +83 -79
- data/lib/net/ssh/prompt.rb +50 -81
- data/lib/net/ssh/proxy/command.rb +108 -60
- data/lib/net/ssh/proxy/errors.rb +12 -10
- data/lib/net/ssh/proxy/http.rb +82 -78
- data/lib/net/ssh/proxy/https.rb +50 -0
- data/lib/net/ssh/proxy/jump.rb +54 -0
- data/lib/net/ssh/proxy/socks4.rb +5 -8
- data/lib/net/ssh/proxy/socks5.rb +18 -20
- data/lib/net/ssh/service/forward.rb +383 -255
- data/lib/net/ssh/test/channel.rb +145 -136
- data/lib/net/ssh/test/extensions.rb +131 -110
- data/lib/net/ssh/test/kex.rb +34 -32
- data/lib/net/ssh/test/local_packet.rb +46 -44
- data/lib/net/ssh/test/packet.rb +89 -70
- data/lib/net/ssh/test/remote_packet.rb +32 -30
- data/lib/net/ssh/test/script.rb +156 -142
- data/lib/net/ssh/test/socket.rb +49 -48
- data/lib/net/ssh/test.rb +82 -77
- data/lib/net/ssh/transport/aes128_gcm.rb +40 -0
- data/lib/net/ssh/transport/aes256_gcm.rb +40 -0
- data/lib/net/ssh/transport/algorithms.rb +472 -348
- data/lib/net/ssh/transport/chacha20_poly1305_cipher.rb +117 -0
- data/lib/net/ssh/transport/chacha20_poly1305_cipher_loader.rb +17 -0
- data/lib/net/ssh/transport/cipher_factory.rb +124 -100
- data/lib/net/ssh/transport/constants.rb +32 -24
- data/lib/net/ssh/transport/ctr.rb +42 -22
- data/lib/net/ssh/transport/gcm_cipher.rb +207 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +97 -63
- data/lib/net/ssh/transport/hmac/md5.rb +0 -2
- data/lib/net/ssh/transport/hmac/md5_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/none.rb +0 -2
- data/lib/net/ssh/transport/hmac/ripemd160.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha1_96.rb +0 -2
- data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
- data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
- data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac.rb +14 -12
- data/lib/net/ssh/transport/identity_cipher.rb +54 -44
- data/lib/net/ssh/transport/kex/abstract.rb +130 -0
- data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +39 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +33 -40
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha256.rb +11 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +119 -213
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -61
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +36 -90
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +18 -10
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +18 -10
- data/lib/net/ssh/transport/kex.rb +15 -12
- data/lib/net/ssh/transport/key_expander.rb +24 -20
- data/lib/net/ssh/transport/openssl.rb +161 -124
- data/lib/net/ssh/transport/openssl_cipher_extensions.rb +8 -0
- data/lib/net/ssh/transport/packet_stream.rb +246 -183
- data/lib/net/ssh/transport/server_version.rb +57 -51
- data/lib/net/ssh/transport/session.rb +307 -235
- data/lib/net/ssh/transport/state.rb +178 -176
- data/lib/net/ssh/verifiers/accept_new.rb +33 -0
- data/lib/net/ssh/verifiers/accept_new_or_local_tunnel.rb +33 -0
- data/lib/net/ssh/verifiers/always.rb +58 -0
- data/lib/net/ssh/verifiers/never.rb +19 -0
- data/lib/net/ssh/version.rb +57 -51
- data/lib/net/ssh.rb +140 -40
- data/net-ssh-public_cert.pem +21 -0
- data/net-ssh.gemspec +39 -184
- data/support/ssh_tunnel_bug.rb +5 -5
- data.tar.gz.sig +0 -0
- metadata +205 -99
- metadata.gz.sig +0 -0
- data/README.rdoc +0 -219
- data/Rudyfile +0 -96
- data/gem-public_cert.pem +0 -20
- data/lib/net/ssh/authentication/agent/java_pageant.rb +0 -85
- data/lib/net/ssh/authentication/agent/socket.rb +0 -170
- data/lib/net/ssh/ruby_compat.rb +0 -51
- data/lib/net/ssh/verifiers/lenient.rb +0 -30
- data/lib/net/ssh/verifiers/null.rb +0 -12
- data/lib/net/ssh/verifiers/secure.rb +0 -54
- data/lib/net/ssh/verifiers/strict.rb +0 -24
- data/setup.rb +0 -1585
- data/support/arcfour_check.rb +0 -20
- data/test/README.txt +0 -47
- data/test/authentication/methods/common.rb +0 -28
- data/test/authentication/methods/test_abstract.rb +0 -51
- data/test/authentication/methods/test_hostbased.rb +0 -114
- data/test/authentication/methods/test_keyboard_interactive.rb +0 -100
- data/test/authentication/methods/test_none.rb +0 -41
- data/test/authentication/methods/test_password.rb +0 -52
- data/test/authentication/methods/test_publickey.rb +0 -148
- data/test/authentication/test_agent.rb +0 -205
- data/test/authentication/test_key_manager.rb +0 -218
- data/test/authentication/test_session.rb +0 -108
- data/test/common.rb +0 -108
- data/test/configs/eqsign +0 -3
- data/test/configs/exact_match +0 -8
- data/test/configs/host_plus +0 -10
- data/test/configs/multihost +0 -4
- data/test/configs/nohost +0 -19
- data/test/configs/numeric_host +0 -4
- data/test/configs/send_env +0 -2
- data/test/configs/substitutes +0 -8
- data/test/configs/wild_cards +0 -14
- data/test/connection/test_channel.rb +0 -467
- data/test/connection/test_session.rb +0 -526
- data/test/known_hosts/github +0 -1
- data/test/manual/test_forward.rb +0 -223
- data/test/start/test_options.rb +0 -36
- data/test/start/test_transport.rb +0 -28
- data/test/test_all.rb +0 -11
- data/test/test_buffer.rb +0 -433
- data/test/test_buffered_io.rb +0 -63
- data/test/test_config.rb +0 -151
- data/test/test_key_factory.rb +0 -173
- data/test/test_known_hosts.rb +0 -13
- data/test/transport/hmac/test_md5.rb +0 -41
- data/test/transport/hmac/test_md5_96.rb +0 -27
- data/test/transport/hmac/test_none.rb +0 -34
- data/test/transport/hmac/test_ripemd160.rb +0 -36
- data/test/transport/hmac/test_sha1.rb +0 -36
- data/test/transport/hmac/test_sha1_96.rb +0 -27
- data/test/transport/hmac/test_sha2_256.rb +0 -37
- data/test/transport/hmac/test_sha2_256_96.rb +0 -27
- data/test/transport/hmac/test_sha2_512.rb +0 -37
- data/test/transport/hmac/test_sha2_512_96.rb +0 -27
- data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -146
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -92
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -34
- data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
- data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
- data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
- data/test/transport/test_algorithms.rb +0 -330
- data/test/transport/test_cipher_factory.rb +0 -443
- data/test/transport/test_hmac.rb +0 -34
- data/test/transport/test_identity_cipher.rb +0 -40
- data/test/transport/test_packet_stream.rb +0 -1755
- data/test/transport/test_server_version.rb +0 -78
- data/test/transport/test_session.rb +0 -319
- data/test/transport/test_state.rb +0 -181
data/test/test_key_factory.rb
DELETED
@@ -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
|
data/test/test_known_hosts.rb
DELETED
@@ -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
|