1285031Sdes/* Written by Markus Friedl. Placed in the public domain.  */
2285031Sdes
3285031Sdes#include "includes.h"
4285031Sdes
5285031Sdes#include "ssherr.h"
6285031Sdes#include "packet.h"
7285031Sdes#include "log.h"
8285031Sdes
9285031Sdesstruct ssh *active_state, *backup_state;
10285031Sdes
11285031Sdes/* Map old to new API */
12285031Sdes
13285031Sdesvoid
14285031Sdesssh_packet_start(struct ssh *ssh, u_char type)
15285031Sdes{
16285031Sdes	int r;
17285031Sdes
18285031Sdes	if ((r = sshpkt_start(ssh, type)) != 0)
19285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
20285031Sdes}
21285031Sdes
22285031Sdesvoid
23285031Sdesssh_packet_put_char(struct ssh *ssh, int value)
24285031Sdes{
25285031Sdes	u_char ch = value;
26285031Sdes	int r;
27285031Sdes
28285031Sdes	if ((r = sshpkt_put_u8(ssh, ch)) != 0)
29285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
30285031Sdes}
31285031Sdes
32285031Sdesvoid
33285031Sdesssh_packet_put_int(struct ssh *ssh, u_int value)
34285031Sdes{
35285031Sdes	int r;
36285031Sdes
37285031Sdes	if ((r = sshpkt_put_u32(ssh, value)) != 0)
38285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
39285031Sdes}
40285031Sdes
41285031Sdesvoid
42285031Sdesssh_packet_put_int64(struct ssh *ssh, u_int64_t value)
43285031Sdes{
44285031Sdes	int r;
45285031Sdes
46285031Sdes	if ((r = sshpkt_put_u64(ssh, value)) != 0)
47285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
48285031Sdes}
49285031Sdes
50285031Sdesvoid
51285031Sdesssh_packet_put_string(struct ssh *ssh, const void *buf, u_int len)
52285031Sdes{
53285031Sdes	int r;
54285031Sdes
55285031Sdes	if ((r = sshpkt_put_string(ssh, buf, len)) != 0)
56285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
57285031Sdes}
58285031Sdes
59285031Sdesvoid
60285031Sdesssh_packet_put_cstring(struct ssh *ssh, const char *str)
61285031Sdes{
62285031Sdes	int r;
63285031Sdes
64285031Sdes	if ((r = sshpkt_put_cstring(ssh, str)) != 0)
65285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
66285031Sdes}
67285031Sdes
68285031Sdesvoid
69285031Sdesssh_packet_put_raw(struct ssh *ssh, const void *buf, u_int len)
70285031Sdes{
71285031Sdes	int r;
72285031Sdes
73285031Sdes	if ((r = sshpkt_put(ssh, buf, len)) != 0)
74285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
75285031Sdes}
76285031Sdes
77285031Sdes#ifdef WITH_SSH1
78285031Sdesvoid
79285031Sdesssh_packet_put_bignum(struct ssh *ssh, BIGNUM * value)
80285031Sdes{
81285031Sdes	int r;
82285031Sdes
83285031Sdes	if ((r = sshpkt_put_bignum1(ssh, value)) != 0)
84285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
85285031Sdes}
86285031Sdes#endif
87285031Sdes
88285031Sdes#ifdef WITH_OPENSSL
89285031Sdesvoid
90285031Sdesssh_packet_put_bignum2(struct ssh *ssh, BIGNUM * value)
91285031Sdes{
92285031Sdes	int r;
93285031Sdes
94285031Sdes	if ((r = sshpkt_put_bignum2(ssh, value)) != 0)
95285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
96285031Sdes}
97285031Sdes
98285031Sdes# ifdef OPENSSL_HAS_ECC
99285031Sdesvoid
100285031Sdesssh_packet_put_ecpoint(struct ssh *ssh, const EC_GROUP *curve,
101285031Sdes    const EC_POINT *point)
102285031Sdes{
103285031Sdes	int r;
104285031Sdes
105285031Sdes	if ((r = sshpkt_put_ec(ssh, point, curve)) != 0)
106285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
107285031Sdes}
108285031Sdes# endif
109285031Sdes#endif /* WITH_OPENSSL */
110285031Sdes
111285031Sdesvoid
112285031Sdesssh_packet_send(struct ssh *ssh)
113285031Sdes{
114285031Sdes	int r;
115285031Sdes
116285031Sdes	if ((r = sshpkt_send(ssh)) != 0)
117285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
118285031Sdes}
119285031Sdes
120285031Sdesu_int
121285031Sdesssh_packet_get_char(struct ssh *ssh)
122285031Sdes{
123285031Sdes	u_char ch;
124285031Sdes	int r;
125285031Sdes
126285031Sdes	if ((r = sshpkt_get_u8(ssh, &ch)) != 0)
127285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
128285031Sdes	return ch;
129285031Sdes}
130285031Sdes
131285031Sdesu_int
132285031Sdesssh_packet_get_int(struct ssh *ssh)
133285031Sdes{
134285031Sdes	u_int val;
135285031Sdes	int r;
136285031Sdes
137285031Sdes	if ((r = sshpkt_get_u32(ssh, &val)) != 0)
138285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
139285031Sdes	return val;
140285031Sdes}
141285031Sdes
142285031Sdesu_int64_t
143285031Sdesssh_packet_get_int64(struct ssh *ssh)
144285031Sdes{
145285031Sdes	u_int64_t val;
146285031Sdes	int r;
147285031Sdes
148285031Sdes	if ((r = sshpkt_get_u64(ssh, &val)) != 0)
149285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
150285031Sdes	return val;
151285031Sdes}
152285031Sdes
153285031Sdes#ifdef WITH_SSH1
154285031Sdesvoid
155285031Sdesssh_packet_get_bignum(struct ssh *ssh, BIGNUM * value)
156285031Sdes{
157285031Sdes	int r;
158285031Sdes
159285031Sdes	if ((r = sshpkt_get_bignum1(ssh, value)) != 0)
160285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
161285031Sdes}
162285031Sdes#endif
163285031Sdes
164285031Sdes#ifdef WITH_OPENSSL
165285031Sdesvoid
166285031Sdesssh_packet_get_bignum2(struct ssh *ssh, BIGNUM * value)
167285031Sdes{
168285031Sdes	int r;
169285031Sdes
170285031Sdes	if ((r = sshpkt_get_bignum2(ssh, value)) != 0)
171285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
172285031Sdes}
173285031Sdes
174285031Sdes# ifdef OPENSSL_HAS_ECC
175285031Sdesvoid
176285031Sdesssh_packet_get_ecpoint(struct ssh *ssh, const EC_GROUP *curve, EC_POINT *point)
177285031Sdes{
178285031Sdes	int r;
179285031Sdes
180285031Sdes	if ((r = sshpkt_get_ec(ssh, point, curve)) != 0)
181285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
182285031Sdes}
183285031Sdes# endif
184285031Sdes#endif /* WITH_OPENSSL */
185285031Sdes
186285031Sdesvoid *
187285031Sdesssh_packet_get_string(struct ssh *ssh, u_int *length_ptr)
188285031Sdes{
189285031Sdes	int r;
190285031Sdes	size_t len;
191285031Sdes	u_char *val;
192285031Sdes
193285031Sdes	if ((r = sshpkt_get_string(ssh, &val, &len)) != 0)
194285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
195285031Sdes	if (length_ptr != NULL)
196285031Sdes		*length_ptr = (u_int)len;
197285031Sdes	return val;
198285031Sdes}
199285031Sdes
200285031Sdesconst void *
201285031Sdesssh_packet_get_string_ptr(struct ssh *ssh, u_int *length_ptr)
202285031Sdes{
203285031Sdes	int r;
204285031Sdes	size_t len;
205285031Sdes	const u_char *val;
206285031Sdes
207285031Sdes	if ((r = sshpkt_get_string_direct(ssh, &val, &len)) != 0)
208285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
209285031Sdes	if (length_ptr != NULL)
210285031Sdes		*length_ptr = (u_int)len;
211285031Sdes	return val;
212285031Sdes}
213285031Sdes
214285031Sdeschar *
215285031Sdesssh_packet_get_cstring(struct ssh *ssh, u_int *length_ptr)
216285031Sdes{
217285031Sdes	int r;
218285031Sdes	size_t len;
219285031Sdes	char *val;
220285031Sdes
221285031Sdes	if ((r = sshpkt_get_cstring(ssh, &val, &len)) != 0)
222285031Sdes		fatal("%s: %s", __func__, ssh_err(r));
223285031Sdes	if (length_ptr != NULL)
224285031Sdes		*length_ptr = (u_int)len;
225285031Sdes	return val;
226285031Sdes}
227285031Sdes
228285031Sdes/* Old API, that had to be reimplemented */
229285031Sdes
230285031Sdesvoid
231285031Sdespacket_set_connection(int fd_in, int fd_out)
232285031Sdes{
233285031Sdes	active_state = ssh_packet_set_connection(active_state, fd_in, fd_out);
234285031Sdes	if (active_state == NULL)
235285031Sdes		fatal("%s: ssh_packet_set_connection failed", __func__);
236285031Sdes}
237285031Sdes
238285031Sdesu_int
239285031Sdespacket_get_char(void)
240285031Sdes{
241285031Sdes	return (ssh_packet_get_char(active_state));
242285031Sdes}
243285031Sdes
244285031Sdesu_int
245285031Sdespacket_get_int(void)
246285031Sdes{
247285031Sdes	return (ssh_packet_get_int(active_state));
248285031Sdes}
249285031Sdes
250285031Sdesint
251285031Sdespacket_read_seqnr(u_int32_t *seqnr)
252285031Sdes{
253285031Sdes	u_char type;
254285031Sdes	int r;
255285031Sdes
256285031Sdes	if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
257285031Sdes		sshpkt_fatal(active_state, __func__, r);
258285031Sdes	return type;
259285031Sdes}
260285031Sdes
261285031Sdesint
262285031Sdespacket_read_poll_seqnr(u_int32_t *seqnr)
263285031Sdes{
264285031Sdes	u_char type;
265285031Sdes	int r;
266285031Sdes
267285031Sdes	if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr)))
268285031Sdes		sshpkt_fatal(active_state, __func__, r);
269285031Sdes	return type;
270285031Sdes}
271285031Sdes
272285031Sdesvoid
273285031Sdespacket_close(void)
274285031Sdes{
275285031Sdes	ssh_packet_close(active_state);
276285031Sdes	active_state = NULL;
277285031Sdes}
278285031Sdes
279285031Sdesvoid
280285031Sdespacket_process_incoming(const char *buf, u_int len)
281285031Sdes{
282285031Sdes	int r;
283285031Sdes
284285031Sdes	if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0)
285285031Sdes		sshpkt_fatal(active_state, __func__, r);
286285031Sdes}
287285031Sdes
288285031Sdesvoid
289285031Sdespacket_write_wait(void)
290285031Sdes{
291285031Sdes	int r;
292285031Sdes
293285031Sdes	if ((r = ssh_packet_write_wait(active_state)) != 0)
294285031Sdes		sshpkt_fatal(active_state, __func__, r);
295285031Sdes}
296285031Sdes
297285031Sdesvoid
298285031Sdespacket_write_poll(void)
299285031Sdes{
300285031Sdes	int r;
301285031Sdes
302285031Sdes	if ((r = ssh_packet_write_poll(active_state)) != 0)
303285031Sdes		sshpkt_fatal(active_state, __func__, r);
304285031Sdes}
305285031Sdes
306285031Sdesvoid
307285031Sdespacket_read_expect(int expected_type)
308285031Sdes{
309285031Sdes	int r;
310285031Sdes
311285031Sdes	if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0)
312285031Sdes		sshpkt_fatal(active_state, __func__, r);
313285031Sdes}
314285031Sdes
315285031Sdesvoid
316285031Sdespacket_disconnect(const char *fmt, ...)
317285031Sdes{
318285031Sdes	char buf[1024];
319285031Sdes	va_list args;
320285031Sdes
321285031Sdes	va_start(args, fmt);
322285031Sdes	vsnprintf(buf, sizeof(buf), fmt, args);
323285031Sdes	va_end(args);
324285031Sdes	ssh_packet_disconnect(active_state, "%s", buf);
325285031Sdes}
326285031Sdes
327285031Sdesvoid
328285031Sdespacket_send_debug(const char *fmt, ...)
329285031Sdes{
330285031Sdes	char buf[1024];
331285031Sdes	va_list args;
332285031Sdes
333285031Sdes	va_start(args, fmt);
334285031Sdes	vsnprintf(buf, sizeof(buf), fmt, args);
335285031Sdes	va_end(args);
336285031Sdes	ssh_packet_send_debug(active_state, "%s", buf);
337285031Sdes}
338