hrr_rb_ssh 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/demo/server.rb +5 -97
  3. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/public_key_blob.rb +30 -0
  4. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature.rb +27 -0
  5. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature_blob.rb +33 -0
  6. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb +8 -31
  7. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/public_key_blob.rb +28 -0
  8. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature.rb +27 -0
  9. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature_blob.rb +33 -0
  10. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb +8 -29
  11. data/lib/hrr_rb_ssh/codable.rb +64 -0
  12. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb +50 -0
  13. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change.rb +33 -0
  14. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type.rb +1 -0
  15. data/lib/hrr_rb_ssh/connection/request_handler/reference_env_request_handler.rb +21 -0
  16. data/lib/hrr_rb_ssh/connection/request_handler/reference_exec_request_handler.rb +28 -0
  17. data/lib/hrr_rb_ssh/connection/request_handler/reference_pty_req_request_handler.rb +32 -0
  18. data/lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb +81 -0
  19. data/lib/hrr_rb_ssh/connection/request_handler/reference_window_change_request_handler.rb +21 -0
  20. data/lib/hrr_rb_ssh/connection/request_handler.rb +6 -0
  21. data/lib/hrr_rb_ssh/message/001_ssh_msg_disconnect.rb +1 -1
  22. data/lib/hrr_rb_ssh/message/002_ssh_msg_ignore.rb +1 -1
  23. data/lib/hrr_rb_ssh/message/003_ssh_msg_unimplemented.rb +1 -1
  24. data/lib/hrr_rb_ssh/message/004_ssh_msg_debug.rb +1 -1
  25. data/lib/hrr_rb_ssh/message/005_ssh_msg_service_request.rb +1 -1
  26. data/lib/hrr_rb_ssh/message/006_ssh_msg_service_accept.rb +1 -1
  27. data/lib/hrr_rb_ssh/message/020_ssh_msg_kexinit.rb +1 -1
  28. data/lib/hrr_rb_ssh/message/021_ssh_msg_newkeys.rb +1 -1
  29. data/lib/hrr_rb_ssh/message/030_ssh_msg_kex_dh_gex_request_old.rb +24 -0
  30. data/lib/hrr_rb_ssh/message/030_ssh_msg_kexdh_init.rb +1 -1
  31. data/lib/hrr_rb_ssh/message/031_ssh_msg_kex_dh_gex_group.rb +25 -0
  32. data/lib/hrr_rb_ssh/message/031_ssh_msg_kexdh_reply.rb +1 -1
  33. data/lib/hrr_rb_ssh/message/032_ssh_msg_kex_dh_gex_init.rb +24 -0
  34. data/lib/hrr_rb_ssh/message/033_ssh_msg_kex_dh_gex_reply.rb +26 -0
  35. data/lib/hrr_rb_ssh/message/034_ssh_msg_kex_dh_gex_request.rb +26 -0
  36. data/lib/hrr_rb_ssh/message/050_ssh_msg_userauth_request.rb +1 -1
  37. data/lib/hrr_rb_ssh/message/051_ssh_msg_userauth_failure.rb +1 -1
  38. data/lib/hrr_rb_ssh/message/052_ssh_msg_userauth_success.rb +1 -1
  39. data/lib/hrr_rb_ssh/message/060_ssh_msg_userauth_pk_ok.rb +1 -1
  40. data/lib/hrr_rb_ssh/message/080_ssh_msg_global_request.rb +1 -1
  41. data/lib/hrr_rb_ssh/message/081_ssh_msg_request_success.rb +1 -1
  42. data/lib/hrr_rb_ssh/message/082_ssh_msg_request_failure.rb +1 -1
  43. data/lib/hrr_rb_ssh/message/090_ssh_msg_channel_open.rb +1 -1
  44. data/lib/hrr_rb_ssh/message/091_ssh_msg_channel_open_confirmation.rb +1 -1
  45. data/lib/hrr_rb_ssh/message/092_ssh_msg_channel_open_failure.rb +1 -1
  46. data/lib/hrr_rb_ssh/message/093_ssh_msg_channel_window_adjust.rb +1 -1
  47. data/lib/hrr_rb_ssh/message/094_ssh_msg_channel_data.rb +1 -1
  48. data/lib/hrr_rb_ssh/message/095_ssh_msg_channel_extended_data.rb +1 -1
  49. data/lib/hrr_rb_ssh/message/096_ssh_msg_channel_eof.rb +1 -1
  50. data/lib/hrr_rb_ssh/message/097_ssh_msg_channel_close.rb +1 -1
  51. data/lib/hrr_rb_ssh/message/098_ssh_msg_channel_request.rb +1 -1
  52. data/lib/hrr_rb_ssh/message/099_ssh_msg_channel_success.rb +1 -1
  53. data/lib/hrr_rb_ssh/message/100_ssh_msg_channel_failure.rb +1 -1
  54. data/lib/hrr_rb_ssh/message.rb +5 -0
  55. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman/h0.rb +29 -0
  56. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +28 -18
  57. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha256.rb +35 -0
  58. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group15_sha512.rb +35 -0
  59. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group16_sha512.rb +41 -0
  60. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group17_sha512.rb +47 -0
  61. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group18_sha512.rb +62 -0
  62. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange/h0.rb +34 -0
  63. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb +170 -0
  64. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha1.rb +17 -0
  65. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha256.rb +17 -0
  66. data/lib/hrr_rb_ssh/transport/kex_algorithm.rb +7 -0
  67. data/lib/hrr_rb_ssh/transport/receiver.rb +16 -14
  68. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/public_key_blob.rb +26 -0
  69. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/signature.rb +23 -0
  70. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb +11 -39
  71. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/public_key_blob.rb +25 -0
  72. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/signature.rb +23 -0
  73. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb +11 -38
  74. data/lib/hrr_rb_ssh/transport.rb +9 -29
  75. data/lib/hrr_rb_ssh/version.rb +1 -1
  76. metadata +35 -4
  77. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/codable.rb +0 -33
  78. data/lib/hrr_rb_ssh/message/codable.rb +0 -66
@@ -9,9 +9,8 @@ module HrrRbSsh
9
9
  class ServerHostKeyAlgorithm
10
10
  class SshDss < ServerHostKeyAlgorithm
11
11
  NAME = 'ssh-dss'
12
-
13
12
  PREFERENCE = 10
14
-
13
+ DIGEST = 'sha1'
15
14
  SECRET_KEY = <<-EOB
16
15
  -----BEGIN DSA PRIVATE KEY-----
17
16
  MIIBuwIBAAKBgQD3fQ6cwTtOJpVI0iASOQZxkhwPRNy7UwovQkEK6bXW33HaCebO
@@ -27,41 +26,11 @@ MRl/p42OrQzL/chRPvRf
27
26
  -----END DSA PRIVATE KEY-----
28
27
  EOB
29
28
 
30
- KEY_FORMAT_DEFINITION = [
31
- [DataType::String, 'ssh-dss'],
32
- [DataType::Mpint, 'p'],
33
- [DataType::Mpint, 'q'],
34
- [DataType::Mpint, 'g'],
35
- [DataType::Mpint, 'y'],
36
- ]
37
-
38
- SIGN_DEFINITION = [
39
- [DataType::String, 'ssh-dss'],
40
- [DataType::String, 'dss_signature_blob'],
41
- ]
42
-
43
29
  def initialize
44
30
  @logger = HrrRbSsh::Logger.new(self.class.name)
45
31
  @dss = OpenSSL::PKey::DSA.new SECRET_KEY
46
32
  end
47
33
 
48
- def encode definition, payload
49
- definition.map{ |data_type, field_name|
50
- field_value = if payload[field_name].instance_of? ::Proc then payload[field_name].call else payload[field_name] end
51
- data_type.encode( field_value )
52
- }.join
53
- end
54
-
55
- def decode definition, payload
56
- payload_io = StringIO.new payload, 'r'
57
- definition.map{ |data_type, field_name|
58
- [
59
- field_name,
60
- data_type.decode( payload_io )
61
- ]
62
- }.to_h
63
- end
64
-
65
34
  def server_public_host_key
66
35
  payload = {
67
36
  'ssh-dss' => 'ssh-dss',
@@ -70,11 +39,11 @@ MRl/p42OrQzL/chRPvRf
70
39
  'g' => @dss.g.to_i,
71
40
  'y' => @dss.pub_key.to_i,
72
41
  }
73
- encode KEY_FORMAT_DEFINITION, payload
42
+ PublicKeyBlob.encode payload
74
43
  end
75
44
 
76
- def sign digest, data
77
- hash = OpenSSL::Digest.digest(digest, data)
45
+ def sign data
46
+ hash = OpenSSL::Digest.digest(self.class::DIGEST, data)
78
47
  sign_der = @dss.syssign(hash)
79
48
  sign_asn1 = OpenSSL::ASN1.decode(sign_der)
80
49
  sign_r = sign_asn1.value[0].value.to_s(2).rjust(20, ["00"].pack("H"))
@@ -83,11 +52,11 @@ MRl/p42OrQzL/chRPvRf
83
52
  'ssh-dss' => 'ssh-dss',
84
53
  'dss_signature_blob' => (sign_r + sign_s),
85
54
  }
86
- encode SIGN_DEFINITION, payload
55
+ Signature.encode payload
87
56
  end
88
57
 
89
- def verify digest, sign, data
90
- payload = decode SIGN_DEFINITION, sign
58
+ def verify sign, data
59
+ payload = Signature.decode sign
91
60
  dss_signature_blob = payload['dss_signature_blob']
92
61
  sign_r = dss_signature_blob[ 0, 20]
93
62
  sign_s = dss_signature_blob[20, 20]
@@ -98,10 +67,13 @@ MRl/p42OrQzL/chRPvRf
98
67
  ]
99
68
  )
100
69
  sign_der = sign_asn1.to_der
101
- hash = OpenSSL::Digest.digest(digest, data)
70
+ hash = OpenSSL::Digest.digest(self.class::DIGEST, data)
102
71
  payload['ssh-dss'] == 'ssh-dss' && @dss.sysverify(hash, sign_der)
103
72
  end
104
73
  end
105
74
  end
106
75
  end
107
76
  end
77
+
78
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/public_key_blob'
79
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/signature'
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/data_type'
5
+ require 'hrr_rb_ssh/codable'
6
+
7
+ module HrrRbSsh
8
+ class Transport
9
+ class ServerHostKeyAlgorithm
10
+ class SshRsa
11
+ module PublicKeyBlob
12
+ class << self
13
+ include Codable
14
+ end
15
+ DEFINITION = [
16
+ [DataType::String, 'ssh-rsa'],
17
+ [DataType::Mpint, 'e'],
18
+ [DataType::Mpint, 'n'],
19
+ ]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/data_type'
5
+ require 'hrr_rb_ssh/codable'
6
+
7
+ module HrrRbSsh
8
+ class Transport
9
+ class ServerHostKeyAlgorithm
10
+ class SshRsa
11
+ module Signature
12
+ class << self
13
+ include Codable
14
+ end
15
+ DEFINITION = [
16
+ [DataType::String, 'ssh-rsa'],
17
+ [DataType::String, 'rsa_signature_blob'],
18
+ ]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,16 +2,14 @@
2
2
  # vim: et ts=2 sw=2
3
3
 
4
4
  require 'hrr_rb_ssh/logger'
5
- require 'hrr_rb_ssh/data_type'
6
5
 
7
6
  module HrrRbSsh
8
7
  class Transport
9
8
  class ServerHostKeyAlgorithm
10
9
  class SshRsa < ServerHostKeyAlgorithm
11
10
  NAME = 'ssh-rsa'
12
-
13
11
  PREFERENCE = 20
14
-
12
+ DIGEST = 'sha1'
15
13
  SECRET_KEY = <<-EOB
16
14
  -----BEGIN RSA PRIVATE KEY-----
17
15
  MIIEpAIBAAKCAQEA71zHt9RvbXmxuOCWPKR65iBHO+a8M7Mfo4vRCs/dorZN7XL1
@@ -42,61 +40,36 @@ vzTNM3SFzgt3bHkdEtDLc64aoBX+dHOot6u71XLZrshnHPtiZ0C/ZA==
42
40
  -----END RSA PRIVATE KEY-----
43
41
  EOB
44
42
 
45
- KEY_FORMAT_DEFINITION = [
46
- [DataType::String, 'ssh-rsa'],
47
- [DataType::Mpint, 'e'],
48
- [DataType::Mpint, 'n'],
49
- ]
50
-
51
- SIGN_DEFINITION = [
52
- [DataType::String, 'ssh-rsa'],
53
- [DataType::String, 'rsa_signature_blob'],
54
- ]
55
-
56
43
  def initialize
57
44
  @logger = HrrRbSsh::Logger.new(self.class.name)
58
45
  @rsa = OpenSSL::PKey::RSA.new SECRET_KEY
59
46
  end
60
47
 
61
- def encode definition, payload
62
- definition.map{ |data_type, field_name|
63
- field_value = if payload[field_name].instance_of? ::Proc then payload[field_name].call else payload[field_name] end
64
- data_type.encode( field_value )
65
- }.join
66
- end
67
-
68
- def decode definition, payload
69
- payload_io = StringIO.new payload, 'r'
70
- definition.map{ |data_type, field_name|
71
- [
72
- field_name,
73
- data_type.decode( payload_io )
74
- ]
75
- }.to_h
76
- end
77
-
78
48
  def server_public_host_key
79
49
  payload = {
80
50
  'ssh-rsa' => 'ssh-rsa',
81
51
  'e' => @rsa.e.to_i,
82
52
  'n' => @rsa.n.to_i,
83
53
  }
84
- encode KEY_FORMAT_DEFINITION, payload
54
+ PublicKeyBlob.encode payload
85
55
  end
86
56
 
87
- def sign digest, data
57
+ def sign data
88
58
  payload = {
89
59
  'ssh-rsa' => 'ssh-rsa',
90
- 'rsa_signature_blob' => @rsa.sign(digest, data),
60
+ 'rsa_signature_blob' => @rsa.sign(self.class::DIGEST, data),
91
61
  }
92
- encode SIGN_DEFINITION, payload
62
+ Signature.encode payload
93
63
  end
94
64
 
95
- def verify digest, sign, data
96
- payload = decode SIGN_DEFINITION, sign
97
- payload['ssh-rsa'] == 'ssh-rsa' && @rsa.verify(digest, payload['rsa_signature_blob'], data)
65
+ def verify sign, data
66
+ payload = Signature.decode sign
67
+ payload['ssh-rsa'] == 'ssh-rsa' && @rsa.verify(self.class::DIGEST, payload['rsa_signature_blob'], data)
98
68
  end
99
69
  end
100
70
  end
101
71
  end
102
72
  end
73
+
74
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/public_key_blob'
75
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/signature'
@@ -209,7 +209,6 @@ module HrrRbSsh
209
209
  def exchange_version
210
210
  send_version
211
211
  receive_version
212
-
213
212
  update_version_strings
214
213
  end
215
214
 
@@ -224,20 +223,19 @@ module HrrRbSsh
224
223
  receive_kexinit receive
225
224
  end
226
225
  update_kex_and_server_host_key_algorithms
227
-
228
- case @mode
229
- when HrrRbSsh::Transport::Mode::SERVER
230
- receive_kexdh_init receive
231
- send_kexdh_reply
232
-
233
- send_newkeys
234
- receive_newkeys receive
235
- end
226
+ start_kex_algorithm
227
+ send_newkeys
228
+ receive_newkeys receive
229
+ update_encryption_mac_compression_algorithms
236
230
  end
237
231
  end
238
232
  @in_kex = false
239
233
  end
240
234
 
235
+ def start_kex_algorithm
236
+ @kex_algorithm.start self, @mode
237
+ end
238
+
241
239
  def verify_service_request
242
240
  service_request_message = receive_service_request
243
241
  service_name = service_request_message['service name']
@@ -383,23 +381,6 @@ module HrrRbSsh
383
381
  update_remote_algorithms message
384
382
  end
385
383
 
386
- def receive_kexdh_init payload
387
- message = HrrRbSsh::Message::SSH_MSG_KEXDH_INIT.decode payload
388
- @kex_algorithm.set_e message['e']
389
- @session_id ||= @kex_algorithm.hash self
390
- end
391
-
392
- def send_kexdh_reply
393
- message = {
394
- 'message number' => HrrRbSsh::Message::SSH_MSG_KEXDH_REPLY::VALUE,
395
- 'server public host key and certificates (K_S)' => @server_host_key_algorithm.server_public_host_key,
396
- 'f' => @kex_algorithm.pub_key,
397
- 'signature of H' => @kex_algorithm.sign(self),
398
- }
399
- payload = HrrRbSsh::Message::SSH_MSG_KEXDH_REPLY.encode message
400
- send payload
401
- end
402
-
403
384
  def send_newkeys
404
385
  message = {
405
386
  'message number' => HrrRbSsh::Message::SSH_MSG_NEWKEYS::VALUE,
@@ -410,8 +391,6 @@ module HrrRbSsh
410
391
 
411
392
  def receive_newkeys payload
412
393
  message = HrrRbSsh::Message::SSH_MSG_NEWKEYS.decode payload
413
-
414
- update_encryption_mac_compression_algorithms
415
394
  end
416
395
 
417
396
  def receive_service_request
@@ -456,6 +435,7 @@ module HrrRbSsh
456
435
  end
457
436
 
458
437
  def update_encryption_mac_compression_algorithms
438
+ @session_id ||= @kex_algorithm.hash(self)
459
439
  update_encryption_algorithm
460
440
  update_mac_algorithm
461
441
  update_compression_algorithm
@@ -2,5 +2,5 @@
2
2
  # vim: et ts=2 sw=2
3
3
 
4
4
  module HrrRbSsh
5
- VERSION = "0.1.3"
5
+ VERSION = "0.1.4"
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.3
4
+ version: 0.1.4
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-15 00:00:00.000000000 Z
11
+ date: 2018-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,13 +94,19 @@ files:
94
94
  - lib/hrr_rb_ssh/authentication/method/password/context.rb
95
95
  - lib/hrr_rb_ssh/authentication/method/publickey.rb
96
96
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm.rb
97
- - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/codable.rb
98
97
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb
98
+ - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/public_key_blob.rb
99
+ - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature.rb
100
+ - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature_blob.rb
99
101
  - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb
102
+ - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/public_key_blob.rb
103
+ - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature.rb
104
+ - lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature_blob.rb
100
105
  - lib/hrr_rb_ssh/authentication/method/publickey/context.rb
101
106
  - lib/hrr_rb_ssh/closed_authentication_error.rb
102
107
  - lib/hrr_rb_ssh/closed_connection_error.rb
103
108
  - lib/hrr_rb_ssh/closed_transport_error.rb
109
+ - lib/hrr_rb_ssh/codable.rb
104
110
  - lib/hrr_rb_ssh/compat.rb
105
111
  - lib/hrr_rb_ssh/connection.rb
106
112
  - lib/hrr_rb_ssh/connection/channel.rb
@@ -117,9 +123,16 @@ files:
117
123
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb
118
124
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb
119
125
  - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb
126
+ - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change.rb
127
+ - lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb
120
128
  - lib/hrr_rb_ssh/connection/channel/proc_chain.rb
121
129
  - lib/hrr_rb_ssh/connection/channel/proc_chain/chain_context.rb
122
130
  - lib/hrr_rb_ssh/connection/request_handler.rb
131
+ - lib/hrr_rb_ssh/connection/request_handler/reference_env_request_handler.rb
132
+ - lib/hrr_rb_ssh/connection/request_handler/reference_exec_request_handler.rb
133
+ - lib/hrr_rb_ssh/connection/request_handler/reference_pty_req_request_handler.rb
134
+ - lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb
135
+ - lib/hrr_rb_ssh/connection/request_handler/reference_window_change_request_handler.rb
123
136
  - lib/hrr_rb_ssh/data_type.rb
124
137
  - lib/hrr_rb_ssh/logger.rb
125
138
  - lib/hrr_rb_ssh/message.rb
@@ -131,8 +144,13 @@ files:
131
144
  - lib/hrr_rb_ssh/message/006_ssh_msg_service_accept.rb
132
145
  - lib/hrr_rb_ssh/message/020_ssh_msg_kexinit.rb
133
146
  - lib/hrr_rb_ssh/message/021_ssh_msg_newkeys.rb
147
+ - lib/hrr_rb_ssh/message/030_ssh_msg_kex_dh_gex_request_old.rb
134
148
  - lib/hrr_rb_ssh/message/030_ssh_msg_kexdh_init.rb
149
+ - lib/hrr_rb_ssh/message/031_ssh_msg_kex_dh_gex_group.rb
135
150
  - lib/hrr_rb_ssh/message/031_ssh_msg_kexdh_reply.rb
151
+ - lib/hrr_rb_ssh/message/032_ssh_msg_kex_dh_gex_init.rb
152
+ - lib/hrr_rb_ssh/message/033_ssh_msg_kex_dh_gex_reply.rb
153
+ - lib/hrr_rb_ssh/message/034_ssh_msg_kex_dh_gex_request.rb
136
154
  - lib/hrr_rb_ssh/message/050_ssh_msg_userauth_request.rb
137
155
  - lib/hrr_rb_ssh/message/051_ssh_msg_userauth_failure.rb
138
156
  - lib/hrr_rb_ssh/message/052_ssh_msg_userauth_success.rb
@@ -151,7 +169,6 @@ files:
151
169
  - lib/hrr_rb_ssh/message/098_ssh_msg_channel_request.rb
152
170
  - lib/hrr_rb_ssh/message/099_ssh_msg_channel_success.rb
153
171
  - lib/hrr_rb_ssh/message/100_ssh_msg_channel_failure.rb
154
- - lib/hrr_rb_ssh/message/codable.rb
155
172
  - lib/hrr_rb_ssh/subclass_with_preference_listable.rb
156
173
  - lib/hrr_rb_ssh/transport.rb
157
174
  - lib/hrr_rb_ssh/transport/compression_algorithm.rb
@@ -177,8 +194,18 @@ files:
177
194
  - lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb
178
195
  - lib/hrr_rb_ssh/transport/kex_algorithm.rb
179
196
  - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb
197
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman/h0.rb
180
198
  - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1.rb
199
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha256.rb
200
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group15_sha512.rb
201
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group16_sha512.rb
202
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group17_sha512.rb
203
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group18_sha512.rb
181
204
  - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1.rb
205
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb
206
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange/h0.rb
207
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha1.rb
208
+ - lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha256.rb
182
209
  - lib/hrr_rb_ssh/transport/mac_algorithm.rb
183
210
  - lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb
184
211
  - lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5.rb
@@ -193,7 +220,11 @@ files:
193
220
  - lib/hrr_rb_ssh/transport/sequence_number.rb
194
221
  - lib/hrr_rb_ssh/transport/server_host_key_algorithm.rb
195
222
  - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb
223
+ - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/public_key_blob.rb
224
+ - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/signature.rb
196
225
  - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb
226
+ - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/public_key_blob.rb
227
+ - lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/signature.rb
197
228
  - lib/hrr_rb_ssh/version.rb
198
229
  homepage: https://github.com/hirura/hrr_rb_ssh
199
230
  licenses:
@@ -1,33 +0,0 @@
1
- # coding: utf-8
2
- # vim: et ts=2 sw=2
3
-
4
- require 'hrr_rb_ssh/data_type'
5
-
6
- module HrrRbSsh
7
- class Authentication
8
- class Method
9
- class Publickey
10
- class Algorithm
11
- module Codable
12
- def encode definition, payload
13
- definition.map{ |data_type, field_name|
14
- field_value = if payload[field_name].instance_of? ::Proc then payload[field_name].call else payload[field_name] end
15
- data_type.encode(field_value)
16
- }.join
17
- end
18
-
19
- def decode definition, payload
20
- payload_io = StringIO.new payload, 'r'
21
- definition.map{ |data_type, field_name|
22
- [
23
- field_name,
24
- data_type.decode(payload_io)
25
- ]
26
- }.to_h
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,66 +0,0 @@
1
- # coding: utf-8
2
- # vim: et ts=2 sw=2
3
-
4
- require 'hrr_rb_ssh/logger'
5
-
6
- module HrrRbSsh
7
- module Message
8
- module Codable
9
- def logger
10
- @logger ||= HrrRbSsh::Logger.new self.name
11
- end
12
-
13
- def common_definition
14
- self::DEFINITION
15
- end
16
-
17
- def conditional_definition message
18
- message.inject([]){ |a, (k,v)|
19
- field_name = k
20
- field_value = if v.instance_of? ::Proc then v.call else v end
21
- a + ((self::CONDITIONAL_DEFINITION rescue {}).fetch(field_name, {})[field_value] || [])
22
- }
23
- end
24
-
25
- def encode message, complementary_message={}
26
- logger.debug('encoding message: ' + message.inspect)
27
- definition = common_definition + conditional_definition(message.merge complementary_message)
28
- definition.map{ |data_type, field_name|
29
- field_value = if message[field_name].instance_of? ::Proc then message[field_name].call else message[field_name] end
30
- data_type.encode( field_value )
31
- }.join
32
- end
33
-
34
- def decode payload, complementary_message={}
35
- def decode_recursively payload_io, message=nil
36
- if message.class == Array and message.size == 0
37
- []
38
- else
39
- definition = case message
40
- when nil
41
- common_definition
42
- when Array
43
- conditional_definition(message)
44
- end
45
- decoded_message = definition.map{ |data_type, field_name|
46
- [
47
- field_name,
48
- data_type.decode( payload_io )
49
- ]
50
- }
51
-
52
- decoded_message + decode_recursively(payload_io, decoded_message)
53
- end
54
- end
55
-
56
- payload_io = StringIO.new payload
57
- decoded_message = decode_recursively(payload_io).to_h
58
- if complementary_message.any?
59
- decoded_message.merge! decode_recursively(payload_io, complementary_message.to_a).to_h
60
- end
61
- logger.debug('decoded message: ' + decoded_message.inspect)
62
- decoded_message
63
- end
64
- end
65
- end
66
- end