1 /* Written by Markus Friedl. Placed in the public domain.  */
2 
3 #include "includes.h"
4 
5 #include "ssherr.h"
6 #include "packet.h"
7 #include "log.h"
8 
9 struct ssh *active_state, *backup_state;
10 
11 /* Map old to new API */
12 
13 void
ssh_packet_start(ncrack_ssh_state * nstate,u_char type)14 ssh_packet_start(ncrack_ssh_state *nstate, u_char type)
15 {
16 	int r;
17 
18 	if ((r = sshpkt_start(nstate, type)) != 0)
19 		fatal("%s: %s", __func__, ssh_err(r));
20 }
21 
22 void
ssh_packet_put_char(ncrack_ssh_state * nstate,int value)23 ssh_packet_put_char(ncrack_ssh_state *nstate, int value)
24 {
25 	u_char ch = value;
26 	int r;
27 
28 	if ((r = sshpkt_put_u8(nstate, ch)) != 0)
29 		fatal("%s: %s", __func__, ssh_err(r));
30 }
31 
32 void
ssh_packet_put_int(ncrack_ssh_state * nstate,u_int value)33 ssh_packet_put_int(ncrack_ssh_state *nstate, u_int value)
34 {
35 	int r;
36 
37 	if ((r = sshpkt_put_u32(nstate, value)) != 0)
38 		fatal("%s: %s", __func__, ssh_err(r));
39 }
40 
41 void
ssh_packet_put_int64(ncrack_ssh_state * nstate,u_int64_t value)42 ssh_packet_put_int64(ncrack_ssh_state *nstate, u_int64_t value)
43 {
44 	int r;
45 
46 	if ((r = sshpkt_put_u64(nstate, value)) != 0)
47 		fatal("%s: %s", __func__, ssh_err(r));
48 }
49 
50 void
ssh_packet_put_string(ncrack_ssh_state * nstate,const void * buf,u_int len)51 ssh_packet_put_string(ncrack_ssh_state *nstate, const void *buf, u_int len)
52 {
53 	int r;
54 
55 	if ((r = sshpkt_put_string(nstate, buf, len)) != 0)
56 		fatal("%s: %s", __func__, ssh_err(r));
57 }
58 
59 void
ssh_packet_put_cstring(ncrack_ssh_state * nstate,const char * str)60 ssh_packet_put_cstring(ncrack_ssh_state *nstate, const char *str)
61 {
62 	int r;
63 
64 	if ((r = sshpkt_put_cstring(nstate, str)) != 0)
65 		fatal("%s: %s", __func__, ssh_err(r));
66 }
67 
68 void
ssh_packet_put_raw(ncrack_ssh_state * nstate,const void * buf,u_int len)69 ssh_packet_put_raw(ncrack_ssh_state *nstate, const void *buf, u_int len)
70 {
71 	int r;
72 
73 	if ((r = sshpkt_put(nstate, buf, len)) != 0)
74 		fatal("%s: %s", __func__, ssh_err(r));
75 }
76 
77 #ifdef WITH_SSH1
78 void
ssh_packet_put_bignum(ncrack_ssh_state * nstate,BIGNUM * value)79 ssh_packet_put_bignum(ncrack_ssh_state *nstate, BIGNUM * value)
80 {
81 	int r;
82 
83 	if ((r = sshpkt_put_bignum1(nstate, value)) != 0)
84 		fatal("%s: %s", __func__, ssh_err(r));
85 }
86 #endif
87 
88 #ifdef WITH_OPENSSL
89 void
ssh_packet_put_bignum2(ncrack_ssh_state * nstate,BIGNUM * value)90 ssh_packet_put_bignum2(ncrack_ssh_state *nstate, BIGNUM * value)
91 {
92 	int r;
93 
94 	if ((r = sshpkt_put_bignum2(nstate, value)) != 0)
95 		fatal("%s: %s", __func__, ssh_err(r));
96 }
97 
98 # ifdef OPENSSL_HAS_ECC
99 void
ssh_packet_put_ecpoint(ncrack_ssh_state * nstate,const EC_GROUP * curve,const EC_POINT * point)100 ssh_packet_put_ecpoint(ncrack_ssh_state *nstate, const EC_GROUP *curve,
101     const EC_POINT *point)
102 {
103 	int r;
104 
105 	if ((r = sshpkt_put_ec(nstate, point, curve)) != 0)
106 		fatal("%s: %s", __func__, ssh_err(r));
107 }
108 # endif
109 #endif /* WITH_OPENSSL */
110 
111 void
ssh_packet_send(ncrack_ssh_state * nstate)112 ssh_packet_send(ncrack_ssh_state *nstate)
113 {
114 	int r;
115 
116 	if ((r = sshpkt_send(nstate)) != 0)
117 		fatal("%s: %s", __func__, ssh_err(r));
118 }
119 
120 u_int
ssh_packet_get_char(ncrack_ssh_state * nstate)121 ssh_packet_get_char(ncrack_ssh_state *nstate)
122 {
123 	u_char ch;
124 	int r;
125 
126 	if ((r = sshpkt_get_u8(nstate, &ch)) != 0)
127 		fatal("%s: %s", __func__, ssh_err(r));
128 	return ch;
129 }
130 
131 u_int
ssh_packet_get_int(ncrack_ssh_state * nstate)132 ssh_packet_get_int(ncrack_ssh_state *nstate)
133 {
134 	u_int val;
135 	int r;
136 
137 	if ((r = sshpkt_get_u32(nstate, &val)) != 0)
138 		fatal("%s: %s", __func__, ssh_err(r));
139 	return val;
140 }
141 
142 u_int64_t
ssh_packet_get_int64(ncrack_ssh_state * nstate)143 ssh_packet_get_int64(ncrack_ssh_state *nstate)
144 {
145 	u_int64_t val;
146 	int r;
147 
148 	if ((r = sshpkt_get_u64(nstate, &val)) != 0)
149 		fatal("%s: %s", __func__, ssh_err(r));
150 	return val;
151 }
152 
153 #ifdef WITH_SSH1
154 void
ssh_packet_get_bignum(ncrack_ssh_state * nstate,BIGNUM * value)155 ssh_packet_get_bignum(ncrack_ssh_state *nstate, BIGNUM * value)
156 {
157 	int r;
158 
159 	if ((r = sshpkt_get_bignum1(nstate, value)) != 0)
160 		fatal("%s: %s", __func__, ssh_err(r));
161 }
162 #endif
163 
164 #ifdef WITH_OPENSSL
165 void
ssh_packet_get_bignum2(ncrack_ssh_state * nstate,BIGNUM * value)166 ssh_packet_get_bignum2(ncrack_ssh_state *nstate, BIGNUM * value)
167 {
168 	int r;
169 
170 	if ((r = sshpkt_get_bignum2(nstate, value)) != 0)
171 		fatal("%s: %s", __func__, ssh_err(r));
172 }
173 
174 # ifdef OPENSSL_HAS_ECC
175 void
ssh_packet_get_ecpoint(ncrack_ssh_state * nstate,const EC_GROUP * curve,EC_POINT * point)176 ssh_packet_get_ecpoint(ncrack_ssh_state *nstate, const EC_GROUP *curve, EC_POINT *point)
177 {
178 	int r;
179 
180 	if ((r = sshpkt_get_ec(nstate, point, curve)) != 0)
181 		fatal("%s: %s", __func__, ssh_err(r));
182 }
183 # endif
184 #endif /* WITH_OPENSSL */
185 
186 void *
ssh_packet_get_string(ncrack_ssh_state * nstate,u_int * length_ptr)187 ssh_packet_get_string(ncrack_ssh_state *nstate, u_int *length_ptr)
188 {
189 	int r;
190 	size_t len;
191 	u_char *val;
192 
193 	if ((r = sshpkt_get_string(nstate, &val, &len)) != 0)
194 		fatal("%s: %s", __func__, ssh_err(r));
195 	if (length_ptr != NULL)
196 		*length_ptr = (u_int)len;
197 	return val;
198 }
199 
200 const void *
ssh_packet_get_string_ptr(ncrack_ssh_state * nstate,u_int * length_ptr)201 ssh_packet_get_string_ptr(ncrack_ssh_state *nstate, u_int *length_ptr)
202 {
203 	int r;
204 	size_t len;
205 	const u_char *val;
206 
207 	if ((r = sshpkt_get_string_direct(nstate, &val, &len)) != 0)
208 		fatal("%s: %s", __func__, ssh_err(r));
209 	if (length_ptr != NULL)
210 		*length_ptr = (u_int)len;
211 	return val;
212 }
213 
214 char *
ssh_packet_get_cstring(ncrack_ssh_state * nstate,u_int * length_ptr)215 ssh_packet_get_cstring(ncrack_ssh_state *nstate, u_int *length_ptr)
216 {
217 	int r;
218 	size_t len;
219 	char *val;
220 
221 	if ((r = sshpkt_get_cstring(nstate, &val, &len)) != 0)
222 		fatal("%s: %s", __func__, ssh_err(r));
223 	if (length_ptr != NULL)
224 		*length_ptr = (u_int)len;
225 	return val;
226 }
227 
228 /* Old API, that had to be reimplemented */
229 
230 #if 0
231 void
232 packet_set_connection(int fd_in, int fd_out)
233 {
234 	active_state = ssh_packet_set_connection(active_state); //, fd_in, fd_out);
235 	if (active_state == NULL)
236 		fatal("%s: ssh_packet_set_connection failed", __func__);
237 }
238 
239 void
240 packet_backup_state(void)
241 {
242 	ssh_packet_backup_state(active_state, backup_state);
243 }
244 
245 void
246 packet_restore_state(void)
247 {
248 	ssh_packet_restore_state(active_state, backup_state);
249 }
250 
251 u_int
252 packet_get_char(void)
253 {
254 	return (ssh_packet_get_char(active_state));
255 }
256 
257 u_int
258 packet_get_int(void)
259 {
260 	return (ssh_packet_get_int(active_state));
261 }
262 
263 int
264 packet_read_seqnr(u_int32_t *seqnr)
265 {
266 	u_char type;
267 	int r;
268 
269 	if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
270 		sshpkt_fatal(active_state, __func__, r);
271 	return type;
272 }
273 
274 int
275 packet_read_poll_seqnr(u_int32_t *seqnr)
276 {
277 	u_char type;
278 	int r;
279 
280 	if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr)))
281 		sshpkt_fatal(active_state, __func__, r);
282 	return type;
283 }
284 #endif
285 
286 void
packet_close(void)287 packet_close(void)
288 {
289 	ssh_packet_close(active_state);
290 	active_state = NULL;
291 }
292 
293 #if 0
294 void
295 packet_process_incoming(const char *buf, u_int len)
296 {
297 	int r;
298 
299 	if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0)
300 		sshpkt_fatal(active_state, __func__, r);
301 }
302 
303 void
304 packet_write_wait(void)
305 {
306 	int r;
307 
308 	if ((r = ssh_packet_write_wait(active_state)) != 0)
309 		sshpkt_fatal(active_state, __func__, r);
310 }
311 
312 void
313 packet_write_poll(void)
314 {
315 	int r;
316 
317 	if ((r = ssh_packet_write_poll(active_state)) != 0)
318 		sshpkt_fatal(active_state, __func__, r);
319 }
320 
321 void
322 packet_read_expect(int expected_type)
323 {
324 	int r;
325 
326 	if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0)
327 		sshpkt_fatal(active_state, __func__, r);
328 }
329 
330 void
331 packet_disconnect(const char *fmt, ...)
332 {
333 	char buf[1024];
334 	va_list args;
335 
336 	va_start(args, fmt);
337 	vsnprintf(buf, sizeof(buf), fmt, args);
338 	va_end(args);
339 	ssh_packet_disconnect(active_state, "%s", buf);
340 }
341 
342 void
343 packet_send_debug(const char *fmt, ...)
344 {
345 	char buf[1024];
346 	va_list args;
347 
348 	va_start(args, fmt);
349 	vsnprintf(buf, sizeof(buf), fmt, args);
350 	va_end(args);
351 	ssh_packet_send_debug(active_state, "%s", buf);
352 }
353 #endif
354