Module: HrrRbSsh::Transport::KexAlgorithm::DiffieHellman
Defined Under Namespace
Classes: H0
Instance Attribute Summary
Attributes included from Loggable
#log_key, #logger
Instance Method Summary
collapse
#build_key, #iv_c_to_s, #iv_s_to_c, #key_c_to_s, #key_s_to_c, #mac_c_to_s, #mac_s_to_c
Methods included from Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn
Instance Method Details
#hash(transport) ⇒ Object
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# 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
|
#initialize(logger: nil) ⇒ Object
16
17
18
19
20
21
22
23
24
25
26
27
|
# 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
|
#receive_kexdh_init(payload) ⇒ Object
72
73
74
|
# 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) ⇒ Object
96
97
98
|
# 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) ⇒ Object
87
88
89
90
91
92
93
94
|
# 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) ⇒ Object
76
77
78
79
80
81
82
83
84
85
|
# 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
|
#shared_secret ⇒ Object
48
49
50
|
# File 'lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb', line 48
def shared_secret
@shared_secret
end
|
#sign(transport) ⇒ Object
67
68
69
70
|
# 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) ⇒ Object
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# 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
|