minmb-net-ssh 2.5.1

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 (137) hide show
  1. data/CHANGELOG.rdoc +291 -0
  2. data/Manifest +132 -0
  3. data/README.rdoc +184 -0
  4. data/Rakefile +86 -0
  5. data/Rudyfile +96 -0
  6. data/THANKS.rdoc +19 -0
  7. data/lib/net/ssh.rb +223 -0
  8. data/lib/net/ssh/authentication/agent.rb +23 -0
  9. data/lib/net/ssh/authentication/agent/java_pageant.rb +85 -0
  10. data/lib/net/ssh/authentication/agent/socket.rb +170 -0
  11. data/lib/net/ssh/authentication/constants.rb +18 -0
  12. data/lib/net/ssh/authentication/key_manager.rb +253 -0
  13. data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  14. data/lib/net/ssh/authentication/methods/hostbased.rb +75 -0
  15. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +70 -0
  16. data/lib/net/ssh/authentication/methods/password.rb +43 -0
  17. data/lib/net/ssh/authentication/methods/publickey.rb +96 -0
  18. data/lib/net/ssh/authentication/pageant.rb +301 -0
  19. data/lib/net/ssh/authentication/session.rb +154 -0
  20. data/lib/net/ssh/buffer.rb +350 -0
  21. data/lib/net/ssh/buffered_io.rb +207 -0
  22. data/lib/net/ssh/config.rb +207 -0
  23. data/lib/net/ssh/connection/channel.rb +630 -0
  24. data/lib/net/ssh/connection/constants.rb +33 -0
  25. data/lib/net/ssh/connection/session.rb +603 -0
  26. data/lib/net/ssh/connection/term.rb +178 -0
  27. data/lib/net/ssh/errors.rb +88 -0
  28. data/lib/net/ssh/key_factory.rb +107 -0
  29. data/lib/net/ssh/known_hosts.rb +141 -0
  30. data/lib/net/ssh/loggable.rb +61 -0
  31. data/lib/net/ssh/packet.rb +102 -0
  32. data/lib/net/ssh/prompt.rb +93 -0
  33. data/lib/net/ssh/proxy/command.rb +75 -0
  34. data/lib/net/ssh/proxy/errors.rb +14 -0
  35. data/lib/net/ssh/proxy/http.rb +94 -0
  36. data/lib/net/ssh/proxy/socks4.rb +70 -0
  37. data/lib/net/ssh/proxy/socks5.rb +142 -0
  38. data/lib/net/ssh/ruby_compat.rb +77 -0
  39. data/lib/net/ssh/service/forward.rb +327 -0
  40. data/lib/net/ssh/test.rb +89 -0
  41. data/lib/net/ssh/test/channel.rb +129 -0
  42. data/lib/net/ssh/test/extensions.rb +152 -0
  43. data/lib/net/ssh/test/kex.rb +44 -0
  44. data/lib/net/ssh/test/local_packet.rb +51 -0
  45. data/lib/net/ssh/test/packet.rb +81 -0
  46. data/lib/net/ssh/test/remote_packet.rb +38 -0
  47. data/lib/net/ssh/test/script.rb +157 -0
  48. data/lib/net/ssh/test/socket.rb +64 -0
  49. data/lib/net/ssh/transport/algorithms.rb +407 -0
  50. data/lib/net/ssh/transport/cipher_factory.rb +106 -0
  51. data/lib/net/ssh/transport/constants.rb +32 -0
  52. data/lib/net/ssh/transport/ctr.rb +95 -0
  53. data/lib/net/ssh/transport/hmac.rb +45 -0
  54. data/lib/net/ssh/transport/hmac/abstract.rb +79 -0
  55. data/lib/net/ssh/transport/hmac/md5.rb +12 -0
  56. data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  57. data/lib/net/ssh/transport/hmac/none.rb +15 -0
  58. data/lib/net/ssh/transport/hmac/ripemd160.rb +13 -0
  59. data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  60. data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  61. data/lib/net/ssh/transport/hmac/sha2_256.rb +15 -0
  62. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +13 -0
  63. data/lib/net/ssh/transport/hmac/sha2_512.rb +14 -0
  64. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +13 -0
  65. data/lib/net/ssh/transport/identity_cipher.rb +55 -0
  66. data/lib/net/ssh/transport/kex.rb +28 -0
  67. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +44 -0
  68. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +216 -0
  69. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +80 -0
  70. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +15 -0
  71. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +93 -0
  72. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +13 -0
  73. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +13 -0
  74. data/lib/net/ssh/transport/key_expander.rb +26 -0
  75. data/lib/net/ssh/transport/openssl.rb +237 -0
  76. data/lib/net/ssh/transport/packet_stream.rb +235 -0
  77. data/lib/net/ssh/transport/server_version.rb +71 -0
  78. data/lib/net/ssh/transport/session.rb +278 -0
  79. data/lib/net/ssh/transport/state.rb +206 -0
  80. data/lib/net/ssh/verifiers/lenient.rb +30 -0
  81. data/lib/net/ssh/verifiers/null.rb +12 -0
  82. data/lib/net/ssh/verifiers/strict.rb +53 -0
  83. data/lib/net/ssh/version.rb +62 -0
  84. data/net-ssh.gemspec +164 -0
  85. data/setup.rb +1585 -0
  86. data/support/arcfour_check.rb +20 -0
  87. data/support/ssh_tunnel_bug.rb +65 -0
  88. data/test/authentication/methods/common.rb +28 -0
  89. data/test/authentication/methods/test_abstract.rb +51 -0
  90. data/test/authentication/methods/test_hostbased.rb +114 -0
  91. data/test/authentication/methods/test_keyboard_interactive.rb +100 -0
  92. data/test/authentication/methods/test_password.rb +52 -0
  93. data/test/authentication/methods/test_publickey.rb +148 -0
  94. data/test/authentication/test_agent.rb +205 -0
  95. data/test/authentication/test_key_manager.rb +218 -0
  96. data/test/authentication/test_session.rb +106 -0
  97. data/test/common.rb +107 -0
  98. data/test/configs/eqsign +3 -0
  99. data/test/configs/exact_match +8 -0
  100. data/test/configs/host_plus +10 -0
  101. data/test/configs/multihost +4 -0
  102. data/test/configs/wild_cards +14 -0
  103. data/test/connection/test_channel.rb +467 -0
  104. data/test/connection/test_session.rb +488 -0
  105. data/test/known_hosts/github +1 -0
  106. data/test/test_all.rb +9 -0
  107. data/test/test_buffer.rb +426 -0
  108. data/test/test_buffered_io.rb +63 -0
  109. data/test/test_config.rb +120 -0
  110. data/test/test_key_factory.rb +121 -0
  111. data/test/test_known_hosts.rb +13 -0
  112. data/test/transport/hmac/test_md5.rb +39 -0
  113. data/test/transport/hmac/test_md5_96.rb +25 -0
  114. data/test/transport/hmac/test_none.rb +34 -0
  115. data/test/transport/hmac/test_ripemd160.rb +34 -0
  116. data/test/transport/hmac/test_sha1.rb +34 -0
  117. data/test/transport/hmac/test_sha1_96.rb +25 -0
  118. data/test/transport/hmac/test_sha2_256.rb +35 -0
  119. data/test/transport/hmac/test_sha2_256_96.rb +25 -0
  120. data/test/transport/hmac/test_sha2_512.rb +35 -0
  121. data/test/transport/hmac/test_sha2_512_96.rb +25 -0
  122. data/test/transport/kex/test_diffie_hellman_group14_sha1.rb +13 -0
  123. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  124. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  125. data/test/transport/kex/test_diffie_hellman_group_exchange_sha256.rb +33 -0
  126. data/test/transport/kex/test_ecdh_sha2_nistp256.rb +161 -0
  127. data/test/transport/kex/test_ecdh_sha2_nistp384.rb +37 -0
  128. data/test/transport/kex/test_ecdh_sha2_nistp521.rb +37 -0
  129. data/test/transport/test_algorithms.rb +330 -0
  130. data/test/transport/test_cipher_factory.rb +441 -0
  131. data/test/transport/test_hmac.rb +34 -0
  132. data/test/transport/test_identity_cipher.rb +40 -0
  133. data/test/transport/test_packet_stream.rb +1745 -0
  134. data/test/transport/test_server_version.rb +78 -0
  135. data/test/transport/test_session.rb +315 -0
  136. data/test/transport/test_state.rb +179 -0
  137. metadata +208 -0
@@ -0,0 +1,106 @@
1
+ require 'openssl'
2
+ require 'net/ssh/transport/ctr.rb'
3
+ require 'net/ssh/transport/key_expander'
4
+ require 'net/ssh/transport/identity_cipher'
5
+
6
+ module Net; module SSH; module Transport
7
+
8
+ # Implements a factory of OpenSSL cipher algorithms.
9
+ class CipherFactory
10
+ # Maps the SSH name of a cipher to it's corresponding OpenSSL name
11
+ SSH_TO_OSSL = {
12
+ "3des-cbc" => "des-ede3-cbc",
13
+ "blowfish-cbc" => "bf-cbc",
14
+ "aes256-cbc" => "aes-256-cbc",
15
+ "aes192-cbc" => "aes-192-cbc",
16
+ "aes128-cbc" => "aes-128-cbc",
17
+ "idea-cbc" => "idea-cbc",
18
+ "cast128-cbc" => "cast-cbc",
19
+ "rijndael-cbc@lysator.liu.se" => "aes-256-cbc",
20
+ "arcfour128" => "rc4",
21
+ "arcfour256" => "rc4",
22
+ "arcfour512" => "rc4",
23
+ "arcfour" => "rc4",
24
+ "camellia128-cbc" => "camellia-128-cbc",
25
+ "camellia192-cbc" => "camellia-192-cbc",
26
+ "camellia256-cbc" => "camellia-256-cbc",
27
+ "camellia128-cbc@openssh.org" => "camellia-128-cbc",
28
+ "camellia192-cbc@openssh.org" => "camellia-192-cbc",
29
+ "camellia256-cbc@openssh.org" => "camellia-256-cbc",
30
+
31
+ "3des-ctr" => "des-ede3",
32
+ "blowfish-ctr" => "bf-ecb",
33
+ "aes256-ctr" => "aes-256-ecb",
34
+ "aes192-ctr" => "aes-192-ecb",
35
+ "aes128-ctr" => "aes-128-ecb",
36
+ "cast128-ctr" => "cast5-ecb",
37
+ "camellia128-ctr" => "camellia-128-ecb",
38
+ "camellia192-ctr" => "camellia-192-ecb",
39
+ "camellia256-ctr" => "camellia-256-ecb",
40
+ "camellia128-ctr@openssh.org" => "camellia-128-ecb",
41
+ "camellia192-ctr@openssh.org" => "camellia-192-ecb",
42
+ "camellia256-ctr@openssh.org" => "camellia-256-ecb",
43
+
44
+ "none" => "none",
45
+ }
46
+
47
+ # Ruby's OpenSSL bindings always return a key length of 16 for RC4 ciphers
48
+ # resulting in the error: OpenSSL::CipherError: key length too short.
49
+ # The following ciphers will override this key length.
50
+ KEY_LEN_OVERRIDE = {
51
+ "arcfour256" => 32,
52
+ "arcfour512" => 64
53
+ }
54
+
55
+
56
+ # Returns true if the underlying OpenSSL library supports the given cipher,
57
+ # and false otherwise.
58
+ def self.supported?(name)
59
+ ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
60
+ return true if ossl_name == "none"
61
+ return OpenSSL::Cipher.ciphers.include?(ossl_name)
62
+ end
63
+
64
+ # Retrieves a new instance of the named algorithm. The new instance
65
+ # will be initialized using an iv and key generated from the given
66
+ # iv, key, shared, hash and digester values. Additionally, the
67
+ # cipher will be put into encryption or decryption mode, based on the
68
+ # value of the +encrypt+ parameter.
69
+ def self.get(name, options={})
70
+ ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
71
+ return IdentityCipher if ossl_name == "none"
72
+ cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
73
+
74
+ cipher.send(options[:encrypt] ? :encrypt : :decrypt)
75
+
76
+ cipher.padding = 0
77
+
78
+ cipher.extend(Net::SSH::Transport::CTR) if (name =~ /-ctr(@openssh.org)?$/)
79
+
80
+ cipher.iv = Net::SSH::Transport::KeyExpander.expand_key(cipher.iv_len, options[:iv], options) if ossl_name != "rc4"
81
+
82
+ key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
83
+ cipher.key_len = key_len
84
+ cipher.key = Net::SSH::Transport::KeyExpander.expand_key(key_len, options[:key], options)
85
+ cipher.update(" " * 1536) if (ossl_name == "rc4" && name != "arcfour")
86
+
87
+ return cipher
88
+ end
89
+
90
+ # Returns a two-element array containing the [ key-length,
91
+ # block-size ] for the named cipher algorithm. If the cipher
92
+ # algorithm is unknown, or is "none", 0 is returned for both elements
93
+ # of the tuple.
94
+ def self.get_lengths(name)
95
+ ossl_name = SSH_TO_OSSL[name]
96
+ return [0, 0] if ossl_name.nil? || ossl_name == "none"
97
+
98
+ cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
99
+ key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
100
+ cipher.key_len = key_len
101
+
102
+ return [key_len, ossl_name=="rc4" ? 8 : cipher.block_size]
103
+ end
104
+ end
105
+
106
+ end; end; end
@@ -0,0 +1,32 @@
1
+ module Net; module SSH; module Transport
2
+ module Constants
3
+
4
+ #--
5
+ # Transport layer generic messages
6
+ #++
7
+
8
+ DISCONNECT = 1
9
+ IGNORE = 2
10
+ UNIMPLEMENTED = 3
11
+ DEBUG = 4
12
+ SERVICE_REQUEST = 5
13
+ SERVICE_ACCEPT = 6
14
+
15
+ #--
16
+ # Algorithm negotiation messages
17
+ #++
18
+
19
+ KEXINIT = 20
20
+ NEWKEYS = 21
21
+
22
+ #--
23
+ # Key exchange method specific messages
24
+ #++
25
+
26
+ KEXDH_INIT = 30
27
+ KEXDH_REPLY = 31
28
+
29
+ KEXECDH_INIT = 30
30
+ KEXECDH_REPLY = 31
31
+ end
32
+ end; end; end
@@ -0,0 +1,95 @@
1
+ require 'openssl'
2
+
3
+ module Net::SSH::Transport
4
+
5
+ # Pure-Ruby implementation of Stateful Decryption Counter(SDCTR) Mode
6
+ # for Block Ciphers. See RFC4344 for detail.
7
+ module CTR
8
+ def self.extended(orig)
9
+ orig.instance_eval {
10
+ @remaining = ""
11
+ @counter = nil
12
+ @counter_len = orig.block_size
13
+ orig.encrypt
14
+ orig.padding = 0
15
+ }
16
+
17
+ class <<orig
18
+ alias :_update :update
19
+ private :_update
20
+ undef :update
21
+
22
+ def iv
23
+ @counter
24
+ end
25
+
26
+ def iv_len
27
+ block_size
28
+ end
29
+
30
+ def iv=(iv_s)
31
+ @counter = iv_s if @counter.nil?
32
+ end
33
+
34
+ def encrypt
35
+ # DO NOTHING (always set to "encrypt")
36
+ end
37
+
38
+ def decrypt
39
+ # DO NOTHING (always set to "encrypt")
40
+ end
41
+
42
+ def padding=(pad)
43
+ # DO NOTHING (always 0)
44
+ end
45
+
46
+ def reset
47
+ @remaining = ""
48
+ end
49
+
50
+ def update(data)
51
+ @remaining += data
52
+
53
+ encrypted = ""
54
+
55
+ while @remaining.bytesize >= block_size
56
+ encrypted += xor!(@remaining.slice!(0, block_size),
57
+ _update(@counter))
58
+ increment_counter!
59
+ end
60
+
61
+ encrypted
62
+ end
63
+
64
+ def final
65
+ unless @remaining.empty?
66
+ s = xor!(@remaining, _update(@counter))
67
+ else
68
+ s = ""
69
+ end
70
+
71
+ @remaining = ""
72
+
73
+ s
74
+ end
75
+
76
+ private
77
+
78
+ def xor!(s1, s2)
79
+ s = []
80
+ s1.unpack('Q*').zip(s2.unpack('Q*')) {|a,b| s.push(a^b) }
81
+ s.pack('Q*')
82
+ end
83
+
84
+ def increment_counter!
85
+ c = @counter_len
86
+ while ((c -= 1) > 0)
87
+ if @counter.setbyte(c, (@counter.getbyte(c) + 1) & 0xff) != 0
88
+ break
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,45 @@
1
+ require 'net/ssh/transport/key_expander'
2
+ require 'net/ssh/transport/hmac/md5'
3
+ require 'net/ssh/transport/hmac/md5_96'
4
+ require 'net/ssh/transport/hmac/sha1'
5
+ require 'net/ssh/transport/hmac/sha1_96'
6
+ require 'net/ssh/transport/hmac/sha2_256'
7
+ require 'net/ssh/transport/hmac/sha2_256_96'
8
+ require 'net/ssh/transport/hmac/sha2_512'
9
+ require 'net/ssh/transport/hmac/sha2_512_96'
10
+ require 'net/ssh/transport/hmac/ripemd160'
11
+ require 'net/ssh/transport/hmac/none'
12
+
13
+ # Implements a simple factory interface for fetching hmac implementations, or
14
+ # for finding the key lengths for hmac implementations.s
15
+ module Net::SSH::Transport::HMAC
16
+ # The mapping of SSH hmac algorithms to their implementations
17
+ MAP = {
18
+ 'hmac-md5' => MD5,
19
+ 'hmac-md5-96' => MD5_96,
20
+ 'hmac-sha1' => SHA1,
21
+ 'hmac-sha1-96' => SHA1_96,
22
+ 'hmac-ripemd160' => RIPEMD160,
23
+ 'hmac-ripemd160@openssh.com' => RIPEMD160,
24
+ 'none' => None
25
+ }
26
+
27
+ # add mapping to sha2 hmac algorithms if they're available
28
+ MAP['hmac-sha2-256'] = SHA2_256 if defined?(::Net::SSH::Transport::HMAC::SHA2_256)
29
+ MAP['hmac-sha2-256-96'] = SHA2_256_96 if defined?(::Net::SSH::Transport::HMAC::SHA2_256_96)
30
+ MAP['hmac-sha2-512'] = SHA2_512 if defined?(::Net::SSH::Transport::HMAC::SHA2_512)
31
+ MAP['hmac-sha2-512-96'] = SHA2_512_96 if defined?(::Net::SSH::Transport::HMAC::SHA2_512_96)
32
+
33
+ # Retrieves a new hmac instance of the given SSH type (+name+). If +key+ is
34
+ # given, the new instance will be initialized with that key.
35
+ def self.get(name, key="", parameters = {})
36
+ impl = MAP[name] or raise ArgumentError, "hmac not found: #{name.inspect}"
37
+ impl.new(Net::SSH::Transport::KeyExpander.expand_key(impl.key_length, key, parameters))
38
+ end
39
+
40
+ # Retrieves the key length for the hmac of the given SSH type (+name+).
41
+ def self.key_length(name)
42
+ impl = MAP[name] or raise ArgumentError, "hmac not found: #{name.inspect}"
43
+ impl.key_length
44
+ end
45
+ end
@@ -0,0 +1,79 @@
1
+ require 'openssl'
2
+ require 'openssl/digest'
3
+
4
+ module Net; module SSH; module Transport; module HMAC
5
+
6
+ # The base class of all OpenSSL-based HMAC algorithm wrappers.
7
+ class Abstract
8
+
9
+ class <<self
10
+ def key_length(*v)
11
+ @key_length = nil if !defined?(@key_length)
12
+ if v.empty?
13
+ @key_length = superclass.key_length if @key_length.nil? && superclass.respond_to?(:key_length)
14
+ return @key_length
15
+ elsif v.length == 1
16
+ @key_length = v.first
17
+ else
18
+ raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
19
+ end
20
+ end
21
+
22
+ def mac_length(*v)
23
+ @mac_length = nil if !defined?(@mac_length)
24
+ if v.empty?
25
+ @mac_length = superclass.mac_length if @mac_length.nil? && superclass.respond_to?(:mac_length)
26
+ return @mac_length
27
+ elsif v.length == 1
28
+ @mac_length = v.first
29
+ else
30
+ raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
31
+ end
32
+ end
33
+
34
+ def digest_class(*v)
35
+ @digest_class = nil if !defined?(@digest_class)
36
+ if v.empty?
37
+ @digest_class = superclass.digest_class if @digest_class.nil? && superclass.respond_to?(:digest_class)
38
+ return @digest_class
39
+ elsif v.length == 1
40
+ @digest_class = v.first
41
+ else
42
+ raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
43
+ end
44
+ end
45
+ end
46
+
47
+ def key_length
48
+ self.class.key_length
49
+ end
50
+
51
+ def mac_length
52
+ self.class.mac_length
53
+ end
54
+
55
+ def digest_class
56
+ self.class.digest_class
57
+ end
58
+
59
+ # The key in use for this instance.
60
+ attr_reader :key
61
+
62
+ def initialize(key=nil)
63
+ self.key = key
64
+ end
65
+
66
+ # Sets the key to the given value, truncating it so that it is the correct
67
+ # length.
68
+ def key=(value)
69
+ @key = value ? value.to_s[0,key_length] : nil
70
+ end
71
+
72
+ # Compute the HMAC digest for the given data string.
73
+ def digest(data)
74
+ OpenSSL::HMAC.digest(digest_class.new, key, data)[0,mac_length]
75
+ end
76
+
77
+ end
78
+
79
+ end; end; end; end
@@ -0,0 +1,12 @@
1
+ require 'net/ssh/transport/hmac/abstract'
2
+
3
+ module Net::SSH::Transport::HMAC
4
+
5
+ # The MD5 HMAC algorithm.
6
+ class MD5 < Abstract
7
+ mac_length 16
8
+ key_length 16
9
+ digest_class OpenSSL::Digest::MD5
10
+ end
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ require 'net/ssh/transport/hmac/md5'
2
+
3
+ module Net::SSH::Transport::HMAC
4
+
5
+ # The MD5-96 HMAC algorithm. This returns only the first 12 bytes of
6
+ # the digest.
7
+ class MD5_96 < MD5
8
+ mac_length 12
9
+ end
10
+
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'net/ssh/transport/hmac/abstract'
2
+
3
+ module Net::SSH::Transport::HMAC
4
+
5
+ # The "none" algorithm. This has a key and mac length of 0.
6
+ class None < Abstract
7
+ key_length 0
8
+ mac_length 0
9
+
10
+ def digest(data)
11
+ ""
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'net/ssh/transport/hmac/abstract'
2
+
3
+ module Net::SSH::Transport::HMAC
4
+
5
+ # The RIPEMD-160 HMAC algorithm. This has a mac and key length of 20, and
6
+ # uses the RIPEMD-160 digest algorithm.
7
+ class RIPEMD160 < Abstract
8
+ mac_length 20
9
+ key_length 20
10
+ digest_class OpenSSL::Digest::RIPEMD160
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'net/ssh/transport/hmac/abstract'
2
+
3
+ module Net::SSH::Transport::HMAC
4
+
5
+ # The SHA1 HMAC algorithm. This has a mac and key length of 20, and
6
+ # uses the SHA1 digest algorithm.
7
+ class SHA1 < Abstract
8
+ mac_length 20
9
+ key_length 20
10
+ digest_class OpenSSL::Digest::SHA1
11
+ end
12
+
13
+ end
@@ -0,0 +1,11 @@
1
+ require 'net/ssh/transport/hmac/sha1'
2
+
3
+ module Net::SSH::Transport::HMAC
4
+
5
+ # The SHA1-96 HMAC algorithm. This returns only the first 12 bytes of
6
+ # the digest.
7
+ class SHA1_96 < SHA1
8
+ mac_length 12
9
+ end
10
+
11
+ end