1 /*
2 * Copyright 2005-2024 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 #ifndef _GNU_SOURCE
11 # define _GNU_SOURCE
12 #endif
13
14 #include <stdio.h>
15 #include <errno.h>
16
17 #include "internal/time.h"
18 #include "bio_local.h"
19 #ifndef OPENSSL_NO_DGRAM
20
21 # ifndef OPENSSL_NO_SCTP
22 # include <netinet/sctp.h>
23 # include <fcntl.h>
24 # define OPENSSL_SCTP_DATA_CHUNK_TYPE 0x00
25 # define OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE 0xc0
26 # endif
27
28 # if defined(OPENSSL_SYS_LINUX) && !defined(IP_MTU)
29 # define IP_MTU 14 /* linux is lame */
30 # endif
31
32 # if OPENSSL_USE_IPV6 && !defined(IPPROTO_IPV6)
33 # define IPPROTO_IPV6 41 /* windows is lame */
34 # endif
35
36 # if defined(__FreeBSD__) && defined(IN6_IS_ADDR_V4MAPPED)
37 /* Standard definition causes type-punning problems. */
38 # undef IN6_IS_ADDR_V4MAPPED
39 # define s6_addr32 __u6_addr.__u6_addr32
40 # define IN6_IS_ADDR_V4MAPPED(a) \
41 (((a)->s6_addr32[0] == 0) && \
42 ((a)->s6_addr32[1] == 0) && \
43 ((a)->s6_addr32[2] == htonl(0x0000ffff)))
44 # endif
45
46 /* Determine what method to use for BIO_sendmmsg and BIO_recvmmsg. */
47 # define M_METHOD_NONE 0
48 # define M_METHOD_RECVMMSG 1
49 # define M_METHOD_RECVMSG 2
50 # define M_METHOD_RECVFROM 3
51 # define M_METHOD_WSARECVMSG 4
52
53 # if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
54 # if !(__GLIBC_PREREQ(2, 14))
55 # undef NO_RECVMMSG
56 /*
57 * Some old glibc versions may have recvmmsg and MSG_WAITFORONE flag, but
58 * not sendmmsg. We need both so force this to be disabled on these old
59 * versions
60 */
61 # define NO_RECVMMSG
62 # endif
63 # endif
64 # if defined(__GNU__)
65 /* GNU/Hurd does not have IP_PKTINFO yet */
66 #undef NO_RECVMSG
67 #define NO_RECVMSG
68 # endif
69 # if (defined(__ANDROID_API__) && __ANDROID_API__ < 21) || defined(_AIX)
70 # undef NO_RECVMMSG
71 # define NO_RECVMMSG
72 # endif
73 # if !defined(M_METHOD)
74 # if defined(OPENSSL_SYS_WINDOWS) && defined(BIO_HAVE_WSAMSG) && !defined(NO_WSARECVMSG)
75 # define M_METHOD M_METHOD_WSARECVMSG
76 # elif !defined(OPENSSL_SYS_WINDOWS) && defined(MSG_WAITFORONE) && !defined(NO_RECVMMSG)
77 # define M_METHOD M_METHOD_RECVMMSG
78 # elif !defined(OPENSSL_SYS_WINDOWS) && defined(CMSG_LEN) && !defined(NO_RECVMSG)
79 # define M_METHOD M_METHOD_RECVMSG
80 # elif !defined(NO_RECVFROM)
81 # define M_METHOD M_METHOD_RECVFROM
82 # else
83 # define M_METHOD M_METHOD_NONE
84 # endif
85 # endif
86
87 # if defined(OPENSSL_SYS_WINDOWS)
88 # define BIO_CMSG_SPACE(x) WSA_CMSG_SPACE(x)
89 # define BIO_CMSG_FIRSTHDR(x) WSA_CMSG_FIRSTHDR(x)
90 # define BIO_CMSG_NXTHDR(x, y) WSA_CMSG_NXTHDR(x, y)
91 # define BIO_CMSG_DATA(x) WSA_CMSG_DATA(x)
92 # define BIO_CMSG_LEN(x) WSA_CMSG_LEN(x)
93 # define MSGHDR_TYPE WSAMSG
94 # define CMSGHDR_TYPE WSACMSGHDR
95 # else
96 # define MSGHDR_TYPE struct msghdr
97 # define CMSGHDR_TYPE struct cmsghdr
98 # define BIO_CMSG_SPACE(x) CMSG_SPACE(x)
99 # define BIO_CMSG_FIRSTHDR(x) CMSG_FIRSTHDR(x)
100 # define BIO_CMSG_NXTHDR(x, y) CMSG_NXTHDR(x, y)
101 # define BIO_CMSG_DATA(x) CMSG_DATA(x)
102 # define BIO_CMSG_LEN(x) CMSG_LEN(x)
103 # endif
104
105 # if M_METHOD == M_METHOD_RECVMMSG \
106 || M_METHOD == M_METHOD_RECVMSG \
107 || M_METHOD == M_METHOD_WSARECVMSG
108 # if defined(__APPLE__)
109 /*
110 * CMSG_SPACE is not a constant expression on OSX even though POSIX
111 * says it's supposed to be. This should be adequate.
112 */
113 # define BIO_CMSG_ALLOC_LEN 64
114 # else
115 # if defined(IPV6_PKTINFO)
116 # define BIO_CMSG_ALLOC_LEN_1 BIO_CMSG_SPACE(sizeof(struct in6_pktinfo))
117 # else
118 # define BIO_CMSG_ALLOC_LEN_1 0
119 # endif
120 # if defined(IP_PKTINFO)
121 # define BIO_CMSG_ALLOC_LEN_2 BIO_CMSG_SPACE(sizeof(struct in_pktinfo))
122 # else
123 # define BIO_CMSG_ALLOC_LEN_2 0
124 # endif
125 # if defined(IP_RECVDSTADDR)
126 # define BIO_CMSG_ALLOC_LEN_3 BIO_CMSG_SPACE(sizeof(struct in_addr))
127 # else
128 # define BIO_CMSG_ALLOC_LEN_3 0
129 # endif
130 # define BIO_MAX(X,Y) ((X) > (Y) ? (X) : (Y))
131 # define BIO_CMSG_ALLOC_LEN \
132 BIO_MAX(BIO_CMSG_ALLOC_LEN_1, \
133 BIO_MAX(BIO_CMSG_ALLOC_LEN_2, BIO_CMSG_ALLOC_LEN_3))
134 # endif
135 # if (defined(IP_PKTINFO) || defined(IP_RECVDSTADDR)) && defined(IPV6_RECVPKTINFO)
136 # define SUPPORT_LOCAL_ADDR
137 # endif
138 # endif
139
140 # define BIO_MSG_N(array, stride, n) (*(BIO_MSG *)((char *)(array) + (n)*(stride)))
141
142 static int dgram_write(BIO *h, const char *buf, int num);
143 static int dgram_read(BIO *h, char *buf, int size);
144 static int dgram_puts(BIO *h, const char *str);
145 static long dgram_ctrl(BIO *h, int cmd, long arg1, void *arg2);
146 static int dgram_new(BIO *h);
147 static int dgram_free(BIO *data);
148 static int dgram_clear(BIO *bio);
149 static int dgram_sendmmsg(BIO *b, BIO_MSG *msg,
150 size_t stride, size_t num_msg,
151 uint64_t flags, size_t *num_processed);
152 static int dgram_recvmmsg(BIO *b, BIO_MSG *msg,
153 size_t stride, size_t num_msg,
154 uint64_t flags, size_t *num_processed);
155
156 # ifndef OPENSSL_NO_SCTP
157 static int dgram_sctp_write(BIO *h, const char *buf, int num);
158 static int dgram_sctp_read(BIO *h, char *buf, int size);
159 static int dgram_sctp_puts(BIO *h, const char *str);
160 static long dgram_sctp_ctrl(BIO *h, int cmd, long arg1, void *arg2);
161 static int dgram_sctp_new(BIO *h);
162 static int dgram_sctp_free(BIO *data);
163 static int dgram_sctp_wait_for_dry(BIO *b);
164 static int dgram_sctp_msg_waiting(BIO *b);
165 # ifdef SCTP_AUTHENTICATION_EVENT
166 static void dgram_sctp_handle_auth_free_key_event(BIO *b, union sctp_notification
167 *snp);
168 # endif
169 # endif
170
171 static int BIO_dgram_should_retry(int s);
172
173 static const BIO_METHOD methods_dgramp = {
174 BIO_TYPE_DGRAM,
175 "datagram socket",
176 bwrite_conv,
177 dgram_write,
178 bread_conv,
179 dgram_read,
180 dgram_puts,
181 NULL, /* dgram_gets, */
182 dgram_ctrl,
183 dgram_new,
184 dgram_free,
185 NULL, /* dgram_callback_ctrl */
186 dgram_sendmmsg,
187 dgram_recvmmsg,
188 };
189
190 # ifndef OPENSSL_NO_SCTP
191 static const BIO_METHOD methods_dgramp_sctp = {
192 BIO_TYPE_DGRAM_SCTP,
193 "datagram sctp socket",
194 bwrite_conv,
195 dgram_sctp_write,
196 bread_conv,
197 dgram_sctp_read,
198 dgram_sctp_puts,
199 NULL, /* dgram_gets, */
200 dgram_sctp_ctrl,
201 dgram_sctp_new,
202 dgram_sctp_free,
203 NULL, /* dgram_callback_ctrl */
204 NULL, /* sendmmsg */
205 NULL, /* recvmmsg */
206 };
207 # endif
208
209 typedef struct bio_dgram_data_st {
210 BIO_ADDR peer;
211 BIO_ADDR local_addr;
212 unsigned int connected;
213 unsigned int _errno;
214 unsigned int mtu;
215 OSSL_TIME next_timeout;
216 OSSL_TIME socket_timeout;
217 unsigned int peekmode;
218 char local_addr_enabled;
219 } bio_dgram_data;
220
221 # ifndef OPENSSL_NO_SCTP
222 typedef struct bio_dgram_sctp_save_message_st {
223 BIO *bio;
224 char *data;
225 int length;
226 } bio_dgram_sctp_save_message;
227
228 /*
229 * Note: bio_dgram_data must be first here
230 * as we use dgram_ctrl for underlying dgram operations
231 * which will cast this struct to a bio_dgram_data
232 */
233 typedef struct bio_dgram_sctp_data_st {
234 bio_dgram_data dgram;
235 struct bio_dgram_sctp_sndinfo sndinfo;
236 struct bio_dgram_sctp_rcvinfo rcvinfo;
237 struct bio_dgram_sctp_prinfo prinfo;
238 BIO_dgram_sctp_notification_handler_fn handle_notifications;
239 void *notification_context;
240 int in_handshake;
241 int ccs_rcvd;
242 int ccs_sent;
243 int save_shutdown;
244 int peer_auth_tested;
245 } bio_dgram_sctp_data;
246 # endif
247
BIO_s_datagram(void)248 const BIO_METHOD *BIO_s_datagram(void)
249 {
250 return &methods_dgramp;
251 }
252
BIO_new_dgram(int fd,int close_flag)253 BIO *BIO_new_dgram(int fd, int close_flag)
254 {
255 BIO *ret;
256
257 ret = BIO_new(BIO_s_datagram());
258 if (ret == NULL)
259 return NULL;
260 BIO_set_fd(ret, fd, close_flag);
261 return ret;
262 }
263
dgram_new(BIO * bi)264 static int dgram_new(BIO *bi)
265 {
266 bio_dgram_data *data = OPENSSL_zalloc(sizeof(*data));
267
268 if (data == NULL)
269 return 0;
270 bi->ptr = data;
271 return 1;
272 }
273
dgram_free(BIO * a)274 static int dgram_free(BIO *a)
275 {
276 bio_dgram_data *data;
277
278 if (a == NULL)
279 return 0;
280 if (!dgram_clear(a))
281 return 0;
282
283 data = (bio_dgram_data *)a->ptr;
284 OPENSSL_free(data);
285
286 return 1;
287 }
288
dgram_clear(BIO * a)289 static int dgram_clear(BIO *a)
290 {
291 if (a == NULL)
292 return 0;
293 if (a->shutdown) {
294 if (a->init) {
295 BIO_closesocket(a->num);
296 }
297 a->init = 0;
298 a->flags = 0;
299 }
300 return 1;
301 }
302
dgram_adjust_rcv_timeout(BIO * b)303 static void dgram_adjust_rcv_timeout(BIO *b)
304 {
305 # if defined(SO_RCVTIMEO)
306 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
307 OSSL_TIME timeleft;
308
309 /* Is a timer active? */
310 if (!ossl_time_is_zero(data->next_timeout)) {
311 /* Read current socket timeout */
312 # ifdef OPENSSL_SYS_WINDOWS
313 int timeout;
314 int sz = sizeof(timeout);
315
316 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
317 (void *)&timeout, &sz) < 0)
318 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
319 "calling getsockopt()");
320 else
321 data->socket_timeout = ossl_ms2time(timeout);
322 # else
323 struct timeval tv;
324 socklen_t sz = sizeof(tv);
325
326 if (getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &tv, &sz) < 0)
327 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
328 "calling getsockopt()");
329 else
330 data->socket_timeout = ossl_time_from_timeval(tv);
331 # endif
332
333 /* Calculate time left until timer expires */
334 timeleft = ossl_time_subtract(data->next_timeout, ossl_time_now());
335 if (ossl_time_compare(timeleft, ossl_ticks2time(OSSL_TIME_US)) < 0)
336 timeleft = ossl_ticks2time(OSSL_TIME_US);
337
338 /*
339 * Adjust socket timeout if next handshake message timer will expire
340 * earlier.
341 */
342 if (ossl_time_is_zero(data->socket_timeout)
343 || ossl_time_compare(data->socket_timeout, timeleft) >= 0) {
344 # ifdef OPENSSL_SYS_WINDOWS
345 timeout = (int)ossl_time2ms(timeleft);
346 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
347 (void *)&timeout, sizeof(timeout)) < 0)
348 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
349 "calling setsockopt()");
350 # else
351 tv = ossl_time_to_timeval(timeleft);
352 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &tv,
353 sizeof(tv)) < 0)
354 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
355 "calling setsockopt()");
356 # endif
357 }
358 }
359 # endif
360 }
361
dgram_update_local_addr(BIO * b)362 static void dgram_update_local_addr(BIO *b)
363 {
364 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
365 socklen_t addr_len = sizeof(data->local_addr);
366
367 if (getsockname(b->num, &data->local_addr.sa, &addr_len) < 0)
368 /*
369 * This should not be possible, but zero-initialize and return
370 * anyway.
371 */
372 BIO_ADDR_clear(&data->local_addr);
373 }
374
375 # if M_METHOD == M_METHOD_RECVMMSG || M_METHOD == M_METHOD_RECVMSG || M_METHOD == M_METHOD_WSARECVMSG
dgram_get_sock_family(BIO * b)376 static int dgram_get_sock_family(BIO *b)
377 {
378 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
379 return data->local_addr.sa.sa_family;
380 }
381 # endif
382
dgram_reset_rcv_timeout(BIO * b)383 static void dgram_reset_rcv_timeout(BIO *b)
384 {
385 # if defined(SO_RCVTIMEO)
386 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
387
388 /* Is a timer active? */
389 if (!ossl_time_is_zero(data->next_timeout)) {
390 # ifdef OPENSSL_SYS_WINDOWS
391 int timeout = (int)ossl_time2ms(data->socket_timeout);
392
393 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
394 (void *)&timeout, sizeof(timeout)) < 0)
395 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
396 "calling setsockopt()");
397 # else
398 struct timeval tv = ossl_time_to_timeval(data->socket_timeout);
399
400 if (setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
401 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
402 "calling setsockopt()");
403 # endif
404 }
405 # endif
406 }
407
dgram_read(BIO * b,char * out,int outl)408 static int dgram_read(BIO *b, char *out, int outl)
409 {
410 int ret = 0;
411 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
412 int flags = 0;
413
414 BIO_ADDR peer;
415 socklen_t len = sizeof(peer);
416
417 if (out != NULL) {
418 clear_socket_error();
419 BIO_ADDR_clear(&peer);
420 dgram_adjust_rcv_timeout(b);
421 if (data->peekmode)
422 flags = MSG_PEEK;
423 ret = recvfrom(b->num, out, outl, flags,
424 BIO_ADDR_sockaddr_noconst(&peer), &len);
425
426 if (!data->connected && ret >= 0)
427 BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, &peer);
428
429 BIO_clear_retry_flags(b);
430 if (ret < 0) {
431 if (BIO_dgram_should_retry(ret)) {
432 BIO_set_retry_read(b);
433 data->_errno = get_last_socket_error();
434 }
435 }
436
437 dgram_reset_rcv_timeout(b);
438 }
439 return ret;
440 }
441
dgram_write(BIO * b,const char * in,int inl)442 static int dgram_write(BIO *b, const char *in, int inl)
443 {
444 int ret;
445 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
446 clear_socket_error();
447
448 if (data->connected)
449 ret = writesocket(b->num, in, inl);
450 else {
451 int peerlen = BIO_ADDR_sockaddr_size(&data->peer);
452
453 ret = sendto(b->num, in, inl, 0,
454 BIO_ADDR_sockaddr(&data->peer), peerlen);
455 }
456
457 BIO_clear_retry_flags(b);
458 if (ret <= 0) {
459 if (BIO_dgram_should_retry(ret)) {
460 BIO_set_retry_write(b);
461 data->_errno = get_last_socket_error();
462 }
463 }
464 return ret;
465 }
466
dgram_get_mtu_overhead(bio_dgram_data * data)467 static long dgram_get_mtu_overhead(bio_dgram_data *data)
468 {
469 long ret;
470
471 switch (BIO_ADDR_family(&data->peer)) {
472 case AF_INET:
473 /*
474 * Assume this is UDP - 20 bytes for IP, 8 bytes for UDP
475 */
476 ret = 28;
477 break;
478 # if OPENSSL_USE_IPV6
479 case AF_INET6:
480 {
481 # ifdef IN6_IS_ADDR_V4MAPPED
482 struct in6_addr tmp_addr;
483 if (BIO_ADDR_rawaddress(&data->peer, &tmp_addr, NULL)
484 && IN6_IS_ADDR_V4MAPPED(&tmp_addr))
485 /*
486 * Assume this is UDP - 20 bytes for IP, 8 bytes for UDP
487 */
488 ret = 28;
489 else
490 # endif
491 /*
492 * Assume this is UDP - 40 bytes for IP, 8 bytes for UDP
493 */
494 ret = 48;
495 }
496 break;
497 # endif
498 default:
499 /* We don't know. Go with the historical default */
500 ret = 28;
501 break;
502 }
503 return ret;
504 }
505
506 /* Enables appropriate destination address reception option on the socket. */
507 # if defined(SUPPORT_LOCAL_ADDR)
enable_local_addr(BIO * b,int enable)508 static int enable_local_addr(BIO *b, int enable) {
509 int af = dgram_get_sock_family(b);
510
511 if (af == AF_INET) {
512 # if defined(IP_PKTINFO)
513 /* IP_PKTINFO is preferred */
514 if (setsockopt(b->num, IPPROTO_IP, IP_PKTINFO,
515 (void *)&enable, sizeof(enable)) < 0)
516 return 0;
517
518 return 1;
519
520 # elif defined(IP_RECVDSTADDR)
521 /* Fall back to IP_RECVDSTADDR */
522
523 if (setsockopt(b->num, IPPROTO_IP, IP_RECVDSTADDR,
524 &enable, sizeof(enable)) < 0)
525 return 0;
526
527 return 1;
528 # endif
529 }
530
531 # if OPENSSL_USE_IPV6
532 if (af == AF_INET6) {
533 # if defined(IPV6_RECVPKTINFO)
534 if (setsockopt(b->num, IPPROTO_IPV6, IPV6_RECVPKTINFO,
535 &enable, sizeof(enable)) < 0)
536 return 0;
537
538 return 1;
539 # endif
540 }
541 # endif
542
543 return 0;
544 }
545 # endif
546
dgram_ctrl(BIO * b,int cmd,long num,void * ptr)547 static long dgram_ctrl(BIO *b, int cmd, long num, void *ptr)
548 {
549 long ret = 1;
550 int *ip;
551 bio_dgram_data *data = NULL;
552 # ifndef __DJGPP__
553 /* There are currently no cases where this is used on djgpp/watt32. */
554 int sockopt_val = 0;
555 # endif
556 int d_errno;
557 # if defined(OPENSSL_SYS_LINUX) && (defined(IP_MTU_DISCOVER) || defined(IP_MTU))
558 socklen_t sockopt_len; /* assume that system supporting IP_MTU is
559 * modern enough to define socklen_t */
560 socklen_t addr_len;
561 BIO_ADDR addr;
562 # endif
563 struct sockaddr_storage ss;
564 socklen_t ss_len = sizeof(ss);
565
566 data = (bio_dgram_data *)b->ptr;
567
568 switch (cmd) {
569 case BIO_CTRL_RESET:
570 num = 0;
571 ret = 0;
572 break;
573 case BIO_CTRL_INFO:
574 ret = 0;
575 break;
576 case BIO_C_SET_FD:
577 dgram_clear(b);
578 b->num = *((int *)ptr);
579 b->shutdown = (int)num;
580 b->init = 1;
581 dgram_update_local_addr(b);
582 if (getpeername(b->num, (struct sockaddr *)&ss, &ss_len) == 0) {
583 BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)&ss));
584 data->connected = 1;
585 }
586 # if defined(SUPPORT_LOCAL_ADDR)
587 if (data->local_addr_enabled) {
588 if (enable_local_addr(b, 1) < 1)
589 data->local_addr_enabled = 0;
590 }
591 # endif
592 break;
593 case BIO_C_GET_FD:
594 if (b->init) {
595 ip = (int *)ptr;
596 if (ip != NULL)
597 *ip = b->num;
598 ret = b->num;
599 } else
600 ret = -1;
601 break;
602 case BIO_CTRL_GET_CLOSE:
603 ret = b->shutdown;
604 break;
605 case BIO_CTRL_SET_CLOSE:
606 b->shutdown = (int)num;
607 break;
608 case BIO_CTRL_PENDING:
609 case BIO_CTRL_WPENDING:
610 ret = 0;
611 break;
612 case BIO_CTRL_DUP:
613 case BIO_CTRL_FLUSH:
614 ret = 1;
615 break;
616 case BIO_CTRL_DGRAM_CONNECT:
617 BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
618 break;
619 /* (Linux)kernel sets DF bit on outgoing IP packets */
620 case BIO_CTRL_DGRAM_MTU_DISCOVER:
621 # if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO)
622 addr_len = (socklen_t) sizeof(addr);
623 BIO_ADDR_clear(&addr);
624 if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
625 ret = 0;
626 break;
627 }
628 switch (addr.sa.sa_family) {
629 case AF_INET:
630 sockopt_val = IP_PMTUDISC_DO;
631 if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
632 &sockopt_val, sizeof(sockopt_val))) < 0)
633 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
634 "calling setsockopt()");
635 break;
636 # if OPENSSL_USE_IPV6 && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO)
637 case AF_INET6:
638 sockopt_val = IPV6_PMTUDISC_DO;
639 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
640 &sockopt_val, sizeof(sockopt_val))) < 0)
641 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
642 "calling setsockopt()");
643 break;
644 # endif
645 default:
646 ret = -1;
647 break;
648 }
649 # else
650 ret = -1;
651 # endif
652 break;
653 case BIO_CTRL_DGRAM_QUERY_MTU:
654 # if defined(OPENSSL_SYS_LINUX) && defined(IP_MTU)
655 addr_len = (socklen_t) sizeof(addr);
656 BIO_ADDR_clear(&addr);
657 if (getsockname(b->num, &addr.sa, &addr_len) < 0) {
658 ret = 0;
659 break;
660 }
661 sockopt_len = sizeof(sockopt_val);
662 switch (addr.sa.sa_family) {
663 case AF_INET:
664 if ((ret =
665 getsockopt(b->num, IPPROTO_IP, IP_MTU, (void *)&sockopt_val,
666 &sockopt_len)) < 0 || sockopt_val < 0) {
667 ret = 0;
668 } else {
669 /*
670 * we assume that the transport protocol is UDP and no IP
671 * options are used.
672 */
673 data->mtu = sockopt_val - 8 - 20;
674 ret = data->mtu;
675 }
676 break;
677 # if OPENSSL_USE_IPV6 && defined(IPV6_MTU)
678 case AF_INET6:
679 if ((ret =
680 getsockopt(b->num, IPPROTO_IPV6, IPV6_MTU,
681 (void *)&sockopt_val, &sockopt_len)) < 0
682 || sockopt_val < 0) {
683 ret = 0;
684 } else {
685 /*
686 * we assume that the transport protocol is UDP and no IPV6
687 * options are used.
688 */
689 data->mtu = sockopt_val - 8 - 40;
690 ret = data->mtu;
691 }
692 break;
693 # endif
694 default:
695 ret = 0;
696 break;
697 }
698 # else
699 ret = 0;
700 # endif
701 break;
702 case BIO_CTRL_DGRAM_GET_FALLBACK_MTU:
703 ret = -dgram_get_mtu_overhead(data);
704 switch (BIO_ADDR_family(&data->peer)) {
705 case AF_INET:
706 ret += 576;
707 break;
708 # if OPENSSL_USE_IPV6
709 case AF_INET6:
710 {
711 # ifdef IN6_IS_ADDR_V4MAPPED
712 struct in6_addr tmp_addr;
713 if (BIO_ADDR_rawaddress(&data->peer, &tmp_addr, NULL)
714 && IN6_IS_ADDR_V4MAPPED(&tmp_addr))
715 ret += 576;
716 else
717 # endif
718 ret += 1280;
719 }
720 break;
721 # endif
722 default:
723 ret += 576;
724 break;
725 }
726 break;
727 case BIO_CTRL_DGRAM_GET_MTU:
728 return data->mtu;
729 case BIO_CTRL_DGRAM_SET_MTU:
730 data->mtu = num;
731 ret = num;
732 break;
733 case BIO_CTRL_DGRAM_SET_CONNECTED:
734 if (ptr != NULL) {
735 data->connected = 1;
736 BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
737 } else {
738 data->connected = 0;
739 BIO_ADDR_clear(&data->peer);
740 }
741 break;
742 case BIO_CTRL_DGRAM_GET_PEER:
743 ret = BIO_ADDR_sockaddr_size(&data->peer);
744 /* FIXME: if num < ret, we will only return part of an address.
745 That should bee an error, no? */
746 if (num == 0 || num > ret)
747 num = ret;
748 memcpy(ptr, &data->peer, (ret = num));
749 break;
750 case BIO_CTRL_DGRAM_SET_PEER:
751 BIO_ADDR_make(&data->peer, BIO_ADDR_sockaddr((BIO_ADDR *)ptr));
752 break;
753 case BIO_CTRL_DGRAM_DETECT_PEER_ADDR:
754 {
755 BIO_ADDR xaddr, *p = &data->peer;
756 socklen_t xaddr_len = sizeof(xaddr.sa);
757
758 if (BIO_ADDR_family(p) == AF_UNSPEC) {
759 if (getpeername(b->num, (void *)&xaddr.sa, &xaddr_len) == 0
760 && BIO_ADDR_family(&xaddr) != AF_UNSPEC) {
761 p = &xaddr;
762 } else {
763 ret = 0;
764 break;
765 }
766 }
767
768 ret = BIO_ADDR_sockaddr_size(p);
769 if (num == 0 || num > ret)
770 num = ret;
771
772 memcpy(ptr, p, (ret = num));
773 }
774 break;
775 case BIO_C_SET_NBIO:
776 if (!BIO_socket_nbio(b->num, num != 0))
777 ret = 0;
778 break;
779 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
780 data->next_timeout = ossl_time_from_timeval(*(struct timeval *)ptr);
781 break;
782 # if defined(SO_RCVTIMEO)
783 case BIO_CTRL_DGRAM_SET_RECV_TIMEOUT:
784 # ifdef OPENSSL_SYS_WINDOWS
785 {
786 struct timeval *tv = (struct timeval *)ptr;
787 int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000;
788
789 if ((ret = setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
790 (void *)&timeout, sizeof(timeout))) < 0)
791 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
792 "calling setsockopt()");
793 }
794 # else
795 if ((ret = setsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO, ptr,
796 sizeof(struct timeval))) < 0)
797 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
798 "calling setsockopt()");
799 # endif
800 break;
801 case BIO_CTRL_DGRAM_GET_RECV_TIMEOUT:
802 {
803 # ifdef OPENSSL_SYS_WINDOWS
804 int sz = 0;
805 int timeout;
806 struct timeval *tv = (struct timeval *)ptr;
807
808 sz = sizeof(timeout);
809 if ((ret = getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
810 (void *)&timeout, &sz)) < 0) {
811 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
812 "calling getsockopt()");
813 } else {
814 tv->tv_sec = timeout / 1000;
815 tv->tv_usec = (timeout % 1000) * 1000;
816 ret = sizeof(*tv);
817 }
818 # else
819 socklen_t sz = sizeof(struct timeval);
820 if ((ret = getsockopt(b->num, SOL_SOCKET, SO_RCVTIMEO,
821 ptr, &sz)) < 0) {
822 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
823 "calling getsockopt()");
824 } else {
825 OPENSSL_assert((size_t)sz <= sizeof(struct timeval));
826 ret = (int)sz;
827 }
828 # endif
829 }
830 break;
831 # endif
832 # if defined(SO_SNDTIMEO)
833 case BIO_CTRL_DGRAM_SET_SEND_TIMEOUT:
834 # ifdef OPENSSL_SYS_WINDOWS
835 {
836 struct timeval *tv = (struct timeval *)ptr;
837 int timeout = tv->tv_sec * 1000 + tv->tv_usec / 1000;
838
839 if ((ret = setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
840 (void *)&timeout, sizeof(timeout))) < 0)
841 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
842 "calling setsockopt()");
843 }
844 # else
845 if ((ret = setsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO, ptr,
846 sizeof(struct timeval))) < 0)
847 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
848 "calling setsockopt()");
849 # endif
850 break;
851 case BIO_CTRL_DGRAM_GET_SEND_TIMEOUT:
852 {
853 # ifdef OPENSSL_SYS_WINDOWS
854 int sz = 0;
855 int timeout;
856 struct timeval *tv = (struct timeval *)ptr;
857
858 sz = sizeof(timeout);
859 if ((ret = getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
860 (void *)&timeout, &sz)) < 0) {
861 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
862 "calling getsockopt()");
863 } else {
864 tv->tv_sec = timeout / 1000;
865 tv->tv_usec = (timeout % 1000) * 1000;
866 ret = sizeof(*tv);
867 }
868 # else
869 socklen_t sz = sizeof(struct timeval);
870
871 if ((ret = getsockopt(b->num, SOL_SOCKET, SO_SNDTIMEO,
872 ptr, &sz)) < 0) {
873 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
874 "calling getsockopt()");
875 } else {
876 OPENSSL_assert((size_t)sz <= sizeof(struct timeval));
877 ret = (int)sz;
878 }
879 # endif
880 }
881 break;
882 # endif
883 case BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP:
884 /* fall-through */
885 case BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP:
886 # ifdef OPENSSL_SYS_WINDOWS
887 d_errno = (data->_errno == WSAETIMEDOUT);
888 # else
889 d_errno = (data->_errno == EAGAIN);
890 # endif
891 if (d_errno) {
892 ret = 1;
893 data->_errno = 0;
894 } else
895 ret = 0;
896 break;
897 # ifdef EMSGSIZE
898 case BIO_CTRL_DGRAM_MTU_EXCEEDED:
899 if (data->_errno == EMSGSIZE) {
900 ret = 1;
901 data->_errno = 0;
902 } else
903 ret = 0;
904 break;
905 # endif
906 case BIO_CTRL_DGRAM_SET_DONT_FRAG:
907 switch (data->peer.sa.sa_family) {
908 case AF_INET:
909 # if defined(IP_DONTFRAG)
910 sockopt_val = num ? 1 : 0;
911 if ((ret = setsockopt(b->num, IPPROTO_IP, IP_DONTFRAG,
912 &sockopt_val, sizeof(sockopt_val))) < 0)
913 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
914 "calling setsockopt()");
915 # elif defined(OPENSSL_SYS_LINUX) && defined(IP_MTU_DISCOVER) && defined (IP_PMTUDISC_PROBE)
916 sockopt_val = num ? IP_PMTUDISC_PROBE : IP_PMTUDISC_DONT;
917 if ((ret = setsockopt(b->num, IPPROTO_IP, IP_MTU_DISCOVER,
918 &sockopt_val, sizeof(sockopt_val))) < 0)
919 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
920 "calling setsockopt()");
921 # elif defined(OPENSSL_SYS_WINDOWS) && defined(IP_DONTFRAGMENT)
922 sockopt_val = num ? 1 : 0;
923 if ((ret = setsockopt(b->num, IPPROTO_IP, IP_DONTFRAGMENT,
924 (const char *)&sockopt_val,
925 sizeof(sockopt_val))) < 0)
926 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
927 "calling setsockopt()");
928 # else
929 ret = -1;
930 # endif
931 break;
932 # if OPENSSL_USE_IPV6
933 case AF_INET6:
934 # if defined(IPV6_DONTFRAG)
935 sockopt_val = num ? 1 : 0;
936 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_DONTFRAG,
937 (const void *)&sockopt_val,
938 sizeof(sockopt_val))) < 0)
939 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
940 "calling setsockopt()");
941
942 # elif defined(OPENSSL_SYS_LINUX) && defined(IPV6_MTUDISCOVER)
943 sockopt_val = num ? IP_PMTUDISC_PROBE : IP_PMTUDISC_DONT;
944 if ((ret = setsockopt(b->num, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
945 &sockopt_val, sizeof(sockopt_val))) < 0)
946 ERR_raise_data(ERR_LIB_SYS, get_last_socket_error(),
947 "calling setsockopt()");
948 # else
949 ret = -1;
950 # endif
951 break;
952 # endif
953 default:
954 ret = -1;
955 break;
956 }
957 break;
958 case BIO_CTRL_DGRAM_GET_MTU_OVERHEAD:
959 ret = dgram_get_mtu_overhead(data);
960 break;
961
962 /*
963 * BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE is used here for compatibility
964 * reasons. When BIO_CTRL_DGRAM_SET_PEEK_MODE was first defined its value
965 * was incorrectly clashing with BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE. The
966 * value has been updated to a non-clashing value. However to preserve
967 * binary compatibility we now respond to both the old value and the new one
968 */
969 case BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE:
970 case BIO_CTRL_DGRAM_SET_PEEK_MODE:
971 data->peekmode = (unsigned int)num;
972 break;
973
974 case BIO_CTRL_DGRAM_GET_LOCAL_ADDR_CAP:
975 # if defined(SUPPORT_LOCAL_ADDR)
976 ret = 1;
977 # else
978 ret = 0;
979 # endif
980 break;
981
982 case BIO_CTRL_DGRAM_SET_LOCAL_ADDR_ENABLE:
983 # if defined(SUPPORT_LOCAL_ADDR)
984 num = num > 0;
985 if (num != data->local_addr_enabled) {
986 if (enable_local_addr(b, num) < 1) {
987 ret = 0;
988 break;
989 }
990
991 data->local_addr_enabled = (char)num;
992 }
993 # else
994 ret = 0;
995 # endif
996 break;
997
998 case BIO_CTRL_DGRAM_GET_LOCAL_ADDR_ENABLE:
999 *(int *)ptr = data->local_addr_enabled;
1000 break;
1001
1002 case BIO_CTRL_DGRAM_GET_EFFECTIVE_CAPS:
1003 ret = (long)(BIO_DGRAM_CAP_HANDLES_DST_ADDR
1004 | BIO_DGRAM_CAP_HANDLES_SRC_ADDR
1005 | BIO_DGRAM_CAP_PROVIDES_DST_ADDR
1006 | BIO_DGRAM_CAP_PROVIDES_SRC_ADDR);
1007 break;
1008
1009 case BIO_CTRL_GET_RPOLL_DESCRIPTOR:
1010 case BIO_CTRL_GET_WPOLL_DESCRIPTOR:
1011 {
1012 BIO_POLL_DESCRIPTOR *pd = ptr;
1013
1014 pd->type = BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD;
1015 pd->value.fd = b->num;
1016 }
1017 break;
1018
1019 default:
1020 ret = 0;
1021 break;
1022 }
1023 /* Normalize if error */
1024 if (ret < 0)
1025 ret = -1;
1026 return ret;
1027 }
1028
dgram_puts(BIO * bp,const char * str)1029 static int dgram_puts(BIO *bp, const char *str)
1030 {
1031 int n, ret;
1032
1033 n = strlen(str);
1034 ret = dgram_write(bp, str, n);
1035 return ret;
1036 }
1037
1038 # if M_METHOD == M_METHOD_WSARECVMSG
translate_msg_win(BIO * b,WSAMSG * mh,WSABUF * iov,unsigned char * control,BIO_MSG * msg)1039 static void translate_msg_win(BIO *b, WSAMSG *mh, WSABUF *iov,
1040 unsigned char *control, BIO_MSG *msg)
1041 {
1042 iov->len = msg->data_len;
1043 iov->buf = msg->data;
1044
1045 /* Windows requires namelen to be set exactly */
1046 mh->name = msg->peer != NULL ? &msg->peer->sa : NULL;
1047 if (msg->peer != NULL && dgram_get_sock_family(b) == AF_INET)
1048 mh->namelen = sizeof(struct sockaddr_in);
1049 # if OPENSSL_USE_IPV6
1050 else if (msg->peer != NULL && dgram_get_sock_family(b) == AF_INET6)
1051 mh->namelen = sizeof(struct sockaddr_in6);
1052 # endif
1053 else
1054 mh->namelen = 0;
1055
1056 /*
1057 * When local address reception (IP_PKTINFO, etc.) is enabled, on Windows
1058 * this causes WSARecvMsg to fail if the control buffer is too small to hold
1059 * the structure, or if no control buffer is passed. So we need to give it
1060 * the control buffer even if we aren't actually going to examine the
1061 * result.
1062 */
1063 mh->lpBuffers = iov;
1064 mh->dwBufferCount = 1;
1065 mh->Control.len = BIO_CMSG_ALLOC_LEN;
1066 mh->Control.buf = control;
1067 mh->dwFlags = 0;
1068 }
1069 # endif
1070
1071 # if M_METHOD == M_METHOD_RECVMMSG || M_METHOD == M_METHOD_RECVMSG
1072 /* Translates a BIO_MSG to a msghdr and iovec. */
translate_msg(BIO * b,struct msghdr * mh,struct iovec * iov,unsigned char * control,BIO_MSG * msg)1073 static void translate_msg(BIO *b, struct msghdr *mh, struct iovec *iov,
1074 unsigned char *control, BIO_MSG *msg)
1075 {
1076 bio_dgram_data *data;
1077
1078 iov->iov_base = msg->data;
1079 iov->iov_len = msg->data_len;
1080
1081 data = (bio_dgram_data *)b->ptr;
1082 if (data->connected == 0) {
1083 /* macOS requires msg_namelen be 0 if msg_name is NULL */
1084 mh->msg_name = msg->peer != NULL ? &msg->peer->sa : NULL;
1085 if (msg->peer != NULL && dgram_get_sock_family(b) == AF_INET)
1086 mh->msg_namelen = sizeof(struct sockaddr_in);
1087 # if OPENSSL_USE_IPV6
1088 else if (msg->peer != NULL && dgram_get_sock_family(b) == AF_INET6)
1089 mh->msg_namelen = sizeof(struct sockaddr_in6);
1090 # endif
1091 else
1092 mh->msg_namelen = 0;
1093 } else {
1094 mh->msg_name = NULL;
1095 mh->msg_namelen = 0;
1096 }
1097
1098 mh->msg_iov = iov;
1099 mh->msg_iovlen = 1;
1100 mh->msg_control = msg->local != NULL ? control : NULL;
1101 mh->msg_controllen = msg->local != NULL ? BIO_CMSG_ALLOC_LEN : 0;
1102 mh->msg_flags = 0;
1103 }
1104 # endif
1105
1106 # if M_METHOD == M_METHOD_RECVMMSG || M_METHOD == M_METHOD_RECVMSG || M_METHOD == M_METHOD_WSARECVMSG
1107 /* Extracts destination address from the control buffer. */
extract_local(BIO * b,MSGHDR_TYPE * mh,BIO_ADDR * local)1108 static int extract_local(BIO *b, MSGHDR_TYPE *mh, BIO_ADDR *local) {
1109 # if defined(IP_PKTINFO) || defined(IP_RECVDSTADDR) || defined(IPV6_PKTINFO)
1110 CMSGHDR_TYPE *cmsg;
1111 int af = dgram_get_sock_family(b);
1112
1113 for (cmsg = BIO_CMSG_FIRSTHDR(mh); cmsg != NULL;
1114 cmsg = BIO_CMSG_NXTHDR(mh, cmsg)) {
1115 if (af == AF_INET) {
1116 if (cmsg->cmsg_level != IPPROTO_IP)
1117 continue;
1118
1119 # if defined(IP_PKTINFO)
1120 if (cmsg->cmsg_type != IP_PKTINFO)
1121 continue;
1122
1123 local->s_in.sin_addr =
1124 ((struct in_pktinfo *)BIO_CMSG_DATA(cmsg))->ipi_addr;
1125
1126 # elif defined(IP_RECVDSTADDR)
1127 if (cmsg->cmsg_type != IP_RECVDSTADDR)
1128 continue;
1129
1130 local->s_in.sin_addr = *(struct in_addr *)BIO_CMSG_DATA(cmsg);
1131 # endif
1132
1133 # if defined(IP_PKTINFO) || defined(IP_RECVDSTADDR)
1134 {
1135 bio_dgram_data *data = b->ptr;
1136
1137 local->s_in.sin_family = AF_INET;
1138 local->s_in.sin_port = data->local_addr.s_in.sin_port;
1139 }
1140 return 1;
1141 # endif
1142 }
1143 # if OPENSSL_USE_IPV6
1144 else if (af == AF_INET6) {
1145 if (cmsg->cmsg_level != IPPROTO_IPV6)
1146 continue;
1147
1148 # if defined(IPV6_RECVPKTINFO)
1149 if (cmsg->cmsg_type != IPV6_PKTINFO)
1150 continue;
1151
1152 {
1153 bio_dgram_data *data = b->ptr;
1154
1155 local->s_in6.sin6_addr =
1156 ((struct in6_pktinfo *)BIO_CMSG_DATA(cmsg))->ipi6_addr;
1157 local->s_in6.sin6_family = AF_INET6;
1158 local->s_in6.sin6_port = data->local_addr.s_in6.sin6_port;
1159 local->s_in6.sin6_scope_id =
1160 data->local_addr.s_in6.sin6_scope_id;
1161 local->s_in6.sin6_flowinfo = 0;
1162 }
1163 return 1;
1164 # endif
1165 }
1166 # endif
1167 }
1168 # endif
1169
1170 return 0;
1171 }
1172
pack_local(BIO * b,MSGHDR_TYPE * mh,const BIO_ADDR * local)1173 static int pack_local(BIO *b, MSGHDR_TYPE *mh, const BIO_ADDR *local) {
1174 int af = dgram_get_sock_family(b);
1175 # if defined(IP_PKTINFO) || defined(IP_RECVDSTADDR) || defined(IPV6_PKTINFO)
1176 CMSGHDR_TYPE *cmsg;
1177 bio_dgram_data *data = b->ptr;
1178 # endif
1179
1180 if (af == AF_INET) {
1181 # if defined(IP_PKTINFO)
1182 struct in_pktinfo *info;
1183
1184 # if defined(OPENSSL_SYS_WINDOWS)
1185 cmsg = (CMSGHDR_TYPE *)mh->Control.buf;
1186 # else
1187 cmsg = (CMSGHDR_TYPE *)mh->msg_control;
1188 # endif
1189
1190 cmsg->cmsg_len = BIO_CMSG_LEN(sizeof(struct in_pktinfo));
1191 cmsg->cmsg_level = IPPROTO_IP;
1192 cmsg->cmsg_type = IP_PKTINFO;
1193
1194 info = (struct in_pktinfo *)BIO_CMSG_DATA(cmsg);
1195 # if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_CYGWIN) && !defined(__FreeBSD__) && !defined(__QNX__)
1196 info->ipi_spec_dst = local->s_in.sin_addr;
1197 # endif
1198 info->ipi_addr.s_addr = 0;
1199 info->ipi_ifindex = 0;
1200
1201 /*
1202 * We cannot override source port using this API, therefore
1203 * ensure the application specified a source port of 0
1204 * or the one we are bound to. (Better to error than silently
1205 * ignore this.)
1206 */
1207 if (local->s_in.sin_port != 0
1208 && data->local_addr.s_in.sin_port != local->s_in.sin_port) {
1209 ERR_raise(ERR_LIB_BIO, BIO_R_PORT_MISMATCH);
1210 return 0;
1211 }
1212
1213 # if defined(OPENSSL_SYS_WINDOWS)
1214 mh->Control.len = BIO_CMSG_SPACE(sizeof(struct in_pktinfo));
1215 # else
1216 mh->msg_controllen = BIO_CMSG_SPACE(sizeof(struct in_pktinfo));
1217 # endif
1218 return 1;
1219
1220 # elif defined(IP_SENDSRCADDR)
1221 struct in_addr *info;
1222
1223 /*
1224 * At least FreeBSD is very pedantic about using IP_SENDSRCADDR when we
1225 * are not bound to 0.0.0.0 or ::, even if the address matches what we
1226 * bound to. Support this by not packing the structure if the address
1227 * matches our understanding of our local address. IP_SENDSRCADDR is a
1228 * BSD thing, so we don't need an explicit test for BSD here.
1229 */
1230 if (local->s_in.sin_addr.s_addr == data->local_addr.s_in.sin_addr.s_addr) {
1231 mh->msg_control = NULL;
1232 mh->msg_controllen = 0;
1233 return 1;
1234 }
1235
1236 cmsg = (struct cmsghdr *)mh->msg_control;
1237 cmsg->cmsg_len = BIO_CMSG_LEN(sizeof(struct in_addr));
1238 cmsg->cmsg_level = IPPROTO_IP;
1239 cmsg->cmsg_type = IP_SENDSRCADDR;
1240
1241 info = (struct in_addr *)BIO_CMSG_DATA(cmsg);
1242 *info = local->s_in.sin_addr;
1243
1244 /* See comment above. */
1245 if (local->s_in.sin_port != 0
1246 && data->local_addr.s_in.sin_port != local->s_in.sin_port) {
1247 ERR_raise(ERR_LIB_BIO, BIO_R_PORT_MISMATCH);
1248 return 0;
1249 }
1250
1251 mh->msg_controllen = BIO_CMSG_SPACE(sizeof(struct in_addr));
1252 return 1;
1253 # endif
1254 }
1255 # if OPENSSL_USE_IPV6
1256 else if (af == AF_INET6) {
1257 # if defined(IPV6_PKTINFO)
1258 struct in6_pktinfo *info;
1259
1260 # if defined(OPENSSL_SYS_WINDOWS)
1261 cmsg = (CMSGHDR_TYPE *)mh->Control.buf;
1262 # else
1263 cmsg = (CMSGHDR_TYPE *)mh->msg_control;
1264 # endif
1265 cmsg->cmsg_len = BIO_CMSG_LEN(sizeof(struct in6_pktinfo));
1266 cmsg->cmsg_level = IPPROTO_IPV6;
1267 cmsg->cmsg_type = IPV6_PKTINFO;
1268
1269 info = (struct in6_pktinfo *)BIO_CMSG_DATA(cmsg);
1270 info->ipi6_addr = local->s_in6.sin6_addr;
1271 info->ipi6_ifindex = 0;
1272
1273 /*
1274 * See comment above, but also applies to the other fields
1275 * in sockaddr_in6.
1276 */
1277 if (local->s_in6.sin6_port != 0
1278 && data->local_addr.s_in6.sin6_port != local->s_in6.sin6_port) {
1279 ERR_raise(ERR_LIB_BIO, BIO_R_PORT_MISMATCH);
1280 return 0;
1281 }
1282
1283 if (local->s_in6.sin6_scope_id != 0
1284 && data->local_addr.s_in6.sin6_scope_id != local->s_in6.sin6_scope_id) {
1285 ERR_raise(ERR_LIB_BIO, BIO_R_PORT_MISMATCH);
1286 return 0;
1287 }
1288
1289 # if defined(OPENSSL_SYS_WINDOWS)
1290 mh->Control.len = BIO_CMSG_SPACE(sizeof(struct in6_pktinfo));
1291 # else
1292 mh->msg_controllen = BIO_CMSG_SPACE(sizeof(struct in6_pktinfo));
1293 # endif
1294 return 1;
1295 # endif
1296 }
1297 # endif
1298
1299 return 0;
1300 }
1301 # endif
1302
1303 /*
1304 * Converts flags passed to BIO_sendmmsg or BIO_recvmmsg to syscall flags. You
1305 * should mask out any system flags returned by this function you cannot support
1306 * in a particular circumstance. Currently no flags are defined.
1307 */
1308 # if M_METHOD != M_METHOD_NONE
translate_flags(uint64_t flags)1309 static int translate_flags(uint64_t flags) {
1310 return 0;
1311 }
1312 # endif
1313
dgram_sendmmsg(BIO * b,BIO_MSG * msg,size_t stride,size_t num_msg,uint64_t flags,size_t * num_processed)1314 static int dgram_sendmmsg(BIO *b, BIO_MSG *msg, size_t stride,
1315 size_t num_msg, uint64_t flags, size_t *num_processed)
1316 {
1317 # if M_METHOD != M_METHOD_NONE && M_METHOD != M_METHOD_RECVMSG
1318 int ret;
1319 # endif
1320 # if M_METHOD == M_METHOD_RECVMMSG
1321 # define BIO_MAX_MSGS_PER_CALL 64
1322 int sysflags;
1323 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
1324 size_t i;
1325 struct mmsghdr mh[BIO_MAX_MSGS_PER_CALL];
1326 struct iovec iov[BIO_MAX_MSGS_PER_CALL];
1327 unsigned char control[BIO_MAX_MSGS_PER_CALL][BIO_CMSG_ALLOC_LEN];
1328 int have_local_enabled = data->local_addr_enabled;
1329 # elif M_METHOD == M_METHOD_RECVMSG
1330 int sysflags;
1331 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
1332 ossl_ssize_t l;
1333 struct msghdr mh;
1334 struct iovec iov;
1335 unsigned char control[BIO_CMSG_ALLOC_LEN];
1336 int have_local_enabled = data->local_addr_enabled;
1337 # elif M_METHOD == M_METHOD_WSARECVMSG
1338 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
1339 int have_local_enabled = data->local_addr_enabled;
1340 WSAMSG wmsg;
1341 WSABUF wbuf;
1342 DWORD num_bytes_sent = 0;
1343 unsigned char control[BIO_CMSG_ALLOC_LEN];
1344 # endif
1345 # if M_METHOD == M_METHOD_RECVFROM || M_METHOD == M_METHOD_WSARECVMSG
1346 int sysflags;
1347 # endif
1348
1349 if (num_msg == 0) {
1350 *num_processed = 0;
1351 return 1;
1352 }
1353
1354 if (num_msg > OSSL_SSIZE_MAX)
1355 num_msg = OSSL_SSIZE_MAX;
1356
1357 # if M_METHOD != M_METHOD_NONE
1358 sysflags = translate_flags(flags);
1359 # endif
1360
1361 # if M_METHOD == M_METHOD_RECVMMSG
1362 /*
1363 * In the sendmmsg/recvmmsg case, we need to allocate our translated struct
1364 * msghdr and struct iovec on the stack to support multithreaded use. Thus
1365 * we place a fixed limit on the number of messages per call, in the
1366 * expectation that we will be called again if there were more messages to
1367 * be sent.
1368 */
1369 if (num_msg > BIO_MAX_MSGS_PER_CALL)
1370 num_msg = BIO_MAX_MSGS_PER_CALL;
1371
1372 for (i = 0; i < num_msg; ++i) {
1373 translate_msg(b, &mh[i].msg_hdr, &iov[i],
1374 control[i], &BIO_MSG_N(msg, stride, i));
1375
1376 /* If local address was requested, it must have been enabled */
1377 if (BIO_MSG_N(msg, stride, i).local != NULL) {
1378 if (!have_local_enabled) {
1379 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1380 *num_processed = 0;
1381 return 0;
1382 }
1383
1384 if (pack_local(b, &mh[i].msg_hdr,
1385 BIO_MSG_N(msg, stride, i).local) < 1) {
1386 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1387 *num_processed = 0;
1388 return 0;
1389 }
1390 }
1391 }
1392
1393 /* Do the batch */
1394 ret = sendmmsg(b->num, mh, num_msg, sysflags);
1395 if (ret < 0) {
1396 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1397 *num_processed = 0;
1398 return 0;
1399 }
1400
1401 for (i = 0; i < (size_t)ret; ++i) {
1402 BIO_MSG_N(msg, stride, i).data_len = mh[i].msg_len;
1403 BIO_MSG_N(msg, stride, i).flags = 0;
1404 }
1405
1406 *num_processed = (size_t)ret;
1407 return 1;
1408
1409 # elif M_METHOD == M_METHOD_RECVMSG
1410 /*
1411 * If sendmsg is available, use it.
1412 */
1413 translate_msg(b, &mh, &iov, control, msg);
1414
1415 if (msg->local != NULL) {
1416 if (!have_local_enabled) {
1417 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1418 *num_processed = 0;
1419 return 0;
1420 }
1421
1422 if (pack_local(b, &mh, msg->local) < 1) {
1423 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1424 *num_processed = 0;
1425 return 0;
1426 }
1427 }
1428
1429 l = sendmsg(b->num, &mh, sysflags);
1430 if (l < 0) {
1431 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1432 *num_processed = 0;
1433 return 0;
1434 }
1435
1436 msg->data_len = (size_t)l;
1437 msg->flags = 0;
1438 *num_processed = 1;
1439 return 1;
1440
1441 # elif M_METHOD == M_METHOD_WSARECVMSG || M_METHOD == M_METHOD_RECVFROM
1442 # if M_METHOD == M_METHOD_WSARECVMSG
1443 if (bio_WSASendMsg != NULL) {
1444 /* WSASendMsg-based implementation for Windows. */
1445 translate_msg_win(b, &wmsg, &wbuf, control, msg);
1446
1447 if (msg[0].local != NULL) {
1448 if (!have_local_enabled) {
1449 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1450 *num_processed = 0;
1451 return 0;
1452 }
1453
1454 if (pack_local(b, &wmsg, msg[0].local) < 1) {
1455 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1456 *num_processed = 0;
1457 return 0;
1458 }
1459 }
1460
1461 ret = WSASendMsg((SOCKET)b->num, &wmsg, 0, &num_bytes_sent, NULL, NULL);
1462 if (ret < 0) {
1463 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1464 *num_processed = 0;
1465 return 0;
1466 }
1467
1468 msg[0].data_len = num_bytes_sent;
1469 msg[0].flags = 0;
1470 *num_processed = 1;
1471 return 1;
1472 }
1473 # endif
1474
1475 /*
1476 * Fallback to sendto and send a single message.
1477 */
1478 if (msg[0].local != NULL) {
1479 /*
1480 * We cannot set the local address if using sendto
1481 * so fail in this case
1482 */
1483 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1484 *num_processed = 0;
1485 return 0;
1486 }
1487
1488 ret = sendto(b->num, msg[0].data,
1489 # if defined(OPENSSL_SYS_WINDOWS)
1490 (int)msg[0].data_len,
1491 # else
1492 msg[0].data_len,
1493 # endif
1494 sysflags,
1495 msg[0].peer != NULL ? BIO_ADDR_sockaddr(msg[0].peer) : NULL,
1496 msg[0].peer != NULL ? BIO_ADDR_sockaddr_size(msg[0].peer) : 0);
1497 if (ret <= 0) {
1498 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1499 *num_processed = 0;
1500 return 0;
1501 }
1502
1503 msg[0].data_len = ret;
1504 msg[0].flags = 0;
1505 *num_processed = 1;
1506 return 1;
1507
1508 # else
1509 ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
1510 *num_processed = 0;
1511 return 0;
1512 # endif
1513 }
1514
dgram_recvmmsg(BIO * b,BIO_MSG * msg,size_t stride,size_t num_msg,uint64_t flags,size_t * num_processed)1515 static int dgram_recvmmsg(BIO *b, BIO_MSG *msg,
1516 size_t stride, size_t num_msg,
1517 uint64_t flags, size_t *num_processed)
1518 {
1519 # if M_METHOD != M_METHOD_NONE && M_METHOD != M_METHOD_RECVMSG
1520 int ret;
1521 # endif
1522 # if M_METHOD == M_METHOD_RECVMMSG
1523 int sysflags;
1524 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
1525 size_t i;
1526 struct mmsghdr mh[BIO_MAX_MSGS_PER_CALL];
1527 struct iovec iov[BIO_MAX_MSGS_PER_CALL];
1528 unsigned char control[BIO_MAX_MSGS_PER_CALL][BIO_CMSG_ALLOC_LEN];
1529 int have_local_enabled = data->local_addr_enabled;
1530 # elif M_METHOD == M_METHOD_RECVMSG
1531 int sysflags;
1532 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
1533 ossl_ssize_t l;
1534 struct msghdr mh;
1535 struct iovec iov;
1536 unsigned char control[BIO_CMSG_ALLOC_LEN];
1537 int have_local_enabled = data->local_addr_enabled;
1538 # elif M_METHOD == M_METHOD_WSARECVMSG
1539 bio_dgram_data *data = (bio_dgram_data *)b->ptr;
1540 int have_local_enabled = data->local_addr_enabled;
1541 WSAMSG wmsg;
1542 WSABUF wbuf;
1543 DWORD num_bytes_received = 0;
1544 unsigned char control[BIO_CMSG_ALLOC_LEN];
1545 # endif
1546 # if M_METHOD == M_METHOD_RECVFROM || M_METHOD == M_METHOD_WSARECVMSG
1547 int sysflags;
1548 socklen_t slen;
1549 # endif
1550
1551 if (num_msg == 0) {
1552 *num_processed = 0;
1553 return 1;
1554 }
1555
1556 if (num_msg > OSSL_SSIZE_MAX)
1557 num_msg = OSSL_SSIZE_MAX;
1558
1559 # if M_METHOD != M_METHOD_NONE
1560 sysflags = translate_flags(flags);
1561 # endif
1562
1563 # if M_METHOD == M_METHOD_RECVMMSG
1564 /*
1565 * In the sendmmsg/recvmmsg case, we need to allocate our translated struct
1566 * msghdr and struct iovec on the stack to support multithreaded use. Thus
1567 * we place a fixed limit on the number of messages per call, in the
1568 * expectation that we will be called again if there were more messages to
1569 * be sent.
1570 */
1571 if (num_msg > BIO_MAX_MSGS_PER_CALL)
1572 num_msg = BIO_MAX_MSGS_PER_CALL;
1573
1574 for (i = 0; i < num_msg; ++i) {
1575 translate_msg(b, &mh[i].msg_hdr, &iov[i],
1576 control[i], &BIO_MSG_N(msg, stride, i));
1577
1578 /* If local address was requested, it must have been enabled */
1579 if (BIO_MSG_N(msg, stride, i).local != NULL && !have_local_enabled) {
1580 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1581 *num_processed = 0;
1582 return 0;
1583 }
1584 }
1585
1586 /* Do the batch */
1587 ret = recvmmsg(b->num, mh, num_msg, sysflags, NULL);
1588 if (ret < 0) {
1589 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1590 *num_processed = 0;
1591 return 0;
1592 }
1593
1594 for (i = 0; i < (size_t)ret; ++i) {
1595 BIO_MSG_N(msg, stride, i).data_len = mh[i].msg_len;
1596 BIO_MSG_N(msg, stride, i).flags = 0;
1597 /*
1598 * *(msg->peer) will have been filled in by recvmmsg;
1599 * for msg->local we parse the control data returned
1600 */
1601 if (BIO_MSG_N(msg, stride, i).local != NULL)
1602 if (extract_local(b, &mh[i].msg_hdr,
1603 BIO_MSG_N(msg, stride, i).local) < 1)
1604 /*
1605 * It appears BSDs do not support local addresses for
1606 * loopback sockets. In this case, just clear the local
1607 * address, as for OS X and Windows in some circumstances
1608 * (see below).
1609 */
1610 BIO_ADDR_clear(msg->local);
1611 }
1612
1613 *num_processed = (size_t)ret;
1614 return 1;
1615
1616 # elif M_METHOD == M_METHOD_RECVMSG
1617 /*
1618 * If recvmsg is available, use it.
1619 */
1620 translate_msg(b, &mh, &iov, control, msg);
1621
1622 /* If local address was requested, it must have been enabled */
1623 if (msg->local != NULL && !have_local_enabled) {
1624 /*
1625 * If we have done at least one message, we must return the
1626 * count; if we haven't done any, we can give an error code
1627 */
1628 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1629 *num_processed = 0;
1630 return 0;
1631 }
1632
1633 l = recvmsg(b->num, &mh, sysflags);
1634 if (l < 0) {
1635 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1636 *num_processed = 0;
1637 return 0;
1638 }
1639
1640 msg->data_len = (size_t)l;
1641 msg->flags = 0;
1642
1643 if (msg->local != NULL)
1644 if (extract_local(b, &mh, msg->local) < 1)
1645 /*
1646 * OS X exhibits odd behaviour where it appears that if a packet is
1647 * sent before the receiving interface enables IP_PKTINFO, it will
1648 * sometimes not have any control data returned even if the
1649 * receiving interface enables IP_PKTINFO before calling recvmsg().
1650 * This appears to occur non-deterministically. Presumably, OS X
1651 * handles IP_PKTINFO at the time the packet is enqueued into a
1652 * socket's receive queue, rather than at the time recvmsg() is
1653 * called, unlike most other operating systems. Thus (if this
1654 * hypothesis is correct) there is a race between where IP_PKTINFO
1655 * is enabled by the process and when the kernel's network stack
1656 * queues the incoming message.
1657 *
1658 * We cannot return the local address if we do not have it, but this
1659 * is not a caller error either, so just return a zero address
1660 * structure. This is similar to how we handle Windows loopback
1661 * interfaces (see below). We enable this workaround for all
1662 * platforms, not just Apple, as this kind of quirk in OS networking
1663 * stacks seems to be common enough that failing hard if a local
1664 * address is not provided appears to be too brittle.
1665 */
1666 BIO_ADDR_clear(msg->local);
1667
1668 *num_processed = 1;
1669 return 1;
1670
1671 # elif M_METHOD == M_METHOD_RECVFROM || M_METHOD == M_METHOD_WSARECVMSG
1672 # if M_METHOD == M_METHOD_WSARECVMSG
1673 if (bio_WSARecvMsg != NULL) {
1674 /* WSARecvMsg-based implementation for Windows. */
1675 translate_msg_win(b, &wmsg, &wbuf, control, msg);
1676
1677 /* If local address was requested, it must have been enabled */
1678 if (msg[0].local != NULL && !have_local_enabled) {
1679 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1680 *num_processed = 0;
1681 return 0;
1682 }
1683
1684 ret = WSARecvMsg((SOCKET)b->num, &wmsg, &num_bytes_received, NULL, NULL);
1685 if (ret < 0) {
1686 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1687 *num_processed = 0;
1688 return 0;
1689 }
1690
1691 msg[0].data_len = num_bytes_received;
1692 msg[0].flags = 0;
1693 if (msg[0].local != NULL)
1694 if (extract_local(b, &wmsg, msg[0].local) < 1)
1695 /*
1696 * On Windows, loopback is not a "proper" interface and it works
1697 * differently; packets are essentially short-circuited and
1698 * don't go through all of the normal processing. A consequence
1699 * of this is that packets sent from the local machine to the
1700 * local machine _will not have IP_PKTINFO_ even if the
1701 * IP_PKTINFO socket option is enabled. WSARecvMsg just sets
1702 * Control.len to 0 on returning.
1703 *
1704 * This applies regardless of whether the loopback address,
1705 * 127.0.0.1 is used, or a local interface address (e.g.
1706 * 192.168.1.1); in both cases IP_PKTINFO will not be present.
1707 *
1708 * We report this condition by setting the local BIO_ADDR's
1709 * family to 0.
1710 */
1711 BIO_ADDR_clear(msg[0].local);
1712
1713 *num_processed = 1;
1714 return 1;
1715 }
1716 # endif
1717
1718 /*
1719 * Fallback to recvfrom and receive a single message.
1720 */
1721 if (msg[0].local != NULL) {
1722 /*
1723 * We cannot determine the local address if using recvfrom
1724 * so fail in this case
1725 */
1726 ERR_raise(ERR_LIB_BIO, BIO_R_LOCAL_ADDR_NOT_AVAILABLE);
1727 *num_processed = 0;
1728 return 0;
1729 }
1730
1731 slen = sizeof(*msg[0].peer);
1732 ret = recvfrom(b->num, msg[0].data,
1733 # if defined(OPENSSL_SYS_WINDOWS)
1734 (int)msg[0].data_len,
1735 # else
1736 msg[0].data_len,
1737 # endif
1738 sysflags,
1739 msg[0].peer != NULL ? &msg[0].peer->sa : NULL,
1740 msg[0].peer != NULL ? &slen : NULL);
1741 if (ret <= 0) {
1742 ERR_raise(ERR_LIB_SYS, get_last_socket_error());
1743 return 0;
1744 }
1745
1746 msg[0].data_len = ret;
1747 msg[0].flags = 0;
1748 *num_processed = 1;
1749 return 1;
1750
1751 # else
1752 ERR_raise(ERR_LIB_BIO, BIO_R_UNSUPPORTED_METHOD);
1753 *num_processed = 0;
1754 return 0;
1755 # endif
1756 }
1757
1758 # ifndef OPENSSL_NO_SCTP
BIO_s_datagram_sctp(void)1759 const BIO_METHOD *BIO_s_datagram_sctp(void)
1760 {
1761 return &methods_dgramp_sctp;
1762 }
1763
BIO_new_dgram_sctp(int fd,int close_flag)1764 BIO *BIO_new_dgram_sctp(int fd, int close_flag)
1765 {
1766 BIO *bio;
1767 int ret, optval = 20000;
1768 int auth_data = 0, auth_forward = 0;
1769 unsigned char *p;
1770 struct sctp_authchunk auth;
1771 struct sctp_authchunks *authchunks;
1772 socklen_t sockopt_len;
1773 # ifdef SCTP_AUTHENTICATION_EVENT
1774 # ifdef SCTP_EVENT
1775 struct sctp_event event;
1776 # else
1777 struct sctp_event_subscribe event;
1778 # endif
1779 # endif
1780
1781 bio = BIO_new(BIO_s_datagram_sctp());
1782 if (bio == NULL)
1783 return NULL;
1784 BIO_set_fd(bio, fd, close_flag);
1785
1786 /* Activate SCTP-AUTH for DATA and FORWARD-TSN chunks */
1787 auth.sauth_chunk = OPENSSL_SCTP_DATA_CHUNK_TYPE;
1788 ret =
1789 setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth,
1790 sizeof(struct sctp_authchunk));
1791 if (ret < 0) {
1792 BIO_vfree(bio);
1793 ERR_raise_data(ERR_LIB_BIO, ERR_R_SYS_LIB,
1794 "Ensure SCTP AUTH chunks are enabled in kernel");
1795 return NULL;
1796 }
1797 auth.sauth_chunk = OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE;
1798 ret =
1799 setsockopt(fd, IPPROTO_SCTP, SCTP_AUTH_CHUNK, &auth,
1800 sizeof(struct sctp_authchunk));
1801 if (ret < 0) {
1802 BIO_vfree(bio);
1803 ERR_raise_data(ERR_LIB_BIO, ERR_R_SYS_LIB,
1804 "Ensure SCTP AUTH chunks are enabled in kernel");
1805 return NULL;
1806 }
1807
1808 /*
1809 * Test if activation was successful. When using accept(), SCTP-AUTH has
1810 * to be activated for the listening socket already, otherwise the
1811 * connected socket won't use it. Similarly with connect(): the socket
1812 * prior to connection must be activated for SCTP-AUTH
1813 */
1814 sockopt_len = (socklen_t) (sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));
1815 authchunks = OPENSSL_zalloc(sockopt_len);
1816 if (authchunks == NULL) {
1817 BIO_vfree(bio);
1818 return NULL;
1819 }
1820 ret = getsockopt(fd, IPPROTO_SCTP, SCTP_LOCAL_AUTH_CHUNKS, authchunks,
1821 &sockopt_len);
1822 if (ret < 0) {
1823 OPENSSL_free(authchunks);
1824 BIO_vfree(bio);
1825 return NULL;
1826 }
1827
1828 for (p = (unsigned char *)authchunks->gauth_chunks;
1829 p < (unsigned char *)authchunks + sockopt_len;
1830 p += sizeof(uint8_t)) {
1831 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
1832 auth_data = 1;
1833 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
1834 auth_forward = 1;
1835 }
1836
1837 OPENSSL_free(authchunks);
1838
1839 if (!auth_data || !auth_forward) {
1840 BIO_vfree(bio);
1841 ERR_raise_data(ERR_LIB_BIO, ERR_R_SYS_LIB,
1842 "Ensure SCTP AUTH chunks are enabled on the "
1843 "underlying socket");
1844 return NULL;
1845 }
1846
1847 # ifdef SCTP_AUTHENTICATION_EVENT
1848 # ifdef SCTP_EVENT
1849 memset(&event, 0, sizeof(event));
1850 event.se_assoc_id = 0;
1851 event.se_type = SCTP_AUTHENTICATION_EVENT;
1852 event.se_on = 1;
1853 ret =
1854 setsockopt(fd, IPPROTO_SCTP, SCTP_EVENT, &event,
1855 sizeof(struct sctp_event));
1856 if (ret < 0) {
1857 BIO_vfree(bio);
1858 return NULL;
1859 }
1860 # else
1861 sockopt_len = (socklen_t) sizeof(struct sctp_event_subscribe);
1862 ret = getsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event, &sockopt_len);
1863 if (ret < 0) {
1864 BIO_vfree(bio);
1865 return NULL;
1866 }
1867
1868 event.sctp_authentication_event = 1;
1869
1870 ret =
1871 setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &event,
1872 sizeof(struct sctp_event_subscribe));
1873 if (ret < 0) {
1874 BIO_vfree(bio);
1875 return NULL;
1876 }
1877 # endif
1878 # endif
1879
1880 /*
1881 * Disable partial delivery by setting the min size larger than the max
1882 * record size of 2^14 + 2048 + 13
1883 */
1884 ret =
1885 setsockopt(fd, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT, &optval,
1886 sizeof(optval));
1887 if (ret < 0) {
1888 BIO_vfree(bio);
1889 return NULL;
1890 }
1891
1892 return bio;
1893 }
1894
BIO_dgram_is_sctp(BIO * bio)1895 int BIO_dgram_is_sctp(BIO *bio)
1896 {
1897 return (BIO_method_type(bio) == BIO_TYPE_DGRAM_SCTP);
1898 }
1899
dgram_sctp_new(BIO * bi)1900 static int dgram_sctp_new(BIO *bi)
1901 {
1902 bio_dgram_sctp_data *data = NULL;
1903
1904 bi->init = 0;
1905 bi->num = 0;
1906 if ((data = OPENSSL_zalloc(sizeof(*data))) == NULL)
1907 return 0;
1908 # ifdef SCTP_PR_SCTP_NONE
1909 data->prinfo.pr_policy = SCTP_PR_SCTP_NONE;
1910 # endif
1911 bi->ptr = data;
1912
1913 bi->flags = 0;
1914 return 1;
1915 }
1916
dgram_sctp_free(BIO * a)1917 static int dgram_sctp_free(BIO *a)
1918 {
1919 bio_dgram_sctp_data *data;
1920
1921 if (a == NULL)
1922 return 0;
1923 if (!dgram_clear(a))
1924 return 0;
1925
1926 data = (bio_dgram_sctp_data *) a->ptr;
1927 if (data != NULL)
1928 OPENSSL_free(data);
1929
1930 return 1;
1931 }
1932
1933 # ifdef SCTP_AUTHENTICATION_EVENT
dgram_sctp_handle_auth_free_key_event(BIO * b,union sctp_notification * snp)1934 void dgram_sctp_handle_auth_free_key_event(BIO *b,
1935 union sctp_notification *snp)
1936 {
1937 int ret;
1938 struct sctp_authkey_event *authkeyevent = &snp->sn_auth_event;
1939
1940 if (authkeyevent->auth_indication == SCTP_AUTH_FREE_KEY) {
1941 struct sctp_authkeyid authkeyid;
1942
1943 /* delete key */
1944 authkeyid.scact_keynumber = authkeyevent->auth_keynumber;
1945 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
1946 &authkeyid, sizeof(struct sctp_authkeyid));
1947 }
1948 }
1949 # endif
1950
dgram_sctp_read(BIO * b,char * out,int outl)1951 static int dgram_sctp_read(BIO *b, char *out, int outl)
1952 {
1953 int ret = 0, n = 0, i, optval;
1954 socklen_t optlen;
1955 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
1956 struct msghdr msg;
1957 struct iovec iov;
1958 struct cmsghdr *cmsg;
1959 char cmsgbuf[512];
1960
1961 if (out != NULL) {
1962 clear_socket_error();
1963
1964 do {
1965 memset(&data->rcvinfo, 0, sizeof(data->rcvinfo));
1966 iov.iov_base = out;
1967 iov.iov_len = outl;
1968 msg.msg_name = NULL;
1969 msg.msg_namelen = 0;
1970 msg.msg_iov = &iov;
1971 msg.msg_iovlen = 1;
1972 msg.msg_control = cmsgbuf;
1973 msg.msg_controllen = 512;
1974 msg.msg_flags = 0;
1975 n = recvmsg(b->num, &msg, 0);
1976
1977 if (n <= 0) {
1978 if (n < 0)
1979 ret = n;
1980 break;
1981 }
1982
1983 if (msg.msg_controllen > 0) {
1984 for (cmsg = CMSG_FIRSTHDR(&msg); cmsg;
1985 cmsg = CMSG_NXTHDR(&msg, cmsg)) {
1986 if (cmsg->cmsg_level != IPPROTO_SCTP)
1987 continue;
1988 # ifdef SCTP_RCVINFO
1989 if (cmsg->cmsg_type == SCTP_RCVINFO) {
1990 struct sctp_rcvinfo *rcvinfo;
1991
1992 rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmsg);
1993 data->rcvinfo.rcv_sid = rcvinfo->rcv_sid;
1994 data->rcvinfo.rcv_ssn = rcvinfo->rcv_ssn;
1995 data->rcvinfo.rcv_flags = rcvinfo->rcv_flags;
1996 data->rcvinfo.rcv_ppid = rcvinfo->rcv_ppid;
1997 data->rcvinfo.rcv_tsn = rcvinfo->rcv_tsn;
1998 data->rcvinfo.rcv_cumtsn = rcvinfo->rcv_cumtsn;
1999 data->rcvinfo.rcv_context = rcvinfo->rcv_context;
2000 }
2001 # endif
2002 # ifdef SCTP_SNDRCV
2003 if (cmsg->cmsg_type == SCTP_SNDRCV) {
2004 struct sctp_sndrcvinfo *sndrcvinfo;
2005
2006 sndrcvinfo =
2007 (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
2008 data->rcvinfo.rcv_sid = sndrcvinfo->sinfo_stream;
2009 data->rcvinfo.rcv_ssn = sndrcvinfo->sinfo_ssn;
2010 data->rcvinfo.rcv_flags = sndrcvinfo->sinfo_flags;
2011 data->rcvinfo.rcv_ppid = sndrcvinfo->sinfo_ppid;
2012 data->rcvinfo.rcv_tsn = sndrcvinfo->sinfo_tsn;
2013 data->rcvinfo.rcv_cumtsn = sndrcvinfo->sinfo_cumtsn;
2014 data->rcvinfo.rcv_context = sndrcvinfo->sinfo_context;
2015 }
2016 # endif
2017 }
2018 }
2019
2020 if (msg.msg_flags & MSG_NOTIFICATION) {
2021 union sctp_notification snp;
2022
2023 memcpy(&snp, out, sizeof(snp));
2024 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
2025 # ifdef SCTP_EVENT
2026 struct sctp_event event;
2027 # else
2028 struct sctp_event_subscribe event;
2029 socklen_t eventsize;
2030 # endif
2031
2032 /* disable sender dry event */
2033 # ifdef SCTP_EVENT
2034 memset(&event, 0, sizeof(event));
2035 event.se_assoc_id = 0;
2036 event.se_type = SCTP_SENDER_DRY_EVENT;
2037 event.se_on = 0;
2038 i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event,
2039 sizeof(struct sctp_event));
2040 if (i < 0) {
2041 ret = i;
2042 break;
2043 }
2044 # else
2045 eventsize = sizeof(struct sctp_event_subscribe);
2046 i = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
2047 &eventsize);
2048 if (i < 0) {
2049 ret = i;
2050 break;
2051 }
2052
2053 event.sctp_sender_dry_event = 0;
2054
2055 i = setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
2056 sizeof(struct sctp_event_subscribe));
2057 if (i < 0) {
2058 ret = i;
2059 break;
2060 }
2061 # endif
2062 }
2063 # ifdef SCTP_AUTHENTICATION_EVENT
2064 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
2065 dgram_sctp_handle_auth_free_key_event(b, &snp);
2066 # endif
2067
2068 if (data->handle_notifications != NULL)
2069 data->handle_notifications(b, data->notification_context,
2070 (void *)out);
2071
2072 memset(&snp, 0, sizeof(snp));
2073 memset(out, 0, outl);
2074 } else {
2075 ret += n;
2076 }
2077 }
2078 while ((msg.msg_flags & MSG_NOTIFICATION) && (msg.msg_flags & MSG_EOR)
2079 && (ret < outl));
2080
2081 if (ret > 0 && !(msg.msg_flags & MSG_EOR)) {
2082 /* Partial message read, this should never happen! */
2083
2084 /*
2085 * The buffer was too small, this means the peer sent a message
2086 * that was larger than allowed.
2087 */
2088 if (ret == outl)
2089 return -1;
2090
2091 /*
2092 * Test if socket buffer can handle max record size (2^14 + 2048
2093 * + 13)
2094 */
2095 optlen = (socklen_t) sizeof(int);
2096 ret = getsockopt(b->num, SOL_SOCKET, SO_RCVBUF, &optval, &optlen);
2097 if (ret >= 0)
2098 OPENSSL_assert(optval >= 18445);
2099
2100 /*
2101 * Test if SCTP doesn't partially deliver below max record size
2102 * (2^14 + 2048 + 13)
2103 */
2104 optlen = (socklen_t) sizeof(int);
2105 ret =
2106 getsockopt(b->num, IPPROTO_SCTP, SCTP_PARTIAL_DELIVERY_POINT,
2107 &optval, &optlen);
2108 if (ret >= 0)
2109 OPENSSL_assert(optval >= 18445);
2110
2111 /*
2112 * Partially delivered notification??? Probably a bug....
2113 */
2114 OPENSSL_assert(!(msg.msg_flags & MSG_NOTIFICATION));
2115
2116 /*
2117 * Everything seems ok till now, so it's most likely a message
2118 * dropped by PR-SCTP.
2119 */
2120 memset(out, 0, outl);
2121 BIO_set_retry_read(b);
2122 return -1;
2123 }
2124
2125 BIO_clear_retry_flags(b);
2126 if (ret < 0) {
2127 if (BIO_dgram_should_retry(ret)) {
2128 BIO_set_retry_read(b);
2129 data->dgram._errno = get_last_socket_error();
2130 }
2131 }
2132
2133 /* Test if peer uses SCTP-AUTH before continuing */
2134 if (!data->peer_auth_tested) {
2135 int ii, auth_data = 0, auth_forward = 0;
2136 unsigned char *p;
2137 struct sctp_authchunks *authchunks;
2138
2139 optlen =
2140 (socklen_t) (sizeof(sctp_assoc_t) + 256 * sizeof(uint8_t));
2141 authchunks = OPENSSL_malloc(optlen);
2142 if (authchunks == NULL)
2143 return -1;
2144 memset(authchunks, 0, optlen);
2145 ii = getsockopt(b->num, IPPROTO_SCTP, SCTP_PEER_AUTH_CHUNKS,
2146 authchunks, &optlen);
2147
2148 if (ii >= 0)
2149 for (p = (unsigned char *)authchunks->gauth_chunks;
2150 p < (unsigned char *)authchunks + optlen;
2151 p += sizeof(uint8_t)) {
2152 if (*p == OPENSSL_SCTP_DATA_CHUNK_TYPE)
2153 auth_data = 1;
2154 if (*p == OPENSSL_SCTP_FORWARD_CUM_TSN_CHUNK_TYPE)
2155 auth_forward = 1;
2156 }
2157
2158 OPENSSL_free(authchunks);
2159
2160 if (!auth_data || !auth_forward) {
2161 ERR_raise(ERR_LIB_BIO, BIO_R_CONNECT_ERROR);
2162 return -1;
2163 }
2164
2165 data->peer_auth_tested = 1;
2166 }
2167 }
2168 return ret;
2169 }
2170
2171 /*
2172 * dgram_sctp_write - send message on SCTP socket
2173 * @b: BIO to write to
2174 * @in: data to send
2175 * @inl: amount of bytes in @in to send
2176 *
2177 * Returns -1 on error or the sent amount of bytes on success
2178 */
dgram_sctp_write(BIO * b,const char * in,int inl)2179 static int dgram_sctp_write(BIO *b, const char *in, int inl)
2180 {
2181 int ret;
2182 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
2183 struct bio_dgram_sctp_sndinfo *sinfo = &(data->sndinfo);
2184 struct bio_dgram_sctp_prinfo *pinfo = &(data->prinfo);
2185 struct bio_dgram_sctp_sndinfo handshake_sinfo;
2186 struct iovec iov[1];
2187 struct msghdr msg;
2188 struct cmsghdr *cmsg;
2189 # if defined(SCTP_SNDINFO) && defined(SCTP_PRINFO)
2190 char cmsgbuf[CMSG_SPACE(sizeof(struct sctp_sndinfo)) +
2191 CMSG_SPACE(sizeof(struct sctp_prinfo))];
2192 struct sctp_sndinfo *sndinfo;
2193 struct sctp_prinfo *prinfo;
2194 # else
2195 char cmsgbuf[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
2196 struct sctp_sndrcvinfo *sndrcvinfo;
2197 # endif
2198
2199 clear_socket_error();
2200
2201 /*
2202 * If we're send anything else than application data, disable all user
2203 * parameters and flags.
2204 */
2205 if (in[0] != 23) {
2206 memset(&handshake_sinfo, 0, sizeof(handshake_sinfo));
2207 # ifdef SCTP_SACK_IMMEDIATELY
2208 handshake_sinfo.snd_flags = SCTP_SACK_IMMEDIATELY;
2209 # endif
2210 sinfo = &handshake_sinfo;
2211 }
2212
2213 /* We can only send a shutdown alert if the socket is dry */
2214 if (data->save_shutdown) {
2215 ret = BIO_dgram_sctp_wait_for_dry(b);
2216 if (ret < 0)
2217 return -1;
2218 if (ret == 0) {
2219 BIO_clear_retry_flags(b);
2220 BIO_set_retry_write(b);
2221 return -1;
2222 }
2223 }
2224
2225 iov[0].iov_base = (char *)in;
2226 iov[0].iov_len = inl;
2227 msg.msg_name = NULL;
2228 msg.msg_namelen = 0;
2229 msg.msg_iov = iov;
2230 msg.msg_iovlen = 1;
2231 msg.msg_control = (caddr_t) cmsgbuf;
2232 msg.msg_controllen = 0;
2233 msg.msg_flags = 0;
2234 # if defined(SCTP_SNDINFO) && defined(SCTP_PRINFO)
2235 cmsg = (struct cmsghdr *)cmsgbuf;
2236 cmsg->cmsg_level = IPPROTO_SCTP;
2237 cmsg->cmsg_type = SCTP_SNDINFO;
2238 cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndinfo));
2239 sndinfo = (struct sctp_sndinfo *)CMSG_DATA(cmsg);
2240 memset(sndinfo, 0, sizeof(*sndinfo));
2241 sndinfo->snd_sid = sinfo->snd_sid;
2242 sndinfo->snd_flags = sinfo->snd_flags;
2243 sndinfo->snd_ppid = sinfo->snd_ppid;
2244 sndinfo->snd_context = sinfo->snd_context;
2245 msg.msg_controllen += CMSG_SPACE(sizeof(struct sctp_sndinfo));
2246
2247 cmsg =
2248 (struct cmsghdr *)&cmsgbuf[CMSG_SPACE(sizeof(struct sctp_sndinfo))];
2249 cmsg->cmsg_level = IPPROTO_SCTP;
2250 cmsg->cmsg_type = SCTP_PRINFO;
2251 cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_prinfo));
2252 prinfo = (struct sctp_prinfo *)CMSG_DATA(cmsg);
2253 memset(prinfo, 0, sizeof(*prinfo));
2254 prinfo->pr_policy = pinfo->pr_policy;
2255 prinfo->pr_value = pinfo->pr_value;
2256 msg.msg_controllen += CMSG_SPACE(sizeof(struct sctp_prinfo));
2257 # else
2258 cmsg = (struct cmsghdr *)cmsgbuf;
2259 cmsg->cmsg_level = IPPROTO_SCTP;
2260 cmsg->cmsg_type = SCTP_SNDRCV;
2261 cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
2262 sndrcvinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
2263 memset(sndrcvinfo, 0, sizeof(*sndrcvinfo));
2264 sndrcvinfo->sinfo_stream = sinfo->snd_sid;
2265 sndrcvinfo->sinfo_flags = sinfo->snd_flags;
2266 # ifdef __FreeBSD__
2267 sndrcvinfo->sinfo_flags |= pinfo->pr_policy;
2268 # endif
2269 sndrcvinfo->sinfo_ppid = sinfo->snd_ppid;
2270 sndrcvinfo->sinfo_context = sinfo->snd_context;
2271 sndrcvinfo->sinfo_timetolive = pinfo->pr_value;
2272 msg.msg_controllen += CMSG_SPACE(sizeof(struct sctp_sndrcvinfo));
2273 # endif
2274
2275 ret = sendmsg(b->num, &msg, 0);
2276
2277 BIO_clear_retry_flags(b);
2278 if (ret <= 0) {
2279 if (BIO_dgram_should_retry(ret)) {
2280 BIO_set_retry_write(b);
2281 data->dgram._errno = get_last_socket_error();
2282 }
2283 }
2284 return ret;
2285 }
2286
dgram_sctp_ctrl(BIO * b,int cmd,long num,void * ptr)2287 static long dgram_sctp_ctrl(BIO *b, int cmd, long num, void *ptr)
2288 {
2289 long ret = 1;
2290 bio_dgram_sctp_data *data = NULL;
2291 socklen_t sockopt_len = 0;
2292 struct sctp_authkeyid authkeyid;
2293 struct sctp_authkey *authkey = NULL;
2294
2295 data = (bio_dgram_sctp_data *) b->ptr;
2296
2297 switch (cmd) {
2298 case BIO_CTRL_DGRAM_QUERY_MTU:
2299 /*
2300 * Set to maximum (2^14) and ignore user input to enable transport
2301 * protocol fragmentation. Returns always 2^14.
2302 */
2303 data->dgram.mtu = 16384;
2304 ret = data->dgram.mtu;
2305 break;
2306 case BIO_CTRL_DGRAM_SET_MTU:
2307 /*
2308 * Set to maximum (2^14) and ignore input to enable transport
2309 * protocol fragmentation. Returns always 2^14.
2310 */
2311 data->dgram.mtu = 16384;
2312 ret = data->dgram.mtu;
2313 break;
2314 case BIO_CTRL_DGRAM_SET_CONNECTED:
2315 case BIO_CTRL_DGRAM_CONNECT:
2316 /* Returns always -1. */
2317 ret = -1;
2318 break;
2319 case BIO_CTRL_DGRAM_SET_NEXT_TIMEOUT:
2320 /*
2321 * SCTP doesn't need the DTLS timer Returns always 1.
2322 */
2323 break;
2324 case BIO_CTRL_DGRAM_GET_MTU_OVERHEAD:
2325 /*
2326 * We allow transport protocol fragmentation so this is irrelevant
2327 */
2328 ret = 0;
2329 break;
2330 case BIO_CTRL_DGRAM_SCTP_SET_IN_HANDSHAKE:
2331 if (num > 0)
2332 data->in_handshake = 1;
2333 else
2334 data->in_handshake = 0;
2335
2336 ret =
2337 setsockopt(b->num, IPPROTO_SCTP, SCTP_NODELAY,
2338 &data->in_handshake, sizeof(int));
2339 break;
2340 case BIO_CTRL_DGRAM_SCTP_ADD_AUTH_KEY:
2341 /*
2342 * New shared key for SCTP AUTH. Returns 0 on success, -1 otherwise.
2343 */
2344
2345 /* Get active key */
2346 sockopt_len = sizeof(struct sctp_authkeyid);
2347 ret =
2348 getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid,
2349 &sockopt_len);
2350 if (ret < 0)
2351 break;
2352
2353 /* Add new key */
2354 sockopt_len = sizeof(struct sctp_authkey) + 64 * sizeof(uint8_t);
2355 authkey = OPENSSL_malloc(sockopt_len);
2356 if (authkey == NULL) {
2357 ret = -1;
2358 break;
2359 }
2360 memset(authkey, 0, sockopt_len);
2361 authkey->sca_keynumber = authkeyid.scact_keynumber + 1;
2362 # ifndef __FreeBSD__
2363 /*
2364 * This field is missing in FreeBSD 8.2 and earlier, and FreeBSD 8.3
2365 * and higher work without it.
2366 */
2367 authkey->sca_keylength = 64;
2368 # endif
2369 memcpy(&authkey->sca_key[0], ptr, 64 * sizeof(uint8_t));
2370
2371 ret =
2372 setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_KEY, authkey,
2373 sockopt_len);
2374 OPENSSL_free(authkey);
2375 authkey = NULL;
2376 if (ret < 0)
2377 break;
2378
2379 /* Reset active key */
2380 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
2381 &authkeyid, sizeof(struct sctp_authkeyid));
2382 if (ret < 0)
2383 break;
2384
2385 break;
2386 case BIO_CTRL_DGRAM_SCTP_NEXT_AUTH_KEY:
2387 /* Returns 0 on success, -1 otherwise. */
2388
2389 /* Get active key */
2390 sockopt_len = sizeof(struct sctp_authkeyid);
2391 ret =
2392 getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY, &authkeyid,
2393 &sockopt_len);
2394 if (ret < 0)
2395 break;
2396
2397 /* Set active key */
2398 authkeyid.scact_keynumber = authkeyid.scact_keynumber + 1;
2399 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
2400 &authkeyid, sizeof(struct sctp_authkeyid));
2401 if (ret < 0)
2402 break;
2403
2404 /*
2405 * CCS has been sent, so remember that and fall through to check if
2406 * we need to deactivate an old key
2407 */
2408 data->ccs_sent = 1;
2409 /* fall-through */
2410
2411 case BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD:
2412 /* Returns 0 on success, -1 otherwise. */
2413
2414 /*
2415 * Has this command really been called or is this just a
2416 * fall-through?
2417 */
2418 if (cmd == BIO_CTRL_DGRAM_SCTP_AUTH_CCS_RCVD)
2419 data->ccs_rcvd = 1;
2420
2421 /*
2422 * CSS has been both, received and sent, so deactivate an old key
2423 */
2424 if (data->ccs_rcvd == 1 && data->ccs_sent == 1) {
2425 /* Get active key */
2426 sockopt_len = sizeof(struct sctp_authkeyid);
2427 ret =
2428 getsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_ACTIVE_KEY,
2429 &authkeyid, &sockopt_len);
2430 if (ret < 0)
2431 break;
2432
2433 /*
2434 * Deactivate key or delete second last key if
2435 * SCTP_AUTHENTICATION_EVENT is not available.
2436 */
2437 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
2438 # ifdef SCTP_AUTH_DEACTIVATE_KEY
2439 sockopt_len = sizeof(struct sctp_authkeyid);
2440 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DEACTIVATE_KEY,
2441 &authkeyid, sockopt_len);
2442 if (ret < 0)
2443 break;
2444 # endif
2445 # ifndef SCTP_AUTHENTICATION_EVENT
2446 if (authkeyid.scact_keynumber > 0) {
2447 authkeyid.scact_keynumber = authkeyid.scact_keynumber - 1;
2448 ret = setsockopt(b->num, IPPROTO_SCTP, SCTP_AUTH_DELETE_KEY,
2449 &authkeyid, sizeof(struct sctp_authkeyid));
2450 if (ret < 0)
2451 break;
2452 }
2453 # endif
2454
2455 data->ccs_rcvd = 0;
2456 data->ccs_sent = 0;
2457 }
2458 break;
2459 case BIO_CTRL_DGRAM_SCTP_GET_SNDINFO:
2460 /* Returns the size of the copied struct. */
2461 if (num > (long)sizeof(struct bio_dgram_sctp_sndinfo))
2462 num = sizeof(struct bio_dgram_sctp_sndinfo);
2463
2464 memcpy(ptr, &(data->sndinfo), num);
2465 ret = num;
2466 break;
2467 case BIO_CTRL_DGRAM_SCTP_SET_SNDINFO:
2468 /* Returns the size of the copied struct. */
2469 if (num > (long)sizeof(struct bio_dgram_sctp_sndinfo))
2470 num = sizeof(struct bio_dgram_sctp_sndinfo);
2471
2472 memcpy(&(data->sndinfo), ptr, num);
2473 break;
2474 case BIO_CTRL_DGRAM_SCTP_GET_RCVINFO:
2475 /* Returns the size of the copied struct. */
2476 if (num > (long)sizeof(struct bio_dgram_sctp_rcvinfo))
2477 num = sizeof(struct bio_dgram_sctp_rcvinfo);
2478
2479 memcpy(ptr, &data->rcvinfo, num);
2480
2481 ret = num;
2482 break;
2483 case BIO_CTRL_DGRAM_SCTP_SET_RCVINFO:
2484 /* Returns the size of the copied struct. */
2485 if (num > (long)sizeof(struct bio_dgram_sctp_rcvinfo))
2486 num = sizeof(struct bio_dgram_sctp_rcvinfo);
2487
2488 memcpy(&(data->rcvinfo), ptr, num);
2489 break;
2490 case BIO_CTRL_DGRAM_SCTP_GET_PRINFO:
2491 /* Returns the size of the copied struct. */
2492 if (num > (long)sizeof(struct bio_dgram_sctp_prinfo))
2493 num = sizeof(struct bio_dgram_sctp_prinfo);
2494
2495 memcpy(ptr, &(data->prinfo), num);
2496 ret = num;
2497 break;
2498 case BIO_CTRL_DGRAM_SCTP_SET_PRINFO:
2499 /* Returns the size of the copied struct. */
2500 if (num > (long)sizeof(struct bio_dgram_sctp_prinfo))
2501 num = sizeof(struct bio_dgram_sctp_prinfo);
2502
2503 memcpy(&(data->prinfo), ptr, num);
2504 break;
2505 case BIO_CTRL_DGRAM_SCTP_SAVE_SHUTDOWN:
2506 /* Returns always 1. */
2507 if (num > 0)
2508 data->save_shutdown = 1;
2509 else
2510 data->save_shutdown = 0;
2511 break;
2512 case BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY:
2513 return dgram_sctp_wait_for_dry(b);
2514 case BIO_CTRL_DGRAM_SCTP_MSG_WAITING:
2515 return dgram_sctp_msg_waiting(b);
2516
2517 default:
2518 /*
2519 * Pass to default ctrl function to process SCTP unspecific commands
2520 */
2521 ret = dgram_ctrl(b, cmd, num, ptr);
2522 break;
2523 }
2524 return ret;
2525 }
2526
BIO_dgram_sctp_notification_cb(BIO * b,BIO_dgram_sctp_notification_handler_fn handle_notifications,void * context)2527 int BIO_dgram_sctp_notification_cb(BIO *b,
2528 BIO_dgram_sctp_notification_handler_fn handle_notifications,
2529 void *context)
2530 {
2531 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
2532
2533 if (handle_notifications != NULL) {
2534 data->handle_notifications = handle_notifications;
2535 data->notification_context = context;
2536 } else
2537 return -1;
2538
2539 return 0;
2540 }
2541
2542 /*
2543 * BIO_dgram_sctp_wait_for_dry - Wait for SCTP SENDER_DRY event
2544 * @b: The BIO to check for the dry event
2545 *
2546 * Wait until the peer confirms all packets have been received, and so that
2547 * our kernel doesn't have anything to send anymore. This is only received by
2548 * the peer's kernel, not the application.
2549 *
2550 * Returns:
2551 * -1 on error
2552 * 0 when not dry yet
2553 * 1 when dry
2554 */
BIO_dgram_sctp_wait_for_dry(BIO * b)2555 int BIO_dgram_sctp_wait_for_dry(BIO *b)
2556 {
2557 return (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SCTP_WAIT_FOR_DRY, 0, NULL);
2558 }
2559
dgram_sctp_wait_for_dry(BIO * b)2560 static int dgram_sctp_wait_for_dry(BIO *b)
2561 {
2562 int is_dry = 0;
2563 int sockflags = 0;
2564 int n, ret;
2565 union sctp_notification snp;
2566 struct msghdr msg;
2567 struct iovec iov;
2568 # ifdef SCTP_EVENT
2569 struct sctp_event event;
2570 # else
2571 struct sctp_event_subscribe event;
2572 socklen_t eventsize;
2573 # endif
2574 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
2575
2576 /* set sender dry event */
2577 # ifdef SCTP_EVENT
2578 memset(&event, 0, sizeof(event));
2579 event.se_assoc_id = 0;
2580 event.se_type = SCTP_SENDER_DRY_EVENT;
2581 event.se_on = 1;
2582 ret =
2583 setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event,
2584 sizeof(struct sctp_event));
2585 # else
2586 eventsize = sizeof(struct sctp_event_subscribe);
2587 ret = getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event, &eventsize);
2588 if (ret < 0)
2589 return -1;
2590
2591 event.sctp_sender_dry_event = 1;
2592
2593 ret =
2594 setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
2595 sizeof(struct sctp_event_subscribe));
2596 # endif
2597 if (ret < 0)
2598 return -1;
2599
2600 /* peek for notification */
2601 memset(&snp, 0, sizeof(snp));
2602 iov.iov_base = (char *)&snp;
2603 iov.iov_len = sizeof(union sctp_notification);
2604 msg.msg_name = NULL;
2605 msg.msg_namelen = 0;
2606 msg.msg_iov = &iov;
2607 msg.msg_iovlen = 1;
2608 msg.msg_control = NULL;
2609 msg.msg_controllen = 0;
2610 msg.msg_flags = 0;
2611
2612 n = recvmsg(b->num, &msg, MSG_PEEK);
2613 if (n <= 0) {
2614 if ((n < 0) && (get_last_socket_error() != EAGAIN)
2615 && (get_last_socket_error() != EWOULDBLOCK))
2616 return -1;
2617 else
2618 return 0;
2619 }
2620
2621 /* if we find a notification, process it and try again if necessary */
2622 while (msg.msg_flags & MSG_NOTIFICATION) {
2623 memset(&snp, 0, sizeof(snp));
2624 iov.iov_base = (char *)&snp;
2625 iov.iov_len = sizeof(union sctp_notification);
2626 msg.msg_name = NULL;
2627 msg.msg_namelen = 0;
2628 msg.msg_iov = &iov;
2629 msg.msg_iovlen = 1;
2630 msg.msg_control = NULL;
2631 msg.msg_controllen = 0;
2632 msg.msg_flags = 0;
2633
2634 n = recvmsg(b->num, &msg, 0);
2635 if (n <= 0) {
2636 if ((n < 0) && (get_last_socket_error() != EAGAIN)
2637 && (get_last_socket_error() != EWOULDBLOCK))
2638 return -1;
2639 else
2640 return is_dry;
2641 }
2642
2643 if (snp.sn_header.sn_type == SCTP_SENDER_DRY_EVENT) {
2644 is_dry = 1;
2645
2646 /* disable sender dry event */
2647 # ifdef SCTP_EVENT
2648 memset(&event, 0, sizeof(event));
2649 event.se_assoc_id = 0;
2650 event.se_type = SCTP_SENDER_DRY_EVENT;
2651 event.se_on = 0;
2652 ret =
2653 setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENT, &event,
2654 sizeof(struct sctp_event));
2655 # else
2656 eventsize = (socklen_t) sizeof(struct sctp_event_subscribe);
2657 ret =
2658 getsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
2659 &eventsize);
2660 if (ret < 0)
2661 return -1;
2662
2663 event.sctp_sender_dry_event = 0;
2664
2665 ret =
2666 setsockopt(b->num, IPPROTO_SCTP, SCTP_EVENTS, &event,
2667 sizeof(struct sctp_event_subscribe));
2668 # endif
2669 if (ret < 0)
2670 return -1;
2671 }
2672 # ifdef SCTP_AUTHENTICATION_EVENT
2673 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
2674 dgram_sctp_handle_auth_free_key_event(b, &snp);
2675 # endif
2676
2677 if (data->handle_notifications != NULL)
2678 data->handle_notifications(b, data->notification_context,
2679 (void *)&snp);
2680
2681 /* found notification, peek again */
2682 memset(&snp, 0, sizeof(snp));
2683 iov.iov_base = (char *)&snp;
2684 iov.iov_len = sizeof(union sctp_notification);
2685 msg.msg_name = NULL;
2686 msg.msg_namelen = 0;
2687 msg.msg_iov = &iov;
2688 msg.msg_iovlen = 1;
2689 msg.msg_control = NULL;
2690 msg.msg_controllen = 0;
2691 msg.msg_flags = 0;
2692
2693 /* if we have seen the dry already, don't wait */
2694 if (is_dry) {
2695 sockflags = fcntl(b->num, F_GETFL, 0);
2696 fcntl(b->num, F_SETFL, O_NONBLOCK);
2697 }
2698
2699 n = recvmsg(b->num, &msg, MSG_PEEK);
2700
2701 if (is_dry) {
2702 fcntl(b->num, F_SETFL, sockflags);
2703 }
2704
2705 if (n <= 0) {
2706 if ((n < 0) && (get_last_socket_error() != EAGAIN)
2707 && (get_last_socket_error() != EWOULDBLOCK))
2708 return -1;
2709 else
2710 return is_dry;
2711 }
2712 }
2713
2714 /* read anything else */
2715 return is_dry;
2716 }
2717
BIO_dgram_sctp_msg_waiting(BIO * b)2718 int BIO_dgram_sctp_msg_waiting(BIO *b)
2719 {
2720 return (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SCTP_MSG_WAITING, 0, NULL);
2721 }
2722
dgram_sctp_msg_waiting(BIO * b)2723 static int dgram_sctp_msg_waiting(BIO *b)
2724 {
2725 int n, sockflags;
2726 union sctp_notification snp;
2727 struct msghdr msg;
2728 struct iovec iov;
2729 bio_dgram_sctp_data *data = (bio_dgram_sctp_data *) b->ptr;
2730
2731 /* Check if there are any messages waiting to be read */
2732 do {
2733 memset(&snp, 0, sizeof(snp));
2734 iov.iov_base = (char *)&snp;
2735 iov.iov_len = sizeof(union sctp_notification);
2736 msg.msg_name = NULL;
2737 msg.msg_namelen = 0;
2738 msg.msg_iov = &iov;
2739 msg.msg_iovlen = 1;
2740 msg.msg_control = NULL;
2741 msg.msg_controllen = 0;
2742 msg.msg_flags = 0;
2743
2744 sockflags = fcntl(b->num, F_GETFL, 0);
2745 fcntl(b->num, F_SETFL, O_NONBLOCK);
2746 n = recvmsg(b->num, &msg, MSG_PEEK);
2747 fcntl(b->num, F_SETFL, sockflags);
2748
2749 /* if notification, process and try again */
2750 if (n > 0 && (msg.msg_flags & MSG_NOTIFICATION)) {
2751 # ifdef SCTP_AUTHENTICATION_EVENT
2752 if (snp.sn_header.sn_type == SCTP_AUTHENTICATION_EVENT)
2753 dgram_sctp_handle_auth_free_key_event(b, &snp);
2754 # endif
2755
2756 memset(&snp, 0, sizeof(snp));
2757 iov.iov_base = (char *)&snp;
2758 iov.iov_len = sizeof(union sctp_notification);
2759 msg.msg_name = NULL;
2760 msg.msg_namelen = 0;
2761 msg.msg_iov = &iov;
2762 msg.msg_iovlen = 1;
2763 msg.msg_control = NULL;
2764 msg.msg_controllen = 0;
2765 msg.msg_flags = 0;
2766 n = recvmsg(b->num, &msg, 0);
2767
2768 if (data->handle_notifications != NULL)
2769 data->handle_notifications(b, data->notification_context,
2770 (void *)&snp);
2771 }
2772
2773 } while (n > 0 && (msg.msg_flags & MSG_NOTIFICATION));
2774
2775 /* Return 1 if there is a message to be read, return 0 otherwise. */
2776 if (n > 0)
2777 return 1;
2778 else
2779 return 0;
2780 }
2781
dgram_sctp_puts(BIO * bp,const char * str)2782 static int dgram_sctp_puts(BIO *bp, const char *str)
2783 {
2784 int n, ret;
2785
2786 n = strlen(str);
2787 ret = dgram_sctp_write(bp, str, n);
2788 return ret;
2789 }
2790 # endif
2791
BIO_dgram_should_retry(int i)2792 static int BIO_dgram_should_retry(int i)
2793 {
2794 int err;
2795
2796 if ((i == 0) || (i == -1)) {
2797 err = get_last_socket_error();
2798
2799 # if defined(OPENSSL_SYS_WINDOWS)
2800 /*
2801 * If the socket return value (i) is -1 and err is unexpectedly 0 at
2802 * this point, the error code was overwritten by another system call
2803 * before this error handling is called.
2804 */
2805 # endif
2806
2807 return BIO_dgram_non_fatal_error(err);
2808 }
2809 return 0;
2810 }
2811
BIO_dgram_non_fatal_error(int err)2812 int BIO_dgram_non_fatal_error(int err)
2813 {
2814 switch (err) {
2815 # if defined(OPENSSL_SYS_WINDOWS)
2816 # if defined(WSAEWOULDBLOCK)
2817 case WSAEWOULDBLOCK:
2818 # endif
2819 # endif
2820
2821 # ifdef EWOULDBLOCK
2822 # ifdef WSAEWOULDBLOCK
2823 # if WSAEWOULDBLOCK != EWOULDBLOCK
2824 case EWOULDBLOCK:
2825 # endif
2826 # else
2827 case EWOULDBLOCK:
2828 # endif
2829 # endif
2830
2831 # ifdef EINTR
2832 case EINTR:
2833 # endif
2834
2835 # ifdef EAGAIN
2836 # if EWOULDBLOCK != EAGAIN
2837 case EAGAIN:
2838 # endif
2839 # endif
2840
2841 # ifdef EPROTO
2842 case EPROTO:
2843 # endif
2844
2845 # ifdef EINPROGRESS
2846 case EINPROGRESS:
2847 # endif
2848
2849 # ifdef EALREADY
2850 case EALREADY:
2851 # endif
2852
2853 return 1;
2854 default:
2855 break;
2856 }
2857 return 0;
2858 }
2859
2860 #endif
2861