2 * util/net_help.c - implementation of the network helper code
4 * Copyright (c) 2007, NLnet Labs. All rights reserved.
6 * This software is open source.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
15 * Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
19 * Neither the name of the NLNET LABS nor the names of its contributors may
20 * be used to endorse or promote products derived from this software without
21 * specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 * Implementation of net_help.h.
41 #ifdef HAVE_SYS_TYPES_H
42 # include <sys/types.h>
47 #ifdef HAVE_NETIOAPI_H
50 #include "util/net_help.h"
52 #include "util/data/dname.h"
53 #include "util/module.h"
54 #include "util/regional.h"
55 #include "util/config_file.h"
56 #include "sldns/parseutil.h"
57 #include "sldns/wire2str.h"
58 #include "sldns/str2wire.h"
60 #ifdef HAVE_OPENSSL_SSL_H
61 #include <openssl/ssl.h>
62 #include <openssl/evp.h>
63 #include <openssl/rand.h>
65 #ifdef HAVE_OPENSSL_ERR_H
66 #include <openssl/err.h>
68 #ifdef HAVE_OPENSSL_CORE_NAMES_H
69 #include <openssl/core_names.h>
74 #ifdef HAVE_NGHTTP2_NGHTTP2_H
75 #include <nghttp2/nghttp2.h>
78 /** max length of an IP address (the address portion) that we allow */
79 #define MAX_ADDR_STRLEN 128 /* characters */
80 /** default value for EDNS ADVERTISED size */
81 uint16_t EDNS_ADVERTISED_SIZE = 4096;
83 /** minimal responses when positive answer: default is no */
84 int MINIMAL_RESPONSES = 0;
86 /** rrset order roundrobin: default is yes */
87 int RRSET_ROUNDROBIN = 1;
89 /** log tag queries with name instead of 'info' for filtering */
90 int LOG_TAG_QUERYREPLY = 0;
92 static struct tls_session_ticket_key {
93 unsigned char *key_name;
94 unsigned char *aes_key;
95 unsigned char *hmac_key;
100 * callback TLS session ticket encrypt and decrypt
101 * For use with SSL_CTX_set_tlsext_ticket_key_cb or
102 * SSL_CTX_set_tlsext_ticket_key_evp_cb
103 * @param s: the SSL_CTX to use (from connect_sslctx_create())
104 * @param key_name: secret name, 16 bytes
105 * @param iv: up to EVP_MAX_IV_LENGTH.
106 * @param evp_ctx: the evp cipher context, function sets this.
107 * @param hmac_ctx: the hmac context, function sets this.
108 * with ..key_cb it is of type HMAC_CTX*
109 * with ..key_evp_cb it is of type EVP_MAC_CTX*
110 * @param enc: 1 is encrypt, 0 is decrypt
111 * @return 0 on no ticket, 1 for okay, and 2 for okay but renew the ticket
112 * (the ticket is decrypt only). and <0 for failures.
114 int tls_session_ticket_key_cb(SSL *s, unsigned char* key_name,
115 unsigned char* iv, EVP_CIPHER_CTX *evp_ctx,
116 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
117 EVP_MAC_CTX *hmac_ctx,
122 #endif /* HAVE_SSL */
124 /* returns true is string addr is an ip6 specced address */
126 str_is_ip6(const char* str)
134 fd_set_nonblock(int s)
138 if((flag = fcntl(s, F_GETFL)) == -1) {
139 log_err("can't fcntl F_GETFL: %s", strerror(errno));
143 if(fcntl(s, F_SETFL, flag) == -1) {
144 log_err("can't fcntl F_SETFL: %s", strerror(errno));
147 #elif defined(HAVE_IOCTLSOCKET)
148 unsigned long on = 1;
149 if(ioctlsocket(s, FIONBIO, &on) != 0) {
150 log_err("can't ioctlsocket FIONBIO on: %s",
151 wsa_strerror(WSAGetLastError()));
162 if((flag = fcntl(s, F_GETFL)) == -1) {
163 log_err("cannot fcntl F_GETFL: %s", strerror(errno));
167 if(fcntl(s, F_SETFL, flag) == -1) {
168 log_err("cannot fcntl F_SETFL: %s", strerror(errno));
171 #elif defined(HAVE_IOCTLSOCKET)
172 unsigned long off = 0;
173 if(ioctlsocket(s, FIONBIO, &off) != 0) {
174 if(WSAGetLastError() != WSAEINVAL || verbosity >= 4)
175 log_err("can't ioctlsocket FIONBIO off: %s",
176 wsa_strerror(WSAGetLastError()));
185 if(num == 0) return 1;
186 return (num & (num-1)) == 0;
190 memdup(void* data, size_t len)
193 if(!data) return NULL;
194 if(len == 0) return NULL;
197 memcpy(d, data, len);
202 log_addr(enum verbosity_value v, const char* str,
203 struct sockaddr_storage* addr, socklen_t addrlen)
206 const char* family = "unknown";
208 int af = (int)((struct sockaddr_in*)addr)->sin_family;
209 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
213 case AF_INET: family="ip4"; break;
214 case AF_INET6: family="ip6";
215 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
219 (void)inet_ntop(af, sinaddr, dest,
220 (socklen_t)sizeof(dest));
221 verbose(v, "%s local %s", str, dest);
222 return; /* do not continue and try to get port */
225 if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
226 (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
228 dest[sizeof(dest)-1] = 0;
229 port = ntohs(((struct sockaddr_in*)addr)->sin_port);
231 verbose(v, "%s %s %s port %d (len %d)", str, family, dest,
232 (int)port, (int)addrlen);
233 else verbose(v, "%s %s port %d", str, dest, (int)port);
237 extstrtoaddr(const char* str, struct sockaddr_storage* addr,
238 socklen_t* addrlen, int port)
241 if((s=strchr(str, '@'))) {
242 char buf[MAX_ADDR_STRLEN];
243 if(s-str >= MAX_ADDR_STRLEN) {
246 (void)strlcpy(buf, str, sizeof(buf));
249 if(port == 0 && strcmp(s+1,"0")!=0) {
252 return ipstrtoaddr(buf, port, addr, addrlen);
254 return ipstrtoaddr(str, port, addr, addrlen);
258 ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
265 char buf[MAX_ADDR_STRLEN];
267 struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
268 *addrlen = (socklen_t)sizeof(struct sockaddr_in6);
269 memset(sa, 0, *addrlen);
270 sa->sin6_family = AF_INET6;
271 sa->sin6_port = (in_port_t)htons(p);
272 if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
273 if(s-ip >= MAX_ADDR_STRLEN)
275 (void)strlcpy(buf, ip, sizeof(buf));
277 #ifdef HAVE_IF_NAMETOINDEX
278 if (!(sa->sin6_scope_id = if_nametoindex(s+1)))
279 #endif /* HAVE_IF_NAMETOINDEX */
280 sa->sin6_scope_id = (uint32_t)atoi(s+1);
283 if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
287 struct sockaddr_in* sa = (struct sockaddr_in*)addr;
288 *addrlen = (socklen_t)sizeof(struct sockaddr_in);
289 memset(sa, 0, *addrlen);
290 sa->sin_family = AF_INET;
291 sa->sin_port = (in_port_t)htons(p);
292 if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
299 int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
300 socklen_t* addrlen, int* net)
304 *net = (str_is_ip6(str)?128:32);
305 if((s=strchr(str, '/'))) {
306 if(atoi(s+1) > *net) {
307 log_err("netblock too large: %s", str);
311 if(*net == 0 && strcmp(s+1, "0") != 0) {
312 log_err("cannot parse netblock: '%s'", str);
315 strlcpy(buf, str, sizeof(buf));
316 s = strchr(buf, '/');
320 if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
321 log_err("cannot parse ip address: '%s'", str);
325 addr_mask(addr, *addrlen, *net);
330 /* RPZ format address dname to network byte order address */
331 static int ipdnametoaddr(uint8_t* dname, size_t dnamelen,
332 struct sockaddr_storage* addr, socklen_t* addrlen, int* af)
335 int dnamelabs = dname_count_labels(dname);
343 /* need 1 byte for label length */
348 dname_has_label(dname, dnamelen, (uint8_t*)"\002zz")) {
353 i = (*af == AF_INET) ? 3 : 15;
354 if(*af == AF_INET6) {
355 struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
356 *addrlen = (socklen_t)sizeof(struct sockaddr_in6);
357 memset(sa, 0, *addrlen);
358 sa->sin6_family = AF_INET6;
359 ia = (uint8_t*)&sa->sin6_addr;
361 struct sockaddr_in* sa = (struct sockaddr_in*)addr;
362 *addrlen = (socklen_t)sizeof(struct sockaddr_in);
363 memset(sa, 0, *addrlen);
364 sa->sin_family = AF_INET;
365 ia = (uint8_t*)&sa->sin_addr;
367 while(lablen && i >= 0 && len <= dnamelen) {
368 char buff[LDNS_MAX_LABELLEN+1];
369 uint16_t chunk; /* big enough to not overflow on IPv6 hextet */
370 if((*af == AF_INET && (lablen > 3 || dnamelabs > 6)) ||
371 (*af == AF_INET6 && (lablen > 4 || dnamelabs > 10))) {
374 if(memcmp(dname, "zz", 2) == 0 && *af == AF_INET6) {
375 /* Add one or more 0 labels. Address is initialised at
376 * 0, so just skip the zero part. */
377 int zl = 11 - dnamelabs;
383 memcpy(buff, dname, lablen);
385 chunk = strtol(buff, &e, (*af == AF_INET) ? 10 : 16);
386 if(!e || *e != '\0' || (*af == AF_INET && chunk > 255))
389 log_assert(i < 4 && i >= 0);
390 ia[i] = (uint8_t)chunk;
393 log_assert(i < 16 && i >= 1);
394 /* ia in network byte order */
395 ia[i-1] = (uint8_t)(chunk >> 8);
396 ia[i] = (uint8_t)(chunk & 0x00FF);
405 /* input too short */
410 int netblockdnametoaddr(uint8_t* dname, size_t dnamelen,
411 struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af)
413 char buff[3 /* 3 digit netblock */ + 1];
415 if(dnamelen < 1 || *dname > 3)
416 /* netblock invalid */
420 if(dnamelen < 1 + nlablen)
423 memcpy(buff, dname+1, nlablen);
424 buff[nlablen] = '\0';
426 if(*net == 0 && strcmp(buff, "0") != 0)
430 if(!ipdnametoaddr(dname, dnamelen-1-nlablen, addr, addrlen, af))
432 if((*af == AF_INET6 && *net > 128) || (*af == AF_INET && *net > 32))
437 int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
438 socklen_t* addrlen, char** auth_name)
441 int port = UNBOUND_DNS_PORT;
442 if((s=strchr(str, '@'))) {
443 char buf[MAX_ADDR_STRLEN];
444 size_t len = (size_t)(s-str);
445 char* hash = strchr(s+1, '#');
451 if(len >= MAX_ADDR_STRLEN) {
454 (void)strlcpy(buf, str, sizeof(buf));
458 if(!hash && strcmp(s+1,"0")!=0)
460 if(hash && strncmp(s+1,"0#",2)!=0)
463 return ipstrtoaddr(buf, port, addr, addrlen);
465 if((s=strchr(str, '#'))) {
466 char buf[MAX_ADDR_STRLEN];
467 size_t len = (size_t)(s-str);
468 if(len >= MAX_ADDR_STRLEN) {
471 (void)strlcpy(buf, str, sizeof(buf));
473 port = UNBOUND_DNS_OVER_TLS_PORT;
475 return ipstrtoaddr(buf, port, addr, addrlen);
478 return ipstrtoaddr(str, port, addr, addrlen);
481 uint8_t* authextstrtodname(char* str, int* port, char** auth_name)
486 *port = UNBOUND_DNS_PORT;
488 if((s=strchr(str, '@'))) {
489 char* hash = strchr(s+1, '#');
497 if(!hash && strcmp(s+1,"0")!=0)
499 if(hash && strncmp(s+1,"0#",2)!=0)
503 dname = sldns_str2wire_dname(str, &dname_len);
505 } else if((s=strchr(str, '#'))) {
506 *port = UNBOUND_DNS_OVER_TLS_PORT;
509 dname = sldns_str2wire_dname(str, &dname_len);
512 dname = sldns_str2wire_dname(str, &dname_len);
517 /** store port number into sockaddr structure */
519 sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
521 if(addr_is_ip6(addr, addrlen)) {
522 struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
523 sa->sin6_port = (in_port_t)htons((uint16_t)port);
525 struct sockaddr_in* sa = (struct sockaddr_in*)addr;
526 sa->sin_port = (in_port_t)htons((uint16_t)port);
531 log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
532 uint16_t type, uint16_t dclass)
534 char buf[LDNS_MAX_DOMAINLEN+1];
539 dname_str(name, buf);
540 if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
541 else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
542 else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
543 else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
544 else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
545 else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
546 else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
547 ts = sldns_rr_descript(type)->_name;
549 snprintf(t, sizeof(t), "TYPE%d", (int)type);
552 if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
553 sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
554 cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
556 snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
559 log_info("%s %s %s %s", str, buf, ts, cs);
563 log_query_in(const char* str, uint8_t* name, uint16_t type, uint16_t dclass)
565 char buf[LDNS_MAX_DOMAINLEN+1];
568 dname_str(name, buf);
569 if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
570 else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
571 else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
572 else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
573 else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
574 else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
575 else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
576 ts = sldns_rr_descript(type)->_name;
578 snprintf(t, sizeof(t), "TYPE%d", (int)type);
581 if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
582 sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
583 cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
585 snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
588 if(LOG_TAG_QUERYREPLY)
589 log_query("%s %s %s %s", str, buf, ts, cs);
590 else log_info("%s %s %s %s", str, buf, ts, cs);
593 void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
594 struct sockaddr_storage* addr, socklen_t addrlen)
597 const char* family = "unknown_family ";
598 char namebuf[LDNS_MAX_DOMAINLEN+1];
600 int af = (int)((struct sockaddr_in*)addr)->sin_family;
601 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
605 case AF_INET: family=""; break;
606 case AF_INET6: family="";
607 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
609 case AF_LOCAL: family="local "; break;
612 if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
613 (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
615 dest[sizeof(dest)-1] = 0;
616 port = ntohs(((struct sockaddr_in*)addr)->sin_port);
617 dname_str(zone, namebuf);
618 if(af != AF_INET && af != AF_INET6)
619 verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
620 str, namebuf, family, dest, (int)port, (int)addrlen);
621 else verbose(v, "%s <%s> %s%s#%d",
622 str, namebuf, family, dest, (int)port);
625 void log_err_addr(const char* str, const char* err,
626 struct sockaddr_storage* addr, socklen_t addrlen)
630 int af = (int)((struct sockaddr_in*)addr)->sin_family;
631 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
633 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
634 if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
635 (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
637 dest[sizeof(dest)-1] = 0;
638 port = ntohs(((struct sockaddr_in*)addr)->sin_port);
640 log_err("%s: %s for %s port %d (len %d)", str, err, dest,
641 (int)port, (int)addrlen);
642 else log_err("%s: %s for %s port %d", str, err, dest, (int)port);
646 sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
647 struct sockaddr_storage* addr2, socklen_t len2)
649 struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
650 struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
651 struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
652 struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
657 log_assert(len1 == len2);
658 if( p1_in->sin_family < p2_in->sin_family)
660 if( p1_in->sin_family > p2_in->sin_family)
662 log_assert( p1_in->sin_family == p2_in->sin_family );
664 if( p1_in->sin_family == AF_INET ) {
665 /* just order it, ntohs not required */
666 if(p1_in->sin_port < p2_in->sin_port)
668 if(p1_in->sin_port > p2_in->sin_port)
670 log_assert(p1_in->sin_port == p2_in->sin_port);
671 return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
672 } else if (p1_in6->sin6_family == AF_INET6) {
673 /* just order it, ntohs not required */
674 if(p1_in6->sin6_port < p2_in6->sin6_port)
676 if(p1_in6->sin6_port > p2_in6->sin6_port)
678 log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
679 return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
682 /* eek unknown type, perform this comparison for sanity. */
683 return memcmp(addr1, addr2, len1);
688 sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
689 struct sockaddr_storage* addr2, socklen_t len2)
691 struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
692 struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
693 struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
694 struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
699 log_assert(len1 == len2);
700 if( p1_in->sin_family < p2_in->sin_family)
702 if( p1_in->sin_family > p2_in->sin_family)
704 log_assert( p1_in->sin_family == p2_in->sin_family );
706 if( p1_in->sin_family == AF_INET ) {
707 return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
708 } else if (p1_in6->sin6_family == AF_INET6) {
709 return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
712 /* eek unknown type, perform this comparison for sanity. */
713 return memcmp(addr1, addr2, len1);
718 addr_is_ip6(struct sockaddr_storage* addr, socklen_t len)
720 if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
721 ((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
727 addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
729 uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
732 if(addr_is_ip6(addr, len)) {
733 s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
736 s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
741 for(i=net/8+1; i<max/8; i++) {
744 s[net/8] &= mask[net&0x7];
748 addr_in_common(struct sockaddr_storage* addr1, int net1,
749 struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
751 int min = (net1<net2)?net1:net2;
755 if(addr_is_ip6(addr1, addrlen)) {
756 s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
757 s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
760 s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
761 s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
764 /* match = bits_in_common(s1, s2, to); */
765 for(i=0; i<to; i++) {
769 uint8_t z = s1[i]^s2[i];
778 if(match > min) match = min;
783 addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
784 char* buf, size_t len)
786 int af = (int)((struct sockaddr_in*)addr)->sin_family;
787 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
788 if(addr_is_ip6(addr, addrlen))
789 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
790 if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
791 snprintf(buf, len, "(inet_ntop_error)");
796 prefixnet_is_nat64(int prefixnet)
798 return (prefixnet == 32 || prefixnet == 40 ||
799 prefixnet == 48 || prefixnet == 56 ||
800 prefixnet == 64 || prefixnet == 96);
804 addr_to_nat64(const struct sockaddr_storage* addr,
805 const struct sockaddr_storage* nat64_prefix,
806 socklen_t nat64_prefixlen, int nat64_prefixnet,
807 struct sockaddr_storage* nat64_addr, socklen_t* nat64_addrlen)
809 struct sockaddr_in *sin = (struct sockaddr_in *)addr;
810 struct sockaddr_in6 *sin6;
814 /* This needs to be checked by the caller */
815 log_assert(addr->ss_family == AF_INET);
816 /* Current usage is only from config values; prefix lengths enforced
817 * during config validation */
818 log_assert(prefixnet_is_nat64(nat64_prefixnet));
820 *nat64_addr = *nat64_prefix;
821 *nat64_addrlen = nat64_prefixlen;
823 sin6 = (struct sockaddr_in6 *)nat64_addr;
824 sin6->sin6_flowinfo = 0;
825 sin6->sin6_port = sin->sin_port;
827 nat64_prefixnet = nat64_prefixnet / 8;
829 v4_byte = (uint8_t *)&sin->sin_addr.s_addr;
830 for(i = 0; i < 4; i++) {
831 if(nat64_prefixnet == 8) {
832 /* bits 64...71 are MBZ */
833 sin6->sin6_addr.s6_addr[nat64_prefixnet++] = 0;
835 sin6->sin6_addr.s6_addr[nat64_prefixnet++] = *v4_byte++;
840 addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
842 /* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
843 const uint8_t map_prefix[16] =
844 {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
846 if(!addr_is_ip6(addr, addrlen))
848 /* s is 16 octet ipv6 address string */
849 s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
850 return (memcmp(s, map_prefix, 12) == 0);
853 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
855 int af = (int)((struct sockaddr_in*)addr)->sin_family;
856 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
857 return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
858 && memcmp(sinaddr, "\377\377\377\377", 4) == 0;
861 int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
863 int af = (int)((struct sockaddr_in*)addr)->sin_family;
864 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
865 void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
866 if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
867 && memcmp(sinaddr, "\000\000\000\000", 4) == 0)
869 else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
870 && memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
871 "\000\000\000\000\000\000\000\000", 16) == 0)
876 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
877 socklen_t len, struct regional* region)
879 struct sock_list* add = (struct sock_list*)regional_alloc(region,
880 sizeof(*add) - sizeof(add->addr) + (size_t)len);
882 log_err("out of memory in socketlist insert");
889 if(len) memmove(&add->addr, addr, len);
892 void sock_list_prepend(struct sock_list** list, struct sock_list* add)
894 struct sock_list* last = add;
903 int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
907 if(len == list->len) {
908 if(len == 0 || sockaddr_cmp_addr(addr, len,
909 &list->addr, list->len) == 0)
917 void sock_list_merge(struct sock_list** list, struct regional* region,
918 struct sock_list* add)
921 for(p=add; p; p=p->next) {
922 if(!sock_list_find(*list, &p->addr, p->len))
923 sock_list_insert(list, &p->addr, p->len, region);
928 log_crypto_err(const char* str)
931 log_crypto_err_code(str, ERR_get_error());
934 #endif /* HAVE_SSL */
937 void log_crypto_err_code(const char* str, unsigned long err)
940 /* error:[error code]:[library name]:[function name]:[reason string] */
943 ERR_error_string_n(err, buf, sizeof(buf));
944 log_err("%s crypto %s", str, buf);
945 while( (e=ERR_get_error()) ) {
946 ERR_error_string_n(e, buf, sizeof(buf));
947 log_err("and additionally crypto %s", buf);
952 #endif /* HAVE_SSL */
956 /** Print crypt erro with SSL_get_error want code and err_get_error code */
957 static void log_crypto_err_io_code_arg(const char* str, int r,
958 unsigned long err, int err_present)
960 int print_errno = 0, print_crypto_err = 0;
961 const char* inf = NULL;
967 case SSL_ERROR_ZERO_RETURN:
968 inf = "channel closed";
970 case SSL_ERROR_WANT_READ:
973 case SSL_ERROR_WANT_WRITE:
976 case SSL_ERROR_WANT_CONNECT:
977 inf = "want connect";
979 case SSL_ERROR_WANT_ACCEPT:
982 case SSL_ERROR_WANT_X509_LOOKUP:
983 inf = "want X509 lookup";
985 #ifdef SSL_ERROR_WANT_ASYNC
986 case SSL_ERROR_WANT_ASYNC:
990 #ifdef SSL_ERROR_WANT_ASYNC_JOB
991 case SSL_ERROR_WANT_ASYNC_JOB:
992 inf = "want async job";
995 #ifdef SSL_ERROR_WANT_CLIENT_HELLO_CB
996 case SSL_ERROR_WANT_CLIENT_HELLO_CB:
997 inf = "want client hello cb";
1000 case SSL_ERROR_SYSCALL:
1005 print_crypto_err = 1;
1006 inf = "SSL, usually protocol, error";
1009 inf = "unknown SSL_get_error result code";
1011 print_crypto_err = 1;
1013 if(print_crypto_err) {
1016 snprintf(buf, sizeof(buf), "%s with errno %s",
1017 str, strerror(errno));
1019 log_crypto_err_code(buf, err);
1020 else log_crypto_err(buf);
1023 log_crypto_err_code(str, err);
1024 else log_crypto_err(str);
1029 log_err("str: syscall error with errno %s",
1031 else log_err("str: %s", strerror(errno));
1033 log_err("str: %s", inf);
1037 #endif /* HAVE_SSL */
1039 void log_crypto_err_io(const char* str, int r)
1042 log_crypto_err_io_code_arg(str, r, 0, 0);
1046 #endif /* HAVE_SSL */
1049 void log_crypto_err_io_code(const char* str, int r, unsigned long err)
1052 log_crypto_err_io_code_arg(str, r, err, 1);
1057 #endif /* HAVE_SSL */
1061 /** log certificate details */
1063 log_cert(unsigned level, const char* str, void* cert)
1069 if(verbosity < level) return;
1070 bio = BIO_new(BIO_s_mem());
1072 X509_print_ex(bio, (X509*)cert, 0, (unsigned long)-1
1073 ^(X509_FLAG_NO_SUBJECT
1074 |X509_FLAG_NO_ISSUER|X509_FLAG_NO_VALIDITY
1075 |X509_FLAG_NO_EXTENSIONS|X509_FLAG_NO_AUX
1076 |X509_FLAG_NO_ATTRIBUTES));
1077 BIO_write(bio, &nul, (int)sizeof(nul));
1078 len = BIO_get_mem_data(bio, &pp);
1079 if(len != 0 && pp) {
1080 /* reduce size of cert printout */
1082 while((s=strstr(pp, " "))!=NULL)
1083 memmove(s, s+1, strlen(s+1)+1);
1084 while((s=strstr(pp, "\t\t"))!=NULL)
1085 memmove(s, s+1, strlen(s+1)+1);
1086 verbose(level, "%s: \n%s", str, pp);
1090 #endif /* HAVE_SSL */
1092 #if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
1093 static int alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
1094 unsigned char* outlen, const unsigned char* in, unsigned int inlen,
1095 void* ATTR_UNUSED(arg))
1097 int rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in,
1100 return SSL_TLSEXT_ERR_NOACK;
1102 /* either http/1.1 or h2 selected */
1103 return SSL_TLSEXT_ERR_OK;
1108 listen_sslctx_setup(void* ctxt)
1111 SSL_CTX* ctx = (SSL_CTX*)ctxt;
1112 /* no SSLv2, SSLv3 because has defects */
1113 #if SSL_OP_NO_SSLv2 != 0
1114 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1115 != SSL_OP_NO_SSLv2){
1116 log_crypto_err("could not set SSL_OP_NO_SSLv2");
1120 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1121 != SSL_OP_NO_SSLv3){
1122 log_crypto_err("could not set SSL_OP_NO_SSLv3");
1125 #if defined(SSL_OP_NO_TLSv1) && defined(SSL_OP_NO_TLSv1_1)
1126 /* if we have tls 1.1 disable 1.0 */
1127 if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1) & SSL_OP_NO_TLSv1)
1128 != SSL_OP_NO_TLSv1){
1129 log_crypto_err("could not set SSL_OP_NO_TLSv1");
1133 #if defined(SSL_OP_NO_TLSv1_1) && defined(SSL_OP_NO_TLSv1_2)
1134 /* if we have tls 1.2 disable 1.1 */
1135 if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1) & SSL_OP_NO_TLSv1_1)
1136 != SSL_OP_NO_TLSv1_1){
1137 log_crypto_err("could not set SSL_OP_NO_TLSv1_1");
1141 #if defined(SSL_OP_NO_RENEGOTIATION)
1142 /* disable client renegotiation */
1143 if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1144 SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1145 log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1149 #if defined(SHA256_DIGEST_LENGTH) && defined(USE_ECDSA)
1150 /* if we detect system-wide crypto policies, use those */
1151 if (access( "/etc/crypto-policies/config", F_OK ) != 0 ) {
1152 /* if we have sha256, set the cipher list to have no known vulns */
1153 if(!SSL_CTX_set_cipher_list(ctx, "TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"))
1154 log_crypto_err("could not set cipher list with SSL_CTX_set_cipher_list");
1157 #if defined(SSL_OP_IGNORE_UNEXPECTED_EOF)
1158 /* ignore errors when peers do not send the mandatory close_notify
1159 * alert on shutdown.
1160 * Relevant for openssl >= 3 */
1161 if((SSL_CTX_set_options(ctx, SSL_OP_IGNORE_UNEXPECTED_EOF) &
1162 SSL_OP_IGNORE_UNEXPECTED_EOF) != SSL_OP_IGNORE_UNEXPECTED_EOF) {
1163 log_crypto_err("could not set SSL_OP_IGNORE_UNEXPECTED_EOF");
1168 if((SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE) &
1169 SSL_OP_CIPHER_SERVER_PREFERENCE) !=
1170 SSL_OP_CIPHER_SERVER_PREFERENCE) {
1171 log_crypto_err("could not set SSL_OP_CIPHER_SERVER_PREFERENCE");
1175 #ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
1176 SSL_CTX_set_security_level(ctx, 0);
1178 #if defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB) && defined(HAVE_NGHTTP2)
1179 SSL_CTX_set_alpn_select_cb(ctx, alpn_select_cb, NULL);
1183 #endif /* HAVE_SSL */
1188 listen_sslctx_setup_2(void* ctxt)
1191 SSL_CTX* ctx = (SSL_CTX*)ctxt;
1193 #if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
1194 if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
1195 log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
1197 #elif defined(USE_ECDSA)
1199 EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
1201 log_crypto_err("could not find p256, not enabling ECDHE");
1203 if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
1204 log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
1212 #endif /* HAVE_SSL */
1215 void* listen_sslctx_create(char* key, char* pem, char* verifypem)
1218 SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
1220 log_crypto_err("could not SSL_CTX_new");
1223 if(!key || key[0] == 0) {
1224 log_err("error: no tls-service-key file specified");
1228 if(!pem || pem[0] == 0) {
1229 log_err("error: no tls-service-pem file specified");
1233 if(!listen_sslctx_setup(ctx)) {
1237 if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1238 log_err("error for cert file: %s", pem);
1239 log_crypto_err("error in SSL_CTX use_certificate_chain_file");
1243 if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1244 log_err("error for private key file: %s", key);
1245 log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
1249 if(!SSL_CTX_check_private_key(ctx)) {
1250 log_err("error for key file: %s", key);
1251 log_crypto_err("Error in SSL_CTX check_private_key");
1255 listen_sslctx_setup_2(ctx);
1256 if(verifypem && verifypem[0]) {
1257 if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1258 log_crypto_err("Error in SSL_CTX verify locations");
1262 SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
1264 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
1268 (void)key; (void)pem; (void)verifypem;
1274 /* For windows, the CA trust store is not read by openssl.
1275 Add code to open the trust store using wincrypt API and add
1276 the root certs into openssl trust store */
1278 add_WIN_cacerts_to_openssl_store(SSL_CTX* tls_ctx)
1280 HCERTSTORE hSystemStore;
1281 PCCERT_CONTEXT pTargetCert = NULL;
1284 verbose(VERB_ALGO, "Adding Windows certificates from system root store to CA store");
1286 /* load just once per context lifetime for this version
1287 TODO: dynamically update CA trust changes as they are available */
1291 /* Call wincrypt's CertOpenStore to open the CA root store. */
1293 if ((hSystemStore = CertOpenStore(
1294 CERT_STORE_PROV_SYSTEM,
1297 /* NOTE: mingw does not have this const: replace with 1 << 16 from code
1298 CERT_SYSTEM_STORE_CURRENT_USER, */
1305 store = SSL_CTX_get_cert_store(tls_ctx);
1309 /* failure if the CA store is empty or the call fails */
1310 if ((pTargetCert = CertEnumCertificatesInStore(
1311 hSystemStore, pTargetCert)) == 0) {
1312 verbose(VERB_ALGO, "CA certificate store for Windows is empty.");
1315 /* iterate over the windows cert store and add to openssl store */
1318 X509 *cert1 = d2i_X509(NULL,
1319 (const unsigned char **)&pTargetCert->pbCertEncoded,
1320 pTargetCert->cbCertEncoded);
1322 unsigned long error = ERR_get_error();
1323 /* return error if a cert fails */
1324 verbose(VERB_ALGO, "%s %d:%s",
1325 "Unable to parse certificate in memory",
1326 (int)error, ERR_error_string(error, NULL));
1330 /* return error if a cert add to store fails */
1331 if (X509_STORE_add_cert(store, cert1) == 0) {
1332 unsigned long error = ERR_peek_last_error();
1334 /* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
1335 * certificate is already in the store. */
1336 if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
1337 ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
1338 error = ERR_get_error();
1339 verbose(VERB_ALGO, "%s %d:%s\n",
1340 "Error adding certificate", (int)error,
1341 ERR_error_string(error, NULL));
1348 } while ((pTargetCert = CertEnumCertificatesInStore(
1349 hSystemStore, pTargetCert)) != 0);
1351 /* Clean up memory and quit. */
1353 CertFreeCertificateContext(pTargetCert);
1356 if (!CertCloseStore(
1360 verbose(VERB_ALGO, "Completed adding Windows certificates to CA store successfully");
1363 #endif /* USE_WINSOCK */
1365 void* connect_sslctx_create(char* key, char* pem, char* verifypem, int wincert)
1368 SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1370 log_crypto_err("could not allocate SSL_CTX pointer");
1373 #if SSL_OP_NO_SSLv2 != 0
1374 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1375 != SSL_OP_NO_SSLv2) {
1376 log_crypto_err("could not set SSL_OP_NO_SSLv2");
1381 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1382 != SSL_OP_NO_SSLv3) {
1383 log_crypto_err("could not set SSL_OP_NO_SSLv3");
1387 #if defined(SSL_OP_NO_RENEGOTIATION)
1388 /* disable client renegotiation */
1389 if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1390 SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1391 log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1396 #if defined(SSL_OP_IGNORE_UNEXPECTED_EOF)
1397 /* ignore errors when peers do not send the mandatory close_notify
1398 * alert on shutdown.
1399 * Relevant for openssl >= 3 */
1400 if((SSL_CTX_set_options(ctx, SSL_OP_IGNORE_UNEXPECTED_EOF) &
1401 SSL_OP_IGNORE_UNEXPECTED_EOF) != SSL_OP_IGNORE_UNEXPECTED_EOF) {
1402 log_crypto_err("could not set SSL_OP_IGNORE_UNEXPECTED_EOF");
1408 if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1409 log_err("error in client certificate %s", pem);
1410 log_crypto_err("error in certificate file");
1414 if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1415 log_err("error in client private key %s", key);
1416 log_crypto_err("error in key file");
1420 if(!SSL_CTX_check_private_key(ctx)) {
1421 log_err("error in client key %s", key);
1422 log_crypto_err("error in SSL_CTX_check_private_key");
1427 if((verifypem && verifypem[0]) || wincert) {
1428 if(verifypem && verifypem[0]) {
1429 if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1430 log_crypto_err("error in SSL_CTX verify");
1437 if(!add_WIN_cacerts_to_openssl_store(ctx)) {
1438 log_crypto_err("error in add_WIN_cacerts_to_openssl_store");
1445 if(!SSL_CTX_set_default_verify_paths(ctx)) {
1446 log_crypto_err("error in default_verify_paths");
1452 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
1456 (void)key; (void)pem; (void)verifypem; (void)wincert;
1461 void* incoming_ssl_fd(void* sslctx, int fd)
1464 SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1466 log_crypto_err("could not SSL_new");
1469 SSL_set_accept_state(ssl);
1470 (void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1471 if(!SSL_set_fd(ssl, fd)) {
1472 log_crypto_err("could not SSL_set_fd");
1478 (void)sslctx; (void)fd;
1483 void* outgoing_ssl_fd(void* sslctx, int fd)
1486 SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1488 log_crypto_err("could not SSL_new");
1491 SSL_set_connect_state(ssl);
1492 (void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1493 if(!SSL_set_fd(ssl, fd)) {
1494 log_crypto_err("could not SSL_set_fd");
1500 (void)sslctx; (void)fd;
1505 int check_auth_name_for_ssl(char* auth_name)
1507 if(!auth_name) return 1;
1508 #if defined(HAVE_SSL) && !defined(HAVE_SSL_SET1_HOST) && !defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1509 log_err("the query has an auth_name %s, but libssl has no call to "
1510 "perform TLS authentication. Remove that name from config "
1511 "or upgrade the ssl crypto library.", auth_name);
1518 /** set the authname on an SSL structure, SSL* ssl */
1519 int set_auth_name_on_ssl(void* ssl, char* auth_name, int use_sni)
1521 if(!auth_name) return 1;
1524 (void)SSL_set_tlsext_host_name(ssl, auth_name);
1530 #ifdef HAVE_SSL_SET1_HOST
1531 SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1532 /* setting the hostname makes openssl verify the
1533 * host name in the x509 certificate in the
1535 if(!SSL_set1_host(ssl, auth_name)) {
1536 log_err("SSL_set1_host failed");
1539 #elif defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1540 /* openssl 1.0.2 has this function that can be used for
1541 * set1_host like verification */
1543 X509_VERIFY_PARAM* param = SSL_get0_param(ssl);
1544 # ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
1545 X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1547 if(!X509_VERIFY_PARAM_set1_host(param, auth_name, strlen(auth_name))) {
1548 log_err("X509_VERIFY_PARAM_set1_host failed");
1551 SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1554 verbose(VERB_ALGO, "the query has an auth_name, but libssl has no call to perform TLS authentication");
1555 #endif /* HAVE_SSL_SET1_HOST */
1559 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1560 /** global lock list for openssl locks */
1561 static lock_basic_type *ub_openssl_locks = NULL;
1563 /** callback that gets thread id for openssl */
1564 #ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1566 ub_crypto_id_cb(CRYPTO_THREADID *id)
1568 CRYPTO_THREADID_set_numeric(id, (unsigned long)log_thread_get());
1571 static unsigned long
1572 ub_crypto_id_cb(void)
1574 return (unsigned long)log_thread_get();
1579 ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
1580 int ATTR_UNUSED(line))
1582 if((mode&CRYPTO_LOCK)) {
1583 lock_basic_lock(&ub_openssl_locks[type]);
1585 lock_basic_unlock(&ub_openssl_locks[type]);
1588 #endif /* OPENSSL_THREADS */
1590 int ub_openssl_lock_init(void)
1592 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1594 ub_openssl_locks = (lock_basic_type*)reallocarray(
1595 NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
1596 if(!ub_openssl_locks)
1598 for(i=0; i<CRYPTO_num_locks(); i++) {
1599 lock_basic_init(&ub_openssl_locks[i]);
1601 # ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1602 CRYPTO_THREADID_set_callback(&ub_crypto_id_cb);
1604 CRYPTO_set_id_callback(&ub_crypto_id_cb);
1606 CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
1607 #endif /* OPENSSL_THREADS */
1611 void ub_openssl_lock_delete(void)
1613 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1615 if(!ub_openssl_locks)
1617 # ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1618 CRYPTO_THREADID_set_callback(NULL);
1620 CRYPTO_set_id_callback(NULL);
1622 CRYPTO_set_locking_callback(NULL);
1623 for(i=0; i<CRYPTO_num_locks(); i++) {
1624 lock_basic_destroy(&ub_openssl_locks[i]);
1626 free(ub_openssl_locks);
1627 #endif /* OPENSSL_THREADS */
1630 int listen_sslctx_setup_ticket_keys(void* sslctx, struct config_strlist* tls_session_ticket_keys) {
1633 struct config_strlist* p;
1634 struct tls_session_ticket_key *keys;
1635 for(p = tls_session_ticket_keys; p; p = p->next) {
1638 keys = calloc(s, sizeof(struct tls_session_ticket_key));
1641 memset(keys, 0, s*sizeof(*keys));
1644 for(p = tls_session_ticket_keys; p; p = p->next) {
1646 unsigned char *data;
1649 data = (unsigned char *)malloc(80);
1653 f = fopen(p->str, "rb");
1655 log_err("could not read tls-session-ticket-key %s: %s", p->str, strerror(errno));
1659 n = fread(data, 1, 80, f);
1663 log_err("tls-session-ticket-key %s is %d bytes, must be 80 bytes", p->str, (int)n);
1667 verbose(VERB_OPS, "read tls-session-ticket-key: %s", p->str);
1669 keys->key_name = data;
1670 keys->aes_key = data + 16;
1671 keys->hmac_key = data + 48;
1674 /* terminate array with NULL key name entry */
1675 keys->key_name = NULL;
1676 # ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1677 if(SSL_CTX_set_tlsext_ticket_key_evp_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1678 log_err("no support for TLS session ticket");
1682 if(SSL_CTX_set_tlsext_ticket_key_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1683 log_err("no support for TLS session ticket");
1690 (void)tls_session_ticket_keys;
1697 int tls_session_ticket_key_cb(SSL *ATTR_UNUSED(sslctx), unsigned char* key_name,
1698 unsigned char* iv, EVP_CIPHER_CTX *evp_sctx,
1699 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1700 EVP_MAC_CTX *hmac_ctx,
1707 # ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1708 OSSL_PARAM params[3];
1710 const EVP_MD *digest;
1712 const EVP_CIPHER *cipher;
1713 int evp_cipher_length;
1714 # ifndef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1715 digest = EVP_sha256();
1717 cipher = EVP_aes_256_cbc();
1718 evp_cipher_length = EVP_CIPHER_iv_length(cipher);
1721 verbose(VERB_CLIENT, "start session encrypt");
1722 memcpy(key_name, ticket_keys->key_name, 16);
1723 if (RAND_bytes(iv, evp_cipher_length) != 1) {
1724 verbose(VERB_CLIENT, "RAND_bytes failed");
1727 if (EVP_EncryptInit_ex(evp_sctx, cipher, NULL, ticket_keys->aes_key, iv) != 1) {
1728 verbose(VERB_CLIENT, "EVP_EncryptInit_ex failed");
1731 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1732 params[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1733 ticket_keys->hmac_key, 32);
1734 params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1736 params[2] = OSSL_PARAM_construct_end();
1737 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1738 EVP_MAC_CTX_set_params(hmac_ctx, params);
1740 EVP_MAC_set_ctx_params(hmac_ctx, params);
1742 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1743 if (HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL) != 1) {
1744 verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1748 HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL);
1751 } else if (enc == 0) {
1753 struct tls_session_ticket_key *key;
1754 verbose(VERB_CLIENT, "start session decrypt");
1755 for(key = ticket_keys; key->key_name != NULL; key++) {
1756 if (!memcmp(key_name, key->key_name, 16)) {
1757 verbose(VERB_CLIENT, "Found session_key");
1761 if(key->key_name == NULL) {
1762 verbose(VERB_CLIENT, "Not found session_key");
1766 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1767 params[0] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
1769 params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1771 params[2] = OSSL_PARAM_construct_end();
1772 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1773 EVP_MAC_CTX_set_params(hmac_ctx, params);
1775 EVP_MAC_set_ctx_params(hmac_ctx, params);
1777 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1778 if (HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL) != 1) {
1779 verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1783 HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL);
1785 if (EVP_DecryptInit_ex(evp_sctx, cipher, NULL, key->aes_key, iv) != 1) {
1786 log_err("EVP_DecryptInit_ex failed");
1790 return (key == ticket_keys) ? 1 : 2;
1802 #endif /* HAVE_SSL */
1805 listen_sslctx_delete_ticket_keys(void)
1807 struct tls_session_ticket_key *key;
1808 if(!ticket_keys) return;
1809 for(key = ticket_keys; key->key_name != NULL; key++) {
1810 /* wipe key data from memory*/
1811 #ifdef HAVE_EXPLICIT_BZERO
1812 explicit_bzero(key->key_name, 80);
1814 memset(key->key_name, 0xdd, 80);
1816 free(key->key_name);
1822 # ifndef USE_WINSOCK
1824 sock_strerror(int errn)
1826 return strerror(errn);
1830 sock_close(int socket)
1837 sock_strerror(int ATTR_UNUSED(errn))
1839 return wsa_strerror(WSAGetLastError());
1843 sock_close(int socket)
1845 closesocket(socket);
1847 # endif /* USE_WINSOCK */