hrr_rb_ssh 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/demo/server.rb +13 -1
  3. data/lib/hrr_rb_ssh/authentication/method/none/context.rb +1 -1
  4. data/lib/hrr_rb_ssh/authentication/method/none.rb +4 -4
  5. data/lib/hrr_rb_ssh/authentication/method/password/context.rb +1 -1
  6. data/lib/hrr_rb_ssh/authentication/method/password.rb +4 -4
  7. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/codable.rb +5 -5
  8. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb +29 -18
  9. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb +27 -16
  10. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm.rb +7 -13
  11. data/lib/hrr_rb_ssh/authentication/method/publickey/context.rb +1 -1
  12. data/lib/hrr_rb_ssh/authentication/method/publickey.rb +5 -5
  13. data/lib/hrr_rb_ssh/authentication/method.rb +6 -12
  14. data/lib/hrr_rb_ssh/authentication.rb +1 -1
  15. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env/context.rb +2 -2
  16. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env.rb +2 -3
  17. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb +2 -2
  18. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec.rb +2 -3
  19. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb +2 -2
  20. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req.rb +2 -3
  21. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb +2 -2
  22. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell.rb +2 -3
  23. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb +2 -2
  24. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb +2 -3
  25. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type.rb +16 -11
  26. data/lib/hrr_rb_ssh/connection/channel/channel_type/session.rb +1 -15
  27. data/lib/hrr_rb_ssh/connection/channel/channel_type.rb +15 -10
  28. data/lib/hrr_rb_ssh/connection/channel.rb +1 -1
  29. data/lib/hrr_rb_ssh/data_type.rb +153 -0
  30. data/lib/hrr_rb_ssh/message/001_ssh_msg_disconnect.rb +6 -6
  31. data/lib/hrr_rb_ssh/message/002_ssh_msg_ignore.rb +4 -4
  32. data/lib/hrr_rb_ssh/message/003_ssh_msg_unimplemented.rb +4 -4
  33. data/lib/hrr_rb_ssh/message/004_ssh_msg_debug.rb +6 -6
  34. data/lib/hrr_rb_ssh/message/005_ssh_msg_service_request.rb +4 -4
  35. data/lib/hrr_rb_ssh/message/006_ssh_msg_service_accept.rb +4 -4
  36. data/lib/hrr_rb_ssh/message/020_ssh_msg_kexinit.rb +31 -31
  37. data/lib/hrr_rb_ssh/message/021_ssh_msg_newkeys.rb +3 -3
  38. data/lib/hrr_rb_ssh/message/030_ssh_msg_kexdh_init.rb +4 -4
  39. data/lib/hrr_rb_ssh/message/031_ssh_msg_kexdh_reply.rb +6 -6
  40. data/lib/hrr_rb_ssh/message/050_ssh_msg_userauth_request.rb +18 -18
  41. data/lib/hrr_rb_ssh/message/051_ssh_msg_userauth_failure.rb +5 -5
  42. data/lib/hrr_rb_ssh/message/052_ssh_msg_userauth_success.rb +3 -3
  43. data/lib/hrr_rb_ssh/message/060_ssh_msg_userauth_pk_ok.rb +5 -5
  44. data/lib/hrr_rb_ssh/message/080_ssh_msg_global_request.rb +13 -13
  45. data/lib/hrr_rb_ssh/message/081_ssh_msg_request_success.rb +6 -6
  46. data/lib/hrr_rb_ssh/message/082_ssh_msg_request_failure.rb +3 -3
  47. data/lib/hrr_rb_ssh/message/090_ssh_msg_channel_open.rb +25 -25
  48. data/lib/hrr_rb_ssh/message/091_ssh_msg_channel_open_confirmation.rb +25 -25
  49. data/lib/hrr_rb_ssh/message/092_ssh_msg_channel_open_failure.rb +7 -7
  50. data/lib/hrr_rb_ssh/message/093_ssh_msg_channel_window_adjust.rb +5 -5
  51. data/lib/hrr_rb_ssh/message/094_ssh_msg_channel_data.rb +5 -5
  52. data/lib/hrr_rb_ssh/message/095_ssh_msg_channel_extended_data.rb +6 -6
  53. data/lib/hrr_rb_ssh/message/096_ssh_msg_channel_eof.rb +4 -4
  54. data/lib/hrr_rb_ssh/message/097_ssh_msg_channel_close.rb +4 -4
  55. data/lib/hrr_rb_ssh/message/098_ssh_msg_channel_request.rb +53 -53
  56. data/lib/hrr_rb_ssh/message/099_ssh_msg_channel_success.rb +4 -4
  57. data/lib/hrr_rb_ssh/message/100_ssh_msg_channel_failure.rb +4 -4
  58. data/lib/hrr_rb_ssh/message/codable.rb +2 -3
  59. data/lib/hrr_rb_ssh/subclass_with_preference_listable.rb +29 -0
  60. data/lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb +4 -4
  61. data/lib/hrr_rb_ssh/transport/compression_algorithm/none.rb +1 -6
  62. data/lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb +4 -0
  63. data/lib/hrr_rb_ssh/transport/compression_algorithm/zlib.rb +1 -6
  64. data/lib/hrr_rb_ssh/transport/compression_algorithm.rb +5 -11
  65. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_cbc.rb +1 -2
  66. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_ctr.rb +1 -2
  67. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes192_cbc.rb +1 -2
  68. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes192_ctr.rb +1 -2
  69. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes256_cbc.rb +1 -2
  70. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes256_ctr.rb +1 -2
  71. data/lib/hrr_rb_ssh/transport/encryption_algorithm/arcfour.rb +1 -2
  72. data/lib/hrr_rb_ssh/transport/encryption_algorithm/blowfish_cbc.rb +1 -2
  73. data/lib/hrr_rb_ssh/transport/encryption_algorithm/cast128_cbc.rb +1 -2
  74. data/lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb +1 -2
  75. data/lib/hrr_rb_ssh/transport/encryption_algorithm/none.rb +1 -6
  76. data/lib/hrr_rb_ssh/transport/encryption_algorithm/three_des_cbc.rb +1 -2
  77. data/lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb +6 -0
  78. data/lib/hrr_rb_ssh/transport/encryption_algorithm.rb +5 -11
  79. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +14 -14
  80. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1.rb +2 -5
  81. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1.rb +2 -5
  82. data/lib/hrr_rb_ssh/transport/kex_algorithm.rb +5 -10
  83. data/lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb +2 -3
  84. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5.rb +3 -5
  85. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5_96.rb +3 -5
  86. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1.rb +3 -5
  87. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1_96.rb +3 -5
  88. data/lib/hrr_rb_ssh/transport/mac_algorithm/none.rb +2 -8
  89. data/lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb +4 -0
  90. data/lib/hrr_rb_ssh/transport/mac_algorithm.rb +5 -11
  91. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb +14 -13
  92. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb +12 -11
  93. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm.rb +5 -10
  94. data/lib/hrr_rb_ssh/transport.rb +147 -108
  95. data/lib/hrr_rb_ssh/version.rb +1 -1
  96. metadata +4 -12
  97. data/lib/hrr_rb_ssh/authentication/method/method.rb +0 -34
  98. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/algorithm.rb +0 -41
  99. data/lib/hrr_rb_ssh/connection/channel/channel_type/channel_type.rb +0 -30
  100. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/request_type.rb +0 -34
  101. data/lib/hrr_rb_ssh/transport/compression_algorithm/compression_algorithm.rb +0 -34
  102. data/lib/hrr_rb_ssh/transport/data_type.rb +0 -163
  103. data/lib/hrr_rb_ssh/transport/encryption_algorithm/encryption_algorithm.rb +0 -34
  104. data/lib/hrr_rb_ssh/transport/kex_algorithm/kex_algorithm.rb +0 -34
  105. data/lib/hrr_rb_ssh/transport/mac_algorithm/mac_algorithm.rb +0 -34
  106. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm.rb +0 -34
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/transport/data_type'
5
- require 'hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm'
4
+ require 'hrr_rb_ssh/logger'
5
+ require 'hrr_rb_ssh/data_type'
6
6
 
7
7
  module HrrRbSsh
8
8
  class Transport
@@ -10,6 +10,8 @@ module HrrRbSsh
10
10
  class SshDss < ServerHostKeyAlgorithm
11
11
  NAME = 'ssh-dss'
12
12
 
13
+ PREFERENCE = 10
14
+
13
15
  SECRET_KEY = <<-EOB
14
16
  -----BEGIN DSA PRIVATE KEY-----
15
17
  MIIBuwIBAAKBgQD3fQ6cwTtOJpVI0iASOQZxkhwPRNy7UwovQkEK6bXW33HaCebO
@@ -26,28 +28,27 @@ MRl/p42OrQzL/chRPvRf
26
28
  EOB
27
29
 
28
30
  KEY_FORMAT_DEFINITION = [
29
- ['string', 'ssh-dss'],
30
- ['mpint', 'p'],
31
- ['mpint', 'q'],
32
- ['mpint', 'g'],
33
- ['mpint', 'y'],
31
+ [DataType::String, 'ssh-dss'],
32
+ [DataType::Mpint, 'p'],
33
+ [DataType::Mpint, 'q'],
34
+ [DataType::Mpint, 'g'],
35
+ [DataType::Mpint, 'y'],
34
36
  ]
35
37
 
36
38
  SIGN_DEFINITION = [
37
- ['string', 'ssh-dss'],
38
- ['string', 'dss_signature_blob'],
39
+ [DataType::String, 'ssh-dss'],
40
+ [DataType::String, 'dss_signature_blob'],
39
41
  ]
40
42
 
41
43
  def initialize
42
- super
43
-
44
+ @logger = HrrRbSsh::Logger.new(self.class.name)
44
45
  @dss = OpenSSL::PKey::DSA.new SECRET_KEY
45
46
  end
46
47
 
47
48
  def encode definition, payload
48
49
  definition.map{ |data_type, field_name|
49
50
  field_value = if payload[field_name].instance_of? ::Proc then payload[field_name].call else payload[field_name] end
50
- HrrRbSsh::Transport::DataType[data_type].encode( field_value )
51
+ data_type.encode( field_value )
51
52
  }.join
52
53
  end
53
54
 
@@ -56,7 +57,7 @@ MRl/p42OrQzL/chRPvRf
56
57
  definition.map{ |data_type, field_name|
57
58
  [
58
59
  field_name,
59
- HrrRbSsh::Transport::DataType[data_type].decode( payload_io )
60
+ data_type.decode( payload_io )
60
61
  ]
61
62
  }.to_h
62
63
  end
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/transport/data_type'
5
- require 'hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm'
4
+ require 'hrr_rb_ssh/logger'
5
+ require 'hrr_rb_ssh/data_type'
6
6
 
7
7
  module HrrRbSsh
8
8
  class Transport
@@ -10,6 +10,8 @@ module HrrRbSsh
10
10
  class SshRsa < ServerHostKeyAlgorithm
11
11
  NAME = 'ssh-rsa'
12
12
 
13
+ PREFERENCE = 20
14
+
13
15
  SECRET_KEY = <<-EOB
14
16
  -----BEGIN RSA PRIVATE KEY-----
15
17
  MIIEpAIBAAKCAQEA71zHt9RvbXmxuOCWPKR65iBHO+a8M7Mfo4vRCs/dorZN7XL1
@@ -41,26 +43,25 @@ vzTNM3SFzgt3bHkdEtDLc64aoBX+dHOot6u71XLZrshnHPtiZ0C/ZA==
41
43
  EOB
42
44
 
43
45
  KEY_FORMAT_DEFINITION = [
44
- ['string', 'ssh-rsa'],
45
- ['mpint', 'e'],
46
- ['mpint', 'n'],
46
+ [DataType::String, 'ssh-rsa'],
47
+ [DataType::Mpint, 'e'],
48
+ [DataType::Mpint, 'n'],
47
49
  ]
48
50
 
49
51
  SIGN_DEFINITION = [
50
- ['string', 'ssh-rsa'],
51
- ['string', 'rsa_signature_blob'],
52
+ [DataType::String, 'ssh-rsa'],
53
+ [DataType::String, 'rsa_signature_blob'],
52
54
  ]
53
55
 
54
56
  def initialize
55
- super
56
-
57
+ @logger = HrrRbSsh::Logger.new(self.class.name)
57
58
  @rsa = OpenSSL::PKey::RSA.new SECRET_KEY
58
59
  end
59
60
 
60
61
  def encode definition, payload
61
62
  definition.map{ |data_type, field_name|
62
63
  field_value = if payload[field_name].instance_of? ::Proc then payload[field_name].call else payload[field_name] end
63
- HrrRbSsh::Transport::DataType[data_type].encode( field_value )
64
+ data_type.encode( field_value )
64
65
  }.join
65
66
  end
66
67
 
@@ -69,7 +70,7 @@ vzTNM3SFzgt3bHkdEtDLc64aoBX+dHOot6u71XLZrshnHPtiZ0C/ZA==
69
70
  definition.map{ |data_type, field_name|
70
71
  [
71
72
  field_name,
72
- HrrRbSsh::Transport::DataType[data_type].decode( payload_io )
73
+ data_type.decode( payload_io )
73
74
  ]
74
75
  }.to_h
75
76
  end
@@ -1,19 +1,14 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
+ require 'hrr_rb_ssh/subclass_with_preference_listable'
5
+
4
6
  module HrrRbSsh
5
7
  class Transport
6
8
  class ServerHostKeyAlgorithm
7
- def self.list
8
- ServerHostKeyAlgorithm.list
9
- end
10
-
11
- def self.name_list
12
- ServerHostKeyAlgorithm.name_list
13
- end
14
-
15
- def self.[] key
16
- ServerHostKeyAlgorithm[key]
9
+ @subclass_list = Array.new
10
+ class << self
11
+ include SubclassWithPreferenceListable
17
12
  end
18
13
  end
19
14
  end
@@ -1,14 +1,15 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
+ require 'monitor'
4
5
  require 'hrr_rb_ssh/version'
5
6
  require 'hrr_rb_ssh/logger'
7
+ require 'hrr_rb_ssh/data_type'
6
8
  require 'hrr_rb_ssh/message'
7
9
  require 'hrr_rb_ssh/closed_transport_error'
8
10
  require 'hrr_rb_ssh/transport/constant'
9
11
  require 'hrr_rb_ssh/transport/mode'
10
12
  require 'hrr_rb_ssh/transport/direction'
11
- require 'hrr_rb_ssh/transport/data_type'
12
13
  require 'hrr_rb_ssh/transport/sequence_number'
13
14
  require 'hrr_rb_ssh/transport/sender'
14
15
  require 'hrr_rb_ssh/transport/receiver'
@@ -24,6 +25,16 @@ module HrrRbSsh
24
25
 
25
26
  attr_reader \
26
27
  :io,
28
+ :supported_encryption_algorithms,
29
+ :supported_server_host_key_algorithms,
30
+ :supported_kex_algorithms,
31
+ :supported_mac_algorithms,
32
+ :supported_compression_algorithms,
33
+ :preferred_encryption_algorithms,
34
+ :preferred_server_host_key_algorithms,
35
+ :preferred_kex_algorithms,
36
+ :preferred_mac_algorithms,
37
+ :preferred_compression_algorithms,
27
38
  :incoming_sequence_number,
28
39
  :outgoing_sequence_number,
29
40
  :server_host_key_algorithm,
@@ -39,7 +50,7 @@ module HrrRbSsh
39
50
  :i_s,
40
51
  :session_id
41
52
 
42
- def initialize io, mode
53
+ def initialize io, mode, options={}
43
54
  @io = io
44
55
  @mode = mode
45
56
 
@@ -48,14 +59,13 @@ module HrrRbSsh
48
59
  @closed = nil
49
60
  @disconnected = nil
50
61
 
62
+ @in_kex = false
63
+
51
64
  @sender = HrrRbSsh::Transport::Sender.new
52
65
  @receiver = HrrRbSsh::Transport::Receiver.new
53
66
 
54
- @send_queue = Queue.new
55
- @receive_queue = Queue.new
56
-
57
- @sender_thread = nil
58
- @receiver_thread = nil
67
+ @sender_monitor = Monitor.new
68
+ @receiver_monitor = Monitor.new
59
69
 
60
70
  @local_version = "SSH-2.0-HrrRbSsh-#{HrrRbSsh::VERSION}".force_encoding(Encoding::ASCII_8BIT)
61
71
  @remote_version = "".force_encoding(Encoding::ASCII_8BIT)
@@ -65,6 +75,8 @@ module HrrRbSsh
65
75
 
66
76
  @acceptable_services = Array.new
67
77
 
78
+ update_supported_algorithms
79
+ update_preferred_algorithms options
68
80
  initialize_local_algorithms
69
81
  initialize_algorithms
70
82
  end
@@ -74,19 +86,75 @@ module HrrRbSsh
74
86
  end
75
87
 
76
88
  def send payload
77
- begin
78
- @send_queue.enq payload
79
- rescue ClosedQueueError => e
80
- raise HrrRbSsh::ClosedTransportError
89
+ @sender_monitor.synchronize do
90
+ begin
91
+ @sender.send self, payload
92
+ rescue Errno::EPIPE => e
93
+ @logger.warn("IO is Broken PIPE")
94
+ close
95
+ raise HrrRbSsh::ClosedTransportError
96
+ rescue => e
97
+ @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
98
+ close
99
+ raise HrrRbSsh::ClosedTransportError
100
+ end
81
101
  end
82
102
  end
83
103
 
84
104
  def receive
85
- payload = @receive_queue.deq
86
- if @receive_queue.closed?
87
- raise HrrRbSsh::ClosedTransportError
105
+ raise ClosedTransportError if @closed
106
+ @receiver_monitor.synchronize do
107
+ begin
108
+ payload = @receiver.receive self
109
+ case payload[0,1].unpack("C")[0]
110
+ when HrrRbSsh::Message::SSH_MSG_DISCONNECT::VALUE
111
+ message = HrrRbSsh::Message::SSH_MSG_DISCONNECT.decode payload
112
+ @logger.debug("received disconnect message: #{message.inspect}")
113
+ @disconnected = true
114
+ close
115
+ raise ClosedTransportError
116
+ when HrrRbSsh::Message::SSH_MSG_IGNORE::VALUE
117
+ message = HrrRbSsh::Message::SSH_MSG_IGNORE.decode payload
118
+ @logger.debug("received ignore message: #{message.inspect}")
119
+ receive
120
+ when HrrRbSsh::Message::SSH_MSG_UNIMPLEMENTED::VALUE
121
+ message = HrrRbSsh::Message::SSH_MSG_UNIMPLEMENTED.decode payload
122
+ @logger.debug("received unimplemented message: #{message.inspect}")
123
+ receive
124
+ when HrrRbSsh::Message::SSH_MSG_DEBUG::VALUE
125
+ message = HrrRbSsh::Message::SSH_MSG_DEBUG.decode payload
126
+ @logger.debug("received debug message: #{message.inspect}")
127
+ receive
128
+ when HrrRbSsh::Message::SSH_MSG_KEXINIT::VALUE
129
+ @logger.debug("received kexinit message")
130
+ if @in_kex
131
+ payload
132
+ else
133
+ exchange_key payload
134
+ receive
135
+ end
136
+ else
137
+ payload
138
+ end
139
+ rescue ClosedTransportError
140
+ raise ClosedTransportError
141
+ rescue EOFError => e
142
+ close
143
+ raise ClosedTransportError
144
+ rescue IOError => e
145
+ @logger.warn("IO is closed")
146
+ close
147
+ raise ClosedTransportError
148
+ rescue Errno::ECONNRESET => e
149
+ @logger.warn("IO is RESET")
150
+ close
151
+ raise ClosedTransportError
152
+ rescue => e
153
+ @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
154
+ close
155
+ raise ClosedTransportError
156
+ end
88
157
  end
89
- payload
90
158
  end
91
159
 
92
160
  def start
@@ -108,9 +176,6 @@ module HrrRbSsh
108
176
  @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
109
177
  close
110
178
  else
111
- @sender_thread = sender_thread
112
- @receiver_thread = receiver_thread
113
-
114
179
  @logger.info("transport started")
115
180
  end
116
181
  end
@@ -119,8 +184,6 @@ module HrrRbSsh
119
184
  return if @closed
120
185
  @logger.info("close transport")
121
186
  @closed = true
122
- @send_queue.close
123
- @receive_queue.close
124
187
  disconnect
125
188
  @logger.info("transport closed")
126
189
  end
@@ -150,20 +213,29 @@ module HrrRbSsh
150
213
  update_version_strings
151
214
  end
152
215
 
153
- def exchange_key
154
- send_kexinit
155
- receive_kexinit
156
-
157
- update_kex_and_server_host_key_algorithms
216
+ def exchange_key payload=nil
217
+ @in_kex = true
218
+ @sender_monitor.synchronize do
219
+ @receiver_monitor.synchronize do
220
+ send_kexinit
221
+ if payload
222
+ receive_kexinit payload
223
+ else
224
+ receive_kexinit receive
225
+ end
226
+ update_kex_and_server_host_key_algorithms
158
227
 
159
- case @mode
160
- when HrrRbSsh::Transport::Mode::SERVER
161
- receive_kexdh_init
162
- send_kexdh_reply
228
+ case @mode
229
+ when HrrRbSsh::Transport::Mode::SERVER
230
+ receive_kexdh_init receive
231
+ send_kexdh_reply
163
232
 
164
- send_newkeys
165
- receive_newkeys
233
+ send_newkeys
234
+ receive_newkeys receive
235
+ end
236
+ end
166
237
  end
238
+ @in_kex = false
167
239
  end
168
240
 
169
241
  def verify_service_request
@@ -176,74 +248,49 @@ module HrrRbSsh
176
248
  end
177
249
  end
178
250
 
179
- def sender_thread
180
- Thread.start {
181
- @logger.info("start sender thread")
182
- loop do
183
- begin
184
- payload = @send_queue.deq
185
- if @send_queue.closed?
186
- @logger.info("closing sender thread")
187
- break
188
- end
189
- @sender.send self, payload
190
- rescue => e
191
- @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
192
- close
193
- end
194
- end
195
- @logger.info("sender thread closed")
196
- }
251
+ def update_supported_algorithms
252
+ @supported_kex_algorithms = HrrRbSsh::Transport::KexAlgorithm.list_supported
253
+ @supported_server_host_key_algorithms = HrrRbSsh::Transport::ServerHostKeyAlgorithm.list_supported
254
+ @supported_encryption_algorithms = HrrRbSsh::Transport::EncryptionAlgorithm.list_supported
255
+ @supported_mac_algorithms = HrrRbSsh::Transport::MacAlgorithm.list_supported
256
+ @supported_compression_algorithms = HrrRbSsh::Transport::CompressionAlgorithm.list_supported
197
257
  end
198
258
 
199
- def receiver_thread
200
- Thread.start {
201
- @logger.info("start receiver thread")
202
- loop do
203
- if @receive_queue.closed?
204
- @logger.info("closing receiver thread")
205
- break
206
- end
207
- begin
208
- payload = @receiver.receive self
209
- case payload[0,1].unpack("C")[0]
210
- when HrrRbSsh::Message::SSH_MSG_DISCONNECT::VALUE
211
- message = HrrRbSsh::Message::SSH_MSG_DISCONNECT.decode payload
212
- @logger.debug("received disconnect message: #{message.inspect}")
213
- @disconnected = true
214
- close
215
- when HrrRbSsh::Message::SSH_MSG_IGNORE::VALUE
216
- message = HrrRbSsh::Message::SSH_MSG_IGNORE.decode payload
217
- @logger.debug("received ignore message: #{message.inspect}")
218
- when HrrRbSsh::Message::SSH_MSG_UNIMPLEMENTED::VALUE
219
- message = HrrRbSsh::Message::SSH_MSG_UNIMPLEMENTED.decode payload
220
- @logger.debug("received unimplemented message: #{message.inspect}")
221
- when HrrRbSsh::Message::SSH_MSG_DEBUG::VALUE
222
- message = HrrRbSsh::Message::SSH_MSG_DEBUG.decode payload
223
- @logger.debug("received debug message: #{message.inspect}")
224
- else
225
- @receive_queue.enq payload
226
- end
227
- rescue EOFError => e
228
- close
229
- rescue => e
230
- @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
231
- close
259
+ def update_preferred_algorithms options
260
+ @preferred_kex_algorithms = options['transport_preferred_kex_algorithms'] || HrrRbSsh::Transport::KexAlgorithm.list_preferred
261
+ @preferred_server_host_key_algorithms = options['transport_preferred_server_host_key_algorithms'] || HrrRbSsh::Transport::ServerHostKeyAlgorithm.list_preferred
262
+ @preferred_encryption_algorithms = options['transport_preferred_encryption_algorithms'] || HrrRbSsh::Transport::EncryptionAlgorithm.list_preferred
263
+ @preferred_mac_algorithms = options['transport_preferred_mac_algorithms'] || HrrRbSsh::Transport::MacAlgorithm.list_preferred
264
+ @preferred_compression_algorithms = options['transport_preferred_compression_algorithms'] || HrrRbSsh::Transport::CompressionAlgorithm.list_preferred
265
+
266
+ check_if_preferred_algorithms_are_supported
267
+ end
268
+
269
+ def check_if_preferred_algorithms_are_supported
270
+ [
271
+ ['kex', @preferred_kex_algorithms, @supported_kex_algorithms ],
272
+ ['server host key', @preferred_server_host_key_algorithms, @supported_server_host_key_algorithms],
273
+ ['encryption', @preferred_encryption_algorithms, @supported_encryption_algorithms ],
274
+ ['mac', @preferred_mac_algorithms, @supported_mac_algorithms ],
275
+ ['compression', @preferred_compression_algorithms, @supported_compression_algorithms ],
276
+ ].each{ |algorithm_name, list_preferred, list_supported|
277
+ list_preferred.each{ |a|
278
+ unless list_supported.include? a
279
+ raise ArgumentError, "#{algorithm_name} algorithm #{a} is not supported"
232
280
  end
233
- end
234
- @logger.info("receiver thread closed")
281
+ }
235
282
  }
236
283
  end
237
284
 
238
285
  def initialize_local_algorithms
239
- @local_kex_algorithms = HrrRbSsh::Transport::KexAlgorithm.name_list
240
- @local_server_host_key_algorithms = HrrRbSsh::Transport::ServerHostKeyAlgorithm.name_list
241
- @local_encryption_algorithms_client_to_server = HrrRbSsh::Transport::EncryptionAlgorithm.name_list
242
- @local_encryption_algorithms_server_to_client = HrrRbSsh::Transport::EncryptionAlgorithm.name_list
243
- @local_mac_algorithms_client_to_server = HrrRbSsh::Transport::MacAlgorithm.name_list
244
- @local_mac_algorithms_server_to_client = HrrRbSsh::Transport::MacAlgorithm.name_list
245
- @local_compression_algorithms_client_to_server = HrrRbSsh::Transport::CompressionAlgorithm.name_list
246
- @local_compression_algorithms_server_to_client = HrrRbSsh::Transport::CompressionAlgorithm.name_list
286
+ @local_kex_algorithms = @preferred_kex_algorithms
287
+ @local_server_host_key_algorithms = @preferred_server_host_key_algorithms
288
+ @local_encryption_algorithms_client_to_server = @preferred_encryption_algorithms
289
+ @local_encryption_algorithms_server_to_client = @preferred_encryption_algorithms
290
+ @local_mac_algorithms_client_to_server = @preferred_mac_algorithms
291
+ @local_mac_algorithms_server_to_client = @preferred_mac_algorithms
292
+ @local_compression_algorithms_client_to_server = @preferred_compression_algorithms
293
+ @local_compression_algorithms_server_to_client = @preferred_compression_algorithms
247
294
  end
248
295
 
249
296
  def initialize_algorithms
@@ -294,7 +341,7 @@ module HrrRbSsh
294
341
  "language tag" => ""
295
342
  }
296
343
  payload = HrrRbSsh::Message::SSH_MSG_DISCONNECT.encode message
297
- @sender.send self, payload
344
+ send payload
298
345
  end
299
346
 
300
347
  def send_kexinit
@@ -315,7 +362,7 @@ module HrrRbSsh
315
362
  '0 (reserved for future extension)' => 0,
316
363
  }
317
364
  payload = HrrRbSsh::Message::SSH_MSG_KEXINIT.encode message
318
- @sender.send self, payload
365
+ send payload
319
366
 
320
367
  case @mode
321
368
  when HrrRbSsh::Transport::Mode::SERVER
@@ -325,27 +372,20 @@ module HrrRbSsh
325
372
  end
326
373
  end
327
374
 
328
- def receive_kexinit
329
- payload = @receiver.receive self
330
-
375
+ def receive_kexinit payload
331
376
  case @mode
332
377
  when HrrRbSsh::Transport::Mode::SERVER
333
378
  @i_c = payload
334
379
  when HrrRbSsh::Transport::Mode::CLIENT
335
380
  @i_s = payload
336
381
  end
337
-
338
382
  message = HrrRbSsh::Message::SSH_MSG_KEXINIT.decode payload
339
-
340
383
  update_remote_algorithms message
341
384
  end
342
385
 
343
- def receive_kexdh_init
344
- payload = @receiver.receive self
386
+ def receive_kexdh_init payload
345
387
  message = HrrRbSsh::Message::SSH_MSG_KEXDH_INIT.decode payload
346
-
347
388
  @kex_algorithm.set_e message['e']
348
-
349
389
  @session_id ||= @kex_algorithm.hash self
350
390
  end
351
391
 
@@ -357,7 +397,7 @@ module HrrRbSsh
357
397
  'signature of H' => @kex_algorithm.sign(self),
358
398
  }
359
399
  payload = HrrRbSsh::Message::SSH_MSG_KEXDH_REPLY.encode message
360
- @sender.send self, payload
400
+ send payload
361
401
  end
362
402
 
363
403
  def send_newkeys
@@ -365,11 +405,10 @@ module HrrRbSsh
365
405
  'message number' => HrrRbSsh::Message::SSH_MSG_NEWKEYS::VALUE,
366
406
  }
367
407
  payload = HrrRbSsh::Message::SSH_MSG_NEWKEYS.encode message
368
- @sender.send self, payload
408
+ send payload
369
409
  end
370
410
 
371
- def receive_newkeys
372
- payload = @receiver.receive self
411
+ def receive_newkeys payload
373
412
  message = HrrRbSsh::Message::SSH_MSG_NEWKEYS.decode payload
374
413
 
375
414
  update_encryption_mac_compression_algorithms
@@ -388,7 +427,7 @@ module HrrRbSsh
388
427
  'service name' => service_name,
389
428
  }
390
429
  payload = HrrRbSsh::Message::SSH_MSG_SERVICE_ACCEPT.encode message
391
- @sender.send self, payload
430
+ send payload
392
431
  end
393
432
 
394
433
  def update_remote_algorithms message
@@ -2,5 +2,5 @@
2
2
  # vim: et ts=2 sw=2
3
3
 
4
4
  module HrrRbSsh
5
- VERSION = "0.1.2"
5
+ VERSION = "0.1.3"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hrr_rb_ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - hirura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-07 00:00:00.000000000 Z
11
+ date: 2018-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -88,14 +88,12 @@ files:
88
88
  - lib/hrr_rb_ssh/authentication.rb
89
89
  - lib/hrr_rb_ssh/authentication/authenticator.rb
90
90
  - lib/hrr_rb_ssh/authentication/method.rb
91
- - lib/hrr_rb_ssh/authentication/method/method.rb
92
91
  - lib/hrr_rb_ssh/authentication/method/none.rb
93
92
  - lib/hrr_rb_ssh/authentication/method/none/context.rb
94
93
  - lib/hrr_rb_ssh/authentication/method/password.rb
95
94
  - lib/hrr_rb_ssh/authentication/method/password/context.rb
96
95
  - lib/hrr_rb_ssh/authentication/method/publickey.rb
97
96
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm.rb
98
- - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/algorithm.rb
99
97
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/codable.rb
100
98
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb
101
99
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb
@@ -107,7 +105,6 @@ files:
107
105
  - lib/hrr_rb_ssh/connection.rb
108
106
  - lib/hrr_rb_ssh/connection/channel.rb
109
107
  - lib/hrr_rb_ssh/connection/channel/channel_type.rb
110
- - lib/hrr_rb_ssh/connection/channel/channel_type/channel_type.rb
111
108
  - lib/hrr_rb_ssh/connection/channel/channel_type/session.rb
112
109
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type.rb
113
110
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env.rb
@@ -116,7 +113,6 @@ files:
116
113
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb
117
114
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req.rb
118
115
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb
119
- - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/request_type.rb
120
116
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell.rb
121
117
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb
122
118
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb
@@ -124,6 +120,7 @@ files:
124
120
  - lib/hrr_rb_ssh/connection/channel/proc_chain.rb
125
121
  - lib/hrr_rb_ssh/connection/channel/proc_chain/chain_context.rb
126
122
  - lib/hrr_rb_ssh/connection/request_handler.rb
123
+ - lib/hrr_rb_ssh/data_type.rb
127
124
  - lib/hrr_rb_ssh/logger.rb
128
125
  - lib/hrr_rb_ssh/message.rb
129
126
  - lib/hrr_rb_ssh/message/001_ssh_msg_disconnect.rb
@@ -155,15 +152,14 @@ files:
155
152
  - lib/hrr_rb_ssh/message/099_ssh_msg_channel_success.rb
156
153
  - lib/hrr_rb_ssh/message/100_ssh_msg_channel_failure.rb
157
154
  - lib/hrr_rb_ssh/message/codable.rb
155
+ - lib/hrr_rb_ssh/subclass_with_preference_listable.rb
158
156
  - lib/hrr_rb_ssh/transport.rb
159
157
  - lib/hrr_rb_ssh/transport/compression_algorithm.rb
160
- - lib/hrr_rb_ssh/transport/compression_algorithm/compression_algorithm.rb
161
158
  - lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb
162
159
  - lib/hrr_rb_ssh/transport/compression_algorithm/none.rb
163
160
  - lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb
164
161
  - lib/hrr_rb_ssh/transport/compression_algorithm/zlib.rb
165
162
  - lib/hrr_rb_ssh/transport/constant.rb
166
- - lib/hrr_rb_ssh/transport/data_type.rb
167
163
  - lib/hrr_rb_ssh/transport/direction.rb
168
164
  - lib/hrr_rb_ssh/transport/encryption_algorithm.rb
169
165
  - lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_cbc.rb
@@ -175,7 +171,6 @@ files:
175
171
  - lib/hrr_rb_ssh/transport/encryption_algorithm/arcfour.rb
176
172
  - lib/hrr_rb_ssh/transport/encryption_algorithm/blowfish_cbc.rb
177
173
  - lib/hrr_rb_ssh/transport/encryption_algorithm/cast128_cbc.rb
178
- - lib/hrr_rb_ssh/transport/encryption_algorithm/encryption_algorithm.rb
179
174
  - lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb
180
175
  - lib/hrr_rb_ssh/transport/encryption_algorithm/none.rb
181
176
  - lib/hrr_rb_ssh/transport/encryption_algorithm/three_des_cbc.rb
@@ -184,14 +179,12 @@ files:
184
179
  - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb
185
180
  - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1.rb
186
181
  - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1.rb
187
- - lib/hrr_rb_ssh/transport/kex_algorithm/kex_algorithm.rb
188
182
  - lib/hrr_rb_ssh/transport/mac_algorithm.rb
189
183
  - lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb
190
184
  - lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5.rb
191
185
  - lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5_96.rb
192
186
  - lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1.rb
193
187
  - lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1_96.rb
194
- - lib/hrr_rb_ssh/transport/mac_algorithm/mac_algorithm.rb
195
188
  - lib/hrr_rb_ssh/transport/mac_algorithm/none.rb
196
189
  - lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb
197
190
  - lib/hrr_rb_ssh/transport/mode.rb
@@ -199,7 +192,6 @@ files:
199
192
  - lib/hrr_rb_ssh/transport/sender.rb
200
193
  - lib/hrr_rb_ssh/transport/sequence_number.rb
201
194
  - lib/hrr_rb_ssh/transport/server_host_key_algorithm.rb
202
- - lib/hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm.rb
203
195
  - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb
204
196
  - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb
205
197
  - lib/hrr_rb_ssh/version.rb