net-ssh 4.0.0.alpha1 → 4.0.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +6 -0
  5. data/.travis.yml +10 -7
  6. data/CHANGES.txt +4 -0
  7. data/Gemfile +2 -15
  8. data/README.rdoc +6 -37
  9. data/Rakefile +5 -57
  10. data/lib/net/ssh/connection/session.rb +13 -0
  11. data/lib/net/ssh/ruby_compat.rb +2 -24
  12. data/lib/net/ssh/version.rb +1 -1
  13. data/net-ssh.gemspec +34 -225
  14. metadata +26 -100
  15. metadata.gz.sig +0 -0
  16. data/test/README.txt +0 -18
  17. data/test/authentication/methods/common.rb +0 -28
  18. data/test/authentication/methods/test_abstract.rb +0 -51
  19. data/test/authentication/methods/test_hostbased.rb +0 -114
  20. data/test/authentication/methods/test_keyboard_interactive.rb +0 -121
  21. data/test/authentication/methods/test_none.rb +0 -41
  22. data/test/authentication/methods/test_password.rb +0 -95
  23. data/test/authentication/methods/test_publickey.rb +0 -148
  24. data/test/authentication/test_agent.rb +0 -224
  25. data/test/authentication/test_ed25519.rb +0 -77
  26. data/test/authentication/test_key_manager.rb +0 -240
  27. data/test/authentication/test_session.rb +0 -107
  28. data/test/common.rb +0 -109
  29. data/test/configs/auth_off +0 -5
  30. data/test/configs/auth_on +0 -4
  31. data/test/configs/empty +0 -0
  32. data/test/configs/eqsign +0 -3
  33. data/test/configs/exact_match +0 -8
  34. data/test/configs/host_plus +0 -10
  35. data/test/configs/multihost +0 -4
  36. data/test/configs/negative_match +0 -6
  37. data/test/configs/nohost +0 -19
  38. data/test/configs/numeric_host +0 -4
  39. data/test/configs/proxy_remote_user +0 -2
  40. data/test/configs/send_env +0 -2
  41. data/test/configs/substitutes +0 -8
  42. data/test/configs/wild_cards +0 -14
  43. data/test/connection/test_channel.rb +0 -487
  44. data/test/connection/test_session.rb +0 -563
  45. data/test/integration/README.md +0 -18
  46. data/test/integration/Vagrantfile +0 -12
  47. data/test/integration/common.rb +0 -65
  48. data/test/integration/playbook.yml +0 -57
  49. data/test/integration/test_ed25519_pkeys.rb +0 -70
  50. data/test/integration/test_forward.rb +0 -532
  51. data/test/integration/test_id_rsa_keys.rb +0 -96
  52. data/test/integration/test_proxy.rb +0 -93
  53. data/test/known_hosts/github +0 -1
  54. data/test/known_hosts/github_hash +0 -1
  55. data/test/manual/test_pageant.rb +0 -37
  56. data/test/start/test_connection.rb +0 -53
  57. data/test/start/test_options.rb +0 -57
  58. data/test/start/test_transport.rb +0 -28
  59. data/test/start/test_user_nil.rb +0 -27
  60. data/test/test_all.rb +0 -12
  61. data/test/test_buffer.rb +0 -433
  62. data/test/test_buffered_io.rb +0 -63
  63. data/test/test_config.rb +0 -268
  64. data/test/test_key_factory.rb +0 -191
  65. data/test/test_known_hosts.rb +0 -66
  66. data/test/transport/hmac/test_md5.rb +0 -41
  67. data/test/transport/hmac/test_md5_96.rb +0 -27
  68. data/test/transport/hmac/test_none.rb +0 -34
  69. data/test/transport/hmac/test_ripemd160.rb +0 -36
  70. data/test/transport/hmac/test_sha1.rb +0 -36
  71. data/test/transport/hmac/test_sha1_96.rb +0 -27
  72. data/test/transport/hmac/test_sha2_256.rb +0 -37
  73. data/test/transport/hmac/test_sha2_256_96.rb +0 -27
  74. data/test/transport/hmac/test_sha2_512.rb +0 -37
  75. data/test/transport/hmac/test_sha2_512_96.rb +0 -27
  76. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +0 -13
  77. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +0 -150
  78. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +0 -96
  79. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +0 -19
  80. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +0 -161
  81. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +0 -38
  82. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +0 -38
  83. data/test/transport/test_algorithms.rb +0 -328
  84. data/test/transport/test_cipher_factory.rb +0 -324
  85. data/test/transport/test_hmac.rb +0 -34
  86. data/test/transport/test_identity_cipher.rb +0 -40
  87. data/test/transport/test_packet_stream.rb +0 -1186
  88. data/test/transport/test_server_version.rb +0 -74
  89. data/test/transport/test_session.rb +0 -331
  90. data/test/transport/test_state.rb +0 -181
  91. data/test/verifiers/test_secure.rb +0 -40
@@ -1,96 +0,0 @@
1
- require 'common'
2
- require 'fileutils'
3
- require 'tmpdir'
4
-
5
- require 'net/ssh'
6
-
7
- # see Vagrantfile,playbook for env.
8
- # we're running as net_ssh_1 user password foo
9
- # and usually connecting to net_ssh_2 user password foo2pwd
10
- class TestIDRSAPKeys < Test::Unit::TestCase
11
- include IntegrationTestHelpers
12
-
13
- def test_in_file_no_password
14
- tmpdir do |dir|
15
- sh "rm -rf #{dir}/id_rsa #{dir}/id_rsa.pub"
16
- sh "ssh-keygen -q -f #{dir}/id_rsa -t rsa -N ''"
17
- set_authorized_key('net_ssh_1',"#{dir}/id_rsa.pub")
18
-
19
- #sshopts = '-vvvv -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
20
- #sh "ssh -i #{dir}/id_rsa #{sshopts} net_ssh_1@localhost echo 'hello'"
21
-
22
- ret = Net::SSH.start("localhost", "net_ssh_1", {keys: "#{dir}/id_rsa"}) do |ssh|
23
- ssh.exec! 'echo "hello from:$USER"'
24
- end
25
- assert_equal "hello from:net_ssh_1\n", ret
26
- end
27
- end
28
-
29
-
30
- def test_ssh_agent
31
- tmpdir do |dir|
32
- with_agent do
33
- sh "rm -rf #{dir}/id_rsa #{dir}/id_rsa.pub"
34
- sh "ssh-keygen -q -f #{dir}/id_rsa -t rsa -N 'pwd123'"
35
- set_authorized_key('net_ssh_1',"#{dir}/id_rsa.pub")
36
- ssh_add("#{dir}/id_rsa","pwd123")
37
-
38
- ret = Net::SSH.start("localhost", "net_ssh_1") do |ssh|
39
- ssh.exec! 'echo "hello from:$USER"'
40
- end
41
- assert_equal "hello from:net_ssh_1\n", ret
42
- end
43
- end
44
- end
45
-
46
- def test_ssh_agent_ignores_if_already_in_agent
47
- tmpdir do |dir|
48
- with_agent do
49
- sh "rm -rf #{dir}/id_rsa #{dir}/id_rsa.pub"
50
- sh "ssh-keygen -q -f #{dir}/id_rsa -t rsa -N 'pwd123'"
51
- set_authorized_key('net_ssh_1',"#{dir}/id_rsa.pub")
52
- ssh_add("#{dir}/id_rsa","pwd123")
53
-
54
- ret = Net::SSH.start("localhost", "net_ssh_1", keys: ["#{dir}/id_rsa"]) do |ssh|
55
- ssh.exec! 'echo "hello from:$USER"'
56
- end
57
- assert_equal "hello from:net_ssh_1\n", ret
58
- end
59
- end
60
- end
61
-
62
- def test_in_file_with_password
63
- tmpdir do |dir|
64
- sh "rm -rf #{dir}/id_rsa #{dir}/id_rsa.pub"
65
- sh "ssh-keygen -q -f #{dir}/id_rsa -t rsa -N 'pwd12'"
66
- set_authorized_key('net_ssh_1',"#{dir}/id_rsa.pub")
67
-
68
- #sshopts = '-vvvv -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
69
- #sh "ssh -i #{dir}/id_rsa #{sshopts} net_ssh_1@localhost echo 'hello'"
70
-
71
- ret = Net::SSH.start("localhost", "net_ssh_1", {keys: "#{dir}/id_rsa",
72
- passphrase: 'pwd12'}) do |ssh|
73
- ssh.exec! 'echo "hello from:$USER"'
74
- end
75
- assert_equal "hello from:net_ssh_1\n", ret
76
- end
77
- end
78
-
79
- def test_asks_for_passwords_when_read_from_memory
80
- tmpdir do |dir|
81
- sh "rm -rf #{dir}/id_rsa #{dir}/id_rsa.pub"
82
- sh "ssh-keygen -q -f #{dir}/id_rsa -t rsa -N 'pwd12'"
83
- set_authorized_key('net_ssh_1',"#{dir}/id_rsa.pub")
84
- private_key = File.read("#{dir}/id_rsa")
85
-
86
- options = {keys: [], key_data: [private_key]}
87
-
88
- #key_manager = Net::SSH::Authentication::KeyManager.new(nil, options)
89
-
90
- Net::SSH::KeyFactory.expects(:prompt).with('Enter passphrase for :', false).returns('pwd12')
91
- Net::SSH.start("localhost", "net_ssh_1", options) do |ssh|
92
- ssh.exec! 'whoami'
93
- end
94
- end
95
- end
96
- end
@@ -1,93 +0,0 @@
1
- require_relative './common'
2
- require 'net/ssh/buffer'
3
- require 'net/ssh'
4
- require 'timeout'
5
- require 'tempfile'
6
- require 'net/ssh/proxy/command'
7
-
8
- class TestProxy < Test::Unit::TestCase
9
- include IntegrationTestHelpers
10
-
11
- def localhost
12
- 'localhost'
13
- end
14
-
15
- def user
16
- 'net_ssh_1'
17
- end
18
-
19
- def ssh_start_params(options)
20
- [localhost ,user , {:keys => @key_id_rsa}.merge(options)]
21
- end
22
-
23
- def setup_ssh_env(&block)
24
- tmpdir do |dir|
25
- @key_id_rsa = "#{dir}/id_rsa"
26
- sh "rm -rf #{@key_id_rsa} #{@key_id_rsa}.pub"
27
- sh "ssh-keygen -q -f #{@key_id_rsa} -t rsa -N ''"
28
- set_authorized_key(user,"#{@key_id_rsa}.pub")
29
- yield
30
- end
31
- end
32
-
33
- def test_smoke
34
- setup_ssh_env do
35
- proxy = Net::SSH::Proxy::Command.new("/bin/nc localhost 22")
36
- msg = 'echo123'
37
- ret = Net::SSH.start(*ssh_start_params(:proxy => proxy)) do |ssh|
38
- ssh.exec! "echo \"$USER:#{msg}\""
39
- end
40
- assert_equal "net_ssh_1:#{msg}\n", ret
41
- end
42
- end
43
-
44
- def with_spurious_write_wakeup_emulate(rate=99,&block)
45
- orig_io_select = Net::SSH::Compat.method(:io_select)
46
- count = 0
47
- Net::SSH::Compat.singleton_class.send(:define_method,:io_select) do |*params|
48
- count += 1
49
- if (count % rate != 0)
50
- if params && params[1] && !params[1].empty?
51
- return [[],params[1],[]]
52
- end
53
- #if params && params[0] && !params[0].empty?
54
- #return [params[0],[],[]]
55
- #end
56
- end
57
- IO.select(*params)
58
- end
59
- begin
60
- yield
61
- ensure
62
- Net::SSH::Compat.singleton_class.send(:define_method,:io_select,&orig_io_select)
63
- end
64
- end
65
-
66
- def test_with_rate_limit_and_spurious_wakeup
67
- system("sudo sh -c 'echo 4096 > /proc/sys/fs/pipe-max-size'")
68
- begin
69
- setup_ssh_env do
70
- proxy = Net::SSH::Proxy::Command.new("/usr/bin/pv --rate-limit 100k | /bin/nc localhost 22")
71
- #proxy = Net::SSH::Proxy::Command.new("/bin/nc localhost 22")
72
- begin
73
- large_msg = 'echo123'*30000
74
- ok = Net::SSH.start(*ssh_start_params(:proxy => proxy)) do |ssh|
75
- with_spurious_write_wakeup_emulate do
76
- ret = ssh.exec! "echo \"$USER:#{large_msg}\""
77
- #assert_equal "net_ssh_1:#{large_msg}\n", ret
78
- assert_equal "/bin/sh: Argument list too long\n", ret
79
- hello_count = 1000
80
- ret = ssh.exec! "ruby -e 'puts \"Hello\"*#{hello_count}'"
81
- assert_equal "Hello"*hello_count+"\n", ret
82
- end
83
- :ok
84
- end
85
- end
86
- assert_equal :ok, ok
87
- end
88
- ensure
89
- system("sudo sh -c 'echo 1048576 > /proc/sys/fs/pipe-max-size'")
90
- end
91
- end
92
-
93
- end
@@ -1 +0,0 @@
1
- github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
@@ -1 +0,0 @@
1
- |1|eKp+6E0rZ3lONgsIziurXEnaIik=|rcQB/rlJMUquUyFta64KugPjX4o= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
@@ -1,37 +0,0 @@
1
- #
2
- # Tests for communication capability with Pageant (or KeeAgent)
3
- # process, to include the case where it is running in different UAC
4
- # context.
5
- #
6
- # To run:
7
- # - Ensure that Pageant is running (not as administrator).
8
- # - Open two command prompts, one as an administrator and one limited
9
- # (normal).
10
- # - Within each, from the root net/ssh project directory, execute:
11
- # ruby -Ilib -Itest -rrubygems test/manual/test_pageant.rb
12
- #
13
-
14
- require 'common'
15
- require 'net/ssh/authentication/agent'
16
-
17
- module Authentication
18
-
19
- class TestPageant < Test::Unit::TestCase
20
-
21
- def test_agent_should_be_able_to_negotiate
22
- assert_nothing_raised(Net::SSH::Authentication::AgentNotAvailable) { agent.negotiate! }
23
- end
24
-
25
- private
26
-
27
- def agent(auto=:connect)
28
- @agent ||= begin
29
- agent = Net::SSH::Authentication::Agent.new
30
- agent.connect! if auto == :connect
31
- agent
32
- end
33
- end
34
-
35
- end
36
-
37
- end
@@ -1,53 +0,0 @@
1
- require 'common'
2
- require 'net/ssh'
3
-
4
- module NetSSH
5
- class TestConnection < Test::Unit::TestCase
6
- attr_reader :connection_session
7
-
8
- def setup
9
- authentication_session = mock('authentication_session')
10
- authentication_session.stubs(:authenticate).returns(true)
11
- Net::SSH::Authentication::Session.stubs(:new).returns(authentication_session)
12
- Net::SSH::Transport::Session.stubs(:new).returns(mock('transport_session'))
13
- @connection_session = mock('connection_session')
14
- Net::SSH::Connection::Session.expects(:new => connection_session)
15
- end
16
-
17
- def test_close_connection_on_exception
18
- @connection_session.expects(:closed?).returns(false)
19
- @connection_session.expects(:close).once
20
-
21
- begin
22
- Net::SSH.start('localhost', 'testuser') { raise "error" }
23
- rescue RuntimeError
24
- # We aren't interested in the exception
25
- end
26
- end
27
-
28
- def test_close_connection_on_exception_only_if_still_open
29
- conn_open = states('conn').starts_as(true)
30
- @connection_session.expects(:close).then(conn_open.is(false)).once
31
- @connection_session.expects(:closed?).when(conn_open.is(false)).returns(true)
32
-
33
- begin
34
- Net::SSH.start('localhost', 'testuser') do |ssh|
35
- ssh.close
36
- raise "error"
37
- end
38
- rescue RuntimeError
39
- # We aren't interested in the exception
40
- end
41
- end
42
-
43
- def test_return_value_is_returned
44
- @connection_session.expects(:closed?).returns(false)
45
- @connection_session.expects(:close).once
46
-
47
- val = 1
48
- retval = Net::SSH.start('localhost', 'testuser') { val }
49
- assert_equal(val, retval)
50
- end
51
- end
52
- end
53
-
@@ -1,57 +0,0 @@
1
- require 'common'
2
- require 'net/ssh'
3
-
4
- module NetSSH
5
- class TestStartOptions < Test::Unit::TestCase
6
- def setup
7
- authentication_session = mock('authentication_session')
8
- authentication_session.stubs(:authenticate).returns(true)
9
- Net::SSH::Authentication::Session.stubs(:new).returns(authentication_session)
10
- Net::SSH::Transport::Session.stubs(:new).returns(mock('transport_session'))
11
- Net::SSH::Connection::Session.stubs(:new).returns(mock('connection_session'))
12
- end
13
-
14
- def test_start_should_accept_keepalive_option
15
- assert_nothing_raised do
16
- options = { :keepalive => true }
17
- Net::SSH.start('localhost', 'testuser', options)
18
- end
19
- end
20
-
21
- def test_start_should_accept_keepalive_interval_option
22
- assert_nothing_raised do
23
- options = { :keepalive_interval => 10 }
24
- Net::SSH.start('localhost', 'testuser', options)
25
- end
26
- end
27
-
28
- def test_start_should_accept_send_env_option
29
- assert_nothing_raised do
30
- options = { :send_env => [ /^LC_.*$/, "LANG" ] }
31
- Net::SSH.start('localhost', 'testuser', options)
32
- end
33
- end
34
-
35
- def test_start_should_accept_number_of_password_prompts_option
36
- assert_nothing_raised do
37
- options = { :number_of_password_prompts => 2 }
38
- Net::SSH.start('localhost', 'testuser', options)
39
- end
40
- end
41
-
42
- def test_start_should_accept_non_interactive_option
43
- assert_nothing_raised do
44
- options = { :non_interactive => true }
45
- Net::SSH.start('localhost', 'testuser', options)
46
- end
47
- end
48
-
49
- def test_start_should_accept_remote_user_option
50
- assert_nothing_raised do
51
- options = { :remote_user => 'foo' }
52
- Net::SSH.start('localhost', 'testuser', options)
53
- end
54
- end
55
- end
56
- end
57
-
@@ -1,28 +0,0 @@
1
- require 'common'
2
- require 'net/ssh'
3
-
4
- module NetSSH
5
- class TestStart < Test::Unit::TestCase
6
- attr_reader :transport_session
7
- attr_reader :authentication_session
8
-
9
- def setup
10
- @transport_session = mock('transport_session')
11
- @authentication_session = mock('authentication_session')
12
- Net::SSH::Transport::Session.expects(:new => transport_session)
13
- Net::SSH::Authentication::Session.expects(:new => authentication_session)
14
- end
15
-
16
- def test_close_transport_when_authentication_fails
17
- authentication_session.expects(:authenticate => false)
18
-
19
- transport_session.expects(:close).at_least_once
20
-
21
- begin
22
- Net::SSH.start('localhost', 'testuser') {}
23
- rescue Net::SSH::AuthenticationFailed
24
- # Authentication should fail, as it is part of the context
25
- end
26
- end
27
- end
28
- end
@@ -1,27 +0,0 @@
1
- require 'common'
2
- require 'net/ssh'
3
-
4
- module NetSSH
5
- class TestStartUserNil < Test::Unit::TestCase
6
- def setup
7
- @authentication_session = mock('authentication_session')
8
- Net::SSH::Authentication::Session.stubs(:new).returns(@authentication_session)
9
- Net::SSH::Transport::Session.stubs(:new).returns(mock('transport_session'))
10
- Net::SSH::Connection::Session.stubs(:new).returns(mock('connection_session'))
11
- end
12
-
13
- def test_start_should_accept_nil_user
14
- @authentication_session.stubs(:authenticate).returns(true)
15
- assert_nothing_raised do
16
- Net::SSH.start('localhost')
17
- end
18
- end
19
-
20
- def test_start_should_use_default_user_when_nil
21
- @authentication_session.stubs(:authenticate).with() {|_next_service, user, _password| user == Etc.getlogin }.returns(true)
22
- assert_nothing_raised do
23
- Net::SSH.start('localhost')
24
- end
25
- end
26
- end
27
- end
@@ -1,12 +0,0 @@
1
- $: << '.'
2
-
3
- # $ ruby -Ilib -Itest -rrubygems test/test_all.rb
4
- # $ ruby -Ilib -Itest -rrubygems test/transport/test_server_version.rb
5
- Dir.chdir(File.dirname(__FILE__)) do
6
- test_files = Dir['**/test_*.rb']-['test_all.rb'] # prevent circular require
7
- test_files -= Dir['integration/test_*.rb'] unless ENV['NET_SSH_RUN_INTEGRATION_TESTS']
8
- test_files = test_files.reject { |f| f =~ /^manual/ }
9
- test_files = test_files.select { |f| f =~ Regexp.new(ENV['ONLY']) } if ENV['ONLY']
10
- test_files = test_files.reject { |f| f =~ Regexp.new(ENV['EXCEPT']) } if ENV['EXCEPT']
11
- test_files.each { |file| require(file) }
12
- end
@@ -1,433 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require 'common'
4
- require 'net/ssh/buffer'
5
-
6
- class TestBuffer < Test::Unit::TestCase
7
- def test_constructor_should_initialize_buffer_to_empty_by_default
8
- buffer = new
9
- assert buffer.empty?
10
- assert_equal 0, buffer.position
11
- end
12
-
13
- def test_constructor_with_string_should_initialize_buffer_to_the_string
14
- buffer = new("hello")
15
- assert !buffer.empty?
16
- assert_equal "hello", buffer.to_s
17
- assert_equal 0, buffer.position
18
- end
19
-
20
- def test_from_should_require_an_even_number_of_arguments
21
- assert_raises(ArgumentError) { Net::SSH::Buffer.from("this") }
22
- end
23
-
24
- def test_from_should_build_new_buffer_from_definition
25
- buffer = Net::SSH::Buffer.from(:byte, 1, :long, 2, :int64, 3, :string, "4", :bool, true, :bool, false, :bignum, OpenSSL::BN.new("1234567890", 10), :raw, "something")
26
- assert_equal "\1\0\0\0\2\0\0\0\0\0\0\0\3\0\0\0\0014\1\0\000\000\000\004I\226\002\322something", buffer.to_s
27
- end
28
-
29
- def test_from_with_array_argument_should_write_multiple_of_the_given_type
30
- buffer = Net::SSH::Buffer.from(:byte, [1,2,3,4,5])
31
- assert_equal "\1\2\3\4\5", buffer.to_s
32
- end
33
-
34
- def test_from_should_measure_bytesize_of_utf_8_string_correctly
35
- buffer = Net::SSH::Buffer.from(:string, "\u2603") # Snowman is 3 bytes
36
- assert_equal "\0\0\0\3\u2603", buffer.to_s
37
- end
38
-
39
- def test_read_without_argument_should_read_to_end
40
- buffer = new("hello world")
41
- assert_equal "hello world", buffer.read
42
- assert buffer.eof?
43
- assert_equal 11, buffer.position
44
- end
45
-
46
- def test_read_with_argument_that_is_less_than_length_should_read_that_many_bytes
47
- buffer = new "hello world"
48
- assert_equal "hello", buffer.read(5)
49
- assert_equal 5, buffer.position
50
- end
51
-
52
- def test_read_with_argument_that_is_more_than_length_should_read_no_more_than_length
53
- buffer = new "hello world"
54
- assert_equal "hello world", buffer.read(500)
55
- assert_equal 11, buffer.position
56
- end
57
-
58
- def test_read_at_eof_should_return_empty_string
59
- buffer = new "hello"
60
- buffer.position = 5
61
- assert_equal "", buffer.read
62
- end
63
-
64
- def test_consume_without_argument_should_resize_buffer_to_start_at_position
65
- buffer = new "hello world"
66
- buffer.read(5)
67
- assert_equal 5, buffer.position
68
- assert_equal 11, buffer.length
69
- buffer.consume!
70
- assert_equal 0, buffer.position
71
- assert_equal 6, buffer.length
72
- assert_equal " world", buffer.to_s
73
- end
74
-
75
- def test_consume_with_argument_should_resize_buffer_starting_at_n
76
- buffer = new "hello world"
77
- assert_equal 0, buffer.position
78
- buffer.consume!(5)
79
- assert_equal 0, buffer.position
80
- assert_equal 6, buffer.length
81
- assert_equal " world", buffer.to_s
82
- end
83
-
84
- def test_read_bang_should_read_and_consume_and_return_read_portion
85
- buffer = new "hello world"
86
- assert_equal "hello", buffer.read!(5)
87
- assert_equal 0, buffer.position
88
- assert_equal 6, buffer.length
89
- assert_equal " world", buffer.to_s
90
- end
91
-
92
- def test_available_should_return_length_after_position_to_end_of_string
93
- buffer = new "hello world"
94
- buffer.read(5)
95
- assert_equal 6, buffer.available
96
- end
97
-
98
- def test_clear_bang_should_reset_buffer_contents_and_counters
99
- buffer = new "hello world"
100
- buffer.read(5)
101
- buffer.clear!
102
- assert_equal 0, buffer.length
103
- assert_equal 0, buffer.position
104
- assert_equal "", buffer.to_s
105
- end
106
-
107
- def test_append_should_append_argument_without_changing_position_and_should_return_self
108
- buffer = new "hello world"
109
- buffer.read(5)
110
- buffer.append(" again")
111
- assert_equal 5, buffer.position
112
- assert_equal 12, buffer.available
113
- assert_equal 17, buffer.length
114
- assert_equal "hello world again", buffer.to_s
115
- end
116
-
117
- def test_remainder_as_buffer_should_return_a_new_buffer_filled_with_the_text_after_the_current_position
118
- buffer = new "hello world"
119
- buffer.read(6)
120
- b2 = buffer.remainder_as_buffer
121
- assert_equal 6, buffer.position
122
- assert_equal 0, b2.position
123
- assert_equal "world", b2.to_s
124
- end
125
-
126
- def test_read_int64_should_return_8_byte_integer
127
- buffer = new "\xff\xee\xdd\xcc\xbb\xaa\x99\x88"
128
- assert_equal 0xffeeddccbbaa9988, buffer.read_int64
129
- assert_equal 8, buffer.position
130
- end
131
-
132
- def test_read_int64_should_return_nil_on_partial_read
133
- buffer = new "\0\0\0\0\0\0\0"
134
- assert_nil buffer.read_int64
135
- assert buffer.eof?
136
- end
137
-
138
- def test_read_long_should_return_4_byte_integer
139
- buffer = new "\xff\xee\xdd\xcc\xbb\xaa\x99\x88"
140
- assert_equal 0xffeeddcc, buffer.read_long
141
- assert_equal 4, buffer.position
142
- end
143
-
144
- def test_read_long_should_return_nil_on_partial_read
145
- buffer = new "\0\0\0"
146
- assert_nil buffer.read_long
147
- assert buffer.eof?
148
- end
149
-
150
- def test_read_byte_should_return_single_byte_integer
151
- buffer = new "\xfe\xdc"
152
- assert_equal 0xfe, buffer.read_byte
153
- assert_equal 1, buffer.position
154
- end
155
-
156
- def test_read_byte_should_return_nil_at_eof
157
- assert_nil new.read_byte
158
- end
159
-
160
- def test_read_string_should_read_length_and_data_from_buffer
161
- buffer = new "\0\0\0\x0bhello world"
162
- assert_equal "hello world", buffer.read_string
163
- end
164
-
165
- def test_read_string_should_return_nil_if_4_byte_length_cannot_be_read
166
- assert_nil new("\0\1").read_string
167
- end
168
-
169
- def test_read_bool_should_return_true_if_non_zero_byte_is_read
170
- buffer = new "\1\2\3\4\5\6"
171
- 6.times { assert_equal true, buffer.read_bool }
172
- end
173
-
174
- def test_read_bool_should_return_false_if_zero_byte_is_read
175
- buffer = new "\0"
176
- assert_equal false, buffer.read_bool
177
- end
178
-
179
- def test_read_bool_should_return_nil_at_eof
180
- assert_nil new.read_bool
181
- end
182
-
183
- def test_read_bignum_should_read_openssl_formatted_bignum
184
- buffer = new("\000\000\000\004I\226\002\322")
185
- assert_equal OpenSSL::BN.new("1234567890", 10), buffer.read_bignum
186
- end
187
-
188
- def test_read_bignum_should_return_nil_if_length_cannot_be_read
189
- assert_nil new("\0\1\2").read_bignum
190
- end
191
-
192
- def test_read_key_blob_should_read_dsa_keys
193
- random_dss { |buffer| buffer.read_keyblob("ssh-dss") }
194
- end
195
-
196
- def test_read_key_blob_should_read_rsa_keys
197
- random_rsa { |buffer| buffer.read_keyblob("ssh-rsa") }
198
- end
199
-
200
- def test_read_key_should_read_dsa_key_type_and_keyblob
201
- random_dss do |buffer|
202
- b2 = Net::SSH::Buffer.from(:string, "ssh-dss", :raw, buffer)
203
- b2.read_key
204
- end
205
- end
206
-
207
- def test_read_key_should_read_rsa_key_type_and_keyblob
208
- random_rsa do |buffer|
209
- b2 = Net::SSH::Buffer.from(:string, "ssh-rsa", :raw, buffer)
210
- b2.read_key
211
- end
212
- end
213
-
214
- def test_read_buffer_should_read_a_string_and_return_it_wrapped_in_a_buffer
215
- buffer = new("\0\0\0\x0bhello world")
216
- b2 = buffer.read_buffer
217
- assert_equal 0, b2.position
218
- assert_equal 11, b2.length
219
- assert_equal "hello world", b2.read
220
- end
221
-
222
- def test_read_to_should_return_nil_if_pattern_does_not_exist_in_buffer
223
- buffer = new("one two three")
224
- assert_nil buffer.read_to("\n")
225
- end
226
-
227
- def test_read_to_should_grok_string_patterns
228
- buffer = new("one two three")
229
- assert_equal "one tw", buffer.read_to("tw")
230
- assert_equal 6, buffer.position
231
- end
232
-
233
- def test_read_to_should_grok_regex_patterns
234
- buffer = new("one two three")
235
- assert_equal "one tw", buffer.read_to(/tw/)
236
- assert_equal 6, buffer.position
237
- end
238
-
239
- def test_read_to_should_grok_fixnum_patterns
240
- buffer = new("one two three")
241
- assert_equal "one tw", buffer.read_to(?w)
242
- assert_equal 6, buffer.position
243
- end
244
-
245
- def test_reset_bang_should_reset_position_to_0
246
- buffer = new("hello world")
247
- buffer.read(5)
248
- assert_equal 5, buffer.position
249
- buffer.reset!
250
- assert_equal 0, buffer.position
251
- end
252
-
253
- def test_write_should_write_arguments_directly_to_end_buffer
254
- buffer = new("start")
255
- buffer.write "hello", " ", "world"
256
- assert_equal "starthello world", buffer.to_s
257
- assert_equal 0, buffer.position
258
- end
259
-
260
- def test_write_int64_should_write_arguments_as_8_byte_integers_to_end_of_buffer
261
- buffer = new("start")
262
- buffer.write_int64 0xffeeddccbbaa9988, 0x7766554433221100
263
- assert_equal "start\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00", buffer.to_s
264
- end
265
-
266
- def test_write_long_should_write_arguments_as_4_byte_integers_to_end_of_buffer
267
- buffer = new("start")
268
- buffer.write_long 0xffeeddcc, 0xbbaa9988
269
- assert_equal "start\xff\xee\xdd\xcc\xbb\xaa\x99\x88", buffer.to_s
270
- end
271
-
272
- def test_write_byte_should_write_arguments_as_1_byte_integers_to_end_of_buffer
273
- buffer = new("start")
274
- buffer.write_byte 1, 2, 3, 4, 5
275
- assert_equal "start\1\2\3\4\5", buffer.to_s
276
- end
277
-
278
- def test_write_bool_should_write_arguments_as_1_byte_boolean_values_to_end_of_buffer
279
- buffer = new("start")
280
- buffer.write_bool nil, false, true, 1, Object.new
281
- assert_equal "start\0\0\1\1\1", buffer.to_s
282
- end
283
-
284
- def test_write_bignum_should_write_arguments_as_ssh_formatted_bignum_values_to_end_of_buffer
285
- buffer = new("start")
286
- buffer.write_bignum OpenSSL::BN.new('1234567890', 10)
287
- assert_equal "start\000\000\000\004I\226\002\322", buffer.to_s
288
- end
289
-
290
- def test_write_dss_key_should_write_argument_to_end_of_buffer
291
- buffer = new("start")
292
-
293
- key = OpenSSL::PKey::DSA.new
294
- key.p = 0xffeeddccbbaa9988
295
- key.q = 0x7766554433221100
296
- key.g = 0xffddbb9977553311
297
- key.pub_key = 0xeeccaa8866442200
298
-
299
- buffer.write_key(key)
300
- assert_equal "start\0\0\0\7ssh-dss\0\0\0\011\0\xff\xee\xdd\xcc\xbb\xaa\x99\x88\0\0\0\010\x77\x66\x55\x44\x33\x22\x11\x00\0\0\0\011\0\xff\xdd\xbb\x99\x77\x55\x33\x11\0\0\0\011\0\xee\xcc\xaa\x88\x66\x44\x22\x00", buffer.to_s
301
- end
302
-
303
- def test_write_rsa_key_should_write_argument_to_end_of_buffer
304
- buffer = new("start")
305
-
306
- key = OpenSSL::PKey::RSA.new
307
- key.e = 0xffeeddccbbaa9988
308
- key.n = 0x7766554433221100
309
-
310
- buffer.write_key(key)
311
- assert_equal "start\0\0\0\7ssh-rsa\0\0\0\011\0\xff\xee\xdd\xcc\xbb\xaa\x99\x88\0\0\0\010\x77\x66\x55\x44\x33\x22\x11\x00", buffer.to_s
312
- end
313
-
314
- if defined?(OpenSSL::PKey::EC)
315
- def test_read_key_blob_should_read_ecdsa_sha2_nistp256_keys
316
- random_ecdsa_sha2_nistp256 { |buffer|
317
- buffer.read_keyblob("ecdsa-sha2-nistp256")
318
- }
319
- end
320
- def test_read_key_blob_should_read_ecdsa_sha2_nistp384_keys
321
- random_ecdsa_sha2_nistp384 { |buffer|
322
- buffer.read_keyblob("ecdsa-sha2-nistp384")
323
- }
324
- end
325
- def test_read_key_blob_should_read_ecdsa_sha2_nistp521_keys
326
- random_ecdsa_sha2_nistp521 { |buffer|
327
- buffer.read_keyblob("ecdsa-sha2-nistp521")
328
- }
329
- end
330
-
331
- def test_read_key_should_read_ecdsa_sha2_nistp256_key_type_and_keyblob
332
- random_ecdsa_sha2_nistp256 do |buffer|
333
- b2 = Net::SSH::Buffer.from(:string, "ecdsa-sha2-nistp256", :raw, buffer)
334
- b2.read_key
335
- end
336
- end
337
- def test_read_key_should_read_ecdsa_sha2_nistp384_key_type_and_keyblob
338
- random_ecdsa_sha2_nistp384 do |buffer|
339
- b2 = Net::SSH::Buffer.from(:string, "ecdsa-sha2-nistp384", :raw, buffer)
340
- b2.read_key
341
- end
342
- end
343
- def test_read_key_should_read_ecdsa_sha2_nistp521_key_type_and_keyblob
344
- random_ecdsa_sha2_nistp521 do |buffer|
345
- b2 = Net::SSH::Buffer.from(:string, "ecdsa-sha2-nistp521", :raw, buffer)
346
- b2.read_key
347
- end
348
- end
349
-
350
- def test_write_ecdsa_sha2_nistp256_key_should_write_argument_to_end_of_buffer
351
- buffer = new("start")
352
- key = OpenSSL::PKey::EC.new("-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIISGj5vAJCWt2KPI8NwaWVDSNLl2vbRxDIOkY+n6O0VVoAoGCCqGSM49\nAwEHoUQDQgAEnKbs0yEogTKT4QRu8T9nb2svl2mEWXb6g224oCpD2o6TYNXNw54H\nmWkdCv+kFCqSlfSi5fqFhrXdfEY6zSzQYQ==\n-----END EC PRIVATE KEY-----\n")
353
-
354
- buffer.write_key(key)
355
- assert_equal "start\000\000\000\023ecdsa-sha2-nistp256\000\000\000\bnistp256\000\000\000A\004\234\246\354\323!(\2012\223\341\004n\361?gok/\227i\204Yv\372\203m\270\240*C\332\216\223`\325\315\303\236\a\231i\035\n\377\244\024*\222\225\364\242\345\372\205\206\265\335|F:\315,\320a", buffer.to_s
356
- end
357
-
358
- def test_write_ecdsa_sha2_nistp384_key_should_write_argument_to_end_of_buffer
359
- buffer = new("start")
360
- key = OpenSSL::PKey::EC.new("-----BEGIN EC PRIVATE KEY-----\nMIGkAgEBBDBAfxJpzhsR7O+wMol6BcDgualR8rJBvYegUDYbBUrDnPzDx2/gD1lZ\nnwG1FuD2s9igBwYFK4EEACKhZANiAATsfiU4Kxyvvj1DdvFYsdDnZIT7loRlan9I\n8geCWPPl6x7NFRP+awrnTaarMgieGqxG8IQaIA0SsDOICfbDBkuatRi0S1Et/in4\nZwVEZvO81Ro5YSrjuUDAsytnI6OXS28=\n-----END EC PRIVATE KEY-----\n")
361
-
362
- buffer.write_key(key)
363
- assert_equal "start\000\000\000\023ecdsa-sha2-nistp384\000\000\000\bnistp384\000\000\000a\004\354~%8+\034\257\276=Cv\361X\261\320\347d\204\373\226\204ej\177H\362\a\202X\363\345\353\036\315\025\023\376k\n\347M\246\2532\b\236\032\254F\360\204\032 \r\022\2603\210\t\366\303\006K\232\265\030\264KQ-\376)\370g\005Df\363\274\325\0329a*\343\271@\300\263+g#\243\227Ko", buffer.to_s
364
- end
365
-
366
- def test_write_ecdsa_sha2_nistp521_key_should_write_argument_to_end_of_buffer
367
- buffer = new("start")
368
- key = OpenSSL::PKey::EC.new("-----BEGIN EC PRIVATE KEY-----\nMIHbAgEBBEGhnQF/SFo4Vym88HnCfc6BR8WwYqDh9wNTPeqzR8auxIpp0GKQlCG2\nuHzyteJX5/YalV8empYhEzNmNLNn8x7j0aAHBgUrgQQAI6GBiQOBhgAEAYygOgV9\nVI8UyLQ3BDlv+rb3es+ufrIcj++cqcc9QcmRn237NiWRr/1NKy2AKijsEdACtZXo\nxPC0x9Vs9ieC2oR+ANOBubcxPl2giDnBYm8ywAmmlXsP5ByAM17k97CzW5O+Z/uO\nbxGUzzhoXTNcjqpAckhRVKdnh6FL/rKelT0tBYi+\n-----END EC PRIVATE KEY-----\n")
369
-
370
- buffer.write_key(key)
371
- assert_equal "start\000\000\000\023ecdsa-sha2-nistp521\000\000\000\bnistp521\000\000\000\205\004\001\214\240:\005}T\217\024\310\2647\0049o\372\266\367z\317\256~\262\034\217\357\234\251\307=A\311\221\237m\3736%\221\257\375M+-\200*(\354\021\320\002\265\225\350\304\360\264\307\325l\366'\202\332\204~\000\323\201\271\2671>]\240\2109\301bo2\300\t\246\225{\017\344\034\2003^\344\367\260\263[\223\276g\373\216o\021\224\3178h]3\\\216\252@rHQT\247g\207\241K\376\262\236\225=-\005\210\276", buffer.to_s
372
- end
373
- end
374
-
375
- private
376
-
377
- def random_rsa
378
- n1 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
379
- n2 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
380
- buffer = Net::SSH::Buffer.from(:bignum, [n1, n2])
381
- key = yield(buffer)
382
- assert_equal "ssh-rsa", key.ssh_type
383
- assert_equal n1, key.e
384
- assert_equal n2, key.n
385
- end
386
-
387
- def random_dss
388
- n1 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
389
- n2 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
390
- n3 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
391
- n4 = OpenSSL::BN.new(rand(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF).to_s, 10)
392
- buffer = Net::SSH::Buffer.from(:bignum, [n1, n2, n3, n4])
393
- key = yield(buffer)
394
- assert_equal "ssh-dss", key.ssh_type
395
- assert_equal n1, key.p
396
- assert_equal n2, key.q
397
- assert_equal n3, key.g
398
- assert_equal n4, key.pub_key
399
- end
400
-
401
- if defined?(OpenSSL::PKey::EC)
402
- def random_ecdsa_sha2_nistp256
403
- k = OpenSSL::PKey::EC.new("prime256v1").generate_key
404
- buffer = Net::SSH::Buffer.from(:string, "nistp256",
405
- :string, k.public_key.to_bn.to_s(2))
406
- key = yield(buffer)
407
- assert_equal "ecdsa-sha2-nistp256", key.ssh_type
408
- assert_equal k.public_key, key.public_key
409
- end
410
-
411
- def random_ecdsa_sha2_nistp384
412
- k = OpenSSL::PKey::EC.new("secp384r1").generate_key
413
- buffer = Net::SSH::Buffer.from(:string, "nistp384",
414
- :string, k.public_key.to_bn.to_s(2))
415
- key = yield(buffer)
416
- assert_equal "ecdsa-sha2-nistp384", key.ssh_type
417
- assert_equal k.public_key, key.public_key
418
- end
419
-
420
- def random_ecdsa_sha2_nistp521
421
- k = OpenSSL::PKey::EC.new("secp521r1").generate_key
422
- buffer = Net::SSH::Buffer.from(:string, "nistp521",
423
- :string, k.public_key.to_bn.to_s(2))
424
- key = yield(buffer)
425
- assert_equal "ecdsa-sha2-nistp521", key.ssh_type
426
- assert_equal k.public_key, key.public_key
427
- end
428
- end
429
-
430
- def new(*args)
431
- Net::SSH::Buffer.new(*args)
432
- end
433
- end