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
12 struct ssh *active_state, *backup_state;
13
14 /* Map old to new API */
15
16 void
ssh_packet_start(struct ssh * ssh,u_char type)17 ssh_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
25 void
ssh_packet_put_char(struct ssh * ssh,int value)26 ssh_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
35 void
ssh_packet_put_int(struct ssh * ssh,u_int value)36 ssh_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
44 void
ssh_packet_put_int64(struct ssh * ssh,u_int64_t value)45 ssh_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
53 void
ssh_packet_put_string(struct ssh * ssh,const void * buf,u_int len)54 ssh_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
62 void
ssh_packet_put_cstring(struct ssh * ssh,const char * str)63 ssh_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
71 void
ssh_packet_put_raw(struct ssh * ssh,const void * buf,u_int len)72 ssh_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
82 void
ssh_packet_put_bignum2(struct ssh * ssh,BIGNUM * value)83 ssh_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
92 void
ssh_packet_put_ecpoint(struct ssh * ssh,const EC_GROUP * curve,const EC_POINT * point)93 ssh_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
104 void
ssh_packet_send(struct ssh * ssh)105 ssh_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
113 u_int
ssh_packet_get_char(struct ssh * ssh)114 ssh_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
124 u_int
ssh_packet_get_int(struct ssh * ssh)125 ssh_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
135 u_int64_t
ssh_packet_get_int64(struct ssh * ssh)136 ssh_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
148 void
ssh_packet_get_bignum2(struct ssh * ssh,BIGNUM * value)149 ssh_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
158 void
ssh_packet_get_ecpoint(struct ssh * ssh,const EC_GROUP * curve,EC_POINT * point)159 ssh_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
169 void *
ssh_packet_get_string(struct ssh * ssh,u_int * length_ptr)170 ssh_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
183 const void *
ssh_packet_get_string_ptr(struct ssh * ssh,u_int * length_ptr)184 ssh_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
197 char *
ssh_packet_get_cstring(struct ssh * ssh,u_int * length_ptr)198 ssh_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
213 void
packet_set_connection(int fd_in,int fd_out)214 packet_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
221 u_int
packet_get_char(void)222 packet_get_char(void)
223 {
224 return (ssh_packet_get_char(active_state));
225 }
226
227 u_int
packet_get_int(void)228 packet_get_int(void)
229 {
230 return (ssh_packet_get_int(active_state));
231 }
232
233 int
packet_read_seqnr(u_int32_t * seqnr)234 packet_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
244 int
packet_read_poll_seqnr(u_int32_t * seqnr)245 packet_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
255 void
packet_close(void)256 packet_close(void)
257 {
258 ssh_packet_close(active_state);
259 active_state = NULL;
260 }
261
262 void
packet_process_incoming(const char * buf,u_int len)263 packet_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
271 void
packet_write_wait(void)272 packet_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
280 void
packet_write_poll(void)281 packet_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
289 void
packet_read_expect(int expected_type)290 packet_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
298 void
packet_disconnect(const char * fmt,...)299 packet_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
310 void
packet_send_debug(const char * fmt,...)311 packet_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