blob: e637d7a71b5b25653926873914c190915817f297 [file] [log] [blame]
djm@openbsd.orgb011edb2017-10-20 01:56:39 +00001/* $OpenBSD: opacket.c,v 1.7 2017/10/20 01:56:39 djm Exp $ */
markus@openbsd.org091c3022015-01-19 19:52:16 +00002/* Written by Markus Friedl. Placed in the public domain. */
3
4#include "includes.h"
5
Damien Miller4d3b2f32018-07-12 14:49:14 +10006#include <stdarg.h>
7
markus@openbsd.org091c3022015-01-19 19:52:16 +00008#include "ssherr.h"
9#include "packet.h"
10#include "log.h"
11
12struct ssh *active_state, *backup_state;
13
14/* Map old to new API */
15
16void
17ssh_packet_start(struct ssh *ssh, u_char type)
18{
19 int r;
20
21 if ((r = sshpkt_start(ssh, type)) != 0)
22 fatal("%s: %s", __func__, ssh_err(r));
23}
24
25void
26ssh_packet_put_char(struct ssh *ssh, int value)
27{
28 u_char ch = value;
29 int r;
30
31 if ((r = sshpkt_put_u8(ssh, ch)) != 0)
32 fatal("%s: %s", __func__, ssh_err(r));
33}
34
35void
36ssh_packet_put_int(struct ssh *ssh, u_int value)
37{
38 int r;
39
40 if ((r = sshpkt_put_u32(ssh, value)) != 0)
41 fatal("%s: %s", __func__, ssh_err(r));
42}
43
44void
45ssh_packet_put_int64(struct ssh *ssh, u_int64_t value)
46{
47 int r;
48
49 if ((r = sshpkt_put_u64(ssh, value)) != 0)
50 fatal("%s: %s", __func__, ssh_err(r));
51}
52
53void
54ssh_packet_put_string(struct ssh *ssh, const void *buf, u_int len)
55{
56 int r;
57
58 if ((r = sshpkt_put_string(ssh, buf, len)) != 0)
59 fatal("%s: %s", __func__, ssh_err(r));
60}
61
62void
63ssh_packet_put_cstring(struct ssh *ssh, const char *str)
64{
65 int r;
66
67 if ((r = sshpkt_put_cstring(ssh, str)) != 0)
68 fatal("%s: %s", __func__, ssh_err(r));
69}
70
71void
72ssh_packet_put_raw(struct ssh *ssh, const void *buf, u_int len)
73{
74 int r;
75
76 if ((r = sshpkt_put(ssh, buf, len)) != 0)
77 fatal("%s: %s", __func__, ssh_err(r));
78}
79
markus@openbsd.org091c3022015-01-19 19:52:16 +000080
Damien Millerbbffb232015-03-03 13:50:27 -080081#ifdef WITH_OPENSSL
markus@openbsd.org091c3022015-01-19 19:52:16 +000082void
83ssh_packet_put_bignum2(struct ssh *ssh, BIGNUM * value)
84{
85 int r;
86
87 if ((r = sshpkt_put_bignum2(ssh, value)) != 0)
88 fatal("%s: %s", __func__, ssh_err(r));
89}
90
Darren Tuckerf2004cd2015-02-23 05:04:21 +110091# ifdef OPENSSL_HAS_ECC
markus@openbsd.org091c3022015-01-19 19:52:16 +000092void
93ssh_packet_put_ecpoint(struct ssh *ssh, const EC_GROUP *curve,
94 const EC_POINT *point)
95{
96 int r;
97
98 if ((r = sshpkt_put_ec(ssh, point, curve)) != 0)
99 fatal("%s: %s", __func__, ssh_err(r));
100}
Darren Tuckerf2004cd2015-02-23 05:04:21 +1100101# endif
markus@openbsd.org091c3022015-01-19 19:52:16 +0000102#endif /* WITH_OPENSSL */
103
104void
105ssh_packet_send(struct ssh *ssh)
106{
107 int r;
108
109 if ((r = sshpkt_send(ssh)) != 0)
110 fatal("%s: %s", __func__, ssh_err(r));
111}
112
113u_int
114ssh_packet_get_char(struct ssh *ssh)
115{
116 u_char ch;
117 int r;
118
119 if ((r = sshpkt_get_u8(ssh, &ch)) != 0)
120 fatal("%s: %s", __func__, ssh_err(r));
121 return ch;
122}
123
124u_int
125ssh_packet_get_int(struct ssh *ssh)
126{
127 u_int val;
128 int r;
129
130 if ((r = sshpkt_get_u32(ssh, &val)) != 0)
131 fatal("%s: %s", __func__, ssh_err(r));
132 return val;
133}
134
135u_int64_t
136ssh_packet_get_int64(struct ssh *ssh)
137{
138 u_int64_t val;
139 int r;
140
141 if ((r = sshpkt_get_u64(ssh, &val)) != 0)
142 fatal("%s: %s", __func__, ssh_err(r));
143 return val;
144}
145
markus@openbsd.org091c3022015-01-19 19:52:16 +0000146
Damien Millerbbffb232015-03-03 13:50:27 -0800147#ifdef WITH_OPENSSL
markus@openbsd.org091c3022015-01-19 19:52:16 +0000148void
149ssh_packet_get_bignum2(struct ssh *ssh, BIGNUM * value)
150{
151 int r;
152
153 if ((r = sshpkt_get_bignum2(ssh, value)) != 0)
154 fatal("%s: %s", __func__, ssh_err(r));
155}
156
Darren Tuckerf2004cd2015-02-23 05:04:21 +1100157# ifdef OPENSSL_HAS_ECC
markus@openbsd.org091c3022015-01-19 19:52:16 +0000158void
159ssh_packet_get_ecpoint(struct ssh *ssh, const EC_GROUP *curve, EC_POINT *point)
160{
161 int r;
162
163 if ((r = sshpkt_get_ec(ssh, point, curve)) != 0)
164 fatal("%s: %s", __func__, ssh_err(r));
165}
Darren Tuckerf2004cd2015-02-23 05:04:21 +1100166# endif
markus@openbsd.org091c3022015-01-19 19:52:16 +0000167#endif /* WITH_OPENSSL */
168
169void *
170ssh_packet_get_string(struct ssh *ssh, u_int *length_ptr)
171{
172 int r;
173 size_t len;
174 u_char *val;
175
176 if ((r = sshpkt_get_string(ssh, &val, &len)) != 0)
177 fatal("%s: %s", __func__, ssh_err(r));
178 if (length_ptr != NULL)
179 *length_ptr = (u_int)len;
180 return val;
181}
182
183const void *
184ssh_packet_get_string_ptr(struct ssh *ssh, u_int *length_ptr)
185{
186 int r;
187 size_t len;
188 const u_char *val;
189
190 if ((r = sshpkt_get_string_direct(ssh, &val, &len)) != 0)
191 fatal("%s: %s", __func__, ssh_err(r));
192 if (length_ptr != NULL)
193 *length_ptr = (u_int)len;
194 return val;
195}
196
197char *
198ssh_packet_get_cstring(struct ssh *ssh, u_int *length_ptr)
199{
200 int r;
201 size_t len;
202 char *val;
203
204 if ((r = sshpkt_get_cstring(ssh, &val, &len)) != 0)
205 fatal("%s: %s", __func__, ssh_err(r));
206 if (length_ptr != NULL)
207 *length_ptr = (u_int)len;
208 return val;
209}
210
211/* Old API, that had to be reimplemented */
212
213void
214packet_set_connection(int fd_in, int fd_out)
215{
216 active_state = ssh_packet_set_connection(active_state, fd_in, fd_out);
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000217 if (active_state == NULL)
218 fatal("%s: ssh_packet_set_connection failed", __func__);
markus@openbsd.org091c3022015-01-19 19:52:16 +0000219}
220
markus@openbsd.org091c3022015-01-19 19:52:16 +0000221u_int
222packet_get_char(void)
223{
224 return (ssh_packet_get_char(active_state));
225}
226
227u_int
228packet_get_int(void)
229{
230 return (ssh_packet_get_int(active_state));
231}
232
233int
234packet_read_seqnr(u_int32_t *seqnr)
235{
236 u_char type;
237 int r;
238
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000239 if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
240 sshpkt_fatal(active_state, __func__, r);
markus@openbsd.org091c3022015-01-19 19:52:16 +0000241 return type;
242}
243
244int
245packet_read_poll_seqnr(u_int32_t *seqnr)
246{
247 u_char type;
248 int r;
249
250 if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr)))
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000251 sshpkt_fatal(active_state, __func__, r);
markus@openbsd.org091c3022015-01-19 19:52:16 +0000252 return type;
253}
254
255void
256packet_close(void)
257{
258 ssh_packet_close(active_state);
259 active_state = NULL;
260}
djm@openbsd.orgfae7bbe2015-01-28 21:15:47 +0000261
262void
263packet_process_incoming(const char *buf, u_int len)
264{
265 int r;
266
267 if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0)
djm@openbsd.org4509b5d2015-01-30 01:13:33 +0000268 sshpkt_fatal(active_state, __func__, r);
269}
270
271void
272packet_write_wait(void)
273{
274 int r;
275
276 if ((r = ssh_packet_write_wait(active_state)) != 0)
277 sshpkt_fatal(active_state, __func__, r);
278}
279
280void
281packet_write_poll(void)
282{
283 int r;
284
285 if ((r = ssh_packet_write_poll(active_state)) != 0)
286 sshpkt_fatal(active_state, __func__, r);
287}
288
289void
290packet_read_expect(int expected_type)
291{
292 int r;
293
294 if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0)
295 sshpkt_fatal(active_state, __func__, r);
djm@openbsd.orgfae7bbe2015-01-28 21:15:47 +0000296}
Darren Tuckerdcc89972015-02-24 12:30:59 +1100297
298void
299packet_disconnect(const char *fmt, ...)
300{
301 char buf[1024];
302 va_list args;
303
304 va_start(args, fmt);
305 vsnprintf(buf, sizeof(buf), fmt, args);
306 va_end(args);
307 ssh_packet_disconnect(active_state, "%s", buf);
308}
309
310void
311packet_send_debug(const char *fmt, ...)
312{
313 char buf[1024];
314 va_list args;
315
316 va_start(args, fmt);
317 vsnprintf(buf, sizeof(buf), fmt, args);
318 va_end(args);
319 ssh_packet_send_debug(active_state, "%s", buf);
320}