hrr_rb_ssh 0.1.3 → 0.1.4
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.
- 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
|