hrr_rb_ssh 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/demo/server.rb +5 -97
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/public_key_blob.rb +30 -0
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature.rb +27 -0
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature_blob.rb +33 -0
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb +8 -31
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/public_key_blob.rb +28 -0
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature.rb +27 -0
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature_blob.rb +33 -0
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb +8 -29
- data/lib/hrr_rb_ssh/codable.rb +64 -0
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb +50 -0
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change.rb +33 -0
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type.rb +1 -0
- data/lib/hrr_rb_ssh/connection/request_handler/reference_env_request_handler.rb +21 -0
- data/lib/hrr_rb_ssh/connection/request_handler/reference_exec_request_handler.rb +28 -0
- data/lib/hrr_rb_ssh/connection/request_handler/reference_pty_req_request_handler.rb +32 -0
- data/lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb +81 -0
- data/lib/hrr_rb_ssh/connection/request_handler/reference_window_change_request_handler.rb +21 -0
- data/lib/hrr_rb_ssh/connection/request_handler.rb +6 -0
- data/lib/hrr_rb_ssh/message/001_ssh_msg_disconnect.rb +1 -1
- data/lib/hrr_rb_ssh/message/002_ssh_msg_ignore.rb +1 -1
- data/lib/hrr_rb_ssh/message/003_ssh_msg_unimplemented.rb +1 -1
- data/lib/hrr_rb_ssh/message/004_ssh_msg_debug.rb +1 -1
- data/lib/hrr_rb_ssh/message/005_ssh_msg_service_request.rb +1 -1
- data/lib/hrr_rb_ssh/message/006_ssh_msg_service_accept.rb +1 -1
- data/lib/hrr_rb_ssh/message/020_ssh_msg_kexinit.rb +1 -1
- data/lib/hrr_rb_ssh/message/021_ssh_msg_newkeys.rb +1 -1
- data/lib/hrr_rb_ssh/message/030_ssh_msg_kex_dh_gex_request_old.rb +24 -0
- data/lib/hrr_rb_ssh/message/030_ssh_msg_kexdh_init.rb +1 -1
- data/lib/hrr_rb_ssh/message/031_ssh_msg_kex_dh_gex_group.rb +25 -0
- data/lib/hrr_rb_ssh/message/031_ssh_msg_kexdh_reply.rb +1 -1
- data/lib/hrr_rb_ssh/message/032_ssh_msg_kex_dh_gex_init.rb +24 -0
- data/lib/hrr_rb_ssh/message/033_ssh_msg_kex_dh_gex_reply.rb +26 -0
- data/lib/hrr_rb_ssh/message/034_ssh_msg_kex_dh_gex_request.rb +26 -0
- data/lib/hrr_rb_ssh/message/050_ssh_msg_userauth_request.rb +1 -1
- data/lib/hrr_rb_ssh/message/051_ssh_msg_userauth_failure.rb +1 -1
- data/lib/hrr_rb_ssh/message/052_ssh_msg_userauth_success.rb +1 -1
- data/lib/hrr_rb_ssh/message/060_ssh_msg_userauth_pk_ok.rb +1 -1
- data/lib/hrr_rb_ssh/message/080_ssh_msg_global_request.rb +1 -1
- data/lib/hrr_rb_ssh/message/081_ssh_msg_request_success.rb +1 -1
- data/lib/hrr_rb_ssh/message/082_ssh_msg_request_failure.rb +1 -1
- data/lib/hrr_rb_ssh/message/090_ssh_msg_channel_open.rb +1 -1
- data/lib/hrr_rb_ssh/message/091_ssh_msg_channel_open_confirmation.rb +1 -1
- data/lib/hrr_rb_ssh/message/092_ssh_msg_channel_open_failure.rb +1 -1
- data/lib/hrr_rb_ssh/message/093_ssh_msg_channel_window_adjust.rb +1 -1
- data/lib/hrr_rb_ssh/message/094_ssh_msg_channel_data.rb +1 -1
- data/lib/hrr_rb_ssh/message/095_ssh_msg_channel_extended_data.rb +1 -1
- data/lib/hrr_rb_ssh/message/096_ssh_msg_channel_eof.rb +1 -1
- data/lib/hrr_rb_ssh/message/097_ssh_msg_channel_close.rb +1 -1
- data/lib/hrr_rb_ssh/message/098_ssh_msg_channel_request.rb +1 -1
- data/lib/hrr_rb_ssh/message/099_ssh_msg_channel_success.rb +1 -1
- data/lib/hrr_rb_ssh/message/100_ssh_msg_channel_failure.rb +1 -1
- data/lib/hrr_rb_ssh/message.rb +5 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman/h0.rb +29 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +28 -18
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha256.rb +35 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group15_sha512.rb +35 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group16_sha512.rb +41 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group17_sha512.rb +47 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group18_sha512.rb +62 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange/h0.rb +34 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb +170 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha1.rb +17 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha256.rb +17 -0
- data/lib/hrr_rb_ssh/transport/kex_algorithm.rb +7 -0
- data/lib/hrr_rb_ssh/transport/receiver.rb +16 -14
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/public_key_blob.rb +26 -0
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/signature.rb +23 -0
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb +11 -39
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/public_key_blob.rb +25 -0
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/signature.rb +23 -0
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb +11 -38
- data/lib/hrr_rb_ssh/transport.rb +9 -29
- data/lib/hrr_rb_ssh/version.rb +1 -1
- metadata +35 -4
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/codable.rb +0 -33
- data/lib/hrr_rb_ssh/message/codable.rb +0 -66
@@ -9,17 +9,6 @@ module HrrRbSsh
|
|
9
9
|
class Transport
|
10
10
|
class KexAlgorithm
|
11
11
|
module DiffieHellman
|
12
|
-
H0_DEFINITION = [
|
13
|
-
[DataType::String, 'V_C'],
|
14
|
-
[DataType::String, 'V_S'],
|
15
|
-
[DataType::String, 'I_C'],
|
16
|
-
[DataType::String, 'I_S'],
|
17
|
-
[DataType::String, 'K_S'],
|
18
|
-
[DataType::Mpint, 'e'],
|
19
|
-
[DataType::Mpint, 'f'],
|
20
|
-
[DataType::Mpint, 'k'],
|
21
|
-
]
|
22
|
-
|
23
12
|
def initialize
|
24
13
|
@logger = HrrRbSsh::Logger.new(self.class.name)
|
25
14
|
@dh = OpenSSL::PKey::DH.new
|
@@ -32,11 +21,14 @@ module HrrRbSsh
|
|
32
21
|
@dh.generate_key!
|
33
22
|
end
|
34
23
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
24
|
+
def start transport, mode
|
25
|
+
case mode
|
26
|
+
when HrrRbSsh::Transport::Mode::SERVER
|
27
|
+
receive_kexdh_init transport.receive
|
28
|
+
send_kexdh_reply transport
|
29
|
+
else
|
30
|
+
raise "unsupported mode"
|
31
|
+
end
|
40
32
|
end
|
41
33
|
|
42
34
|
def set_e e
|
@@ -66,7 +58,7 @@ module HrrRbSsh
|
|
66
58
|
'f' => f,
|
67
59
|
'k' => k,
|
68
60
|
}
|
69
|
-
h0 = encode
|
61
|
+
h0 = H0.encode h0_payload
|
70
62
|
|
71
63
|
h = OpenSSL::Digest.digest self.class::DIGEST, h0
|
72
64
|
|
@@ -75,7 +67,7 @@ module HrrRbSsh
|
|
75
67
|
|
76
68
|
def sign transport
|
77
69
|
h = hash transport
|
78
|
-
s = transport.server_host_key_algorithm.sign
|
70
|
+
s = transport.server_host_key_algorithm.sign h
|
79
71
|
|
80
72
|
s
|
81
73
|
end
|
@@ -122,7 +114,25 @@ module HrrRbSsh
|
|
122
114
|
key_length = HrrRbSsh::Transport::MacAlgorithm[mac_algorithm_s_to_c_name]::KEY_LENGTH
|
123
115
|
build_key(shared_secret, hash(transport), 'F'.ord, transport.session_id, key_length)
|
124
116
|
end
|
117
|
+
|
118
|
+
def receive_kexdh_init payload
|
119
|
+
message = HrrRbSsh::Message::SSH_MSG_KEXDH_INIT.decode payload
|
120
|
+
set_e message['e']
|
121
|
+
end
|
122
|
+
|
123
|
+
def send_kexdh_reply transport
|
124
|
+
message = {
|
125
|
+
'message number' => HrrRbSsh::Message::SSH_MSG_KEXDH_REPLY::VALUE,
|
126
|
+
'server public host key and certificates (K_S)' => transport.server_host_key_algorithm.server_public_host_key,
|
127
|
+
'f' => pub_key,
|
128
|
+
'signature of H' => sign(transport),
|
129
|
+
}
|
130
|
+
payload = HrrRbSsh::Message::SSH_MSG_KEXDH_REPLY.encode message
|
131
|
+
transport.send payload
|
132
|
+
end
|
125
133
|
end
|
126
134
|
end
|
127
135
|
end
|
128
136
|
end
|
137
|
+
|
138
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman/h0'
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroup14Sha256 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group14-sha256'
|
11
|
+
PREFERENCE = 50
|
12
|
+
DIGEST = 'sha256'
|
13
|
+
P = \
|
14
|
+
"FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" \
|
15
|
+
"C4C6628B" "80DC1CD1" "29024E08" "8A67CC74" \
|
16
|
+
"020BBEA6" "3B139B22" "514A0879" "8E3404DD" \
|
17
|
+
"EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" \
|
18
|
+
"4FE1356D" "6D51C245" "E485B576" "625E7EC6" \
|
19
|
+
"F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED" \
|
20
|
+
"EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" \
|
21
|
+
"49286651" "ECE45B3D" "C2007CB8" "A163BF05" \
|
22
|
+
"98DA4836" "1C55D39A" "69163FA8" "FD24CF5F" \
|
23
|
+
"83655D23" "DCA3AD96" "1C62F356" "208552BB" \
|
24
|
+
"9ED52907" "7096966D" "670C354E" "4ABC9804" \
|
25
|
+
"F1746C08" "CA18217C" "32905E46" "2E36CE3B" \
|
26
|
+
"E39E772C" "180E8603" "9B2783A2" "EC07A28F" \
|
27
|
+
"B5C55DF0" "6F4C52C9" "DE2BCBF6" "95581718" \
|
28
|
+
"3995497C" "EA956AE5" "15D22618" "98FA0510" \
|
29
|
+
"15728E5A" "8AACAA68" "FFFFFFFF" "FFFFFFFF"
|
30
|
+
G = 2
|
31
|
+
include DiffieHellman
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroup15Sha512 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group15-sha512'
|
11
|
+
PREFERENCE = 60
|
12
|
+
DIGEST = 'sha512'
|
13
|
+
P = \
|
14
|
+
"FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1" \
|
15
|
+
"29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD" \
|
16
|
+
"EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245" \
|
17
|
+
"E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED" \
|
18
|
+
"EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D" \
|
19
|
+
"C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F" \
|
20
|
+
"83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D" \
|
21
|
+
"670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B" \
|
22
|
+
"E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9" \
|
23
|
+
"DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510" \
|
24
|
+
"15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64" \
|
25
|
+
"ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7" \
|
26
|
+
"ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B" \
|
27
|
+
"F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C" \
|
28
|
+
"BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31" \
|
29
|
+
"43DB5BFC" "E0FD108E" "4B82D120" "A93AD2CA" "FFFFFFFF" "FFFFFFFF"
|
30
|
+
G = 2
|
31
|
+
include DiffieHellman
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroup16Sha512 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group16-sha512'
|
11
|
+
PREFERENCE = 70
|
12
|
+
DIGEST = 'sha512'
|
13
|
+
P = \
|
14
|
+
"FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1" \
|
15
|
+
"29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD" \
|
16
|
+
"EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245" \
|
17
|
+
"E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED" \
|
18
|
+
"EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D" \
|
19
|
+
"C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F" \
|
20
|
+
"83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D" \
|
21
|
+
"670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B" \
|
22
|
+
"E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9" \
|
23
|
+
"DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510" \
|
24
|
+
"15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64" \
|
25
|
+
"ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7" \
|
26
|
+
"ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B" \
|
27
|
+
"F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C" \
|
28
|
+
"BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31" \
|
29
|
+
"43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7" \
|
30
|
+
"88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA" \
|
31
|
+
"2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6" \
|
32
|
+
"287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED" \
|
33
|
+
"1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9" \
|
34
|
+
"93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34063199" \
|
35
|
+
"FFFFFFFF" "FFFFFFFF"
|
36
|
+
G = 2
|
37
|
+
include DiffieHellman
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroup17Sha512 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group17-sha512'
|
11
|
+
PREFERENCE = 80
|
12
|
+
DIGEST = 'sha512'
|
13
|
+
P = \
|
14
|
+
"FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1 29024E08" \
|
15
|
+
"8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD" "EF9519B3 CD3A431B" \
|
16
|
+
"302B0A6D" "F25F1437" "4FE1356D" "6D51C245" "E485B576" "625E7EC6 F44C42E9" \
|
17
|
+
"A637ED6B" "0BFF5CB6" "F406B7ED" "EE386BFB" "5A899FA5" "AE9F2411 7C4B1FE6" \
|
18
|
+
"49286651" "ECE45B3D" "C2007CB8" "A163BF05" "98DA4836" "1C55D39A 69163FA8" \
|
19
|
+
"FD24CF5F" "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907 7096966D" \
|
20
|
+
"670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B E39E772C" \
|
21
|
+
"180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9" "DE2BCBF6 95581718" \
|
22
|
+
"3995497C" "EA956AE5" "15D22618" "98FA0510" "15728E5A" "8AAAC42D AD33170D" \
|
23
|
+
"04507A33" "A85521AB" "DF1CBA64" "ECFB8504" "58DBEF0A" "8AEA7157 5D060C7D" \
|
24
|
+
"B3970F85" "A6E1E4C7" "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D CEE3D226" \
|
25
|
+
"1AD2EE6B" "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18 177B200C" \
|
26
|
+
"BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31 43DB5BFC" \
|
27
|
+
"E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7" "88719A10 BDBA5B26" \
|
28
|
+
"99C32718" "6AF4E23C" "1A946834" "B6150BDA" "2583E9CA" "2AD44CE8 DBBBC2DB" \
|
29
|
+
"04DE8EF9" "2E8EFC14" "1FBECAA6" "287C5947" "4E6BC05D" "99B2964F A090C3A2" \
|
30
|
+
"233BA186" "515BE7ED" "1F612970" "CEE2D7AF" "B81BDD76" "2170481C D0069127" \
|
31
|
+
"D5B05AA9" "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9 34028492" \
|
32
|
+
"36C3FAB4" "D27C7026" "C1D4DCB2" "602646DE" "C9751E76" "3DBA37BD F8FF9406" \
|
33
|
+
"AD9E530E" "E5DB382F" "413001AE" "B06A53ED" "9027D831" "179727B0 865A8918" \
|
34
|
+
"DA3EDBEB" "CF9B14ED" "44CE6CBA" "CED4BB1B" "DB7F1447" "E6CC254B 33205151" \
|
35
|
+
"2BD7AF42" "6FB8F401" "378CD2BF" "5983CA01" "C64B92EC" "F032EA15 D1721D03" \
|
36
|
+
"F482D7CE" "6E74FEF6" "D55E702F" "46980C82" "B5A84031" "900B1C9E 59E7C97F" \
|
37
|
+
"BEC7E8F3" "23A97A7E" "36CC88BE" "0F1D45B7" "FF585AC5" "4BD407B2 2B4154AA" \
|
38
|
+
"CC8F6D7E" "BF48E1D8" "14CC5ED2" "0F8037E0" "A79715EE" "F29BE328 06A1D58B" \
|
39
|
+
"B7C5DA76" "F550AA3D" "8A1FBFF0" "EB19CCB1" "A313D55C" "DA56C9EC 2EF29632" \
|
40
|
+
"387FE8D7" "6E3C0468" "043E8F66" "3F4860EE" "12BF2D5B" "0B7474D6 E694F91E" \
|
41
|
+
"6DCC4024" "FFFFFFFF" "FFFFFFFF"
|
42
|
+
G = 2
|
43
|
+
include DiffieHellman
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroup18Sha512 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group18-sha512'
|
11
|
+
PREFERENCE = 90
|
12
|
+
DIGEST = 'sha512'
|
13
|
+
P = \
|
14
|
+
"FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1" \
|
15
|
+
"29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD" \
|
16
|
+
"EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245" \
|
17
|
+
"E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED" \
|
18
|
+
"EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D" \
|
19
|
+
"C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F" \
|
20
|
+
"83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D" \
|
21
|
+
"670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B" \
|
22
|
+
"E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9" \
|
23
|
+
"DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510" \
|
24
|
+
"15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64" \
|
25
|
+
"ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7" \
|
26
|
+
"ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B" \
|
27
|
+
"F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C" \
|
28
|
+
"BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31" \
|
29
|
+
"43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7" \
|
30
|
+
"88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA" \
|
31
|
+
"2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6" \
|
32
|
+
"287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED" \
|
33
|
+
"1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9" \
|
34
|
+
"93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34028492" \
|
35
|
+
"36C3FAB4" "D27C7026" "C1D4DCB2" "602646DE" "C9751E76" "3DBA37BD" \
|
36
|
+
"F8FF9406" "AD9E530E" "E5DB382F" "413001AE" "B06A53ED" "9027D831" \
|
37
|
+
"179727B0" "865A8918" "DA3EDBEB" "CF9B14ED" "44CE6CBA" "CED4BB1B" \
|
38
|
+
"DB7F1447" "E6CC254B" "33205151" "2BD7AF42" "6FB8F401" "378CD2BF" \
|
39
|
+
"5983CA01" "C64B92EC" "F032EA15" "D1721D03" "F482D7CE" "6E74FEF6" \
|
40
|
+
"D55E702F" "46980C82" "B5A84031" "900B1C9E" "59E7C97F" "BEC7E8F3" \
|
41
|
+
"23A97A7E" "36CC88BE" "0F1D45B7" "FF585AC5" "4BD407B2" "2B4154AA" \
|
42
|
+
"CC8F6D7E" "BF48E1D8" "14CC5ED2" "0F8037E0" "A79715EE" "F29BE328" \
|
43
|
+
"06A1D58B" "B7C5DA76" "F550AA3D" "8A1FBFF0" "EB19CCB1" "A313D55C" \
|
44
|
+
"DA56C9EC" "2EF29632" "387FE8D7" "6E3C0468" "043E8F66" "3F4860EE" \
|
45
|
+
"12BF2D5B" "0B7474D6" "E694F91E" "6DBE1159" "74A3926F" "12FEE5E4" \
|
46
|
+
"38777CB6" "A932DF8C" "D8BEC4D0" "73B931BA" "3BC832B6" "8D9DD300" \
|
47
|
+
"741FA7BF" "8AFC47ED" "2576F693" "6BA42466" "3AAB639C" "5AE4F568" \
|
48
|
+
"3423B474" "2BF1C978" "238F16CB" "E39D652D" "E3FDB8BE" "FC848AD9" \
|
49
|
+
"22222E04" "A4037C07" "13EB57A8" "1A23F0C7" "3473FC64" "6CEA306B" \
|
50
|
+
"4BCBC886" "2F8385DD" "FA9D4B7F" "A2C087E8" "79683303" "ED5BDD3A" \
|
51
|
+
"062B3CF5" "B3A278A6" "6D2A13F8" "3F44F82D" "DF310EE0" "74AB6A36" \
|
52
|
+
"4597E899" "A0255DC1" "64F31CC5" "0846851D" "F9AB4819" "5DED7EA1" \
|
53
|
+
"B1D510BD" "7EE74D73" "FAF36BC3" "1ECFA268" "359046F4" "EB879F92" \
|
54
|
+
"4009438B" "481C6CD7" "889A002E" "D5EE382B" "C9190DA6" "FC026E47" \
|
55
|
+
"9558E447" "5677E9AA" "9E3050E2" "765694DF" "C81F56E8" "80B96E71" \
|
56
|
+
"60C980DD" "98EDD3DF" "FFFFFFFF" "FFFFFFFF"
|
57
|
+
G = 2
|
58
|
+
include DiffieHellman
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/data_type'
|
5
|
+
require 'hrr_rb_ssh/codable'
|
6
|
+
|
7
|
+
module HrrRbSsh
|
8
|
+
class Transport
|
9
|
+
class KexAlgorithm
|
10
|
+
module DiffieHellmanGroupExchange
|
11
|
+
module H0
|
12
|
+
class << self
|
13
|
+
include Codable
|
14
|
+
end
|
15
|
+
DEFINITION = [
|
16
|
+
[DataType::String, 'V_C'],
|
17
|
+
[DataType::String, 'V_S'],
|
18
|
+
[DataType::String, 'I_C'],
|
19
|
+
[DataType::String, 'I_S'],
|
20
|
+
[DataType::String, 'K_S'],
|
21
|
+
[DataType::Uint32, 'min'],
|
22
|
+
[DataType::Uint32, 'n'],
|
23
|
+
[DataType::Uint32, 'max'],
|
24
|
+
[DataType::Mpint, 'p'],
|
25
|
+
[DataType::Mpint, 'g'],
|
26
|
+
[DataType::Mpint, 'e'],
|
27
|
+
[DataType::Mpint, 'f'],
|
28
|
+
[DataType::Mpint, 'k'],
|
29
|
+
]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'openssl'
|
5
|
+
require 'hrr_rb_ssh/logger'
|
6
|
+
require 'hrr_rb_ssh/data_type'
|
7
|
+
|
8
|
+
module HrrRbSsh
|
9
|
+
class Transport
|
10
|
+
class KexAlgorithm
|
11
|
+
module DiffieHellmanGroupExchange
|
12
|
+
def initialize
|
13
|
+
@logger = HrrRbSsh::Logger.new(self.class.name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def start transport, mode
|
17
|
+
case mode
|
18
|
+
when HrrRbSsh::Transport::Mode::SERVER
|
19
|
+
receive_kex_dh_gex_request transport.receive
|
20
|
+
set_dh
|
21
|
+
send_kex_dh_gex_group transport
|
22
|
+
receive_kex_dh_gex_init transport.receive
|
23
|
+
send_kex_dh_gex_reply transport
|
24
|
+
else
|
25
|
+
raise "unsupported mode"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_dh
|
30
|
+
p_list = KexAlgorithm.list_supported.map{ |e| KexAlgorithm[e] }.select{ |e| e.const_defined?(:P) }.map{ |e| [OpenSSL::BN.new(e::P,16).num_bits, e::P] }.sort_by{ |e| e[0] }.reverse
|
31
|
+
candidate = p_list.find{ |e| e[0] <= @n }
|
32
|
+
raise unless (@min .. @max).include?(candidate[0])
|
33
|
+
p = candidate[1]
|
34
|
+
g = 2
|
35
|
+
@dh = OpenSSL::PKey::DH.new
|
36
|
+
if @dh.respond_to?(:set_pqg)
|
37
|
+
@dh.set_pqg OpenSSL::BN.new(p, 16), nil, OpenSSL::BN.new(g)
|
38
|
+
else
|
39
|
+
@dh.p = OpenSSL::BN.new(p, 16)
|
40
|
+
@dh.g = OpenSSL::BN.new(g)
|
41
|
+
end
|
42
|
+
@dh.generate_key!
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_e e
|
46
|
+
@e = e
|
47
|
+
end
|
48
|
+
|
49
|
+
def shared_secret
|
50
|
+
k = OpenSSL::BN.new(@dh.compute_key(OpenSSL::BN.new(@e)), 2).to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
def pub_key
|
54
|
+
f = @dh.pub_key.to_i
|
55
|
+
end
|
56
|
+
|
57
|
+
def hash transport
|
58
|
+
e = @e
|
59
|
+
k = shared_secret
|
60
|
+
f = pub_key
|
61
|
+
|
62
|
+
h0_payload = {
|
63
|
+
'V_C' => transport.v_c,
|
64
|
+
'V_S' => transport.v_s,
|
65
|
+
'I_C' => transport.i_c,
|
66
|
+
'I_S' => transport.i_s,
|
67
|
+
'K_S' => transport.server_host_key_algorithm.server_public_host_key,
|
68
|
+
'min' => @min,
|
69
|
+
'n' => @n,
|
70
|
+
'max' => @max,
|
71
|
+
'p' => @dh.p.to_i,
|
72
|
+
'g' => @dh.g.to_i,
|
73
|
+
'e' => e,
|
74
|
+
'f' => f,
|
75
|
+
'k' => k,
|
76
|
+
}
|
77
|
+
h0 = H0.encode h0_payload
|
78
|
+
|
79
|
+
h = OpenSSL::Digest.digest self.class::DIGEST, h0
|
80
|
+
|
81
|
+
h
|
82
|
+
end
|
83
|
+
|
84
|
+
def sign transport
|
85
|
+
h = hash transport
|
86
|
+
s = transport.server_host_key_algorithm.sign h
|
87
|
+
s
|
88
|
+
end
|
89
|
+
|
90
|
+
def build_key(_k, h, _x, session_id, key_length)
|
91
|
+
k = DataType::Mpint.encode _k
|
92
|
+
x = DataType::Byte.encode _x
|
93
|
+
|
94
|
+
key = OpenSSL::Digest.digest(self.class::DIGEST, k + h + x + session_id)
|
95
|
+
|
96
|
+
while key.length < key_length
|
97
|
+
key = key + OpenSSL::Digest.digest(self.class::DIGEST, k + h + key )
|
98
|
+
end
|
99
|
+
|
100
|
+
key[0, key_length]
|
101
|
+
end
|
102
|
+
|
103
|
+
def iv_c_to_s transport, encryption_algorithm_c_to_s_name
|
104
|
+
key_length = HrrRbSsh::Transport::EncryptionAlgorithm[encryption_algorithm_c_to_s_name]::IV_LENGTH
|
105
|
+
build_key(shared_secret, hash(transport), 'A'.ord, transport.session_id, key_length)
|
106
|
+
end
|
107
|
+
|
108
|
+
def iv_s_to_c transport, encryption_algorithm_s_to_c_name
|
109
|
+
key_length = HrrRbSsh::Transport::EncryptionAlgorithm[encryption_algorithm_s_to_c_name]::IV_LENGTH
|
110
|
+
build_key(shared_secret, hash(transport), 'B'.ord, transport.session_id, key_length)
|
111
|
+
end
|
112
|
+
|
113
|
+
def key_c_to_s transport, encryption_algorithm_c_to_s_name
|
114
|
+
key_length = HrrRbSsh::Transport::EncryptionAlgorithm[encryption_algorithm_c_to_s_name]::KEY_LENGTH
|
115
|
+
build_key(shared_secret, hash(transport), 'C'.ord, transport.session_id, key_length)
|
116
|
+
end
|
117
|
+
|
118
|
+
def key_s_to_c transport, encryption_algorithm_s_to_c_name
|
119
|
+
key_length = HrrRbSsh::Transport::EncryptionAlgorithm[encryption_algorithm_s_to_c_name]::KEY_LENGTH
|
120
|
+
build_key(shared_secret, hash(transport), 'D'.ord, transport.session_id, key_length)
|
121
|
+
end
|
122
|
+
|
123
|
+
def mac_c_to_s transport, mac_algorithm_c_to_s_name
|
124
|
+
key_length = HrrRbSsh::Transport::MacAlgorithm[mac_algorithm_c_to_s_name]::KEY_LENGTH
|
125
|
+
build_key(shared_secret, hash(transport), 'E'.ord, transport.session_id, key_length)
|
126
|
+
end
|
127
|
+
|
128
|
+
def mac_s_to_c transport, mac_algorithm_s_to_c_name
|
129
|
+
key_length = HrrRbSsh::Transport::MacAlgorithm[mac_algorithm_s_to_c_name]::KEY_LENGTH
|
130
|
+
build_key(shared_secret, hash(transport), 'F'.ord, transport.session_id, key_length)
|
131
|
+
end
|
132
|
+
|
133
|
+
def receive_kex_dh_gex_request payload
|
134
|
+
message = HrrRbSsh::Message::SSH_MSG_KEX_DH_GEX_REQUEST.decode payload
|
135
|
+
@min = message['min']
|
136
|
+
@n = message['n']
|
137
|
+
@max = message['max']
|
138
|
+
end
|
139
|
+
|
140
|
+
def send_kex_dh_gex_group transport
|
141
|
+
message = {
|
142
|
+
'message number' => HrrRbSsh::Message::SSH_MSG_KEX_DH_GEX_GROUP::VALUE,
|
143
|
+
'p' => @dh.p.to_i,
|
144
|
+
'g' => @dh.g.to_i,
|
145
|
+
}
|
146
|
+
payload = HrrRbSsh::Message::SSH_MSG_KEX_DH_GEX_GROUP.encode message
|
147
|
+
transport.send payload
|
148
|
+
end
|
149
|
+
|
150
|
+
def receive_kex_dh_gex_init payload
|
151
|
+
message = HrrRbSsh::Message::SSH_MSG_KEX_DH_GEX_INIT.decode payload
|
152
|
+
set_e message['e']
|
153
|
+
end
|
154
|
+
|
155
|
+
def send_kex_dh_gex_reply transport
|
156
|
+
message = {
|
157
|
+
'message number' => HrrRbSsh::Message::SSH_MSG_KEX_DH_GEX_REPLY::VALUE,
|
158
|
+
'server public host key and certificates (K_S)' => transport.server_host_key_algorithm.server_public_host_key,
|
159
|
+
'f' => pub_key,
|
160
|
+
'signature of H' => sign(transport),
|
161
|
+
}
|
162
|
+
payload = HrrRbSsh::Message::SSH_MSG_KEX_DH_GEX_REPLY.encode message
|
163
|
+
transport.send payload
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange/h0'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroupExchangeSha1 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group-exchange-sha1'
|
11
|
+
PREFERENCE = 30
|
12
|
+
DIGEST = 'sha1'
|
13
|
+
include DiffieHellmanGroupExchange
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange'
|
5
|
+
|
6
|
+
module HrrRbSsh
|
7
|
+
class Transport
|
8
|
+
class KexAlgorithm
|
9
|
+
class DiffieHellmanGroupExchangeSha256 < KexAlgorithm
|
10
|
+
NAME = 'diffie-hellman-group-exchange-sha256'
|
11
|
+
PREFERENCE = 40
|
12
|
+
DIGEST = 'sha256'
|
13
|
+
include DiffieHellmanGroupExchange
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -16,3 +16,10 @@ end
|
|
16
16
|
|
17
17
|
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1'
|
18
18
|
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1'
|
19
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha1'
|
20
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha256'
|
21
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha256'
|
22
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group15_sha512'
|
23
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group16_sha512'
|
24
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group17_sha512'
|
25
|
+
require 'hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group18_sha512'
|
@@ -25,28 +25,30 @@ module HrrRbSsh
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def receive_packet transport
|
28
|
-
packet_length_field_length
|
29
|
-
minimum_block_size
|
28
|
+
packet_length_field_length = 4
|
29
|
+
minimum_block_size = 8
|
30
|
+
|
31
|
+
encrypted_packet = Array.new
|
32
|
+
unencrypted_packet = Array.new
|
30
33
|
|
31
|
-
block_size
|
32
|
-
|
33
|
-
if (
|
34
|
+
block_size = [transport.incoming_encryption_algorithm.block_size, minimum_block_size].max
|
35
|
+
encrypted_packet.push transport.io.read(block_size)
|
36
|
+
if (encrypted_packet.last == nil) || (encrypted_packet.last.length != block_size)
|
34
37
|
@logger.warn("IO is EOF")
|
35
38
|
raise EOFError
|
36
39
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
40
|
+
unencrypted_packet.push transport.incoming_encryption_algorithm.decrypt(encrypted_packet.last)
|
41
|
+
|
42
|
+
packet_length = unencrypted_packet.last[0,4].unpack("N")[0]
|
43
|
+
following_packet_length = packet_length_field_length + packet_length - block_size
|
44
|
+
encrypted_packet.push transport.io.read(following_packet_length)
|
45
|
+
if (encrypted_packet.last == nil) || (encrypted_packet.last.length != following_packet_length)
|
42
46
|
@logger.warn("IO is EOF")
|
43
47
|
raise EOFError
|
44
48
|
end
|
45
|
-
|
46
|
-
encrypted_packet = initial_encrypted_packet + last_encrypted_packet
|
47
|
-
unencrypted_packet = initial_unencrypted_packet + last_unencrypted_packet
|
49
|
+
unencrypted_packet.push transport.incoming_encryption_algorithm.decrypt(encrypted_packet.last)
|
48
50
|
|
49
|
-
unencrypted_packet
|
51
|
+
unencrypted_packet.join
|
50
52
|
end
|
51
53
|
|
52
54
|
def receive_mac transport
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/data_type'
|
5
|
+
require 'hrr_rb_ssh/codable'
|
6
|
+
|
7
|
+
module HrrRbSsh
|
8
|
+
class Transport
|
9
|
+
class ServerHostKeyAlgorithm
|
10
|
+
class SshDss
|
11
|
+
module PublicKeyBlob
|
12
|
+
class << self
|
13
|
+
include Codable
|
14
|
+
end
|
15
|
+
DEFINITION = [
|
16
|
+
[DataType::String, 'ssh-dss'],
|
17
|
+
[DataType::Mpint, 'p'],
|
18
|
+
[DataType::Mpint, 'q'],
|
19
|
+
[DataType::Mpint, 'g'],
|
20
|
+
[DataType::Mpint, 'y'],
|
21
|
+
]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_ssh/data_type'
|
5
|
+
require 'hrr_rb_ssh/codable'
|
6
|
+
|
7
|
+
module HrrRbSsh
|
8
|
+
class Transport
|
9
|
+
class ServerHostKeyAlgorithm
|
10
|
+
class SshDss
|
11
|
+
module Signature
|
12
|
+
class << self
|
13
|
+
include Codable
|
14
|
+
end
|
15
|
+
DEFINITION = [
|
16
|
+
[DataType::String, 'ssh-dss'],
|
17
|
+
[DataType::String, 'dss_signature_blob'],
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|