blob: b9160d59def8b600272fd6341d09fb2ca1cb3974 [file] [log] [blame]
markus@openbsd.org091c3022015-01-19 19:52:16 +00001/* 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
9struct ssh *active_state, *backup_state;
10
11/* Map old to new API */
12
13void
14ssh_packet_start(struct ssh *ssh, u_char type)
15{
16 int r;
17
18 if ((r = sshpkt_start(ssh, type)) != 0)
19 fatal("%s: %s", __func__, ssh_err(r));
20}
21
22void
23ssh_packet_put_char(struct ssh *ssh, int value)
24{
25 u_char ch = value;
26 int r;
27
28 if ((r = sshpkt_put_u8(ssh, ch)) != 0)
29 fatal("%s: %s", __func__, ssh_err(r));
30}
31
32void
33ssh_packet_put_int(struct ssh *ssh, u_int value)
34{
35 int r;
36
37 if ((r = sshpkt_put_u32(ssh, value)) != 0)
38 fatal("%s: %s", __func__, ssh_err(r));
39}
40
41void
42ssh_packet_put_int64(struct ssh *ssh, u_int64_t value)
43{
44 int r;
45
46 if ((r = sshpkt_put_u64(ssh, value)) != 0)
47 fatal("%s: %s", __func__, ssh_err(r));
48}
49
50void
51ssh_packet_put_string(struct ssh *ssh, const void *buf, u_int len)
52{
53 int r;
54
55 if ((r = sshpkt_put_string(ssh, buf, len)) != 0)
56 fatal("%s: %s", __func__, ssh_err(r));
57}
58
59void
60ssh_packet_put_cstring(struct ssh *ssh, const char *str)
61{
62 int r;
63
64 if ((r = sshpkt_put_cstring(ssh, str)) != 0)
65 fatal("%s: %s", __func__, ssh_err(r));
66}
67
68void
69ssh_packet_put_raw(struct ssh *ssh, const void *buf, u_int len)
70{
71 int r;
72
73 if ((r = sshpkt_put(ssh, buf, len)) != 0)
74 fatal("%s: %s", __func__, ssh_err(r));
75}
76
Damien Millerbbffb232015-03-03 13:50:27 -080077#ifdef WITH_SSH1
markus@openbsd.org091c3022015-01-19 19:52:16 +000078void
79ssh_packet_put_bignum(struct ssh *ssh, BIGNUM * value)
80{
81 int r;
82
83 if ((r = sshpkt_put_bignum1(ssh, value)) != 0)
84 fatal("%s: %s", __func__, ssh_err(r));
85}
Damien Millerbbffb232015-03-03 13:50:27 -080086#endif
markus@openbsd.org091c3022015-01-19 19:52:16 +000087
Damien Millerbbffb232015-03-03 13:50:27 -080088#ifdef WITH_OPENSSL
markus@openbsd.org091c3022015-01-19 19:52:16 +000089void
90ssh_packet_put_bignum2(struct ssh *ssh, BIGNUM * value)
91{
92 int r;
93
94 if ((r = sshpkt_put_bignum2(ssh, value)) != 0)
95 fatal("%s: %s", __func__, ssh_err(r));
96}
97
Darren Tuckerf2004cd2015-02-23 05:04:21 +110098# ifdef OPENSSL_HAS_ECC
markus@openbsd.org091c3022015-01-19 19:52:16 +000099void
100ssh_packet_put_ecpoint(struct ssh *ssh, const EC_GROUP *curve,
101 const EC_POINT *point)
102{
103 int r;
104
105 if ((r = sshpkt_put_ec(ssh, point, curve)) != 0)
106 fatal("%s: %s", __func__, ssh_err(r));
107}
Darren Tuckerf2004cd2015-02-23 05:04:21 +1100108# endif
markus@openbsd.org091c3022015-01-19 19:52:16 +0000109#endif /* WITH_OPENSSL */
110
111void
112ssh_packet_send(struct ssh *ssh)
113{
114 int r;
115
116 if ((r = sshpkt_send(ssh)) != 0)
117 fatal("%s: %s", __func__, ssh_err(r));
118}
119
120u_int
121ssh_packet_get_char(struct ssh *ssh)
122{
123 u_char ch;
124 int r;
125
126 if ((r = sshpkt_get_u8(ssh, &ch)) != 0)
127 fatal("%s: %s", __func__, ssh_err(r));
128 return ch;
129}
130
131u_int
132ssh_packet_get_int(struct ssh *ssh)
133{
134 u_int val;
135 int r;
136
137 if ((r = sshpkt_get_u32(ssh, &val)) != 0)
138 fatal("%s: %s", __func__, ssh_err(r));
139 return val;
140}
141
142u_int64_t
143ssh_packet_get_int64(struct ssh *ssh)
144{
145 u_int64_t val;
146 int r;
147
148 if ((r = sshpkt_get_u64(ssh, &val)) != 0)
149 fatal("%s: %s", __func__, ssh_err(r));
150 return val;
151}
152
Damien Millerbbffb232015-03-03 13:50:27 -0800153#ifdef WITH_SSH1
markus@openbsd.org091c3022015-01-19 19:52:16 +0000154void
155ssh_packet_get_bignum(struct ssh *ssh, BIGNUM * value)
156{
157 int r;
158
159 if ((r = sshpkt_get_bignum1(ssh, value)) != 0)
160 fatal("%s: %s", __func__, ssh_err(r));
161}
Damien Millerbbffb232015-03-03 13:50:27 -0800162#endif
markus@openbsd.org091c3022015-01-19 19:52:16 +0000163
Damien Millerbbffb232015-03-03 13:50:27 -0800164#ifdef WITH_OPENSSL
markus@openbsd.org091c3022015-01-19 19:52:16 +0000165void
166ssh_packet_get_bignum2(struct ssh *ssh, BIGNUM * value)
167{
168 int r;
169
170 if ((r = sshpkt_get_bignum2(ssh, value)) != 0)
171 fatal("%s: %s", __func__, ssh_err(r));
172}
173
Darren Tuckerf2004cd2015-02-23 05:04:21 +1100174# ifdef OPENSSL_HAS_ECC
markus@openbsd.org091c3022015-01-19 19:52:16 +0000175void
176ssh_packet_get_ecpoint(struct ssh *ssh, const EC_GROUP *curve, EC_POINT *point)
177{
178 int r;
179
180 if ((r = sshpkt_get_ec(ssh, point, curve)) != 0)
181 fatal("%s: %s", __func__, ssh_err(r));
182}
Darren Tuckerf2004cd2015-02-23 05:04:21 +1100183# endif
markus@openbsd.org091c3022015-01-19 19:52:16 +0000184#endif /* WITH_OPENSSL */
185
186void *
187ssh_packet_get_string(struct ssh *ssh, u_int *length_ptr)
188{
189 int r;
190 size_t len;
191 u_char *val;
192
193 if ((r = sshpkt_get_string(ssh, &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
200const void *
201ssh_packet_get_string_ptr(struct ssh *ssh, 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(ssh, &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
214char *
215ssh_packet_get_cstring(struct ssh *ssh, u_int *length_ptr)
216{
217 int r;
218 size_t len;
219 char *val;
220
221 if ((r = sshpkt_get_cstring(ssh, &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
230void
231packet_set_connection(int fd_in, int fd_out)
232{
233 active_state = ssh_packet_set_connection(active_state, fd_in, fd_out);
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000234 if (active_state == NULL)
235 fatal("%s: ssh_packet_set_connection failed", __func__);
markus@openbsd.org091c3022015-01-19 19:52:16 +0000236}
237
238void
239packet_backup_state(void)
240{
241 ssh_packet_backup_state(active_state, backup_state);
242}
243
244void
245packet_restore_state(void)
246{
247 ssh_packet_restore_state(active_state, backup_state);
248}
249
250u_int
251packet_get_char(void)
252{
253 return (ssh_packet_get_char(active_state));
254}
255
256u_int
257packet_get_int(void)
258{
259 return (ssh_packet_get_int(active_state));
260}
261
262int
263packet_read_seqnr(u_int32_t *seqnr)
264{
265 u_char type;
266 int r;
267
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000268 if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
269 sshpkt_fatal(active_state, __func__, r);
markus@openbsd.org091c3022015-01-19 19:52:16 +0000270 return type;
271}
272
273int
274packet_read_poll_seqnr(u_int32_t *seqnr)
275{
276 u_char type;
277 int r;
278
279 if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr)))
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000280 sshpkt_fatal(active_state, __func__, r);
markus@openbsd.org091c3022015-01-19 19:52:16 +0000281 return type;
282}
283
284void
285packet_close(void)
286{
287 ssh_packet_close(active_state);
288 active_state = NULL;
289}
djm@openbsd.orgfae7bbe2015-01-28 21:15:47 +0000290
291void
292packet_process_incoming(const char *buf, u_int len)
293{
294 int r;
295
296 if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0)
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000297 sshpkt_fatal(active_state, __func__, r);
298}
299
300void
301packet_write_wait(void)
302{
303 int r;
304
305 if ((r = ssh_packet_write_wait(active_state)) != 0)
306 sshpkt_fatal(active_state, __func__, r);
307}
308
309void
310packet_write_poll(void)
311{
312 int r;
313
314 if ((r = ssh_packet_write_poll(active_state)) != 0)
315 sshpkt_fatal(active_state, __func__, r);
316}
317
318void
319packet_read_expect(int expected_type)
320{
321 int r;
322
323 if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0)
324 sshpkt_fatal(active_state, __func__, r);
djm@openbsd.orgfae7bbe2015-01-28 21:15:47 +0000325}
Darren Tuckerdcc89972015-02-24 12:30:59 +1100326
327void
328packet_disconnect(const char *fmt, ...)
329{
330 char buf[1024];
331 va_list args;
332
333 va_start(args, fmt);
334 vsnprintf(buf, sizeof(buf), fmt, args);
335 va_end(args);
336 ssh_packet_disconnect(active_state, "%s", buf);
337}
338
339void
340packet_send_debug(const char *fmt, ...)
341{
342 char buf[1024];
343 va_list args;
344
345 va_start(args, fmt);
346 vsnprintf(buf, sizeof(buf), fmt, args);
347 va_end(args);
348 ssh_packet_send_debug(active_state, "%s", buf);
349}