net-ssh 5.0.0.beta1 → 5.0.0.beta2

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 (87) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.rubocop_todo.yml +98 -258
  5. data/CHANGES.txt +8 -0
  6. data/Gemfile +1 -3
  7. data/Rakefile +37 -39
  8. data/lib/net/ssh.rb +26 -25
  9. data/lib/net/ssh/authentication/agent.rb +228 -225
  10. data/lib/net/ssh/authentication/certificate.rb +166 -164
  11. data/lib/net/ssh/authentication/constants.rb +17 -14
  12. data/lib/net/ssh/authentication/ed25519.rb +107 -104
  13. data/lib/net/ssh/authentication/ed25519_loader.rb +32 -28
  14. data/lib/net/ssh/authentication/key_manager.rb +5 -3
  15. data/lib/net/ssh/authentication/methods/abstract.rb +53 -47
  16. data/lib/net/ssh/authentication/methods/hostbased.rb +32 -33
  17. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +2 -4
  18. data/lib/net/ssh/authentication/methods/none.rb +10 -10
  19. data/lib/net/ssh/authentication/methods/password.rb +13 -13
  20. data/lib/net/ssh/authentication/methods/publickey.rb +54 -55
  21. data/lib/net/ssh/authentication/pageant.rb +468 -465
  22. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +44 -0
  23. data/lib/net/ssh/authentication/session.rb +127 -123
  24. data/lib/net/ssh/buffer.rb +305 -303
  25. data/lib/net/ssh/buffered_io.rb +163 -162
  26. data/lib/net/ssh/config.rb +230 -227
  27. data/lib/net/ssh/connection/channel.rb +659 -654
  28. data/lib/net/ssh/connection/constants.rb +30 -26
  29. data/lib/net/ssh/connection/event_loop.rb +108 -104
  30. data/lib/net/ssh/connection/keepalive.rb +54 -50
  31. data/lib/net/ssh/connection/session.rb +677 -678
  32. data/lib/net/ssh/connection/term.rb +180 -176
  33. data/lib/net/ssh/errors.rb +101 -99
  34. data/lib/net/ssh/key_factory.rb +108 -108
  35. data/lib/net/ssh/known_hosts.rb +148 -154
  36. data/lib/net/ssh/loggable.rb +56 -54
  37. data/lib/net/ssh/packet.rb +82 -78
  38. data/lib/net/ssh/prompt.rb +55 -53
  39. data/lib/net/ssh/proxy/command.rb +103 -102
  40. data/lib/net/ssh/proxy/errors.rb +12 -8
  41. data/lib/net/ssh/proxy/http.rb +92 -91
  42. data/lib/net/ssh/proxy/https.rb +42 -39
  43. data/lib/net/ssh/proxy/jump.rb +50 -47
  44. data/lib/net/ssh/proxy/socks4.rb +0 -2
  45. data/lib/net/ssh/proxy/socks5.rb +11 -11
  46. data/lib/net/ssh/ruby_compat.rb +1 -0
  47. data/lib/net/ssh/service/forward.rb +364 -362
  48. data/lib/net/ssh/test.rb +85 -83
  49. data/lib/net/ssh/test/channel.rb +146 -142
  50. data/lib/net/ssh/test/extensions.rb +148 -146
  51. data/lib/net/ssh/test/kex.rb +35 -31
  52. data/lib/net/ssh/test/local_packet.rb +48 -44
  53. data/lib/net/ssh/test/packet.rb +87 -84
  54. data/lib/net/ssh/test/remote_packet.rb +35 -31
  55. data/lib/net/ssh/test/script.rb +173 -171
  56. data/lib/net/ssh/test/socket.rb +59 -55
  57. data/lib/net/ssh/transport/algorithms.rb +413 -412
  58. data/lib/net/ssh/transport/cipher_factory.rb +108 -105
  59. data/lib/net/ssh/transport/constants.rb +35 -31
  60. data/lib/net/ssh/transport/ctr.rb +1 -1
  61. data/lib/net/ssh/transport/hmac.rb +1 -1
  62. data/lib/net/ssh/transport/hmac/abstract.rb +67 -64
  63. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +1 -1
  64. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +1 -1
  65. data/lib/net/ssh/transport/identity_cipher.rb +55 -51
  66. data/lib/net/ssh/transport/kex.rb +2 -4
  67. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +47 -40
  68. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +201 -197
  69. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -56
  70. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +94 -87
  71. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +17 -10
  72. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +17 -10
  73. data/lib/net/ssh/transport/key_expander.rb +29 -25
  74. data/lib/net/ssh/transport/openssl.rb +17 -30
  75. data/lib/net/ssh/transport/packet_stream.rb +193 -192
  76. data/lib/net/ssh/transport/server_version.rb +64 -66
  77. data/lib/net/ssh/transport/session.rb +286 -284
  78. data/lib/net/ssh/transport/state.rb +198 -196
  79. data/lib/net/ssh/verifiers/lenient.rb +29 -25
  80. data/lib/net/ssh/verifiers/null.rb +13 -9
  81. data/lib/net/ssh/verifiers/secure.rb +45 -45
  82. data/lib/net/ssh/verifiers/strict.rb +20 -16
  83. data/lib/net/ssh/version.rb +55 -53
  84. data/net-ssh.gemspec +4 -4
  85. data/support/ssh_tunnel_bug.rb +2 -2
  86. metadata +25 -24
  87. metadata.gz.sig +0 -0
@@ -17,66 +17,63 @@ module Net::SSH::Transport::Kex
17
17
 
18
18
  private
19
19
 
20
- # Compute the number of bits needed for the given number of bytes.
21
- def compute_need_bits
20
+ # Compute the number of bits needed for the given number of bytes.
21
+ def compute_need_bits
22
+ # for Compatibility: OpenSSH requires (need_bits * 2 + 1) length of parameter
23
+ need_bits = data[:need_bytes] * 8 * 2 + 1
22
24
 
23
- # for Compatibility: OpenSSH requires (need_bits * 2 + 1) length of parameter
24
- need_bits = data[:need_bytes] * 8 * 2 + 1
25
+ data[:minimum_dh_bits] ||= MINIMUM_BITS
25
26
 
26
- data[:minimum_dh_bits] ||= MINIMUM_BITS
27
-
28
- if need_bits < data[:minimum_dh_bits]
29
- need_bits = data[:minimum_dh_bits]
30
- elsif need_bits > MAXIMUM_BITS
31
- need_bits = MAXIMUM_BITS
32
- end
33
-
34
- data[:need_bits ] = need_bits
35
- data[:need_bytes] = need_bits / 8
27
+ if need_bits < data[:minimum_dh_bits]
28
+ need_bits = data[:minimum_dh_bits]
29
+ elsif need_bits > MAXIMUM_BITS
30
+ need_bits = MAXIMUM_BITS
36
31
  end
37
32
 
38
- # Returns the DH key parameters for the given session.
39
- def get_parameters
40
- compute_need_bits
41
-
42
- # request the DH key parameters for the given number of bits.
43
- buffer = Net::SSH::Buffer.from(:byte, KEXDH_GEX_REQUEST, :long, data[:minimum_dh_bits],
44
- :long, data[:need_bits], :long, MAXIMUM_BITS)
45
- connection.send_message(buffer)
46
-
47
- buffer = connection.next_message
48
- unless buffer.type == KEXDH_GEX_GROUP
49
- raise Net::SSH::Exception, "expected KEXDH_GEX_GROUP, got #{buffer.type}"
50
- end
51
-
52
- p = buffer.read_bignum
53
- g = buffer.read_bignum
54
-
55
- [p, g]
56
- end
57
-
58
- # Returns the INIT/REPLY constants used by this algorithm.
59
- def get_message_types
60
- [KEXDH_GEX_INIT, KEXDH_GEX_REPLY]
61
- end
62
-
63
- # Build the signature buffer to use when verifying a signature from
64
- # the server.
65
- def build_signature_buffer(result)
66
- response = Net::SSH::Buffer.new
67
- response.write_string data[:client_version_string],
68
- data[:server_version_string],
69
- data[:client_algorithm_packet],
70
- data[:server_algorithm_packet],
71
- result[:key_blob]
72
- response.write_long MINIMUM_BITS,
73
- data[:need_bits],
74
- MAXIMUM_BITS
75
- response.write_bignum dh.p, dh.g, dh.pub_key,
76
- result[:server_dh_pubkey],
77
- result[:shared_secret]
78
- response
79
- end
33
+ data[:need_bits] = need_bits
34
+ data[:need_bytes] = need_bits / 8
35
+ end
36
+
37
+ # Returns the DH key parameters for the given session.
38
+ def get_parameters
39
+ compute_need_bits
40
+
41
+ # request the DH key parameters for the given number of bits.
42
+ buffer = Net::SSH::Buffer.from(:byte, KEXDH_GEX_REQUEST, :long, data[:minimum_dh_bits],
43
+ :long, data[:need_bits], :long, MAXIMUM_BITS)
44
+ connection.send_message(buffer)
45
+
46
+ buffer = connection.next_message
47
+ raise Net::SSH::Exception, "expected KEXDH_GEX_GROUP, got #{buffer.type}" unless buffer.type == KEXDH_GEX_GROUP
48
+
49
+ p = buffer.read_bignum
50
+ g = buffer.read_bignum
51
+
52
+ [p, g]
53
+ end
54
+
55
+ # Returns the INIT/REPLY constants used by this algorithm.
56
+ def get_message_types
57
+ [KEXDH_GEX_INIT, KEXDH_GEX_REPLY]
58
+ end
59
+
60
+ # Build the signature buffer to use when verifying a signature from
61
+ # the server.
62
+ def build_signature_buffer(result)
63
+ response = Net::SSH::Buffer.new
64
+ response.write_string data[:client_version_string],
65
+ data[:server_version_string],
66
+ data[:client_algorithm_packet],
67
+ data[:server_algorithm_packet],
68
+ result[:key_blob]
69
+ response.write_long MINIMUM_BITS,
70
+ data[:need_bits],
71
+ MAXIMUM_BITS
72
+ response.write_bignum dh.p, dh.g, dh.pub_key,
73
+ result[:server_dh_pubkey],
74
+ result[:shared_secret]
75
+ response
76
+ end
80
77
  end
81
78
 
82
79
  end
@@ -1,93 +1,100 @@
1
1
  require 'net/ssh/transport/constants'
2
2
  require 'net/ssh/transport/kex/diffie_hellman_group1_sha1'
3
3
 
4
- module Net; module SSH; module Transport; module Kex
5
-
6
- # A key-exchange service implementing the "ecdh-sha2-nistp256"
7
- # key-exchange algorithm. (defined in RFC 5656)
8
- class EcdhSHA2NistP256 < DiffieHellmanGroup1SHA1
9
- include Constants, Loggable
10
-
11
- attr_reader :ecdh
12
-
13
- def digester
14
- OpenSSL::Digest::SHA256
15
- end
16
-
17
- def curve_name
18
- OpenSSL::PKey::EC::CurveNameAlias['nistp256']
19
- end
20
-
21
- def initialize(algorithms, connection, data)
22
- @algorithms = algorithms
23
- @connection = connection
24
-
25
- @digester = digester
26
- @data = data.dup
27
- @ecdh = generate_key
28
- @logger = @data.delete(:logger)
29
- end
30
-
31
- private
32
-
33
- def get_message_types
34
- [KEXECDH_INIT, KEXECDH_REPLY]
35
- end
36
-
37
- def build_signature_buffer(result)
38
- response = Net::SSH::Buffer.new
39
- response.write_string data[:client_version_string],
40
- data[:server_version_string],
41
- data[:client_algorithm_packet],
42
- data[:server_algorithm_packet],
43
- result[:key_blob],
44
- ecdh.public_key.to_bn.to_s(2),
45
- result[:server_ecdh_pubkey]
46
- response.write_bignum result[:shared_secret]
47
- response
48
- end
49
-
50
- def generate_key #:nodoc:
51
- OpenSSL::PKey::EC.new(curve_name).generate_key
52
- end
53
-
54
- def send_kexinit #:nodoc:
55
- init, reply = get_message_types
56
-
57
- # send the KEXECDH_INIT message
58
- ## byte SSH_MSG_KEX_ECDH_INIT
59
- ## string Q_C, client's ephemeral public key octet string
60
- buffer = Net::SSH::Buffer.from(:byte, init, :mstring, ecdh.public_key.to_bn.to_s(2))
61
- connection.send_message(buffer)
62
-
63
- # expect the following KEXECDH_REPLY message
64
- ## byte SSH_MSG_KEX_ECDH_REPLY
65
- ## string K_S, server's public host key
66
- ## string Q_S, server's ephemeral public key octet string
67
- ## string the signature on the exchange hash
68
- buffer = connection.next_message
69
- raise Net::SSH::Exception, "expected REPLY" unless buffer.type == reply
70
-
71
- result = Hash.new
72
- result[:key_blob] = buffer.read_string
73
- result[:server_key] = Net::SSH::Buffer.new(result[:key_blob]).read_key
74
- result[:server_ecdh_pubkey] = buffer.read_string
75
-
76
- # compute shared secret from server's public key and client's private key
77
- pk = OpenSSL::PKey::EC::Point.new(OpenSSL::PKey::EC.new(curve_name).group,
78
- OpenSSL::BN.new(result[:server_ecdh_pubkey], 2))
79
- result[:shared_secret] = OpenSSL::BN.new(ecdh.dh_compute_key(pk), 2)
80
-
81
- sig_buffer = Net::SSH::Buffer.new(buffer.read_string)
82
- sig_type = sig_buffer.read_string
83
- if sig_type != algorithms.host_key
84
- raise Net::SSH::Exception,
85
- "host key algorithm mismatch for signature " +
86
- "'#{sig_type}' != '#{algorithms.host_key}'"
4
+ module Net
5
+ module SSH
6
+ module Transport
7
+ module Kex
8
+
9
+ # A key-exchange service implementing the "ecdh-sha2-nistp256"
10
+ # key-exchange algorithm. (defined in RFC 5656)
11
+ class EcdhSHA2NistP256 < DiffieHellmanGroup1SHA1
12
+ include Loggable
13
+ include Constants
14
+
15
+ attr_reader :ecdh
16
+
17
+ def digester
18
+ OpenSSL::Digest::SHA256
19
+ end
20
+
21
+ def curve_name
22
+ OpenSSL::PKey::EC::CurveNameAlias['nistp256']
23
+ end
24
+
25
+ def initialize(algorithms, connection, data)
26
+ @algorithms = algorithms
27
+ @connection = connection
28
+
29
+ @digester = digester
30
+ @data = data.dup
31
+ @ecdh = generate_key
32
+ @logger = @data.delete(:logger)
33
+ end
34
+
35
+ private
36
+
37
+ def get_message_types
38
+ [KEXECDH_INIT, KEXECDH_REPLY]
39
+ end
40
+
41
+ def build_signature_buffer(result)
42
+ response = Net::SSH::Buffer.new
43
+ response.write_string data[:client_version_string],
44
+ data[:server_version_string],
45
+ data[:client_algorithm_packet],
46
+ data[:server_algorithm_packet],
47
+ result[:key_blob],
48
+ ecdh.public_key.to_bn.to_s(2),
49
+ result[:server_ecdh_pubkey]
50
+ response.write_bignum result[:shared_secret]
51
+ response
52
+ end
53
+
54
+ def generate_key #:nodoc:
55
+ OpenSSL::PKey::EC.new(curve_name).generate_key
56
+ end
57
+
58
+ def send_kexinit #:nodoc:
59
+ init, reply = get_message_types
60
+
61
+ # send the KEXECDH_INIT message
62
+ ## byte SSH_MSG_KEX_ECDH_INIT
63
+ ## string Q_C, client's ephemeral public key octet string
64
+ buffer = Net::SSH::Buffer.from(:byte, init, :mstring, ecdh.public_key.to_bn.to_s(2))
65
+ connection.send_message(buffer)
66
+
67
+ # expect the following KEXECDH_REPLY message
68
+ ## byte SSH_MSG_KEX_ECDH_REPLY
69
+ ## string K_S, server's public host key
70
+ ## string Q_S, server's ephemeral public key octet string
71
+ ## string the signature on the exchange hash
72
+ buffer = connection.next_message
73
+ raise Net::SSH::Exception, "expected REPLY" unless buffer.type == reply
74
+
75
+ result = Hash.new
76
+ result[:key_blob] = buffer.read_string
77
+ result[:server_key] = Net::SSH::Buffer.new(result[:key_blob]).read_key
78
+ result[:server_ecdh_pubkey] = buffer.read_string
79
+
80
+ # compute shared secret from server's public key and client's private key
81
+ pk = OpenSSL::PKey::EC::Point.new(OpenSSL::PKey::EC.new(curve_name).group,
82
+ OpenSSL::BN.new(result[:server_ecdh_pubkey], 2))
83
+ result[:shared_secret] = OpenSSL::BN.new(ecdh.dh_compute_key(pk), 2)
84
+
85
+ sig_buffer = Net::SSH::Buffer.new(buffer.read_string)
86
+ sig_type = sig_buffer.read_string
87
+ if sig_type != algorithms.host_key
88
+ raise Net::SSH::Exception,
89
+ "host key algorithm mismatch for signature " +
90
+ "'#{sig_type}' != '#{algorithms.host_key}'"
91
+ end
92
+ result[:server_sig] = sig_buffer.read_string
93
+
94
+ return result
95
+ end
96
+ end
87
97
  end
88
- result[:server_sig] = sig_buffer.read_string
89
-
90
- return result
91
98
  end
92
99
  end
93
- end; end; end; end
100
+ end
@@ -1,13 +1,20 @@
1
- module Net; module SSH; module Transport; module Kex
1
+ module Net
2
+ module SSH
3
+ module Transport
4
+ module Kex
2
5
 
3
- # A key-exchange service implementing the "ecdh-sha2-nistp256"
4
- # key-exchange algorithm. (defined in RFC 5656)
5
- class EcdhSHA2NistP384 < EcdhSHA2NistP256
6
- def digester
7
- OpenSSL::Digest::SHA384
8
- end
9
- def curve_name
10
- OpenSSL::PKey::EC::CurveNameAlias['nistp384']
6
+ # A key-exchange service implementing the "ecdh-sha2-nistp256"
7
+ # key-exchange algorithm. (defined in RFC 5656)
8
+ class EcdhSHA2NistP384 < EcdhSHA2NistP256
9
+ def digester
10
+ OpenSSL::Digest::SHA384
11
+ end
12
+
13
+ def curve_name
14
+ OpenSSL::PKey::EC::CurveNameAlias['nistp384']
15
+ end
16
+ end
17
+ end
11
18
  end
12
19
  end
13
- end; end; end; end
20
+ end
@@ -1,13 +1,20 @@
1
- module Net; module SSH; module Transport; module Kex
1
+ module Net
2
+ module SSH
3
+ module Transport
4
+ module Kex
2
5
 
3
- # A key-exchange service implementing the "ecdh-sha2-nistp521"
4
- # key-exchange algorithm. (defined in RFC 5656)
5
- class EcdhSHA2NistP521 < EcdhSHA2NistP256
6
- def digester
7
- OpenSSL::Digest::SHA512
8
- end
9
- def curve_name
10
- OpenSSL::PKey::EC::CurveNameAlias['nistp521']
6
+ # A key-exchange service implementing the "ecdh-sha2-nistp521"
7
+ # key-exchange algorithm. (defined in RFC 5656)
8
+ class EcdhSHA2NistP521 < EcdhSHA2NistP256
9
+ def digester
10
+ OpenSSL::Digest::SHA512
11
+ end
12
+
13
+ def curve_name
14
+ OpenSSL::PKey::EC::CurveNameAlias['nistp521']
15
+ end
16
+ end
17
+ end
11
18
  end
12
19
  end
13
- end; end; end; end
20
+ end
@@ -1,27 +1,31 @@
1
- module Net; module SSH; module Transport
2
- module KeyExpander
3
-
4
- # Generate a key value in accordance with the SSH2 specification.
5
- # (RFC4253 7.2. "Output from Key Exchange")
6
- def self.expand_key(bytes, start, options={})
7
- if bytes == 0
8
- return ""
1
+ module Net
2
+ module SSH
3
+ module Transport
4
+ module KeyExpander
5
+
6
+ # Generate a key value in accordance with the SSH2 specification.
7
+ # (RFC4253 7.2. "Output from Key Exchange")
8
+ def self.expand_key(bytes, start, options={})
9
+ if bytes == 0
10
+ return ""
11
+ end
12
+
13
+ k = start[0, bytes]
14
+ return k if k.length >= bytes
15
+
16
+ digester = options[:digester] or raise 'No digester supplied'
17
+ shared = options[:shared] or raise 'No shared secret supplied'
18
+ hash = options[:hash] or raise 'No hash supplied'
19
+
20
+ while k.length < bytes
21
+ step = digester.digest(shared + hash + k)
22
+ bytes_needed = bytes - k.length
23
+ k << step[0, bytes_needed]
24
+ end
25
+
26
+ return k
27
+ end
28
+ end
9
29
  end
10
-
11
- k = start[0, bytes]
12
- return k if k.length >= bytes
13
-
14
- digester = options[:digester] or raise 'No digester supplied'
15
- shared = options[:shared] or raise 'No shared secret supplied'
16
- hash = options[:hash] or raise 'No hash supplied'
17
-
18
- while k.length < bytes
19
- step = digester.digest(shared + hash + k)
20
- bytes_needed = bytes - k.length
21
- k << step[0, bytes_needed]
22
- end
23
-
24
- return k
25
- end
26
30
  end
27
- end; end; end
31
+ end
@@ -1,5 +1,5 @@
1
- # -*- coding: utf-8 -*-
2
1
  require 'openssl'
2
+ require 'net/ssh/authentication/pub_key_fingerprint'
3
3
 
4
4
  module OpenSSL
5
5
 
@@ -7,7 +7,6 @@ module OpenSSL
7
7
  # have been added to it by the Net::SSH module for convenience in dealing with
8
8
  # SSH functionality.
9
9
  class BN
10
-
11
10
  # Converts a BN object to a string. The format used is that which is
12
11
  # required by the SSH2 protocol.
13
12
  def to_ssh
@@ -16,44 +15,38 @@ module OpenSSL
16
15
  else
17
16
  buf = to_s(2)
18
17
  if buf.getbyte(0)[7] == 1
19
- return [buf.length+1, 0, buf].pack("NCA*")
18
+ return [buf.length + 1, 0, buf].pack("NCA*")
20
19
  else
21
20
  return [buf.length, buf].pack("NA*")
22
21
  end
23
22
  end
24
23
  end
25
-
26
24
  end
27
25
 
28
26
  module PKey
29
27
 
30
28
  class PKey
31
- def fingerprint
32
- @fingerprint ||= OpenSSL::Digest::MD5.hexdigest(to_blob).scan(/../).join(":")
33
- end
29
+ include Net::SSH::Authentication::PubKeyFingerprint
34
30
  end
35
31
 
36
32
  # This class is originally defined in the OpenSSL module. As needed, methods
37
33
  # have been added to it by the Net::SSH module for convenience in dealing
38
34
  # with SSH functionality.
39
35
  class DH
40
-
41
36
  # Determines whether the pub_key for this key is valid. (This algorithm
42
37
  # lifted more-or-less directly from OpenSSH, dh.c, dh_pub_is_valid.)
43
38
  def valid?
44
39
  return false if pub_key.nil? || pub_key < 0
45
40
  bits_set = 0
46
41
  pub_key.num_bits.times { |i| bits_set += 1 if pub_key.bit_set?(i) }
47
- return ( bits_set > 1 && pub_key < p )
42
+ return (bits_set > 1 && pub_key < p)
48
43
  end
49
-
50
44
  end
51
45
 
52
46
  # This class is originally defined in the OpenSSL module. As needed, methods
53
47
  # have been added to it by the Net::SSH module for convenience in dealing
54
48
  # with SSH functionality.
55
49
  class RSA
56
-
57
50
  # Returns "ssh-rsa", which is the description of this key type used by the
58
51
  # SSH2 protocol.
59
52
  def ssh_type
@@ -84,7 +77,6 @@ module OpenSSL
84
77
  # have been added to it by the Net::SSH module for convenience in dealing
85
78
  # with SSH functionality.
86
79
  class DSA
87
-
88
80
  # Returns "ssh-dss", which is the description of this key type used by the
89
81
  # SSH2 protocol.
90
82
  def ssh_type
@@ -114,18 +106,16 @@ module OpenSSL
114
106
 
115
107
  # Signs the given data.
116
108
  def ssh_do_sign(data)
117
- sig = sign( OpenSSL::Digest::SHA1.new, data)
118
- a1sig = OpenSSL::ASN1.decode( sig )
109
+ sig = sign(OpenSSL::Digest::SHA1.new, data)
110
+ a1sig = OpenSSL::ASN1.decode(sig)
119
111
 
120
112
  sig_r = a1sig.value[0].value.to_s(2)
121
113
  sig_s = a1sig.value[1].value.to_s(2)
122
114
 
123
- if sig_r.length > 20 || sig_s.length > 20
124
- raise OpenSSL::PKey::DSAError, "bad sig size"
125
- end
115
+ raise OpenSSL::PKey::DSAError, "bad sig size" if sig_r.length > 20 || sig_s.length > 20
126
116
 
127
- sig_r = "\0" * ( 20 - sig_r.length ) + sig_r if sig_r.length < 20
128
- sig_s = "\0" * ( 20 - sig_s.length ) + sig_s if sig_s.length < 20
117
+ sig_r = "\0" * (20 - sig_r.length) + sig_r if sig_r.length < 20
118
+ sig_s = "\0" * (20 - sig_s.length) + sig_s if sig_s.length < 20
129
119
 
130
120
  return sig_r + sig_s
131
121
  end
@@ -139,20 +129,18 @@ module OpenSSL
139
129
  CurveNameAlias = {
140
130
  "nistp256" => "prime256v1",
141
131
  "nistp384" => "secp384r1",
142
- "nistp521" => "secp521r1",
132
+ "nistp521" => "secp521r1"
143
133
  }
144
134
 
145
135
  CurveNameAliasInv = {
146
136
  "prime256v1" => "nistp256",
147
137
  "secp384r1" => "nistp384",
148
- "secp521r1" => "nistp521",
138
+ "secp521r1" => "nistp521"
149
139
  }
150
140
 
151
141
  def self.read_keyblob(curve_name_in_type, buffer)
152
142
  curve_name_in_key = buffer.read_string
153
- unless curve_name_in_type == curve_name_in_key
154
- raise Net::SSH::Exception, "curve name mismatched (`#{curve_name_in_key}' with `#{curve_name_in_type}')"
155
- end
143
+ raise Net::SSH::Exception, "curve name mismatched (`#{curve_name_in_key}' with `#{curve_name_in_type}')" unless curve_name_in_type == curve_name_in_key
156
144
  public_key_oct = buffer.read_string
157
145
  begin
158
146
  key = OpenSSL::PKey::EC.new(OpenSSL::PKey::EC::CurveNameAlias[curve_name_in_key])
@@ -164,7 +152,6 @@ module OpenSSL
164
152
  rescue OpenSSL::PKey::ECError
165
153
  raise NotImplementedError, "unsupported key type `#{type}'"
166
154
  end
167
-
168
155
  end
169
156
 
170
157
  # Returns the description of this key type used by the
@@ -208,16 +195,16 @@ module OpenSSL
208
195
 
209
196
  begin
210
197
  sig_r_len = sig[0,4].unpack("H*")[0].to_i(16)
211
- sig_l_len = sig[4+sig_r_len,4].unpack("H*")[0].to_i(16)
198
+ sig_l_len = sig[4 + sig_r_len,4].unpack("H*")[0].to_i(16)
212
199
 
213
200
  sig_r = sig[4,sig_r_len].unpack("H*")[0]
214
- sig_s = sig[4+sig_r_len+4,sig_l_len].unpack("H*")[0]
201
+ sig_s = sig[4 + sig_r_len + 4,sig_l_len].unpack("H*")[0]
215
202
 
216
203
  a1sig = OpenSSL::ASN1::Sequence([
217
204
  OpenSSL::ASN1::Integer(sig_r.to_i(16)),
218
- OpenSSL::ASN1::Integer(sig_s.to_i(16)),
205
+ OpenSSL::ASN1::Integer(sig_s.to_i(16))
219
206
  ])
220
- rescue
207
+ rescue StandardError
221
208
  end
222
209
 
223
210
  if a1sig == nil
@@ -231,7 +218,7 @@ module OpenSSL
231
218
  def ssh_do_sign(data)
232
219
  digest = digester.digest(data)
233
220
  sig = dsa_sign_asn1(digest)
234
- a1sig = OpenSSL::ASN1.decode( sig )
221
+ a1sig = OpenSSL::ASN1.decode(sig)
235
222
 
236
223
  sig_r = a1sig.value[0].value
237
224
  sig_s = a1sig.value[1].value