module HrrRbSsh::Transport::KexAlgorithm::DiffieHellman
Public Class Methods
new(logger: nil)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 16 def initialize logger: nil self.logger = logger @dh = OpenSSL::PKey::DH.new if @dh.respond_to?(:set_pqg) @dh.set_pqg OpenSSL::BN.new(self.class::P, 16), nil, OpenSSL::BN.new(self.class::G) else @dh.p = OpenSSL::BN.new(self.class::P, 16) @dh.g = OpenSSL::BN.new(self.class::G) end @dh.generate_key! @public_key = @dh.pub_key.to_i end
Public Instance Methods
hash(transport)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 52 def hash transport h0_payload = { :'V_C' => transport.v_c, :'V_S' => transport.v_s, :'I_C' => transport.i_c, :'I_S' => transport.i_s, :'K_S' => @k_s, :'e' => @e, :'f' => @f, :'k' => @shared_secret, } h0 = H0.new(logger: logger).encode h0_payload h = OpenSSL::Digest.digest self.class::DIGEST, h0 end
receive_kexdh_init(payload)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 72 def receive_kexdh_init payload Message::SSH_MSG_KEXDH_INIT.new(logger: logger).decode payload end
receive_kexdh_reply(payload)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 96 def receive_kexdh_reply payload Message::SSH_MSG_KEXDH_REPLY.new(logger: logger).decode payload end
send_kexdh_init(transport)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 87 def send_kexdh_init transport message = { :'message number' => Message::SSH_MSG_KEXDH_INIT::VALUE, :'e' => @e, } payload = Message::SSH_MSG_KEXDH_INIT.new(logger: logger).encode message transport.send payload end
send_kexdh_reply(transport)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 76 def send_kexdh_reply transport message = { :'message number' => Message::SSH_MSG_KEXDH_REPLY::VALUE, :'server public host key and certificates (K_S)' => @k_s, :'f' => @f, :'signature of H' => sign(transport), } payload = Message::SSH_MSG_KEXDH_REPLY.new(logger: logger).encode message transport.send payload end
sign(transport)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 67 def sign transport h = hash transport s = transport.server_host_key_algorithm.sign h end
start(transport)
click to toggle source
# File lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb, line 29 def start transport case transport.mode when Mode::SERVER @k_s = transport.server_host_key_algorithm.server_public_host_key @f = @public_key message = receive_kexdh_init transport.receive @e = message[:'e'] @shared_secret = OpenSSL::BN.new(@dh.compute_key(OpenSSL::BN.new(@e)), 2).to_i send_kexdh_reply transport when Mode::CLIENT @e = @public_key send_kexdh_init transport message = receive_kexdh_reply transport.receive @k_s = message[:'server public host key and certificates (K_S)'] @f = message[:'f'] @shared_secret = OpenSSL::BN.new(@dh.compute_key(OpenSSL::BN.new(@f)), 2).to_i end end