hrr_rb_ssh 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/demo/server.rb +23 -3
  4. data/hrr_rb_ssh.gemspec +2 -2
  5. data/lib/hrr_rb_ssh/authentication/method/method.rb +34 -0
  6. data/lib/hrr_rb_ssh/authentication/method/none.rb +5 -14
  7. data/lib/hrr_rb_ssh/authentication/method/password.rb +6 -12
  8. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/algorithm.rb +41 -0
  9. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/codable.rb +33 -0
  10. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb +105 -0
  11. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb +85 -0
  12. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm.rb +28 -0
  13. data/lib/hrr_rb_ssh/authentication/method/publickey.rb +9 -25
  14. data/lib/hrr_rb_ssh/authentication/method.rb +12 -9
  15. data/lib/hrr_rb_ssh/connection/channel/channel_type/channel_type.rb +30 -0
  16. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env/context.rb +46 -0
  17. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env.rb +34 -0
  18. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb +44 -0
  19. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec.rb +34 -0
  20. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb +54 -0
  21. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req.rb +34 -0
  22. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/request_type.rb +34 -0
  23. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb +41 -0
  24. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell.rb +34 -0
  25. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb +44 -0
  26. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb +34 -0
  27. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type.rb +33 -0
  28. data/lib/hrr_rb_ssh/connection/channel/channel_type/session.rb +30 -0
  29. data/lib/hrr_rb_ssh/connection/channel/channel_type.rb +25 -0
  30. data/lib/hrr_rb_ssh/connection/channel.rb +2 -12
  31. data/lib/hrr_rb_ssh/transport/compression_algorithm/compression_algorithm.rb +34 -0
  32. data/lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb +31 -0
  33. data/lib/hrr_rb_ssh/transport/compression_algorithm/none.rb +7 -19
  34. data/lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb +20 -0
  35. data/lib/hrr_rb_ssh/transport/compression_algorithm/zlib.rb +7 -24
  36. data/lib/hrr_rb_ssh/transport/compression_algorithm.rb +11 -9
  37. data/lib/hrr_rb_ssh/transport/direction.rb +11 -0
  38. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_cbc.rb +19 -0
  39. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_ctr.rb +19 -0
  40. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes192_cbc.rb +19 -0
  41. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes192_ctr.rb +19 -0
  42. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes256_cbc.rb +19 -0
  43. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes256_ctr.rb +19 -0
  44. data/lib/hrr_rb_ssh/transport/encryption_algorithm/arcfour.rb +19 -0
  45. data/lib/hrr_rb_ssh/transport/encryption_algorithm/blowfish_cbc.rb +19 -0
  46. data/lib/hrr_rb_ssh/transport/encryption_algorithm/cast128_cbc.rb +19 -0
  47. data/lib/hrr_rb_ssh/transport/encryption_algorithm/encryption_algorithm.rb +34 -0
  48. data/lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb +61 -0
  49. data/lib/hrr_rb_ssh/transport/encryption_algorithm/none.rb +6 -33
  50. data/lib/hrr_rb_ssh/transport/encryption_algorithm/three_des_cbc.rb +19 -0
  51. data/lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb +35 -0
  52. data/lib/hrr_rb_ssh/transport/encryption_algorithm.rb +20 -9
  53. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +3 -4
  54. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1.rb +4 -8
  55. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1.rb +4 -8
  56. data/lib/hrr_rb_ssh/transport/kex_algorithm/kex_algorithm.rb +34 -0
  57. data/lib/hrr_rb_ssh/transport/kex_algorithm.rb +10 -9
  58. data/lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb +32 -0
  59. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5.rb +21 -0
  60. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5_96.rb +21 -0
  61. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1.rb +5 -29
  62. data/lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1_96.rb +21 -0
  63. data/lib/hrr_rb_ssh/transport/mac_algorithm/mac_algorithm.rb +34 -0
  64. data/lib/hrr_rb_ssh/transport/mac_algorithm/none.rb +6 -22
  65. data/lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb +24 -0
  66. data/lib/hrr_rb_ssh/transport/mac_algorithm.rb +14 -9
  67. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm.rb +34 -0
  68. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb +106 -0
  69. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb +4 -11
  70. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm.rb +10 -8
  71. data/lib/hrr_rb_ssh/transport.rb +23 -15
  72. data/lib/hrr_rb_ssh/version.rb +1 -1
  73. metadata +51 -17
  74. data/lib/hrr_rb_ssh/authentication/method/publickey/ssh_rsa.rb +0 -116
  75. data/lib/hrr_rb_ssh/connection/channel/session/env/context.rb +0 -43
  76. data/lib/hrr_rb_ssh/connection/channel/session/env.rb +0 -31
  77. data/lib/hrr_rb_ssh/connection/channel/session/exec/context.rb +0 -41
  78. data/lib/hrr_rb_ssh/connection/channel/session/exec.rb +0 -31
  79. data/lib/hrr_rb_ssh/connection/channel/session/pty_req/context.rb +0 -50
  80. data/lib/hrr_rb_ssh/connection/channel/session/pty_req.rb +0 -31
  81. data/lib/hrr_rb_ssh/connection/channel/session/shell/context.rb +0 -37
  82. data/lib/hrr_rb_ssh/connection/channel/session/shell.rb +0 -31
  83. data/lib/hrr_rb_ssh/connection/channel/session/subsystem/context.rb +0 -40
  84. data/lib/hrr_rb_ssh/connection/channel/session/subsystem.rb +0 -31
  85. data/lib/hrr_rb_ssh/connection/channel/session.rb +0 -31
  86. data/lib/hrr_rb_ssh/transport/encryption_algorithm/aes_128_cbc.rb +0 -73
@@ -1,22 +1,23 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/logger'
5
- require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1'
6
- require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1'
7
-
8
4
  module HrrRbSsh
9
5
  class Transport
10
6
  class KexAlgorithm
11
- @@list ||= Hash.new
12
-
13
- def self.[] key
14
- @@list[key]
7
+ def self.list
8
+ KexAlgorithm.list
15
9
  end
16
10
 
17
11
  def self.name_list
18
- @@list.keys
12
+ KexAlgorithm.name_list
13
+ end
14
+
15
+ def self.[] key
16
+ KexAlgorithm[key]
19
17
  end
20
18
  end
21
19
  end
22
20
  end
21
+
22
+ require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1'
23
+ require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1'
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/logger'
5
+
6
+ module HrrRbSsh
7
+ class Transport
8
+ class MacAlgorithm
9
+ module Functionable
10
+ def initialize key
11
+ super
12
+
13
+ @key = key
14
+ end
15
+
16
+ def digest_length
17
+ self.class::DIGEST_LENGTH
18
+ end
19
+
20
+ def key_length
21
+ self.class::KEY_LENGTH
22
+ end
23
+
24
+ def compute sequence_number, unencrypted_packet
25
+ data = HrrRbSsh::Transport::DataType::Uint32.encode(sequence_number) + unencrypted_packet
26
+ digest = OpenSSL::HMAC.digest self.class::DIGEST, @key, data
27
+ digest[0, digest_length]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/transport/mac_algorithm/mac_algorithm'
5
+ require 'hrr_rb_ssh/transport/mac_algorithm/functionable'
6
+
7
+ module HrrRbSsh
8
+ class Transport
9
+ class MacAlgorithm
10
+ class HmacMd5 < MacAlgorithm
11
+ NAME = 'hmac-md5'
12
+ DIGEST = 'md5'
13
+
14
+ DIGEST_LENGTH = 16
15
+ KEY_LENGTH = 16
16
+
17
+ include Functionable
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/transport/mac_algorithm/mac_algorithm'
5
+ require 'hrr_rb_ssh/transport/mac_algorithm/functionable'
6
+
7
+ module HrrRbSsh
8
+ class Transport
9
+ class MacAlgorithm
10
+ class HmacMd5_96 < MacAlgorithm
11
+ NAME = 'hmac-md5-96'
12
+ DIGEST = 'md5'
13
+
14
+ DIGEST_LENGTH = 12
15
+ KEY_LENGTH = 16
16
+
17
+ include Functionable
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,44 +1,20 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/logger'
4
+ require 'hrr_rb_ssh/transport/mac_algorithm/mac_algorithm'
5
+ require 'hrr_rb_ssh/transport/mac_algorithm/functionable'
5
6
 
6
7
  module HrrRbSsh
7
8
  class Transport
8
9
  class MacAlgorithm
9
- name_list = [
10
- 'hmac-sha1'
11
- ]
12
-
13
- class HmacSha1
10
+ class HmacSha1 < MacAlgorithm
11
+ NAME = 'hmac-sha1'
14
12
  DIGEST = 'sha1'
15
13
 
16
14
  DIGEST_LENGTH = 20
17
15
  KEY_LENGTH = 20
18
16
 
19
- def initialize key
20
- @logger = HrrRbSsh::Logger.new self.class.name
21
-
22
- @key = key
23
- end
24
-
25
- def compute sequence_number, unencrypted_packet
26
- data = HrrRbSsh::Transport::DataType::Uint32.encode(sequence_number) + unencrypted_packet
27
- OpenSSL::HMAC.digest DIGEST, @key, data
28
- end
29
-
30
- def digest_length
31
- DIGEST_LENGTH
32
- end
33
-
34
- def key_length
35
- KEY_LENGTH
36
- end
37
- end
38
-
39
- @@list ||= Hash.new
40
- name_list.each do |name|
41
- @@list[name] = HmacSha1
17
+ include Functionable
42
18
  end
43
19
  end
44
20
  end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/transport/mac_algorithm/mac_algorithm'
5
+ require 'hrr_rb_ssh/transport/mac_algorithm/functionable'
6
+
7
+ module HrrRbSsh
8
+ class Transport
9
+ class MacAlgorithm
10
+ class HmacSha1_96 < MacAlgorithm
11
+ NAME = 'hmac-sha1-96'
12
+ DIGEST = 'sha1'
13
+
14
+ DIGEST_LENGTH = 12
15
+ KEY_LENGTH = 20
16
+
17
+ include Functionable
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/logger'
5
+
6
+ module HrrRbSsh
7
+ class Transport
8
+ class MacAlgorithm
9
+ class MacAlgorithm
10
+ @@list = Array.new
11
+
12
+ def self.inherited klass
13
+ @@list.push klass
14
+ end
15
+
16
+ def self.list
17
+ @@list
18
+ end
19
+
20
+ def self.name_list
21
+ @@list.map{ |klass| klass::NAME }
22
+ end
23
+
24
+ def self.[] key
25
+ @@list.find{ |klass| key == klass::NAME }
26
+ end
27
+
28
+ def initialize key
29
+ @logger = HrrRbSsh::Logger.new self.class.name
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,39 +1,23 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/logger'
4
+ require 'hrr_rb_ssh/transport/mac_algorithm/mac_algorithm'
5
+ require 'hrr_rb_ssh/transport/mac_algorithm/unfunctionable'
5
6
 
6
7
  module HrrRbSsh
7
8
  class Transport
8
9
  class MacAlgorithm
9
- name_list = [
10
- 'none'
11
- ]
10
+ class None < MacAlgorithm
11
+ NAME = 'none'
12
12
 
13
- class None
14
13
  DIGEST_LENGTH = 0
15
14
  KEY_LENGTH = 0
16
15
 
17
16
  def initialize key=nil
18
- @logger = HrrRbSsh::Logger.new self.class.name
17
+ super
19
18
  end
20
19
 
21
- def compute sequence_number, unencrypted_packet
22
- String.new
23
- end
24
-
25
- def digest_length
26
- DIGEST_LENGTH
27
- end
28
-
29
- def key_length
30
- KEY_LENGTH
31
- end
32
- end
33
-
34
- @@list ||= Hash.new
35
- name_list.each do |name|
36
- @@list[name] = None
20
+ include Unfunctionable
37
21
  end
38
22
  end
39
23
  end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/logger'
5
+
6
+ module HrrRbSsh
7
+ class Transport
8
+ class MacAlgorithm
9
+ module Unfunctionable
10
+ def digest_length
11
+ self.class::DIGEST_LENGTH
12
+ end
13
+
14
+ def key_length
15
+ self.class::KEY_LENGTH
16
+ end
17
+
18
+ def compute sequence_number, unencrypted_packet
19
+ String.new
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,22 +1,27 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/logger'
5
- require 'hrr_rb_ssh/transport/mac_algorithm/none'
6
- require 'hrr_rb_ssh/transport/mac_algorithm/hmac_sha1'
7
-
8
4
  module HrrRbSsh
9
5
  class Transport
10
6
  class MacAlgorithm
11
- @@list ||= Hash.new
12
-
13
- def self.[] key
14
- @@list[key]
7
+ def self.list
8
+ MacAlgorithm.list
15
9
  end
16
10
 
17
11
  def self.name_list
18
- @@list.keys
12
+ MacAlgorithm.name_list
13
+ end
14
+
15
+ def self.[] key
16
+ MacAlgorithm[key]
19
17
  end
20
18
  end
21
19
  end
22
20
  end
21
+
22
+ require 'hrr_rb_ssh/transport/mac_algorithm/mac_algorithm'
23
+ require 'hrr_rb_ssh/transport/mac_algorithm/none'
24
+ require 'hrr_rb_ssh/transport/mac_algorithm/hmac_sha1'
25
+ require 'hrr_rb_ssh/transport/mac_algorithm/hmac_sha1_96'
26
+ require 'hrr_rb_ssh/transport/mac_algorithm/hmac_md5'
27
+ require 'hrr_rb_ssh/transport/mac_algorithm/hmac_md5_96'
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/logger'
5
+
6
+ module HrrRbSsh
7
+ class Transport
8
+ class ServerHostKeyAlgorithm
9
+ class ServerHostKeyAlgorithm
10
+ @@list = Array.new
11
+
12
+ def self.inherited klass
13
+ @@list.push klass
14
+ end
15
+
16
+ def self.list
17
+ @@list
18
+ end
19
+
20
+ def self.name_list
21
+ @@list.map{ |klass| klass::NAME }
22
+ end
23
+
24
+ def self.[] key
25
+ @@list.find{ |klass| key == klass::NAME }
26
+ end
27
+
28
+ def initialize
29
+ @logger = HrrRbSsh::Logger.new self.class.name
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,106 @@
1
+ # coding: utf-8
2
+ # vim: et ts=2 sw=2
3
+
4
+ require 'hrr_rb_ssh/transport/data_type'
5
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm'
6
+
7
+ module HrrRbSsh
8
+ class Transport
9
+ class ServerHostKeyAlgorithm
10
+ class SshDss < ServerHostKeyAlgorithm
11
+ NAME = 'ssh-dss'
12
+
13
+ SECRET_KEY = <<-EOB
14
+ -----BEGIN DSA PRIVATE KEY-----
15
+ MIIBuwIBAAKBgQD3fQ6cwTtOJpVI0iASOQZxkhwPRNy7UwovQkEK6bXW33HaCebO
16
+ PnNiY/rR4uFhjvHRzF8KnC8xk3fNo4ZJQJlaEHv6qySiXHeX1fw/eo/uzM5WafLd
17
+ oaRtE2muky1i3FBCiboXDlNcwuA/efsOE5qsGBbk6svw+8pGolHmOZFSvQIVAN2G
18
+ ZxtE9Kqqh6z48/VulQZsrh5hAoGAH3191okH8kUwP3dinp5j5YtNzrJ20sBXNNZG
19
+ 0aWjtS2xjSjIXjnlkiwhhvcUcCEkUQ507exvSLgf4dyV/V4+nf5Q5zjLztiSMe9D
20
+ qhTRIR23lsDu0OdITQihTu+Y4GEvNLUL9r2P1aoF/sde97xzzqmXPKx0UL1nNzcL
21
+ dnAdjjMCgYAa1dRvXe65jufPk0kRwhewRSScfg+YK4DOLUYGalsjHZbXtXqHKNpB
22
+ YkTlWKMg6QVREN0+5aNY1z1aJAbNboLz55YBnS9tOBYzvsXQF7ZP1ECMO6m4I8DI
23
+ wxt35i8hEVOJc+8x/xtmogzbjepar+1UycJQTMjhvqCW7RF4LuepvwIVANELTvnl
24
+ MRl/p42OrQzL/chRPvRf
25
+ -----END DSA PRIVATE KEY-----
26
+ EOB
27
+
28
+ KEY_FORMAT_DEFINITION = [
29
+ ['string', 'ssh-dss'],
30
+ ['mpint', 'p'],
31
+ ['mpint', 'q'],
32
+ ['mpint', 'g'],
33
+ ['mpint', 'y'],
34
+ ]
35
+
36
+ SIGN_DEFINITION = [
37
+ ['string', 'ssh-dss'],
38
+ ['string', 'dss_signature_blob'],
39
+ ]
40
+
41
+ def initialize
42
+ super
43
+
44
+ @dss = OpenSSL::PKey::DSA.new SECRET_KEY
45
+ end
46
+
47
+ def encode definition, payload
48
+ definition.map{ |data_type, field_name|
49
+ 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
+ }.join
52
+ end
53
+
54
+ def decode definition, payload
55
+ payload_io = StringIO.new payload, 'r'
56
+ definition.map{ |data_type, field_name|
57
+ [
58
+ field_name,
59
+ HrrRbSsh::Transport::DataType[data_type].decode( payload_io )
60
+ ]
61
+ }.to_h
62
+ end
63
+
64
+ def server_public_host_key
65
+ payload = {
66
+ 'ssh-dss' => 'ssh-dss',
67
+ 'p' => @dss.p.to_i,
68
+ 'q' => @dss.q.to_i,
69
+ 'g' => @dss.g.to_i,
70
+ 'y' => @dss.pub_key.to_i,
71
+ }
72
+ encode KEY_FORMAT_DEFINITION, payload
73
+ end
74
+
75
+ def sign digest, data
76
+ hash = OpenSSL::Digest.digest(digest, data)
77
+ sign_der = @dss.syssign(hash)
78
+ sign_asn1 = OpenSSL::ASN1.decode(sign_der)
79
+ sign_r = sign_asn1.value[0].value.to_s(2).rjust(20, ["00"].pack("H"))
80
+ sign_s = sign_asn1.value[1].value.to_s(2).rjust(20, ["00"].pack("H"))
81
+ payload = {
82
+ 'ssh-dss' => 'ssh-dss',
83
+ 'dss_signature_blob' => (sign_r + sign_s),
84
+ }
85
+ encode SIGN_DEFINITION, payload
86
+ end
87
+
88
+ def verify digest, sign, data
89
+ payload = decode SIGN_DEFINITION, sign
90
+ dss_signature_blob = payload['dss_signature_blob']
91
+ sign_r = dss_signature_blob[ 0, 20]
92
+ sign_s = dss_signature_blob[20, 20]
93
+ sign_asn1 = OpenSSL::ASN1::Sequence.new(
94
+ [
95
+ OpenSSL::ASN1::Integer.new(OpenSSL::BN.new(sign_r, 2)),
96
+ OpenSSL::ASN1::Integer.new(OpenSSL::BN.new(sign_s, 2)),
97
+ ]
98
+ )
99
+ sign_der = sign_asn1.to_der
100
+ hash = OpenSSL::Digest.digest(digest, data)
101
+ payload['ssh-dss'] == 'ssh-dss' && @dss.sysverify(hash, sign_der)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -1,17 +1,15 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/logger'
5
4
  require 'hrr_rb_ssh/transport/data_type'
5
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/server_host_key_algorithm'
6
6
 
7
7
  module HrrRbSsh
8
8
  class Transport
9
9
  class ServerHostKeyAlgorithm
10
- name_list = [
11
- 'ssh-rsa'
12
- ]
10
+ class SshRsa < ServerHostKeyAlgorithm
11
+ NAME = 'ssh-rsa'
13
12
 
14
- class SshRsa
15
13
  SECRET_KEY = <<-EOB
16
14
  -----BEGIN RSA PRIVATE KEY-----
17
15
  MIIEpAIBAAKCAQEA71zHt9RvbXmxuOCWPKR65iBHO+a8M7Mfo4vRCs/dorZN7XL1
@@ -54,7 +52,7 @@ vzTNM3SFzgt3bHkdEtDLc64aoBX+dHOot6u71XLZrshnHPtiZ0C/ZA==
54
52
  ]
55
53
 
56
54
  def initialize
57
- @logger = HrrRbSsh::Logger.new self.class.name
55
+ super
58
56
 
59
57
  @rsa = OpenSSL::PKey::RSA.new SECRET_KEY
60
58
  end
@@ -98,11 +96,6 @@ vzTNM3SFzgt3bHkdEtDLc64aoBX+dHOot6u71XLZrshnHPtiZ0C/ZA==
98
96
  payload['ssh-rsa'] == 'ssh-rsa' && @rsa.verify(digest, payload['rsa_signature_blob'], data)
99
97
  end
100
98
  end
101
-
102
- @@list ||= Hash.new
103
- name_list.each do |name|
104
- @@list[name] = SshRsa
105
- end
106
99
  end
107
100
  end
108
101
  end
@@ -1,21 +1,23 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
- require 'hrr_rb_ssh/logger'
5
- require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa'
6
-
7
4
  module HrrRbSsh
8
5
  class Transport
9
6
  class ServerHostKeyAlgorithm
10
- @@list ||= Hash.new
11
-
12
- def self.[] key
13
- @@list[key]
7
+ def self.list
8
+ ServerHostKeyAlgorithm.list
14
9
  end
15
10
 
16
11
  def self.name_list
17
- @@list.keys
12
+ ServerHostKeyAlgorithm.name_list
13
+ end
14
+
15
+ def self.[] key
16
+ ServerHostKeyAlgorithm[key]
18
17
  end
19
18
  end
20
19
  end
21
20
  end
21
+
22
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss'
23
+ require 'hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa'
@@ -7,6 +7,7 @@ require 'hrr_rb_ssh/message'
7
7
  require 'hrr_rb_ssh/closed_transport_error'
8
8
  require 'hrr_rb_ssh/transport/constant'
9
9
  require 'hrr_rb_ssh/transport/mode'
10
+ require 'hrr_rb_ssh/transport/direction'
10
11
  require 'hrr_rb_ssh/transport/data_type'
11
12
  require 'hrr_rb_ssh/transport/sequence_number'
12
13
  require 'hrr_rb_ssh/transport/sender'
@@ -91,20 +92,27 @@ module HrrRbSsh
91
92
  def start
92
93
  @logger.info("start transport")
93
94
 
94
- exchange_version
95
- exchange_key
96
-
97
- case @mode
98
- when HrrRbSsh::Transport::Mode::SERVER
99
- verify_service_request
100
- end
95
+ begin
96
+ exchange_version
97
+ exchange_key
101
98
 
102
- @closed = false
99
+ case @mode
100
+ when HrrRbSsh::Transport::Mode::SERVER
101
+ verify_service_request
102
+ end
103
103
 
104
- @sender_thread = sender_thread
105
- @receiver_thread = receiver_thread
104
+ @closed = false
105
+ rescue EOFError => e
106
+ close
107
+ rescue => e
108
+ @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
109
+ close
110
+ else
111
+ @sender_thread = sender_thread
112
+ @receiver_thread = receiver_thread
106
113
 
107
- @logger.info("transport started")
114
+ @logger.info("transport started")
115
+ end
108
116
  end
109
117
 
110
118
  def close
@@ -426,8 +434,8 @@ module HrrRbSsh
426
434
  incoming_crpt_key = @kex_algorithm.key_c_to_s self, incoming_encryption_algorithm_name
427
435
  outgoing_crpt_key = @kex_algorithm.key_s_to_c self, outgoing_encryption_algorithm_name
428
436
  end
429
- @incoming_encryption_algorithm = HrrRbSsh::Transport::EncryptionAlgorithm[incoming_encryption_algorithm_name].new incoming_crpt_iv, incoming_crpt_key
430
- @outgoing_encryption_algorithm = HrrRbSsh::Transport::EncryptionAlgorithm[outgoing_encryption_algorithm_name].new outgoing_crpt_iv, outgoing_crpt_key
437
+ @incoming_encryption_algorithm = HrrRbSsh::Transport::EncryptionAlgorithm[incoming_encryption_algorithm_name].new Direction::INCOMING, incoming_crpt_iv, incoming_crpt_key
438
+ @outgoing_encryption_algorithm = HrrRbSsh::Transport::EncryptionAlgorithm[outgoing_encryption_algorithm_name].new Direction::OUTGOING, outgoing_crpt_iv, outgoing_crpt_key
431
439
  end
432
440
 
433
441
  def update_mac_algorithm
@@ -452,8 +460,8 @@ module HrrRbSsh
452
460
  incoming_compression_algorithm_name = compression_algorithm_c_to_s_name
453
461
  outgoing_compression_algorithm_name = compression_algorithm_s_to_c_name
454
462
  end
455
- @incoming_compression_algorithm = HrrRbSsh::Transport::CompressionAlgorithm[incoming_compression_algorithm_name].new
456
- @outgoing_compression_algorithm = HrrRbSsh::Transport::CompressionAlgorithm[outgoing_compression_algorithm_name].new
463
+ @incoming_compression_algorithm = HrrRbSsh::Transport::CompressionAlgorithm[incoming_compression_algorithm_name].new Direction::INCOMING
464
+ @outgoing_compression_algorithm = HrrRbSsh::Transport::CompressionAlgorithm[outgoing_compression_algorithm_name].new Direction::OUTGOING
457
465
  end
458
466
  end
459
467
  end
@@ -2,5 +2,5 @@
2
2
  # vim: et ts=2 sw=2
3
3
 
4
4
  module HrrRbSsh
5
- VERSION = "0.1.1"
5
+ VERSION = "0.1.2"
6
6
  end