opacket.c revision 296781
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
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
77#ifdef WITH_SSH1
78void
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}
86#endif
87
88#ifdef WITH_OPENSSL
89void
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
98# ifdef OPENSSL_HAS_ECC
99void
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}
108# endif
109#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
153#ifdef WITH_SSH1
154void
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}
162#endif
163
164#ifdef WITH_OPENSSL
165void
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
174# ifdef OPENSSL_HAS_ECC
175void
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}
183# endif
184#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);
234	if (active_state == NULL)
235		fatal("%s: ssh_packet_set_connection failed", __func__);
236}
237
238u_int
239packet_get_char(void)
240{
241	return (ssh_packet_get_char(active_state));
242}
243
244u_int
245packet_get_int(void)
246{
247	return (ssh_packet_get_int(active_state));
248}
249
250int
251packet_read_seqnr(u_int32_t *seqnr)
252{
253	u_char type;
254	int r;
255
256	if ((r = ssh_packet_read_seqnr(active_state, &type, seqnr)) != 0)
257		sshpkt_fatal(active_state, __func__, r);
258	return type;
259}
260
261int
262packet_read_poll_seqnr(u_int32_t *seqnr)
263{
264	u_char type;
265	int r;
266
267	if ((r = ssh_packet_read_poll_seqnr(active_state, &type, seqnr)))
268		sshpkt_fatal(active_state, __func__, r);
269	return type;
270}
271
272void
273packet_close(void)
274{
275	ssh_packet_close(active_state);
276	active_state = NULL;
277}
278
279void
280packet_process_incoming(const char *buf, u_int len)
281{
282	int r;
283
284	if ((r = ssh_packet_process_incoming(active_state, buf, len)) != 0)
285		sshpkt_fatal(active_state, __func__, r);
286}
287
288void
289packet_write_wait(void)
290{
291	int r;
292
293	if ((r = ssh_packet_write_wait(active_state)) != 0)
294		sshpkt_fatal(active_state, __func__, r);
295}
296
297void
298packet_write_poll(void)
299{
300	int r;
301
302	if ((r = ssh_packet_write_poll(active_state)) != 0)
303		sshpkt_fatal(active_state, __func__, r);
304}
305
306void
307packet_read_expect(int expected_type)
308{
309	int r;
310
311	if ((r = ssh_packet_read_expect(active_state, expected_type)) != 0)
312		sshpkt_fatal(active_state, __func__, r);
313}
314
315void
316packet_disconnect(const char *fmt, ...)
317{
318	char buf[1024];
319	va_list args;
320
321	va_start(args, fmt);
322	vsnprintf(buf, sizeof(buf), fmt, args);
323	va_end(args);
324	ssh_packet_disconnect(active_state, "%s", buf);
325}
326
327void
328packet_send_debug(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_send_debug(active_state, "%s", buf);
337}
338