1/* $OpenBSD: opacket.c,v 1.7 2017/10/20 01:56:39 djm Exp $ */
2/* Written by Markus Friedl. Placed in the public domain.  */
3
4#include "includes.h"
5
6#include <stdarg.h>
7
8#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
80
81#ifdef WITH_OPENSSL
82void
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
91# ifdef OPENSSL_HAS_ECC
92void
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}
101# endif
102#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
146
147#ifdef WITH_OPENSSL
148void
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
157# ifdef OPENSSL_HAS_ECC
158void
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}
166# endif
167#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);
217	if (active_state == NULL)
218		fatal("%s: ssh_packet_set_connection failed", __func__);
219}
220
221u_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
239	if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
240		sshpkt_fatal(active_state, __func__, r);
241	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)))
251		sshpkt_fatal(active_state, __func__, r);
252	return type;
253}
254
255void
256packet_close(void)
257{
258	ssh_packet_close(active_state);
259	active_state = NULL;
260}
261
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)
268		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);
296}
297
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}
321