1
require 'net/ssh/errors'
2
require 'net/ssh/transport/constants'
3
require 'net/ssh/transport/kex/diffie_hellman_group1_sha1'
5
module Net::SSH::Transport::Kex
7
# A key-exchange service implementing the
8
# "diffie-hellman-group-exchange-sha1" key-exchange algorithm.
9
class DiffieHellmanGroupExchangeSHA1 < DiffieHellmanGroup1SHA1
16
KEXDH_GEX_REQUEST = 34
20
# Compute the number of bits needed for the given number of bytes.
22
need_bits = data[:need_bytes] * 8
23
if need_bits < MINIMUM_BITS
24
need_bits = MINIMUM_BITS
25
elsif need_bits > MAXIMUM_BITS
26
need_bits = MAXIMUM_BITS
29
data[:need_bits ] = need_bits
30
data[:need_bytes] = need_bits / 8
33
# Returns the DH key parameters for the given session.
37
# request the DH key parameters for the given number of bits.
38
buffer = Net::SSH::Buffer.from(:byte, KEXDH_GEX_REQUEST, :long, MINIMUM_BITS,
39
:long, data[:need_bits], :long, MAXIMUM_BITS)
40
connection.send_message(buffer)
42
buffer = connection.next_message
43
unless buffer.type == KEXDH_GEX_GROUP
44
raise Net::SSH::Exception, "expected KEXDH_GEX_GROUP, got #{buffer.type}"
47
p = buffer.read_bignum
48
g = buffer.read_bignum
53
# Returns the INIT/REPLY constants used by this algorithm.
55
[KEXDH_GEX_INIT, KEXDH_GEX_REPLY]
58
# Build the signature buffer to use when verifying a signature from
60
def build_signature_buffer(result)
61
response = Net::SSH::Buffer.new
62
response.write_string data[:client_version_string],
63
data[:server_version_string],
64
data[:client_algorithm_packet],
65
data[:server_algorithm_packet],
67
response.write_long MINIMUM_BITS,
70
response.write_bignum dh.p, dh.g, dh.pub_key,
71
result[:server_dh_pubkey],
72
result[:shared_secret]
b'\\ No newline at end of file'