273
|
1 /*
|
|
2 * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
|
|
3 * Please refer to the LICENSE.txt for licensing details.
|
|
4 */
|
|
5 package ch.ethz.ssh2.packets;
|
|
6
|
|
7 import java.io.IOException;
|
|
8 import java.security.SecureRandom;
|
|
9
|
|
10 import ch.ethz.ssh2.PacketFormatException;
|
|
11 import ch.ethz.ssh2.PacketTypeException;
|
|
12 import ch.ethz.ssh2.crypto.CryptoWishList;
|
|
13 import ch.ethz.ssh2.transport.KexParameters;
|
|
14
|
|
15 /**
|
|
16 * @author Christian Plattner
|
|
17 * @version $Id: PacketKexInit.java 160 2014-05-01 14:30:26Z dkocher@sudo.ch $
|
|
18 */
|
|
19 public final class PacketKexInit {
|
|
20 private final byte[] payload;
|
|
21
|
|
22 KexParameters kp = new KexParameters();
|
|
23
|
|
24 public PacketKexInit(CryptoWishList cwl, SecureRandom rnd) {
|
|
25 kp.cookie = new byte[16];
|
|
26 rnd.nextBytes(kp.cookie);
|
|
27 kp.kex_algorithms = cwl.kexAlgorithms;
|
|
28 kp.server_host_key_algorithms = cwl.serverHostKeyAlgorithms;
|
|
29 kp.encryption_algorithms_client_to_server = cwl.c2s_enc_algos;
|
|
30 kp.encryption_algorithms_server_to_client = cwl.s2c_enc_algos;
|
|
31 kp.mac_algorithms_client_to_server = cwl.c2s_mac_algos;
|
|
32 kp.mac_algorithms_server_to_client = cwl.s2c_mac_algos;
|
|
33 kp.compression_algorithms_client_to_server = cwl.c2s_comp_algos;
|
|
34 kp.compression_algorithms_server_to_client = cwl.s2c_comp_algos;
|
307
|
35 kp.languages_client_to_server = new String[] {""};
|
|
36 kp.languages_server_to_client = new String[] {""};
|
273
|
37 kp.first_kex_packet_follows = false;
|
|
38 kp.reserved_field1 = 0;
|
|
39 TypesWriter tw = new TypesWriter();
|
|
40 tw.writeByte(Packets.SSH_MSG_KEXINIT);
|
|
41 tw.writeBytes(kp.cookie, 0, 16);
|
|
42 tw.writeNameList(kp.kex_algorithms);
|
|
43 tw.writeNameList(kp.server_host_key_algorithms);
|
|
44 tw.writeNameList(kp.encryption_algorithms_client_to_server);
|
|
45 tw.writeNameList(kp.encryption_algorithms_server_to_client);
|
|
46 tw.writeNameList(kp.mac_algorithms_client_to_server);
|
|
47 tw.writeNameList(kp.mac_algorithms_server_to_client);
|
|
48 tw.writeNameList(kp.compression_algorithms_client_to_server);
|
|
49 tw.writeNameList(kp.compression_algorithms_server_to_client);
|
|
50 tw.writeNameList(kp.languages_client_to_server);
|
|
51 tw.writeNameList(kp.languages_server_to_client);
|
|
52 tw.writeBoolean(kp.first_kex_packet_follows);
|
|
53 tw.writeUINT32(kp.reserved_field1);
|
|
54 payload = tw.getBytes();
|
|
55 }
|
|
56
|
|
57 public PacketKexInit(byte payload[]) throws IOException {
|
|
58 this.payload = payload;
|
|
59 TypesReader tr = new TypesReader(payload);
|
|
60 int packet_type = tr.readByte();
|
|
61
|
307
|
62 if (packet_type != Packets.SSH_MSG_KEXINIT) {
|
273
|
63 throw new PacketTypeException(packet_type);
|
|
64 }
|
307
|
65
|
273
|
66 kp.cookie = tr.readBytes(16);
|
|
67 kp.kex_algorithms = tr.readNameList();
|
|
68 kp.server_host_key_algorithms = tr.readNameList();
|
|
69 kp.encryption_algorithms_client_to_server = tr.readNameList();
|
|
70 kp.encryption_algorithms_server_to_client = tr.readNameList();
|
|
71 kp.mac_algorithms_client_to_server = tr.readNameList();
|
|
72 kp.mac_algorithms_server_to_client = tr.readNameList();
|
|
73 kp.compression_algorithms_client_to_server = tr.readNameList();
|
|
74 kp.compression_algorithms_server_to_client = tr.readNameList();
|
|
75 kp.languages_client_to_server = tr.readNameList();
|
|
76 kp.languages_server_to_client = tr.readNameList();
|
|
77 kp.first_kex_packet_follows = tr.readBoolean();
|
|
78 kp.reserved_field1 = tr.readUINT32();
|
|
79
|
307
|
80 if (tr.remain() != 0) {
|
273
|
81 throw new PacketFormatException(String.format("Padding in %s", Packets.getMessageName(packet_type)));
|
|
82 }
|
|
83 }
|
|
84
|
|
85 public byte[] getPayload() {
|
|
86 return payload;
|
|
87 }
|
|
88
|
|
89 public KexParameters getKexParameters() {
|
|
90 return kp;
|
|
91 }
|
|
92
|
|
93 public String[] getCompression_algorithms_client_to_server() {
|
|
94 return kp.compression_algorithms_client_to_server;
|
|
95 }
|
|
96
|
|
97 public String[] getCompression_algorithms_server_to_client() {
|
|
98 return kp.compression_algorithms_server_to_client;
|
|
99 }
|
|
100
|
|
101 public byte[] getCookie() {
|
|
102 return kp.cookie;
|
|
103 }
|
|
104
|
|
105 public String[] getEncryption_algorithms_client_to_server() {
|
|
106 return kp.encryption_algorithms_client_to_server;
|
|
107 }
|
|
108
|
|
109 public String[] getEncryption_algorithms_server_to_client() {
|
|
110 return kp.encryption_algorithms_server_to_client;
|
|
111 }
|
|
112
|
|
113 public boolean isFirst_kex_packet_follows() {
|
|
114 return kp.first_kex_packet_follows;
|
|
115 }
|
|
116
|
|
117 public String[] getKex_algorithms() {
|
|
118 return kp.kex_algorithms;
|
|
119 }
|
|
120
|
|
121 public String[] getLanguages_client_to_server() {
|
|
122 return kp.languages_client_to_server;
|
|
123 }
|
|
124
|
|
125 public String[] getLanguages_server_to_client() {
|
|
126 return kp.languages_server_to_client;
|
|
127 }
|
|
128
|
|
129 public String[] getMac_algorithms_client_to_server() {
|
|
130 return kp.mac_algorithms_client_to_server;
|
|
131 }
|
|
132
|
|
133 public String[] getMac_algorithms_server_to_client() {
|
|
134 return kp.mac_algorithms_server_to_client;
|
|
135 }
|
|
136
|
|
137 public int getReserved_field1() {
|
|
138 return kp.reserved_field1;
|
|
139 }
|
|
140
|
|
141 public String[] getServer_host_key_algorithms() {
|
|
142 return kp.server_host_key_algorithms;
|
|
143 }
|
|
144 }
|