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 #include "util/net_help.h"
43 #include "util/data/dname.h"
44 #include "util/module.h"
45 #include "util/regional.h"
46 #include "util/config_file.h"
47 #include "sldns/parseutil.h"
48 #include "sldns/wire2str.h"
50 #ifdef HAVE_OPENSSL_SSL_H
51 #include <openssl/ssl.h>
52 #include <openssl/evp.h>
53 #include <openssl/rand.h>
55 #ifdef HAVE_OPENSSL_ERR_H
56 #include <openssl/err.h>
58 #ifdef HAVE_OPENSSL_CORE_NAMES_H
59 #include <openssl/core_names.h>
64 #ifdef HAVE_NGHTTP2_NGHTTP2_H
65 #include <nghttp2/nghttp2.h>
68 /** max length of an IP address (the address portion) that we allow */
69 #define MAX_ADDR_STRLEN 128 /* characters */
70 /** default value for EDNS ADVERTISED size */
71 uint16_t EDNS_ADVERTISED_SIZE = 4096;
73 /** minimal responses when positive answer: default is no */
74 int MINIMAL_RESPONSES = 0;
76 /** rrset order roundrobin: default is yes */
77 int RRSET_ROUNDROBIN = 1;
79 /** log tag queries with name instead of 'info' for filtering */
80 int LOG_TAG_QUERYREPLY = 0;
82 static struct tls_session_ticket_key {
83 unsigned char *key_name;
84 unsigned char *aes_key;
85 unsigned char *hmac_key;
90 * callback TLS session ticket encrypt and decrypt
91 * For use with SSL_CTX_set_tlsext_ticket_key_cb or
92 * SSL_CTX_set_tlsext_ticket_key_evp_cb
93 * @param s: the SSL_CTX to use (from connect_sslctx_create())
94 * @param key_name: secret name, 16 bytes
95 * @param iv: up to EVP_MAX_IV_LENGTH.
96 * @param evp_ctx: the evp cipher context, function sets this.
97 * @param hmac_ctx: the hmac context, function sets this.
98 * with ..key_cb it is of type HMAC_CTX*
99 * with ..key_evp_cb it is of type EVP_MAC_CTX*
100 * @param enc: 1 is encrypt, 0 is decrypt
101 * @return 0 on no ticket, 1 for okay, and 2 for okay but renew the ticket
102 * (the ticket is decrypt only). and <0 for failures.
104 int tls_session_ticket_key_cb(SSL *s, unsigned char* key_name,
105 unsigned char* iv, EVP_CIPHER_CTX *evp_ctx,
106 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
107 EVP_MAC_CTX *hmac_ctx,
112 #endif /* HAVE_SSL */
114 /* returns true is string addr is an ip6 specced address */
116 str_is_ip6(const char* str)
124 fd_set_nonblock(int s)
128 if((flag = fcntl(s, F_GETFL)) == -1) {
129 log_err("can't fcntl F_GETFL: %s", strerror(errno));
133 if(fcntl(s, F_SETFL, flag) == -1) {
134 log_err("can't fcntl F_SETFL: %s", strerror(errno));
137 #elif defined(HAVE_IOCTLSOCKET)
138 unsigned long on = 1;
139 if(ioctlsocket(s, FIONBIO, &on) != 0) {
140 log_err("can't ioctlsocket FIONBIO on: %s",
141 wsa_strerror(WSAGetLastError()));
152 if((flag = fcntl(s, F_GETFL)) == -1) {
153 log_err("cannot fcntl F_GETFL: %s", strerror(errno));
157 if(fcntl(s, F_SETFL, flag) == -1) {
158 log_err("cannot fcntl F_SETFL: %s", strerror(errno));
161 #elif defined(HAVE_IOCTLSOCKET)
162 unsigned long off = 0;
163 if(ioctlsocket(s, FIONBIO, &off) != 0) {
164 if(WSAGetLastError() != WSAEINVAL || verbosity >= 4)
165 log_err("can't ioctlsocket FIONBIO off: %s",
166 wsa_strerror(WSAGetLastError()));
175 if(num == 0) return 1;
176 return (num & (num-1)) == 0;
180 memdup(void* data, size_t len)
183 if(!data) return NULL;
184 if(len == 0) return NULL;
187 memcpy(d, data, len);
192 log_addr(enum verbosity_value v, const char* str,
193 struct sockaddr_storage* addr, socklen_t addrlen)
196 const char* family = "unknown";
198 int af = (int)((struct sockaddr_in*)addr)->sin_family;
199 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
203 case AF_INET: family="ip4"; break;
204 case AF_INET6: family="ip6";
205 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
209 (void)inet_ntop(af, sinaddr, dest,
210 (socklen_t)sizeof(dest));
211 verbose(v, "%s local %s", str, dest);
212 return; /* do not continue and try to get port */
215 if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
216 (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
218 dest[sizeof(dest)-1] = 0;
219 port = ntohs(((struct sockaddr_in*)addr)->sin_port);
221 verbose(v, "%s %s %s port %d (len %d)", str, family, dest,
222 (int)port, (int)addrlen);
223 else verbose(v, "%s %s port %d", str, dest, (int)port);
227 extstrtoaddr(const char* str, struct sockaddr_storage* addr,
231 int port = UNBOUND_DNS_PORT;
232 if((s=strchr(str, '@'))) {
233 char buf[MAX_ADDR_STRLEN];
234 if(s-str >= MAX_ADDR_STRLEN) {
237 (void)strlcpy(buf, str, sizeof(buf));
240 if(port == 0 && strcmp(s+1,"0")!=0) {
243 return ipstrtoaddr(buf, port, addr, addrlen);
245 return ipstrtoaddr(str, port, addr, addrlen);
250 ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
257 char buf[MAX_ADDR_STRLEN];
259 struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
260 *addrlen = (socklen_t)sizeof(struct sockaddr_in6);
261 memset(sa, 0, *addrlen);
262 sa->sin6_family = AF_INET6;
263 sa->sin6_port = (in_port_t)htons(p);
264 if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
265 if(s-ip >= MAX_ADDR_STRLEN)
267 (void)strlcpy(buf, ip, sizeof(buf));
269 sa->sin6_scope_id = (uint32_t)atoi(s+1);
272 if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
276 struct sockaddr_in* sa = (struct sockaddr_in*)addr;
277 *addrlen = (socklen_t)sizeof(struct sockaddr_in);
278 memset(sa, 0, *addrlen);
279 sa->sin_family = AF_INET;
280 sa->sin_port = (in_port_t)htons(p);
281 if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
288 int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
289 socklen_t* addrlen, int* net)
293 *net = (str_is_ip6(str)?128:32);
294 if((s=strchr(str, '/'))) {
295 if(atoi(s+1) > *net) {
296 log_err("netblock too large: %s", str);
300 if(*net == 0 && strcmp(s+1, "0") != 0) {
301 log_err("cannot parse netblock: '%s'", str);
304 strlcpy(buf, str, sizeof(buf));
305 s = strchr(buf, '/');
309 if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
310 log_err("cannot parse ip address: '%s'", str);
314 addr_mask(addr, *addrlen, *net);
319 /* RPZ format address dname to network byte order address */
320 static int ipdnametoaddr(uint8_t* dname, size_t dnamelen,
321 struct sockaddr_storage* addr, socklen_t* addrlen, int* af)
324 size_t dnamelabs = dname_count_labels(dname);
332 /* need 1 byte for label length */
337 dname_has_label(dname, dnamelen, (uint8_t*)"\002zz")) {
342 i = (*af == AF_INET) ? 3 : 15;
343 if(*af == AF_INET6) {
344 struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
345 *addrlen = (socklen_t)sizeof(struct sockaddr_in6);
346 memset(sa, 0, *addrlen);
347 sa->sin6_family = AF_INET6;
348 ia = (uint8_t*)&sa->sin6_addr;
350 struct sockaddr_in* sa = (struct sockaddr_in*)addr;
351 *addrlen = (socklen_t)sizeof(struct sockaddr_in);
352 memset(sa, 0, *addrlen);
353 sa->sin_family = AF_INET;
354 ia = (uint8_t*)&sa->sin_addr;
356 while(lablen && i >= 0 && len <= dnamelen) {
357 char buff[LDNS_MAX_LABELLEN+1];
358 uint16_t chunk; /* big enough to not overflow on IPv6 hextet */
359 if((*af == AF_INET && (lablen > 3 || dnamelabs > 6)) ||
360 (*af == AF_INET6 && (lablen > 4 || dnamelabs > 10))) {
363 if(memcmp(dname, "zz", 2) == 0 && *af == AF_INET6) {
364 /* Add one or more 0 labels. Address is initialised at
365 * 0, so just skip the zero part. */
366 int zl = 11 - dnamelabs;
372 memcpy(buff, dname, lablen);
374 chunk = strtol(buff, &e, (*af == AF_INET) ? 10 : 16);
375 if(!e || *e != '\0' || (*af == AF_INET && chunk > 255))
378 log_assert(i < 4 && i >= 0);
379 ia[i] = (uint8_t)chunk;
382 log_assert(i < 16 && i >= 1);
383 /* ia in network byte order */
384 ia[i-1] = (uint8_t)(chunk >> 8);
385 ia[i] = (uint8_t)(chunk & 0x00FF);
394 /* input too short */
399 int netblockdnametoaddr(uint8_t* dname, size_t dnamelen,
400 struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af)
402 char buff[3 /* 3 digit netblock */ + 1];
404 if(dnamelen < 1 || *dname > 3)
405 /* netblock invalid */
409 if(dnamelen < 1 + nlablen)
412 memcpy(buff, dname+1, nlablen);
413 buff[nlablen] = '\0';
415 if(*net == 0 && strcmp(buff, "0") != 0)
419 if(!ipdnametoaddr(dname, dnamelen-1-nlablen, addr, addrlen, af))
421 if((*af == AF_INET6 && *net > 128) || (*af == AF_INET && *net > 32))
426 int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
427 socklen_t* addrlen, char** auth_name)
430 int port = UNBOUND_DNS_PORT;
431 if((s=strchr(str, '@'))) {
432 char buf[MAX_ADDR_STRLEN];
433 size_t len = (size_t)(s-str);
434 char* hash = strchr(s+1, '#');
440 if(len >= MAX_ADDR_STRLEN) {
443 (void)strlcpy(buf, str, sizeof(buf));
447 if(!hash && strcmp(s+1,"0")!=0)
449 if(hash && strncmp(s+1,"0#",2)!=0)
452 return ipstrtoaddr(buf, port, addr, addrlen);
454 if((s=strchr(str, '#'))) {
455 char buf[MAX_ADDR_STRLEN];
456 size_t len = (size_t)(s-str);
457 if(len >= MAX_ADDR_STRLEN) {
460 (void)strlcpy(buf, str, sizeof(buf));
462 port = UNBOUND_DNS_OVER_TLS_PORT;
464 return ipstrtoaddr(buf, port, addr, addrlen);
467 return ipstrtoaddr(str, port, addr, addrlen);
470 /** store port number into sockaddr structure */
472 sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
474 if(addr_is_ip6(addr, addrlen)) {
475 struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
476 sa->sin6_port = (in_port_t)htons((uint16_t)port);
478 struct sockaddr_in* sa = (struct sockaddr_in*)addr;
479 sa->sin_port = (in_port_t)htons((uint16_t)port);
484 log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
485 uint16_t type, uint16_t dclass)
487 char buf[LDNS_MAX_DOMAINLEN+1];
492 dname_str(name, buf);
493 if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
494 else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
495 else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
496 else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
497 else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
498 else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
499 else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
500 ts = sldns_rr_descript(type)->_name;
502 snprintf(t, sizeof(t), "TYPE%d", (int)type);
505 if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
506 sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
507 cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
509 snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
512 log_info("%s %s %s %s", str, buf, ts, cs);
516 log_query_in(const char* str, uint8_t* name, uint16_t type, uint16_t dclass)
518 char buf[LDNS_MAX_DOMAINLEN+1];
521 dname_str(name, buf);
522 if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
523 else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
524 else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
525 else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
526 else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
527 else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
528 else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
529 ts = sldns_rr_descript(type)->_name;
531 snprintf(t, sizeof(t), "TYPE%d", (int)type);
534 if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
535 sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
536 cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
538 snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
541 if(LOG_TAG_QUERYREPLY)
542 log_query("%s %s %s %s", str, buf, ts, cs);
543 else log_info("%s %s %s %s", str, buf, ts, cs);
546 void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
547 struct sockaddr_storage* addr, socklen_t addrlen)
550 const char* family = "unknown_family ";
551 char namebuf[LDNS_MAX_DOMAINLEN+1];
553 int af = (int)((struct sockaddr_in*)addr)->sin_family;
554 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
558 case AF_INET: family=""; break;
559 case AF_INET6: family="";
560 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
562 case AF_LOCAL: family="local "; break;
565 if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
566 (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
568 dest[sizeof(dest)-1] = 0;
569 port = ntohs(((struct sockaddr_in*)addr)->sin_port);
570 dname_str(zone, namebuf);
571 if(af != AF_INET && af != AF_INET6)
572 verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
573 str, namebuf, family, dest, (int)port, (int)addrlen);
574 else verbose(v, "%s <%s> %s%s#%d",
575 str, namebuf, family, dest, (int)port);
578 void log_err_addr(const char* str, const char* err,
579 struct sockaddr_storage* addr, socklen_t addrlen)
583 int af = (int)((struct sockaddr_in*)addr)->sin_family;
584 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
586 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
587 if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
588 (void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
590 dest[sizeof(dest)-1] = 0;
591 port = ntohs(((struct sockaddr_in*)addr)->sin_port);
593 log_err("%s: %s for %s port %d (len %d)", str, err, dest,
594 (int)port, (int)addrlen);
595 else log_err("%s: %s for %s port %d", str, err, dest, (int)port);
599 sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
600 struct sockaddr_storage* addr2, socklen_t len2)
602 struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
603 struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
604 struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
605 struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
610 log_assert(len1 == len2);
611 if( p1_in->sin_family < p2_in->sin_family)
613 if( p1_in->sin_family > p2_in->sin_family)
615 log_assert( p1_in->sin_family == p2_in->sin_family );
617 if( p1_in->sin_family == AF_INET ) {
618 /* just order it, ntohs not required */
619 if(p1_in->sin_port < p2_in->sin_port)
621 if(p1_in->sin_port > p2_in->sin_port)
623 log_assert(p1_in->sin_port == p2_in->sin_port);
624 return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
625 } else if (p1_in6->sin6_family == AF_INET6) {
626 /* just order it, ntohs not required */
627 if(p1_in6->sin6_port < p2_in6->sin6_port)
629 if(p1_in6->sin6_port > p2_in6->sin6_port)
631 log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
632 return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
635 /* eek unknown type, perform this comparison for sanity. */
636 return memcmp(addr1, addr2, len1);
641 sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
642 struct sockaddr_storage* addr2, socklen_t len2)
644 struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
645 struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
646 struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
647 struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
652 log_assert(len1 == len2);
653 if( p1_in->sin_family < p2_in->sin_family)
655 if( p1_in->sin_family > p2_in->sin_family)
657 log_assert( p1_in->sin_family == p2_in->sin_family );
659 if( p1_in->sin_family == AF_INET ) {
660 return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
661 } else if (p1_in6->sin6_family == AF_INET6) {
662 return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
665 /* eek unknown type, perform this comparison for sanity. */
666 return memcmp(addr1, addr2, len1);
671 addr_is_ip6(struct sockaddr_storage* addr, socklen_t len)
673 if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
674 ((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
680 addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
682 uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
685 if(addr_is_ip6(addr, len)) {
686 s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
689 s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
694 for(i=net/8+1; i<max/8; i++) {
697 s[net/8] &= mask[net&0x7];
701 addr_in_common(struct sockaddr_storage* addr1, int net1,
702 struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
704 int min = (net1<net2)?net1:net2;
708 if(addr_is_ip6(addr1, addrlen)) {
709 s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
710 s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
713 s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
714 s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
717 /* match = bits_in_common(s1, s2, to); */
718 for(i=0; i<to; i++) {
722 uint8_t z = s1[i]^s2[i];
731 if(match > min) match = min;
736 addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
737 char* buf, size_t len)
739 int af = (int)((struct sockaddr_in*)addr)->sin_family;
740 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
741 if(addr_is_ip6(addr, addrlen))
742 sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
743 if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
744 snprintf(buf, len, "(inet_ntop_error)");
749 addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
751 /* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
752 const uint8_t map_prefix[16] =
753 {0,0,0,0, 0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
755 if(!addr_is_ip6(addr, addrlen))
757 /* s is 16 octet ipv6 address string */
758 s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
759 return (memcmp(s, map_prefix, 12) == 0);
762 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
764 int af = (int)((struct sockaddr_in*)addr)->sin_family;
765 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
766 return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
767 && memcmp(sinaddr, "\377\377\377\377", 4) == 0;
770 int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
772 int af = (int)((struct sockaddr_in*)addr)->sin_family;
773 void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
774 void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
775 if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
776 && memcmp(sinaddr, "\000\000\000\000", 4) == 0)
778 else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
779 && memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
780 "\000\000\000\000\000\000\000\000", 16) == 0)
785 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
786 socklen_t len, struct regional* region)
788 struct sock_list* add = (struct sock_list*)regional_alloc(region,
789 sizeof(*add) - sizeof(add->addr) + (size_t)len);
791 log_err("out of memory in socketlist insert");
798 if(len) memmove(&add->addr, addr, len);
801 void sock_list_prepend(struct sock_list** list, struct sock_list* add)
803 struct sock_list* last = add;
812 int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
816 if(len == list->len) {
817 if(len == 0 || sockaddr_cmp_addr(addr, len,
818 &list->addr, list->len) == 0)
826 void sock_list_merge(struct sock_list** list, struct regional* region,
827 struct sock_list* add)
830 for(p=add; p; p=p->next) {
831 if(!sock_list_find(*list, &p->addr, p->len))
832 sock_list_insert(list, &p->addr, p->len, region);
837 log_crypto_err(const char* str)
840 log_crypto_err_code(str, ERR_get_error());
843 #endif /* HAVE_SSL */
846 void log_crypto_err_code(const char* str, unsigned long err)
849 /* error:[error code]:[library name]:[function name]:[reason string] */
852 ERR_error_string_n(err, buf, sizeof(buf));
853 log_err("%s crypto %s", str, buf);
854 while( (e=ERR_get_error()) ) {
855 ERR_error_string_n(e, buf, sizeof(buf));
856 log_err("and additionally crypto %s", buf);
861 #endif /* HAVE_SSL */
865 /** log certificate details */
867 log_cert(unsigned level, const char* str, void* cert)
873 if(verbosity < level) return;
874 bio = BIO_new(BIO_s_mem());
876 X509_print_ex(bio, (X509*)cert, 0, (unsigned long)-1
877 ^(X509_FLAG_NO_SUBJECT
878 |X509_FLAG_NO_ISSUER|X509_FLAG_NO_VALIDITY
879 |X509_FLAG_NO_EXTENSIONS|X509_FLAG_NO_AUX
880 |X509_FLAG_NO_ATTRIBUTES));
881 BIO_write(bio, &nul, (int)sizeof(nul));
882 len = BIO_get_mem_data(bio, &pp);
884 verbose(level, "%s: \n%s", str, pp);
888 #endif /* HAVE_SSL */
890 #if defined(HAVE_SSL) && defined(HAVE_NGHTTP2)
891 static int alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
892 unsigned char* outlen, const unsigned char* in, unsigned int inlen,
893 void* ATTR_UNUSED(arg))
895 int rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in,
898 return SSL_TLSEXT_ERR_NOACK;
900 /* either http/1.1 or h2 selected */
901 return SSL_TLSEXT_ERR_OK;
906 listen_sslctx_setup(void* ctxt)
909 SSL_CTX* ctx = (SSL_CTX*)ctxt;
910 /* no SSLv2, SSLv3 because has defects */
911 #if SSL_OP_NO_SSLv2 != 0
912 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
914 log_crypto_err("could not set SSL_OP_NO_SSLv2");
918 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
920 log_crypto_err("could not set SSL_OP_NO_SSLv3");
923 #if defined(SSL_OP_NO_TLSv1) && defined(SSL_OP_NO_TLSv1_1)
924 /* if we have tls 1.1 disable 1.0 */
925 if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1) & SSL_OP_NO_TLSv1)
927 log_crypto_err("could not set SSL_OP_NO_TLSv1");
931 #if defined(SSL_OP_NO_TLSv1_1) && defined(SSL_OP_NO_TLSv1_2)
932 /* if we have tls 1.2 disable 1.1 */
933 if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1) & SSL_OP_NO_TLSv1_1)
934 != SSL_OP_NO_TLSv1_1){
935 log_crypto_err("could not set SSL_OP_NO_TLSv1_1");
939 #if defined(SSL_OP_NO_RENEGOTIATION)
940 /* disable client renegotiation */
941 if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
942 SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
943 log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
947 #if defined(SHA256_DIGEST_LENGTH) && defined(USE_ECDSA)
948 /* if we have sha256, set the cipher list to have no known vulns */
949 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"))
950 log_crypto_err("could not set cipher list with SSL_CTX_set_cipher_list");
953 if((SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE) &
954 SSL_OP_CIPHER_SERVER_PREFERENCE) !=
955 SSL_OP_CIPHER_SERVER_PREFERENCE) {
956 log_crypto_err("could not set SSL_OP_CIPHER_SERVER_PREFERENCE");
960 #ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
961 SSL_CTX_set_security_level(ctx, 0);
963 #if defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB) && defined(HAVE_NGHTTP2)
964 SSL_CTX_set_alpn_select_cb(ctx, alpn_select_cb, NULL);
968 #endif /* HAVE_SSL */
973 listen_sslctx_setup_2(void* ctxt)
976 SSL_CTX* ctx = (SSL_CTX*)ctxt;
978 #if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
979 if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
980 log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
982 #elif defined(USE_ECDSA)
984 EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
986 log_crypto_err("could not find p256, not enabling ECDHE");
988 if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
989 log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
997 #endif /* HAVE_SSL */
1000 void* listen_sslctx_create(char* key, char* pem, char* verifypem)
1003 SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
1005 log_crypto_err("could not SSL_CTX_new");
1008 if(!key || key[0] == 0) {
1009 log_err("error: no tls-service-key file specified");
1013 if(!pem || pem[0] == 0) {
1014 log_err("error: no tls-service-pem file specified");
1018 if(!listen_sslctx_setup(ctx)) {
1022 if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1023 log_err("error for cert file: %s", pem);
1024 log_crypto_err("error in SSL_CTX use_certificate_chain_file");
1028 if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1029 log_err("error for private key file: %s", key);
1030 log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
1034 if(!SSL_CTX_check_private_key(ctx)) {
1035 log_err("error for key file: %s", key);
1036 log_crypto_err("Error in SSL_CTX check_private_key");
1040 listen_sslctx_setup_2(ctx);
1041 if(verifypem && verifypem[0]) {
1042 if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1043 log_crypto_err("Error in SSL_CTX verify locations");
1047 SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
1049 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
1053 (void)key; (void)pem; (void)verifypem;
1059 /* For windows, the CA trust store is not read by openssl.
1060 Add code to open the trust store using wincrypt API and add
1061 the root certs into openssl trust store */
1063 add_WIN_cacerts_to_openssl_store(SSL_CTX* tls_ctx)
1065 HCERTSTORE hSystemStore;
1066 PCCERT_CONTEXT pTargetCert = NULL;
1069 verbose(VERB_ALGO, "Adding Windows certificates from system root store to CA store");
1071 /* load just once per context lifetime for this version
1072 TODO: dynamically update CA trust changes as they are available */
1076 /* Call wincrypt's CertOpenStore to open the CA root store. */
1078 if ((hSystemStore = CertOpenStore(
1079 CERT_STORE_PROV_SYSTEM,
1082 /* NOTE: mingw does not have this const: replace with 1 << 16 from code
1083 CERT_SYSTEM_STORE_CURRENT_USER, */
1090 store = SSL_CTX_get_cert_store(tls_ctx);
1094 /* failure if the CA store is empty or the call fails */
1095 if ((pTargetCert = CertEnumCertificatesInStore(
1096 hSystemStore, pTargetCert)) == 0) {
1097 verbose(VERB_ALGO, "CA certificate store for Windows is empty.");
1100 /* iterate over the windows cert store and add to openssl store */
1103 X509 *cert1 = d2i_X509(NULL,
1104 (const unsigned char **)&pTargetCert->pbCertEncoded,
1105 pTargetCert->cbCertEncoded);
1107 /* return error if a cert fails */
1108 verbose(VERB_ALGO, "%s %d:%s",
1109 "Unable to parse certificate in memory",
1110 (int)ERR_get_error(), ERR_error_string(ERR_get_error(), NULL));
1114 /* return error if a cert add to store fails */
1115 if (X509_STORE_add_cert(store, cert1) == 0) {
1116 unsigned long error = ERR_peek_last_error();
1118 /* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
1119 * certificate is already in the store. */
1120 if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
1121 ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
1122 verbose(VERB_ALGO, "%s %d:%s\n",
1123 "Error adding certificate", (int)ERR_get_error(),
1124 ERR_error_string(ERR_get_error(), NULL));
1131 } while ((pTargetCert = CertEnumCertificatesInStore(
1132 hSystemStore, pTargetCert)) != 0);
1134 /* Clean up memory and quit. */
1136 CertFreeCertificateContext(pTargetCert);
1139 if (!CertCloseStore(
1143 verbose(VERB_ALGO, "Completed adding Windows certificates to CA store successfully");
1146 #endif /* USE_WINSOCK */
1148 void* connect_sslctx_create(char* key, char* pem, char* verifypem, int wincert)
1151 SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1153 log_crypto_err("could not allocate SSL_CTX pointer");
1156 #if SSL_OP_NO_SSLv2 != 0
1157 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1158 != SSL_OP_NO_SSLv2) {
1159 log_crypto_err("could not set SSL_OP_NO_SSLv2");
1164 if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1165 != SSL_OP_NO_SSLv3) {
1166 log_crypto_err("could not set SSL_OP_NO_SSLv3");
1170 #if defined(SSL_OP_NO_RENEGOTIATION)
1171 /* disable client renegotiation */
1172 if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1173 SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1174 log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1179 if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1180 log_err("error in client certificate %s", pem);
1181 log_crypto_err("error in certificate file");
1185 if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1186 log_err("error in client private key %s", key);
1187 log_crypto_err("error in key file");
1191 if(!SSL_CTX_check_private_key(ctx)) {
1192 log_err("error in client key %s", key);
1193 log_crypto_err("error in SSL_CTX_check_private_key");
1198 if((verifypem && verifypem[0]) || wincert) {
1199 if(verifypem && verifypem[0]) {
1200 if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1201 log_crypto_err("error in SSL_CTX verify");
1208 if(!add_WIN_cacerts_to_openssl_store(ctx)) {
1209 log_crypto_err("error in add_WIN_cacerts_to_openssl_store");
1217 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
1221 (void)key; (void)pem; (void)verifypem; (void)wincert;
1226 void* incoming_ssl_fd(void* sslctx, int fd)
1229 SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1231 log_crypto_err("could not SSL_new");
1234 SSL_set_accept_state(ssl);
1235 (void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1236 if(!SSL_set_fd(ssl, fd)) {
1237 log_crypto_err("could not SSL_set_fd");
1243 (void)sslctx; (void)fd;
1248 void* outgoing_ssl_fd(void* sslctx, int fd)
1251 SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1253 log_crypto_err("could not SSL_new");
1256 SSL_set_connect_state(ssl);
1257 (void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1258 if(!SSL_set_fd(ssl, fd)) {
1259 log_crypto_err("could not SSL_set_fd");
1265 (void)sslctx; (void)fd;
1270 int check_auth_name_for_ssl(char* auth_name)
1272 if(!auth_name) return 1;
1273 #if defined(HAVE_SSL) && !defined(HAVE_SSL_SET1_HOST) && !defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1274 log_err("the query has an auth_name %s, but libssl has no call to "
1275 "perform TLS authentication. Remove that name from config "
1276 "or upgrade the ssl crypto library.", auth_name);
1283 /** set the authname on an SSL structure, SSL* ssl */
1284 int set_auth_name_on_ssl(void* ssl, char* auth_name, int use_sni)
1286 if(!auth_name) return 1;
1289 (void)SSL_set_tlsext_host_name(ssl, auth_name);
1295 #ifdef HAVE_SSL_SET1_HOST
1296 SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1297 /* setting the hostname makes openssl verify the
1298 * host name in the x509 certificate in the
1300 if(!SSL_set1_host(ssl, auth_name)) {
1301 log_err("SSL_set1_host failed");
1304 #elif defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1305 /* openssl 1.0.2 has this function that can be used for
1306 * set1_host like verification */
1308 X509_VERIFY_PARAM* param = SSL_get0_param(ssl);
1309 # ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
1310 X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1312 if(!X509_VERIFY_PARAM_set1_host(param, auth_name, strlen(auth_name))) {
1313 log_err("X509_VERIFY_PARAM_set1_host failed");
1316 SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1319 verbose(VERB_ALGO, "the query has an auth_name, but libssl has no call to perform TLS authentication");
1320 #endif /* HAVE_SSL_SET1_HOST */
1324 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1325 /** global lock list for openssl locks */
1326 static lock_basic_type *ub_openssl_locks = NULL;
1328 /** callback that gets thread id for openssl */
1329 #ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1331 ub_crypto_id_cb(CRYPTO_THREADID *id)
1333 CRYPTO_THREADID_set_numeric(id, (unsigned long)log_thread_get());
1336 static unsigned long
1337 ub_crypto_id_cb(void)
1339 return (unsigned long)log_thread_get();
1344 ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
1345 int ATTR_UNUSED(line))
1347 if((mode&CRYPTO_LOCK)) {
1348 lock_basic_lock(&ub_openssl_locks[type]);
1350 lock_basic_unlock(&ub_openssl_locks[type]);
1353 #endif /* OPENSSL_THREADS */
1355 int ub_openssl_lock_init(void)
1357 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1359 ub_openssl_locks = (lock_basic_type*)reallocarray(
1360 NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
1361 if(!ub_openssl_locks)
1363 for(i=0; i<CRYPTO_num_locks(); i++) {
1364 lock_basic_init(&ub_openssl_locks[i]);
1366 # ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1367 CRYPTO_THREADID_set_callback(&ub_crypto_id_cb);
1369 CRYPTO_set_id_callback(&ub_crypto_id_cb);
1371 CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
1372 #endif /* OPENSSL_THREADS */
1376 void ub_openssl_lock_delete(void)
1378 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1380 if(!ub_openssl_locks)
1382 # ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1383 CRYPTO_THREADID_set_callback(NULL);
1385 CRYPTO_set_id_callback(NULL);
1387 CRYPTO_set_locking_callback(NULL);
1388 for(i=0; i<CRYPTO_num_locks(); i++) {
1389 lock_basic_destroy(&ub_openssl_locks[i]);
1391 free(ub_openssl_locks);
1392 #endif /* OPENSSL_THREADS */
1395 int listen_sslctx_setup_ticket_keys(void* sslctx, struct config_strlist* tls_session_ticket_keys) {
1398 struct config_strlist* p;
1399 struct tls_session_ticket_key *keys;
1400 for(p = tls_session_ticket_keys; p; p = p->next) {
1403 keys = calloc(s, sizeof(struct tls_session_ticket_key));
1406 memset(keys, 0, s*sizeof(*keys));
1409 for(p = tls_session_ticket_keys; p; p = p->next) {
1411 unsigned char *data;
1414 data = (unsigned char *)malloc(80);
1418 f = fopen(p->str, "rb");
1420 log_err("could not read tls-session-ticket-key %s: %s", p->str, strerror(errno));
1424 n = fread(data, 1, 80, f);
1428 log_err("tls-session-ticket-key %s is %d bytes, must be 80 bytes", p->str, (int)n);
1432 verbose(VERB_OPS, "read tls-session-ticket-key: %s", p->str);
1434 keys->key_name = data;
1435 keys->aes_key = data + 16;
1436 keys->hmac_key = data + 48;
1439 /* terminate array with NULL key name entry */
1440 keys->key_name = NULL;
1441 # ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1442 if(SSL_CTX_set_tlsext_ticket_key_evp_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1443 log_err("no support for TLS session ticket");
1447 if(SSL_CTX_set_tlsext_ticket_key_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1448 log_err("no support for TLS session ticket");
1455 (void)tls_session_ticket_keys;
1462 int tls_session_ticket_key_cb(SSL *ATTR_UNUSED(sslctx), unsigned char* key_name,
1463 unsigned char* iv, EVP_CIPHER_CTX *evp_sctx,
1464 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1465 EVP_MAC_CTX *hmac_ctx,
1472 # ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1473 OSSL_PARAM params[3];
1475 const EVP_MD *digest;
1477 const EVP_CIPHER *cipher;
1478 int evp_cipher_length;
1479 # ifndef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1480 digest = EVP_sha256();
1482 cipher = EVP_aes_256_cbc();
1483 evp_cipher_length = EVP_CIPHER_iv_length(cipher);
1486 verbose(VERB_CLIENT, "start session encrypt");
1487 memcpy(key_name, ticket_keys->key_name, 16);
1488 if (RAND_bytes(iv, evp_cipher_length) != 1) {
1489 verbose(VERB_CLIENT, "RAND_bytes failed");
1492 if (EVP_EncryptInit_ex(evp_sctx, cipher, NULL, ticket_keys->aes_key, iv) != 1) {
1493 verbose(VERB_CLIENT, "EVP_EncryptInit_ex failed");
1496 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1497 params[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1498 ticket_keys->hmac_key, 32);
1499 params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1501 params[2] = OSSL_PARAM_construct_end();
1502 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1503 EVP_MAC_CTX_set_params(hmac_ctx, params);
1505 EVP_MAC_set_ctx_params(hmac_ctx, params);
1507 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1508 if (HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL) != 1) {
1509 verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1513 HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL);
1516 } else if (enc == 0) {
1518 struct tls_session_ticket_key *key;
1519 verbose(VERB_CLIENT, "start session decrypt");
1520 for(key = ticket_keys; key->key_name != NULL; key++) {
1521 if (!memcmp(key_name, key->key_name, 16)) {
1522 verbose(VERB_CLIENT, "Found session_key");
1526 if(key->key_name == NULL) {
1527 verbose(VERB_CLIENT, "Not found session_key");
1531 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1532 params[0] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
1534 params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1536 params[2] = OSSL_PARAM_construct_end();
1537 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1538 EVP_MAC_CTX_set_params(hmac_ctx, params);
1540 EVP_MAC_set_ctx_params(hmac_ctx, params);
1542 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1543 if (HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL) != 1) {
1544 verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1548 HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL);
1550 if (EVP_DecryptInit_ex(evp_sctx, cipher, NULL, key->aes_key, iv) != 1) {
1551 log_err("EVP_DecryptInit_ex failed");
1555 return (key == ticket_keys) ? 1 : 2;
1567 #endif /* HAVE_SSL */
1570 listen_sslctx_delete_ticket_keys(void)
1572 struct tls_session_ticket_key *key;
1573 if(!ticket_keys) return;
1574 for(key = ticket_keys; key->key_name != NULL; key++) {
1575 /* wipe key data from memory*/
1576 #ifdef HAVE_EXPLICIT_BZERO
1577 explicit_bzero(key->key_name, 80);
1579 memset(key->key_name, 0xdd, 80);
1581 free(key->key_name);
1587 # ifndef USE_WINSOCK
1589 sock_strerror(int errn)
1591 return strerror(errn);
1595 sock_close(int socket)
1602 sock_strerror(int ATTR_UNUSED(errn))
1604 return wsa_strerror(WSAGetLastError());
1608 sock_close(int socket)
1610 closesocket(socket);
1613 # endif /* USE_WINSOCK */