xref: /freebsd/contrib/unbound/util/net_help.c (revision 7a789145f88a6aceacc59029a0cafe7de7aeefea)
1 /*
2  * util/net_help.c - implementation of the network helper code
3  *
4  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5  *
6  * This software is open source.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
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.
18  *
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.
22  *
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.
34  */
35 /**
36  * \file
37  * Implementation of net_help.h.
38  */
39 
40 #include "config.h"
41 #ifdef HAVE_SYS_TYPES_H
42 #  include <sys/types.h>
43 #endif
44 #ifdef HAVE_NET_IF_H
45 #include <net/if.h>
46 #endif
47 #ifdef HAVE_NETIOAPI_H
48 #include <netioapi.h>
49 #endif
50 #include <ctype.h>
51 #include "util/net_help.h"
52 #include "util/log.h"
53 #include "util/data/dname.h"
54 #include "util/module.h"
55 #include "util/regional.h"
56 #include "util/config_file.h"
57 #include "sldns/parseutil.h"
58 #include "sldns/wire2str.h"
59 #include "sldns/str2wire.h"
60 #include <fcntl.h>
61 #ifdef HAVE_OPENSSL_SSL_H
62 #include <openssl/ssl.h>
63 #include <openssl/evp.h>
64 #include <openssl/rand.h>
65 #endif
66 #ifdef HAVE_OPENSSL_ERR_H
67 #include <openssl/err.h>
68 #endif
69 #ifdef HAVE_OPENSSL_CORE_NAMES_H
70 #include <openssl/core_names.h>
71 #endif
72 #ifdef USE_WINSOCK
73 #include <wincrypt.h>
74 #endif
75 #ifdef HAVE_NGHTTP2_NGHTTP2_H
76 #include <nghttp2/nghttp2.h>
77 #endif
78 
79 /** max length of an IP address (the address portion) that we allow */
80 #define MAX_ADDR_STRLEN 128 /* characters */
81 /** max length of a hostname (with port and tls name) that we allow */
82 #define MAX_HOST_STRLEN (LDNS_MAX_DOMAINLEN * 3) /* characters */
83 /** default value for EDNS ADVERTISED size */
84 uint16_t EDNS_ADVERTISED_SIZE = 4096;
85 
86 /** minimal responses when positive answer: default is no */
87 int MINIMAL_RESPONSES = 0;
88 
89 /** rrset order roundrobin: default is yes */
90 int RRSET_ROUNDROBIN = 1;
91 
92 /** log tag queries with name instead of 'info' for filtering */
93 int LOG_TAG_QUERYREPLY = 0;
94 
95 #ifdef HAVE_SSL
96 static struct tls_session_ticket_key {
97 	unsigned char *key_name;
98 	unsigned char *aes_key;
99 	unsigned char *hmac_key;
100 } *ticket_keys;
101 #endif /* HAVE_SSL */
102 
103 #ifdef HAVE_SSL
104 /**
105  * callback TLS session ticket encrypt and decrypt
106  * For use with SSL_CTX_set_tlsext_ticket_key_cb or
107  * SSL_CTX_set_tlsext_ticket_key_evp_cb
108  * @param s: the SSL_CTX to use (from connect_sslctx_create())
109  * @param key_name: secret name, 16 bytes
110  * @param iv: up to EVP_MAX_IV_LENGTH.
111  * @param evp_ctx: the evp cipher context, function sets this.
112  * @param hmac_ctx: the hmac context, function sets this.
113  * 	with ..key_cb it is of type HMAC_CTX*
114  * 	with ..key_evp_cb it is of type EVP_MAC_CTX*
115  * @param enc: 1 is encrypt, 0 is decrypt
116  * @return 0 on no ticket, 1 for okay, and 2 for okay but renew the ticket
117  * 	(the ticket is decrypt only). and <0 for failures.
118  */
119 int tls_session_ticket_key_cb(SSL *s, unsigned char* key_name,
120 	unsigned char* iv, EVP_CIPHER_CTX *evp_ctx,
121 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
122 	EVP_MAC_CTX *hmac_ctx,
123 #else
124 	HMAC_CTX* hmac_ctx,
125 #endif
126 	int enc);
127 #endif /* HAVE_SSL */
128 
129 /* returns true is string addr is an ip6 specced address */
130 int
str_is_ip6(const char * str)131 str_is_ip6(const char* str)
132 {
133 	if(strchr(str, ':'))
134 		return 1;
135 	else    return 0;
136 }
137 
138 int
fd_set_nonblock(int s)139 fd_set_nonblock(int s)
140 {
141 #ifdef HAVE_FCNTL
142 	int flag;
143 	if((flag = fcntl(s, F_GETFL)) == -1) {
144 		log_err("can't fcntl F_GETFL: %s", strerror(errno));
145 		flag = 0;
146 	}
147 	flag |= O_NONBLOCK;
148 	if(fcntl(s, F_SETFL, flag) == -1) {
149 		log_err("can't fcntl F_SETFL: %s", strerror(errno));
150 		return 0;
151 	}
152 #elif defined(HAVE_IOCTLSOCKET)
153 	unsigned long on = 1;
154 	if(ioctlsocket(s, FIONBIO, &on) != 0) {
155 		log_err("can't ioctlsocket FIONBIO on: %s",
156 			wsa_strerror(WSAGetLastError()));
157 	}
158 #endif
159 	return 1;
160 }
161 
162 int
fd_set_block(int s)163 fd_set_block(int s)
164 {
165 #ifdef HAVE_FCNTL
166 	int flag;
167 	if((flag = fcntl(s, F_GETFL)) == -1) {
168 		log_err("cannot fcntl F_GETFL: %s", strerror(errno));
169 		flag = 0;
170 	}
171 	flag &= ~O_NONBLOCK;
172 	if(fcntl(s, F_SETFL, flag) == -1) {
173 		log_err("cannot fcntl F_SETFL: %s", strerror(errno));
174 		return 0;
175 	}
176 #elif defined(HAVE_IOCTLSOCKET)
177 	unsigned long off = 0;
178 	if(ioctlsocket(s, FIONBIO, &off) != 0) {
179 		if(WSAGetLastError() != WSAEINVAL || verbosity >= 4)
180 			log_err("can't ioctlsocket FIONBIO off: %s",
181 				wsa_strerror(WSAGetLastError()));
182 	}
183 #endif
184 	return 1;
185 }
186 
187 int
is_pow2(size_t num)188 is_pow2(size_t num)
189 {
190 	if(num == 0) return 1;
191 	return (num & (num-1)) == 0;
192 }
193 
194 void*
memdup(void * data,size_t len)195 memdup(void* data, size_t len)
196 {
197 	void* d;
198 	if(!data) return NULL;
199 	if(len == 0) return NULL;
200 	d = malloc(len);
201 	if(!d) return NULL;
202 	memcpy(d, data, len);
203 	return d;
204 }
205 
206 void
log_addr(enum verbosity_value v,const char * str,struct sockaddr_storage * addr,socklen_t addrlen)207 log_addr(enum verbosity_value v, const char* str,
208 	struct sockaddr_storage* addr, socklen_t addrlen)
209 {
210 	uint16_t port;
211 	const char* family = "unknown";
212 	char dest[100];
213 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
214 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
215 	if(verbosity < v)
216 		return;
217 	switch(af) {
218 		case AF_INET: family="ip4"; break;
219 		case AF_INET6: family="ip6";
220 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
221 			break;
222 		case AF_LOCAL:
223 			dest[0]=0;
224 			(void)inet_ntop(af, sinaddr, dest,
225 				(socklen_t)sizeof(dest));
226 			verbose(v, "%s local %s", str, dest);
227 			return; /* do not continue and try to get port */
228 		default: break;
229 	}
230 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
231 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
232 	}
233 	dest[sizeof(dest)-1] = 0;
234 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
235 	if(verbosity >= 4)
236 		verbose(v, "%s %s %s port %d (len %d)", str, family, dest,
237 			(int)port, (int)addrlen);
238 	else	verbose(v, "%s %s port %d", str, dest, (int)port);
239 }
240 
241 int
extstrtoaddr(const char * str,struct sockaddr_storage * addr,socklen_t * addrlen,int port)242 extstrtoaddr(const char* str, struct sockaddr_storage* addr,
243 	socklen_t* addrlen, int port)
244 {
245 	const char* s;
246 	if((s=strchr(str, '@'))) {
247 		char buf[MAX_ADDR_STRLEN];
248 		if(s-str >= MAX_ADDR_STRLEN) {
249 			return 0;
250 		}
251 		(void)strlcpy(buf, str, sizeof(buf));
252 		buf[s-str] = 0;
253 		port = atoi(s+1);
254 		if(port == 0 && strcmp(s+1,"0")!=0) {
255 			return 0;
256 		}
257 		return ipstrtoaddr(buf, port, addr, addrlen);
258 	}
259 	return ipstrtoaddr(str, port, addr, addrlen);
260 }
261 
262 int
ipstrtoaddr(const char * ip,int port,struct sockaddr_storage * addr,socklen_t * addrlen)263 ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
264 	socklen_t* addrlen)
265 {
266 	uint16_t p;
267 	if(!ip) return 0;
268 	p = (uint16_t) port;
269 	if(str_is_ip6(ip)) {
270 		char buf[MAX_ADDR_STRLEN];
271 		const char* s;
272 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
273 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
274 		memset(sa, 0, *addrlen);
275 		sa->sin6_family = AF_INET6;
276 		sa->sin6_port = (in_port_t)htons(p);
277 		if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
278 			if(s-ip >= MAX_ADDR_STRLEN)
279 				return 0;
280 			(void)strlcpy(buf, ip, sizeof(buf));
281 			buf[s-ip]=0;
282 #ifdef HAVE_IF_NAMETOINDEX
283 			if (!(sa->sin6_scope_id = if_nametoindex(s+1)))
284 #endif /* HAVE_IF_NAMETOINDEX */
285 				sa->sin6_scope_id = (uint32_t)atoi(s+1);
286 			ip = buf;
287 		}
288 		if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
289 			return 0;
290 		}
291 	} else { /* ip4 */
292 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
293 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
294 		memset(sa, 0, *addrlen);
295 		sa->sin_family = AF_INET;
296 		sa->sin_port = (in_port_t)htons(p);
297 		if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
298 			return 0;
299 		}
300 	}
301 	return 1;
302 }
303 
netblockstrtoaddr(const char * str,int port,struct sockaddr_storage * addr,socklen_t * addrlen,int * net)304 int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
305         socklen_t* addrlen, int* net)
306 {
307 	const char* s;
308 	char buf[64];
309 	char* b = NULL;
310 	*net = (str_is_ip6(str)?128:32);
311 	if((s=strchr(str, '/'))) {
312 		if(atoi(s+1) > *net) {
313 			log_err("netblock too large: %s", str);
314 			return 0;
315 		}
316 		*net = atoi(s+1);
317 		if(*net == 0 && strcmp(s+1, "0") != 0) {
318 			log_err("cannot parse netblock: '%s'", str);
319 			return 0;
320 		}
321 		if(*net < 0) {
322 			log_err("netblock value %d is negative in: '%s'",
323 				*net, str);
324 			return 0;
325 		}
326 		strlcpy(buf, str, sizeof(buf));
327 		b = strchr(buf, '/');
328 		if(b) *b = 0;
329 		b = buf;
330 	}
331 	if(!ipstrtoaddr(b?b:str, port, addr, addrlen)) {
332 		log_err("cannot parse ip address: '%s'", str);
333 		return 0;
334 	}
335 	if(b) {
336 		addr_mask(addr, *addrlen, *net);
337 	}
338 	return 1;
339 }
340 
341 /* RPZ format address dname to network byte order address */
ipdnametoaddr(uint8_t * dname,size_t dnamelen,struct sockaddr_storage * addr,socklen_t * addrlen,int * af)342 static int ipdnametoaddr(uint8_t* dname, size_t dnamelen,
343 	struct sockaddr_storage* addr, socklen_t* addrlen, int* af)
344 {
345 	uint8_t* ia;
346 	int dnamelabs = dname_count_labels(dname);
347 	uint8_t lablen;
348 	char* e = NULL;
349 	int z = 0;
350 	size_t len = 0;
351 	int i;
352 	*af = AF_INET;
353 
354 	/* need 1 byte for label length */
355 	if(dnamelen < 1)
356 		return 0;
357 
358 	if(dnamelabs > 6 ||
359 		dname_has_label(dname, dnamelen, (uint8_t*)"\002zz")) {
360 		*af = AF_INET6;
361 	}
362 	len = *dname;
363 	lablen = *dname++;
364 	i = (*af == AF_INET) ? 3 : 15;
365 	if(*af == AF_INET6) {
366 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
367 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
368 		memset(sa, 0, *addrlen);
369 		sa->sin6_family = AF_INET6;
370 		ia = (uint8_t*)&sa->sin6_addr;
371 	} else { /* ip4 */
372 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
373 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
374 		memset(sa, 0, *addrlen);
375 		sa->sin_family = AF_INET;
376 		ia = (uint8_t*)&sa->sin_addr;
377 	}
378 	while(lablen && i >= 0 && len <= dnamelen) {
379 		char buff[LDNS_MAX_LABELLEN+1];
380 		uint16_t chunk; /* big enough to not overflow on IPv6 hextet */
381 		if((*af == AF_INET && (lablen > 3 || dnamelabs > 6)) ||
382 			(*af == AF_INET6 && (lablen > 4 || dnamelabs > 10))) {
383 			return 0;
384 		}
385 		if(memcmp(dname, "zz", 2) == 0 && *af == AF_INET6) {
386 			/* Add one or more 0 labels. Address is initialised at
387 			 * 0, so just skip the zero part. */
388 			int zl = 11 - dnamelabs;
389 			if(z || zl < 0)
390 				return 0;
391 			z = 1;
392 			i -= (zl*2);
393 		} else {
394 			memcpy(buff, dname, lablen);
395 			buff[lablen] = '\0';
396 			chunk = strtol(buff, &e, (*af == AF_INET) ? 10 : 16);
397 			if(!e || *e != '\0' || (*af == AF_INET && chunk > 255))
398 				return 0;
399 			if(*af == AF_INET) {
400 				log_assert(i < 4 && i >= 0);
401 				ia[i] = (uint8_t)chunk;
402 				i--;
403 			} else {
404 				log_assert(i < 16 && i >= 1);
405 				/* ia in network byte order */
406 				ia[i-1] = (uint8_t)(chunk >> 8);
407 				ia[i] = (uint8_t)(chunk & 0x00FF);
408 				i -= 2;
409 			}
410 		}
411 		dname += lablen;
412 		lablen = *dname++;
413 		len += lablen;
414 	}
415 	if(i != -1)
416 		/* input too short */
417 		return 0;
418 	return 1;
419 }
420 
netblockdnametoaddr(uint8_t * dname,size_t dnamelen,struct sockaddr_storage * addr,socklen_t * addrlen,int * net,int * af)421 int netblockdnametoaddr(uint8_t* dname, size_t dnamelen,
422 	struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af)
423 {
424 	char buff[3 /* 3 digit netblock */ + 1];
425 	size_t nlablen;
426 	if(dnamelen < 1 || *dname > 3)
427 		/* netblock invalid */
428 		return 0;
429 	nlablen = *dname;
430 
431 	if(dnamelen < 1 + nlablen)
432 		return 0;
433 
434 	memcpy(buff, dname+1, nlablen);
435 	buff[nlablen] = '\0';
436 	*net = atoi(buff);
437 	if(*net == 0 && strcmp(buff, "0") != 0)
438 		return 0;
439 	if(*net < 0)
440 		return 0;
441 	dname += nlablen;
442 	dname++;
443 	if(!ipdnametoaddr(dname, dnamelen-1-nlablen, addr, addrlen, af))
444 		return 0;
445 	if((*af == AF_INET6 && *net > 128) || (*af == AF_INET && *net > 32))
446 		return 0;
447 	return 1;
448 }
449 
authextstrtoaddr(char * str,struct sockaddr_storage * addr,socklen_t * addrlen,char ** auth_name)450 int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
451 	socklen_t* addrlen, char** auth_name)
452 {
453 	char* s;
454 	int port = UNBOUND_DNS_PORT;
455 	if((s=strchr(str, '@'))) {
456 		char buf[MAX_ADDR_STRLEN];
457 		size_t len = (size_t)(s-str);
458 		char* hash = strchr(s+1, '#');
459 		if(hash) {
460 			*auth_name = hash+1;
461 		} else {
462 			*auth_name = NULL;
463 		}
464 		if(len >= MAX_ADDR_STRLEN) {
465 			return 0;
466 		}
467 		(void)strlcpy(buf, str, sizeof(buf));
468 		buf[len] = 0;
469 		port = atoi(s+1);
470 		if(port == 0) {
471 			if(!hash && strcmp(s+1,"0")!=0)
472 				return 0;
473 			if(hash && strncmp(s+1,"0#",2)!=0)
474 				return 0;
475 		}
476 		return ipstrtoaddr(buf, port, addr, addrlen);
477 	}
478 	if((s=strchr(str, '#'))) {
479 		char buf[MAX_ADDR_STRLEN];
480 		size_t len = (size_t)(s-str);
481 		if(len >= MAX_ADDR_STRLEN) {
482 			return 0;
483 		}
484 		(void)strlcpy(buf, str, sizeof(buf));
485 		buf[len] = 0;
486 		port = UNBOUND_DNS_OVER_TLS_PORT;
487 		*auth_name = s+1;
488 		return ipstrtoaddr(buf, port, addr, addrlen);
489 	}
490 	*auth_name = NULL;
491 	return ipstrtoaddr(str, port, addr, addrlen);
492 }
493 
authextstrtodname(char * str,int * port,char ** auth_name)494 uint8_t* authextstrtodname(char* str, int* port, char** auth_name)
495 {
496 	char* s;
497 	uint8_t* dname;
498 	size_t dname_len;
499 	*port = UNBOUND_DNS_PORT;
500 	*auth_name = NULL;
501 	if((s=strchr(str, '@'))) {
502 		char buf[MAX_HOST_STRLEN];
503 		size_t len = (size_t)(s-str);
504 		char* hash = strchr(s+1, '#');
505 		if(hash) {
506 			*auth_name = hash+1;
507 		} else {
508 			*auth_name = NULL;
509 		}
510 		if(len >= MAX_HOST_STRLEN) {
511 			return NULL;
512 		}
513 		(void)strlcpy(buf, str, sizeof(buf));
514 		buf[len] = 0;
515 		*port = atoi(s+1);
516 		if(*port == 0) {
517 			if(!hash && strcmp(s+1,"0")!=0)
518 				return NULL;
519 			if(hash && strncmp(s+1,"0#",2)!=0)
520 				return NULL;
521 		}
522 		dname = sldns_str2wire_dname(buf, &dname_len);
523 	} else if((s=strchr(str, '#'))) {
524 		char buf[MAX_HOST_STRLEN];
525 		size_t len = (size_t)(s-str);
526 		if(len >= MAX_HOST_STRLEN) {
527 			return NULL;
528 		}
529 		(void)strlcpy(buf, str, sizeof(buf));
530 		buf[len] = 0;
531 		*port = UNBOUND_DNS_OVER_TLS_PORT;
532 		*auth_name = s+1;
533 		dname = sldns_str2wire_dname(buf, &dname_len);
534 	} else {
535 		dname = sldns_str2wire_dname(str, &dname_len);
536 	}
537 	return dname;
538 }
539 
540 /** store port number into sockaddr structure */
541 void
sockaddr_store_port(struct sockaddr_storage * addr,socklen_t addrlen,int port)542 sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
543 {
544 	if(addr_is_ip6(addr, addrlen)) {
545 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
546 		sa->sin6_port = (in_port_t)htons((uint16_t)port);
547 	} else {
548 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
549 		sa->sin_port = (in_port_t)htons((uint16_t)port);
550 	}
551 }
552 
553 void
log_nametypeclass(enum verbosity_value v,const char * str,uint8_t * name,uint16_t type,uint16_t dclass)554 log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
555 	uint16_t type, uint16_t dclass)
556 {
557 	char buf[LDNS_MAX_DOMAINLEN];
558 	char t[12], c[12];
559 	const char *ts, *cs;
560 	if(verbosity < v)
561 		return;
562 	dname_str(name, buf);
563 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
564 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
565 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
566 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
567 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
568 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
569 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
570 		ts = sldns_rr_descript(type)->_name;
571 	else {
572 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
573 		ts = t;
574 	}
575 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
576 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
577 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
578 	else {
579 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
580 		cs = c;
581 	}
582 	log_info("%s %s %s %s", str, buf, ts, cs);
583 }
584 
585 void
log_query_in(const char * str,uint8_t * name,uint16_t type,uint16_t dclass)586 log_query_in(const char* str, uint8_t* name, uint16_t type, uint16_t dclass)
587 {
588 	char buf[LDNS_MAX_DOMAINLEN];
589 	char t[12], c[12];
590 	const char *ts, *cs;
591 	dname_str(name, buf);
592 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
593 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
594 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
595 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
596 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
597 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
598 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
599 		ts = sldns_rr_descript(type)->_name;
600 	else {
601 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
602 		ts = t;
603 	}
604 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
605 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
606 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
607 	else {
608 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
609 		cs = c;
610 	}
611 	if(LOG_TAG_QUERYREPLY)
612 		log_query("%s %s %s %s", str, buf, ts, cs);
613 	else	log_info("%s %s %s %s", str, buf, ts, cs);
614 }
615 
log_name_addr(enum verbosity_value v,const char * str,uint8_t * zone,struct sockaddr_storage * addr,socklen_t addrlen)616 void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
617 	struct sockaddr_storage* addr, socklen_t addrlen)
618 {
619 	uint16_t port;
620 	const char* family = "unknown_family ";
621 	char namebuf[LDNS_MAX_DOMAINLEN];
622 	char dest[100];
623 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
624 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
625 	if(verbosity < v)
626 		return;
627 	switch(af) {
628 		case AF_INET: family=""; break;
629 		case AF_INET6: family="";
630 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
631 			break;
632 		case AF_LOCAL: family="local "; break;
633 		default: break;
634 	}
635 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
636 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
637 	}
638 	dest[sizeof(dest)-1] = 0;
639 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
640 	dname_str(zone, namebuf);
641 	if(af != AF_INET && af != AF_INET6)
642 		verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
643 			str, namebuf, family, dest, (int)port, (int)addrlen);
644 	else	verbose(v, "%s <%s> %s%s#%d",
645 			str, namebuf, family, dest, (int)port);
646 }
647 
log_err_addr(const char * str,const char * err,struct sockaddr_storage * addr,socklen_t addrlen)648 void log_err_addr(const char* str, const char* err,
649 	struct sockaddr_storage* addr, socklen_t addrlen)
650 {
651 	uint16_t port;
652 	char dest[100];
653 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
654 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
655 	if(af == AF_INET6)
656 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
657 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
658 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
659 	}
660 	dest[sizeof(dest)-1] = 0;
661 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
662 	if(verbosity >= 4)
663 		log_err("%s: %s for %s port %d (len %d)", str, err, dest,
664 			(int)port, (int)addrlen);
665 	else	log_err("%s: %s for %s port %d", str, err, dest, (int)port);
666 }
667 
668 int
sockaddr_cmp(struct sockaddr_storage * addr1,socklen_t len1,struct sockaddr_storage * addr2,socklen_t len2)669 sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
670 	struct sockaddr_storage* addr2, socklen_t len2)
671 {
672 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
673 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
674 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
675 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
676 	if(len1 < len2)
677 		return -1;
678 	if(len1 > len2)
679 		return 1;
680 	log_assert(len1 == len2);
681 	if( p1_in->sin_family < p2_in->sin_family)
682 		return -1;
683 	if( p1_in->sin_family > p2_in->sin_family)
684 		return 1;
685 	log_assert( p1_in->sin_family == p2_in->sin_family );
686 	/* compare ip4 */
687 	if( p1_in->sin_family == AF_INET ) {
688 		/* just order it, ntohs not required */
689 		if(p1_in->sin_port < p2_in->sin_port)
690 			return -1;
691 		if(p1_in->sin_port > p2_in->sin_port)
692 			return 1;
693 		log_assert(p1_in->sin_port == p2_in->sin_port);
694 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
695 	} else if (p1_in6->sin6_family == AF_INET6) {
696 		/* just order it, ntohs not required */
697 		if(p1_in6->sin6_port < p2_in6->sin6_port)
698 			return -1;
699 		if(p1_in6->sin6_port > p2_in6->sin6_port)
700 			return 1;
701 		log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
702 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
703 			INET6_SIZE);
704 	} else {
705 		/* eek unknown type, perform this comparison for sanity. */
706 		return memcmp(addr1, addr2, len1);
707 	}
708 }
709 
710 int
sockaddr_cmp_addr(struct sockaddr_storage * addr1,socklen_t len1,struct sockaddr_storage * addr2,socklen_t len2)711 sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
712 	struct sockaddr_storage* addr2, socklen_t len2)
713 {
714 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
715 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
716 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
717 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
718 	if(len1 < len2)
719 		return -1;
720 	if(len1 > len2)
721 		return 1;
722 	log_assert(len1 == len2);
723 	if( p1_in->sin_family < p2_in->sin_family)
724 		return -1;
725 	if( p1_in->sin_family > p2_in->sin_family)
726 		return 1;
727 	log_assert( p1_in->sin_family == p2_in->sin_family );
728 	/* compare ip4 */
729 	if( p1_in->sin_family == AF_INET ) {
730 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
731 	} else if (p1_in6->sin6_family == AF_INET6) {
732 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
733 			INET6_SIZE);
734 	} else {
735 		/* eek unknown type, perform this comparison for sanity. */
736 		return memcmp(addr1, addr2, len1);
737 	}
738 }
739 
740 int
sockaddr_cmp_scopeid(struct sockaddr_storage * addr1,socklen_t len1,struct sockaddr_storage * addr2,socklen_t len2)741 sockaddr_cmp_scopeid(struct sockaddr_storage* addr1, socklen_t len1,
742 	struct sockaddr_storage* addr2, socklen_t len2)
743 {
744 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
745 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
746 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
747 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
748 	if(len1 < len2)
749 		return -1;
750 	if(len1 > len2)
751 		return 1;
752 	log_assert(len1 == len2);
753 	if( p1_in->sin_family < p2_in->sin_family)
754 		return -1;
755 	if( p1_in->sin_family > p2_in->sin_family)
756 		return 1;
757 	log_assert( p1_in->sin_family == p2_in->sin_family );
758 	/* compare ip4 */
759 	if( p1_in->sin_family == AF_INET ) {
760 		/* just order it, ntohs not required */
761 		if(p1_in->sin_port < p2_in->sin_port)
762 			return -1;
763 		if(p1_in->sin_port > p2_in->sin_port)
764 			return 1;
765 		log_assert(p1_in->sin_port == p2_in->sin_port);
766 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
767 	} else if (p1_in6->sin6_family == AF_INET6) {
768 		/* just order it, ntohs not required */
769 		if(p1_in6->sin6_port < p2_in6->sin6_port)
770 			return -1;
771 		if(p1_in6->sin6_port > p2_in6->sin6_port)
772 			return 1;
773 		if(p1_in6->sin6_scope_id < p2_in6->sin6_scope_id)
774 			return -1;
775 		if(p1_in6->sin6_scope_id > p2_in6->sin6_scope_id)
776 			return 1;
777 		log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
778 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
779 			INET6_SIZE);
780 	} else {
781 		/* eek unknown type, perform this comparison for sanity. */
782 		return memcmp(addr1, addr2, len1);
783 	}
784 }
785 
786 int
addr_is_ip6(const struct sockaddr_storage * addr,socklen_t len)787 addr_is_ip6(const struct sockaddr_storage* addr, socklen_t len)
788 {
789 	if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
790 		((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
791 		return 1;
792 	else    return 0;
793 }
794 
795 void
addr_mask(struct sockaddr_storage * addr,socklen_t len,int net)796 addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
797 {
798 	uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
799 	int i, max;
800 	uint8_t* s;
801 	if(addr_is_ip6(addr, len)) {
802 		s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
803 		max = 128;
804 	} else {
805 		s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
806 		max = 32;
807 	}
808 	if(net >= max || net < 0)
809 		return;
810 	for(i=net/8+1; i<max/8; i++) {
811 		s[i] = 0;
812 	}
813 	s[net/8] &= mask[net&0x7];
814 }
815 
816 int
addr_in_common(struct sockaddr_storage * addr1,int net1,struct sockaddr_storage * addr2,int net2,socklen_t addrlen)817 addr_in_common(struct sockaddr_storage* addr1, int net1,
818 	struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
819 {
820 	int min = (net1<net2)?net1:net2;
821 	int i, to;
822 	int match = 0;
823 	uint8_t* s1, *s2;
824 	if(addr_is_ip6(addr1, addrlen)) {
825 		s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
826 		s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
827 		to = 16;
828 	} else {
829 		s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
830 		s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
831 		to = 4;
832 	}
833 	/* match = bits_in_common(s1, s2, to); */
834 	for(i=0; i<to; i++) {
835 		if(s1[i] == s2[i]) {
836 			match += 8;
837 		} else {
838 			uint8_t z = s1[i]^s2[i];
839 			log_assert(z);
840 			while(!(z&0x80)) {
841 				match++;
842 				z<<=1;
843 			}
844 			break;
845 		}
846 	}
847 	if(match > min) match = min;
848 	return match;
849 }
850 
851 void
addr_to_str(struct sockaddr_storage * addr,socklen_t addrlen,char * buf,size_t len)852 addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
853 	char* buf, size_t len)
854 {
855 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
856 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
857 	if(addr_is_ip6(addr, addrlen))
858 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
859 	if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
860 		snprintf(buf, len, "(inet_ntop_error)");
861 	}
862 }
863 
864 int
prefixnet_is_nat64(int prefixnet)865 prefixnet_is_nat64(int prefixnet)
866 {
867 	return (prefixnet == 32 || prefixnet == 40 ||
868 		prefixnet == 48 || prefixnet == 56 ||
869 		prefixnet == 64 || prefixnet == 96);
870 }
871 
872 void
addr_to_nat64(const struct sockaddr_storage * addr,const struct sockaddr_storage * nat64_prefix,socklen_t nat64_prefixlen,int nat64_prefixnet,struct sockaddr_storage * nat64_addr,socklen_t * nat64_addrlen)873 addr_to_nat64(const struct sockaddr_storage* addr,
874 	const struct sockaddr_storage* nat64_prefix,
875 	socklen_t nat64_prefixlen, int nat64_prefixnet,
876 	struct sockaddr_storage* nat64_addr, socklen_t* nat64_addrlen)
877 {
878 	struct sockaddr_in *sin = (struct sockaddr_in *)addr;
879 	struct sockaddr_in6 *sin6;
880 	uint8_t *v4_byte;
881 	int i;
882 
883 	/* This needs to be checked by the caller */
884 	log_assert(addr->ss_family == AF_INET);
885 	/* Current usage is only from config values; prefix lengths enforced
886 	 * during config validation */
887 	log_assert(prefixnet_is_nat64(nat64_prefixnet));
888 
889 	*nat64_addr = *nat64_prefix;
890 	*nat64_addrlen = nat64_prefixlen;
891 
892 	sin6 = (struct sockaddr_in6 *)nat64_addr;
893 	sin6->sin6_flowinfo = 0;
894 	sin6->sin6_port = sin->sin_port;
895 
896 	nat64_prefixnet = nat64_prefixnet / 8;
897 
898 	v4_byte = (uint8_t *)&sin->sin_addr.s_addr;
899 	for(i = 0; i < 4; i++) {
900 		if(nat64_prefixnet == 8) {
901 			/* bits 64...71 are MBZ */
902 			sin6->sin6_addr.s6_addr[nat64_prefixnet++] = 0;
903 		}
904 		sin6->sin6_addr.s6_addr[nat64_prefixnet++] = *v4_byte++;
905 	}
906 }
907 
908 int
addr_is_ip4mapped(struct sockaddr_storage * addr,socklen_t addrlen)909 addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
910 {
911 	/* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
912 	const uint8_t map_prefix[16] =
913 		{0,0,0,0,  0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
914 	uint8_t* s;
915 	if(!addr_is_ip6(addr, addrlen))
916 		return 0;
917 	/* s is 16 octet ipv6 address string */
918 	s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
919 	return (memcmp(s, map_prefix, 12) == 0);
920 }
921 
addr_is_ip6linklocal(struct sockaddr_storage * addr,socklen_t addrlen)922 int addr_is_ip6linklocal(struct sockaddr_storage* addr, socklen_t addrlen)
923 {
924 	const uint8_t prefix[2] = {0xfe, 0x80};
925 	int af = (int)((struct sockaddr_in6*)addr)->sin6_family;
926 	void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
927 	uint8_t start[2];
928 	if(af != AF_INET6 || addrlen<(socklen_t)sizeof(struct sockaddr_in6))
929 		return 0;
930 	/* Put the first 10 bits of sin6addr in start, match fe80::/10. */
931 	memmove(start, sin6addr, 2);
932 	start[1] &= 0xc0;
933 	return memcmp(start, prefix, 2) == 0;
934 }
935 
addr_is_broadcast(struct sockaddr_storage * addr,socklen_t addrlen)936 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
937 {
938 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
939 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
940 	return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
941 		&& memcmp(sinaddr, "\377\377\377\377", 4) == 0;
942 }
943 
addr_is_any(struct sockaddr_storage * addr,socklen_t addrlen)944 int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
945 {
946 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
947 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
948 	void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
949 	if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
950 		&& memcmp(sinaddr, "\000\000\000\000", 4) == 0)
951 		return 1;
952 	else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
953 		&& memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
954 		"\000\000\000\000\000\000\000\000", 16) == 0)
955 		return 1;
956 	return 0;
957 }
958 
sock_list_insert(struct sock_list ** list,struct sockaddr_storage * addr,socklen_t len,struct regional * region)959 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
960 	socklen_t len, struct regional* region)
961 {
962 	struct sock_list* add = (struct sock_list*)regional_alloc(region,
963 		sizeof(*add) - sizeof(add->addr) + (size_t)len);
964 	if(!add) {
965 		log_err("out of memory in socketlist insert");
966 		return;
967 	}
968 	log_assert(list);
969 	add->next = *list;
970 	add->len = len;
971 	*list = add;
972 	if(len) memmove(&add->addr, addr, len);
973 }
974 
sock_list_prepend(struct sock_list ** list,struct sock_list * add)975 void sock_list_prepend(struct sock_list** list, struct sock_list* add)
976 {
977 	struct sock_list* last = add;
978 	if(!last)
979 		return;
980 	while(last->next)
981 		last = last->next;
982 	last->next = *list;
983 	*list = add;
984 }
985 
sock_list_find(struct sock_list * list,struct sockaddr_storage * addr,socklen_t len)986 int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
987         socklen_t len)
988 {
989 	while(list) {
990 		if(len == list->len) {
991 			if(len == 0 || sockaddr_cmp_addr(addr, len,
992 				&list->addr, list->len) == 0)
993 				return 1;
994 		}
995 		list = list->next;
996 	}
997 	return 0;
998 }
999 
sock_list_merge(struct sock_list ** list,struct regional * region,struct sock_list * add)1000 void sock_list_merge(struct sock_list** list, struct regional* region,
1001 	struct sock_list* add)
1002 {
1003 	struct sock_list* p;
1004 	for(p=add; p; p=p->next) {
1005 		if(!sock_list_find(*list, &p->addr, p->len))
1006 			sock_list_insert(list, &p->addr, p->len, region);
1007 	}
1008 }
1009 
1010 void
log_crypto_err(const char * str)1011 log_crypto_err(const char* str)
1012 {
1013 #ifdef HAVE_SSL
1014 	log_crypto_err_code(str, ERR_get_error());
1015 #else
1016 	(void)str;
1017 #endif /* HAVE_SSL */
1018 }
1019 
log_crypto_err_code(const char * str,unsigned long err)1020 void log_crypto_err_code(const char* str, unsigned long err)
1021 {
1022 #ifdef HAVE_SSL
1023 	/* error:[error code]:[library name]:[function name]:[reason string] */
1024 	char buf[128];
1025 	unsigned long e;
1026 	ERR_error_string_n(err, buf, sizeof(buf));
1027 	log_err("%s crypto %s", str, buf);
1028 	while( (e=ERR_get_error()) ) {
1029 		ERR_error_string_n(e, buf, sizeof(buf));
1030 		log_err("and additionally crypto %s", buf);
1031 	}
1032 #else
1033 	(void)str;
1034 	(void)err;
1035 #endif /* HAVE_SSL */
1036 }
1037 
1038 #ifdef HAVE_SSL
1039 /** Print crypt error with SSL_get_error want code and err_get_error code */
log_crypto_err_io_code_arg(const char * str,int r,unsigned long err,int err_present)1040 static void log_crypto_err_io_code_arg(const char* str, int r,
1041 	unsigned long err, int err_present)
1042 {
1043 	int print_errno = 0, print_crypto_err = 0;
1044 	const char* inf = NULL;
1045 
1046 	switch(r) {
1047 	case SSL_ERROR_NONE:
1048 		inf = "no error";
1049 		break;
1050 	case SSL_ERROR_ZERO_RETURN:
1051 		inf = "channel closed";
1052 		break;
1053 	case SSL_ERROR_WANT_READ:
1054 		inf = "want read";
1055 		break;
1056 	case SSL_ERROR_WANT_WRITE:
1057 		inf = "want write";
1058 		break;
1059 	case SSL_ERROR_WANT_CONNECT:
1060 		inf = "want connect";
1061 		break;
1062 	case SSL_ERROR_WANT_ACCEPT:
1063 		inf = "want accept";
1064 		break;
1065 	case SSL_ERROR_WANT_X509_LOOKUP:
1066 		inf = "want X509 lookup";
1067 		break;
1068 #ifdef SSL_ERROR_WANT_ASYNC
1069 	case SSL_ERROR_WANT_ASYNC:
1070 		inf = "want async";
1071 		break;
1072 #endif
1073 #ifdef SSL_ERROR_WANT_ASYNC_JOB
1074 	case SSL_ERROR_WANT_ASYNC_JOB:
1075 		inf = "want async job";
1076 		break;
1077 #endif
1078 #ifdef SSL_ERROR_WANT_CLIENT_HELLO_CB
1079 	case SSL_ERROR_WANT_CLIENT_HELLO_CB:
1080 		inf = "want client hello cb";
1081 		break;
1082 #endif
1083 	case SSL_ERROR_SYSCALL:
1084 		print_errno = 1;
1085 		inf = "syscall";
1086 		break;
1087 	case SSL_ERROR_SSL:
1088 		print_crypto_err = 1;
1089 		inf = "SSL, usually protocol, error";
1090 		break;
1091 	default:
1092 		inf = "unknown SSL_get_error result code";
1093 		print_errno = 1;
1094 		print_crypto_err = 1;
1095 	}
1096 	if(print_crypto_err) {
1097 		if(print_errno) {
1098 			char buf[1024];
1099 			snprintf(buf, sizeof(buf), "%s with errno %s",
1100 				str, strerror(errno));
1101 			if(err_present)
1102 				log_crypto_err_code(buf, err);
1103 			else	log_crypto_err(buf);
1104 		} else {
1105 			if(err_present)
1106 				log_crypto_err_code(str, err);
1107 			else	log_crypto_err(str);
1108 		}
1109 	} else {
1110 		if(print_errno) {
1111 			if(errno == 0)
1112 				log_err("%s: syscall error with errno %s",
1113 					str, strerror(errno));
1114 			else log_err("%s: %s", str, strerror(errno));
1115 		} else {
1116 			log_err("%s: %s", str, inf);
1117 		}
1118 	}
1119 }
1120 #endif /* HAVE_SSL */
1121 
log_crypto_err_io(const char * str,int r)1122 void log_crypto_err_io(const char* str, int r)
1123 {
1124 #ifdef HAVE_SSL
1125 	log_crypto_err_io_code_arg(str, r, 0, 0);
1126 #else
1127 	(void)str;
1128 	(void)r;
1129 #endif /* HAVE_SSL */
1130 }
1131 
log_crypto_err_io_code(const char * str,int r,unsigned long err)1132 void log_crypto_err_io_code(const char* str, int r, unsigned long err)
1133 {
1134 #ifdef HAVE_SSL
1135 	log_crypto_err_io_code_arg(str, r, err, 1);
1136 #else
1137 	(void)str;
1138 	(void)r;
1139 	(void)err;
1140 #endif /* HAVE_SSL */
1141 }
1142 
1143 #ifdef HAVE_SSL
1144 /** log certificate details */
1145 void
log_cert(unsigned level,const char * str,void * cert)1146 log_cert(unsigned level, const char* str, void* cert)
1147 {
1148 	BIO* bio;
1149 	char nul = 0;
1150 	char* pp = NULL;
1151 	long len;
1152 	if(verbosity < level) return;
1153 	bio = BIO_new(BIO_s_mem());
1154 	if(!bio) return;
1155 	X509_print_ex(bio, (X509*)cert, 0, (unsigned long)-1
1156 		^(X509_FLAG_NO_SUBJECT
1157                         |X509_FLAG_NO_ISSUER|X509_FLAG_NO_VALIDITY
1158 			|X509_FLAG_NO_EXTENSIONS|X509_FLAG_NO_AUX
1159 			|X509_FLAG_NO_ATTRIBUTES));
1160 	BIO_write(bio, &nul, (int)sizeof(nul));
1161 	len = BIO_get_mem_data(bio, &pp);
1162 	if(len != 0 && pp) {
1163 		/* reduce size of cert printout */
1164 		char* s;
1165 		while((s=strstr(pp, "  "))!=NULL)
1166 			memmove(s, s+1, strlen(s+1)+1);
1167 		while((s=strstr(pp, "\t\t"))!=NULL)
1168 			memmove(s, s+1, strlen(s+1)+1);
1169 		verbose(level, "%s: \n%s", str, pp);
1170 	}
1171 	BIO_free(bio);
1172 }
1173 #endif /* HAVE_SSL */
1174 
1175 #if defined(HAVE_SSL) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
1176 static int
dot_alpn_select_cb(SSL * ATTR_UNUSED (ssl),const unsigned char ** out,unsigned char * outlen,const unsigned char * in,unsigned int inlen,void * ATTR_UNUSED (arg))1177 dot_alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
1178 	unsigned char* outlen, const unsigned char* in, unsigned int inlen,
1179 	void* ATTR_UNUSED(arg))
1180 {
1181 	static const unsigned char alpns[] = { 3, 'd', 'o', 't' };
1182 	unsigned char* tmp_out;
1183 	int ret;
1184 	ret = SSL_select_next_proto(&tmp_out, outlen, alpns, sizeof(alpns), in, inlen);
1185 	if(ret == OPENSSL_NPN_NO_OVERLAP) {
1186 		/* Client sent ALPN but no overlap. Should have been error,
1187 		 * but for privacy we continue without ALPN (e.g., if certain
1188 		 * ALPNs are blocked) */
1189 		return SSL_TLSEXT_ERR_NOACK;
1190 	}
1191 	*out = tmp_out;
1192 	return SSL_TLSEXT_ERR_OK;
1193 }
1194 #endif
1195 
1196 #if defined(HAVE_SSL) && defined(HAVE_NGHTTP2) && defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
doh_alpn_select_cb(SSL * ATTR_UNUSED (ssl),const unsigned char ** out,unsigned char * outlen,const unsigned char * in,unsigned int inlen,void * ATTR_UNUSED (arg))1197 static int doh_alpn_select_cb(SSL* ATTR_UNUSED(ssl), const unsigned char** out,
1198 	unsigned char* outlen, const unsigned char* in, unsigned int inlen,
1199 	void* ATTR_UNUSED(arg))
1200 {
1201 	int rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in,
1202 		inlen);
1203 	if(rv == -1) {
1204 		return SSL_TLSEXT_ERR_NOACK;
1205 	}
1206 	/* either http/1.1 or h2 selected */
1207 	return SSL_TLSEXT_ERR_OK;
1208 }
1209 #endif
1210 
1211 #ifdef HAVE_SSL
1212 /* setup the callback for ticket keys */
1213 static int
setup_ticket_keys_cb(void * sslctx)1214 setup_ticket_keys_cb(void* sslctx)
1215 {
1216 #  ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1217 	if(SSL_CTX_set_tlsext_ticket_key_evp_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1218 		return 0;
1219 	}
1220 #  else
1221 	if(SSL_CTX_set_tlsext_ticket_key_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1222 		return 0;
1223 	}
1224 #  endif
1225 	return 1;
1226 }
1227 #endif /* HAVE_SSL */
1228 
1229 int
listen_sslctx_setup(void * ctxt,const char * tls_protocols)1230 listen_sslctx_setup(void* ctxt, const char* tls_protocols)
1231 {
1232 #ifdef HAVE_SSL
1233 	int allow12, allow13;
1234 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
1235 	cfg_tls_protocols_allowed(tls_protocols, &allow12, &allow13);
1236 
1237 	/* no SSLv2, SSLv3 because has defects */
1238 #if SSL_OP_NO_SSLv2 != 0
1239 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1240 		!= SSL_OP_NO_SSLv2){
1241 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
1242 		return 0;
1243 	}
1244 #endif
1245 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1246 		!= SSL_OP_NO_SSLv3){
1247 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
1248 		return 0;
1249 	}
1250 #if defined(SSL_OP_NO_TLSv1) && defined(SSL_OP_NO_TLSv1_1)
1251 	/* if we have tls 1.1 disable 1.0 */
1252 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1) & SSL_OP_NO_TLSv1)
1253 		!= SSL_OP_NO_TLSv1){
1254 		log_crypto_err("could not set SSL_OP_NO_TLSv1");
1255 		return 0;
1256 	}
1257 #endif
1258 #if defined(SSL_OP_NO_TLSv1_1) && defined(SSL_OP_NO_TLSv1_2)
1259 	/* if we have tls 1.2 disable 1.1 */
1260 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1) & SSL_OP_NO_TLSv1_1)
1261 		!= SSL_OP_NO_TLSv1_1){
1262 		log_crypto_err("could not set SSL_OP_NO_TLSv1_1");
1263 		return 0;
1264 	}
1265 #endif
1266 #if defined(SSL_OP_NO_TLSv1_2)
1267 	if(!allow12) {
1268 		/* we are not allowed to use TLS1.2 */
1269 		if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_2) & SSL_OP_NO_TLSv1_2)
1270 			!= SSL_OP_NO_TLSv1_2){
1271 			log_crypto_err("could not set SSL_OP_NO_TLSv1_2");
1272 			return 0;
1273 		}
1274 	}
1275 #endif
1276 #if defined(SSL_OP_NO_TLSv1_3)
1277 	if(!allow13) {
1278 		/* we are not allowed to use TLS1.3 */
1279 		if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_3) & SSL_OP_NO_TLSv1_3)
1280 			!= SSL_OP_NO_TLSv1_3){
1281 			log_crypto_err("could not set SSL_OP_NO_TLSv1_3");
1282 			return 0;
1283 		}
1284 	}
1285 #endif
1286 #if defined(SSL_OP_NO_RENEGOTIATION)
1287 	/* disable client renegotiation */
1288 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1289 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1290 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1291 		return 0;
1292 	}
1293 #endif
1294 #if defined(SHA256_DIGEST_LENGTH) && defined(USE_ECDSA)
1295 	/* if we detect system-wide crypto policies, use those */
1296 	if (access( "/etc/crypto-policies/config", F_OK ) != 0 ) {
1297 	/* if we have sha256, set the cipher list to have no known vulns */
1298 		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"))
1299 			log_crypto_err("could not set cipher list with SSL_CTX_set_cipher_list");
1300 	}
1301 #endif
1302 #if defined(SSL_OP_IGNORE_UNEXPECTED_EOF)
1303 	/* ignore errors when peers do not send the mandatory close_notify
1304 	 * alert on shutdown.
1305 	 * Relevant for openssl >= 3 */
1306 	if((SSL_CTX_set_options(ctx, SSL_OP_IGNORE_UNEXPECTED_EOF) &
1307 		SSL_OP_IGNORE_UNEXPECTED_EOF) != SSL_OP_IGNORE_UNEXPECTED_EOF) {
1308 		log_crypto_err("could not set SSL_OP_IGNORE_UNEXPECTED_EOF");
1309 		return 0;
1310 	}
1311 #endif
1312 
1313 	if((SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE) &
1314 		SSL_OP_CIPHER_SERVER_PREFERENCE) !=
1315 		SSL_OP_CIPHER_SERVER_PREFERENCE) {
1316 		log_crypto_err("could not set SSL_OP_CIPHER_SERVER_PREFERENCE");
1317 		return 0;
1318 	}
1319 
1320 #ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
1321 	SSL_CTX_set_security_level(ctx, 0);
1322 #endif
1323 #else
1324 	(void)ctxt; (void)tls_protocols;
1325 #endif /* HAVE_SSL */
1326 	return 1;
1327 }
1328 
1329 void
listen_sslctx_setup_2(void * ctxt)1330 listen_sslctx_setup_2(void* ctxt)
1331 {
1332 #ifdef HAVE_SSL
1333 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
1334 	(void)ctx;
1335 #if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
1336 	if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
1337 		log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
1338 	}
1339 #elif defined(USE_ECDSA) && HAVE_DECL_SSL_CTX_SET_TMP_ECDH
1340 	if(1) {
1341 		EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
1342 		if (!ecdh) {
1343 			log_crypto_err("could not find p256, not enabling ECDHE");
1344 		} else {
1345 			if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
1346 				log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
1347 			}
1348 			EC_KEY_free (ecdh);
1349 		}
1350 	}
1351 #endif
1352 #else
1353 	(void)ctxt;
1354 #endif /* HAVE_SSL */
1355 }
1356 
listen_sslctx_create(const char * key,const char * pem,const char * verifypem,const char * tls_ciphers,const char * tls_ciphersuites,int set_ticket_keys_cb,int is_dot,int is_doh,const char * tls_protocols)1357 void* listen_sslctx_create(const char* key, const char* pem,
1358 	const char* verifypem, const char* tls_ciphers,
1359 	const char* tls_ciphersuites, int set_ticket_keys_cb,
1360 	int is_dot, int is_doh, const char* tls_protocols)
1361 {
1362 #ifdef HAVE_SSL
1363 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
1364 	if(!ctx) {
1365 		log_crypto_err("could not SSL_CTX_new");
1366 		return NULL;
1367 	}
1368 	if(!key || key[0] == 0) {
1369 		log_err("error: no tls-service-key file specified");
1370 		SSL_CTX_free(ctx);
1371 		return NULL;
1372 	}
1373 	if(!pem || pem[0] == 0) {
1374 		log_err("error: no tls-service-pem file specified");
1375 		SSL_CTX_free(ctx);
1376 		return NULL;
1377 	}
1378 	if(!listen_sslctx_setup(ctx, tls_protocols)) {
1379 		SSL_CTX_free(ctx);
1380 		return NULL;
1381 	}
1382 	if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1383 		log_err("error for cert file: %s", pem);
1384 		log_crypto_err("error in SSL_CTX use_certificate_chain_file");
1385 		SSL_CTX_free(ctx);
1386 		return NULL;
1387 	}
1388 	if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1389 		log_err("error for private key file: %s", key);
1390 		log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
1391 		SSL_CTX_free(ctx);
1392 		return NULL;
1393 	}
1394 	if(!SSL_CTX_check_private_key(ctx)) {
1395 		log_err("error for key file: %s", key);
1396 		log_crypto_err("Error in SSL_CTX check_private_key");
1397 		SSL_CTX_free(ctx);
1398 		return NULL;
1399 	}
1400 	listen_sslctx_setup_2(ctx);
1401 	if(verifypem && verifypem[0]) {
1402 		if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1403 			log_crypto_err("Error in SSL_CTX verify locations");
1404 			SSL_CTX_free(ctx);
1405 			return NULL;
1406 		}
1407 		SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
1408 			verifypem));
1409 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
1410 	}
1411 	if(tls_ciphers && tls_ciphers[0]) {
1412 		if (!SSL_CTX_set_cipher_list(ctx, tls_ciphers)) {
1413 			log_err("failed to set tls-cipher %s",
1414 				tls_ciphers);
1415 			log_crypto_err("Error in SSL_CTX_set_cipher_list");
1416 			SSL_CTX_free(ctx);
1417 			return NULL;
1418 		}
1419 	}
1420 #ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
1421 	if(tls_ciphersuites && tls_ciphersuites[0]) {
1422 		if (!SSL_CTX_set_ciphersuites(ctx, tls_ciphersuites)) {
1423 			log_err("failed to set tls-ciphersuites %s",
1424 				tls_ciphersuites);
1425 			log_crypto_err("Error in SSL_CTX_set_ciphersuites");
1426 			SSL_CTX_free(ctx);
1427 			return NULL;
1428 		}
1429 	}
1430 #else
1431 	(void)tls_ciphersuites; /* variable unused. */
1432 #endif /* HAVE_SSL_CTX_SET_CIPHERSUITES */
1433 	if(set_ticket_keys_cb) {
1434 		if(!setup_ticket_keys_cb(ctx)) {
1435 			log_crypto_err("no support for TLS session ticket");
1436 			SSL_CTX_free(ctx);
1437 			return NULL;
1438 		}
1439 	}
1440 	/* setup ALPN */
1441 #if defined(HAVE_SSL_CTX_SET_ALPN_SELECT_CB)
1442 	if(is_dot) {
1443 		SSL_CTX_set_alpn_select_cb(ctx, dot_alpn_select_cb, NULL);
1444 	} else if(is_doh) {
1445 #if defined(HAVE_NGHTTP2)
1446 		SSL_CTX_set_alpn_select_cb(ctx, doh_alpn_select_cb, NULL);
1447 #endif
1448 	}
1449 #else /* HAVE_SSL_CTX_SET_ALPN_SELECT_CB */
1450 	(void)is_dot; (void)is_doh;
1451 #endif /* HAVE_SSL_CTX_SET_ALPN_SELECT_CB */
1452 	return ctx;
1453 #else
1454 	(void)key; (void)pem; (void)verifypem;
1455 	(void)tls_ciphers; (void)tls_ciphersuites;
1456 	(void)set_ticket_keys_cb; (void)is_dot; (void)is_doh;
1457 	(void)tls_protocols;
1458 	return NULL;
1459 #endif /* HAVE_SSL */
1460 }
1461 
1462 #ifdef USE_WINSOCK
1463 /* For windows, the CA trust store is not read by openssl.
1464    Add code to open the trust store using wincrypt API and add
1465    the root certs into openssl trust store */
1466 static int
add_WIN_cacerts_to_openssl_store(SSL_CTX * tls_ctx)1467 add_WIN_cacerts_to_openssl_store(SSL_CTX* tls_ctx)
1468 {
1469 	HCERTSTORE      hSystemStore;
1470 	PCCERT_CONTEXT  pTargetCert = NULL;
1471 	X509_STORE*	store;
1472 
1473 	verbose(VERB_ALGO, "Adding Windows certificates from system root store to CA store");
1474 
1475 	/* load just once per context lifetime for this version
1476 	   TODO: dynamically update CA trust changes as they are available */
1477 	if (!tls_ctx)
1478 		return 0;
1479 
1480 	/* Call wincrypt's CertOpenStore to open the CA root store. */
1481 
1482 	if ((hSystemStore = CertOpenStore(
1483 		CERT_STORE_PROV_SYSTEM,
1484 		0,
1485 		0,
1486 		/* NOTE: mingw does not have this const: replace with 1 << 16 from code
1487 		   CERT_SYSTEM_STORE_CURRENT_USER, */
1488 		1 << 16,
1489 		L"root")) == 0)
1490 	{
1491 		return 0;
1492 	}
1493 
1494 	store = SSL_CTX_get_cert_store(tls_ctx);
1495 	if (!store)
1496 		return 0;
1497 
1498 	/* failure if the CA store is empty or the call fails */
1499 	if ((pTargetCert = CertEnumCertificatesInStore(
1500 		hSystemStore, pTargetCert)) == 0) {
1501 		verbose(VERB_ALGO, "CA certificate store for Windows is empty.");
1502 		return 0;
1503 	}
1504 	/* iterate over the windows cert store and add to openssl store */
1505 	do
1506 	{
1507 		X509 *cert1 = d2i_X509(NULL,
1508 			(const unsigned char **)&pTargetCert->pbCertEncoded,
1509 			pTargetCert->cbCertEncoded);
1510 		if (!cert1) {
1511 			unsigned long error = ERR_get_error();
1512 			/* return error if a cert fails */
1513 			verbose(VERB_ALGO, "%s %d:%s",
1514 				"Unable to parse certificate in memory",
1515 				(int)error, ERR_error_string(error, NULL));
1516 			return 0;
1517 		}
1518 		else {
1519 			/* return error if a cert add to store fails */
1520 			if (X509_STORE_add_cert(store, cert1) == 0) {
1521 				unsigned long error = ERR_peek_last_error();
1522 
1523 				/* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
1524 				* certificate is already in the store.  */
1525 				if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
1526 					ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
1527 					error = ERR_get_error();
1528 					verbose(VERB_ALGO, "%s %d:%s\n",
1529 					    "Error adding certificate", (int)error,
1530 					     ERR_error_string(error, NULL));
1531 					X509_free(cert1);
1532 					return 0;
1533 				}
1534 			}
1535 			X509_free(cert1);
1536 		}
1537 	} while ((pTargetCert = CertEnumCertificatesInStore(
1538 		hSystemStore, pTargetCert)) != 0);
1539 
1540 	/* Clean up memory and quit. */
1541 	if (pTargetCert)
1542 		CertFreeCertificateContext(pTargetCert);
1543 	if (hSystemStore)
1544 	{
1545 		if (!CertCloseStore(
1546 			hSystemStore, 0))
1547 			return 0;
1548 	}
1549 	verbose(VERB_ALGO, "Completed adding Windows certificates to CA store successfully");
1550 	return 1;
1551 }
1552 #endif /* USE_WINSOCK */
1553 
connect_sslctx_create(char * key,char * pem,char * verifypem,int wincert)1554 void* connect_sslctx_create(char* key, char* pem, char* verifypem, int wincert)
1555 {
1556 #ifdef HAVE_SSL
1557 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1558 	if(!ctx) {
1559 		log_crypto_err("could not allocate SSL_CTX pointer");
1560 		return NULL;
1561 	}
1562 #if SSL_OP_NO_SSLv2 != 0
1563 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1564 		!= SSL_OP_NO_SSLv2) {
1565 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
1566 		SSL_CTX_free(ctx);
1567 		return NULL;
1568 	}
1569 #endif
1570 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1571 		!= SSL_OP_NO_SSLv3) {
1572 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
1573 		SSL_CTX_free(ctx);
1574 		return NULL;
1575 	}
1576 #if defined(SSL_OP_NO_RENEGOTIATION)
1577 	/* disable client renegotiation */
1578 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1579 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1580 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1581 		SSL_CTX_free(ctx);
1582 		return 0;
1583 	}
1584 #endif
1585 #if defined(SSL_OP_IGNORE_UNEXPECTED_EOF)
1586 	/* ignore errors when peers do not send the mandatory close_notify
1587 	 * alert on shutdown.
1588 	 * Relevant for openssl >= 3 */
1589 	if((SSL_CTX_set_options(ctx, SSL_OP_IGNORE_UNEXPECTED_EOF) &
1590 		SSL_OP_IGNORE_UNEXPECTED_EOF) != SSL_OP_IGNORE_UNEXPECTED_EOF) {
1591 		log_crypto_err("could not set SSL_OP_IGNORE_UNEXPECTED_EOF");
1592 		SSL_CTX_free(ctx);
1593 		return 0;
1594 	}
1595 #endif
1596 	if(key && key[0]) {
1597 		if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1598 			log_err("error in client certificate %s", pem);
1599 			log_crypto_err("error in certificate file");
1600 			SSL_CTX_free(ctx);
1601 			return NULL;
1602 		}
1603 		if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1604 			log_err("error in client private key %s", key);
1605 			log_crypto_err("error in key file");
1606 			SSL_CTX_free(ctx);
1607 			return NULL;
1608 		}
1609 		if(!SSL_CTX_check_private_key(ctx)) {
1610 			log_err("error in client key %s", key);
1611 			log_crypto_err("error in SSL_CTX_check_private_key");
1612 			SSL_CTX_free(ctx);
1613 			return NULL;
1614 		}
1615 	}
1616 	if((verifypem && verifypem[0]) || wincert) {
1617 		if(verifypem && verifypem[0]) {
1618 			if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1619 				log_crypto_err("error in SSL_CTX verify");
1620 				SSL_CTX_free(ctx);
1621 				return NULL;
1622 			}
1623 		}
1624 #ifdef USE_WINSOCK
1625 		if(wincert) {
1626 			if(!add_WIN_cacerts_to_openssl_store(ctx)) {
1627 				log_crypto_err("error in add_WIN_cacerts_to_openssl_store");
1628 				SSL_CTX_free(ctx);
1629 				return NULL;
1630 			}
1631 		}
1632 #else
1633 		if(wincert) {
1634 			if(!SSL_CTX_set_default_verify_paths(ctx)) {
1635 				log_crypto_err("error in default_verify_paths");
1636 				SSL_CTX_free(ctx);
1637 				return NULL;
1638 			}
1639 		}
1640 #endif
1641 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
1642 	}
1643 	return ctx;
1644 #else
1645 	(void)key; (void)pem; (void)verifypem; (void)wincert;
1646 	return NULL;
1647 #endif
1648 }
1649 
incoming_ssl_fd(void * sslctx,int fd)1650 void* incoming_ssl_fd(void* sslctx, int fd)
1651 {
1652 #ifdef HAVE_SSL
1653 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1654 	if(!ssl) {
1655 		log_crypto_err("could not SSL_new");
1656 		return NULL;
1657 	}
1658 	SSL_set_accept_state(ssl);
1659 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1660 	if(!SSL_set_fd(ssl, fd)) {
1661 		log_crypto_err("could not SSL_set_fd");
1662 		SSL_free(ssl);
1663 		return NULL;
1664 	}
1665 	return ssl;
1666 #else
1667 	(void)sslctx; (void)fd;
1668 	return NULL;
1669 #endif
1670 }
1671 
outgoing_ssl_fd(void * sslctx,int fd)1672 void* outgoing_ssl_fd(void* sslctx, int fd)
1673 {
1674 #ifdef HAVE_SSL
1675 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1676 	if(!ssl) {
1677 		log_crypto_err("could not SSL_new");
1678 		return NULL;
1679 	}
1680 	SSL_set_connect_state(ssl);
1681 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1682 	if(!SSL_set_fd(ssl, fd)) {
1683 		log_crypto_err("could not SSL_set_fd");
1684 		SSL_free(ssl);
1685 		return NULL;
1686 	}
1687 	return ssl;
1688 #else
1689 	(void)sslctx; (void)fd;
1690 	return NULL;
1691 #endif
1692 }
1693 
check_auth_name_for_ssl(char * auth_name)1694 int check_auth_name_for_ssl(char* auth_name)
1695 {
1696 	if(!auth_name) return 1;
1697 #if defined(HAVE_SSL) && !defined(HAVE_SSL_SET1_HOST) && !defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1698 	log_err("the query has an auth_name %s, but libssl has no call to "
1699 		"perform TLS authentication.  Remove that name from config "
1700 		"or upgrade the ssl crypto library.", auth_name);
1701 	return 0;
1702 #else
1703 	return 1;
1704 #endif
1705 }
1706 
1707 /** set the authname on an SSL structure, SSL* ssl */
set_auth_name_on_ssl(void * ssl,char * auth_name,int use_sni)1708 int set_auth_name_on_ssl(void* ssl, char* auth_name, int use_sni)
1709 {
1710 #ifdef HAVE_SSL_SET1_DNSNAME
1711 	struct sockaddr_storage tmpaddr;
1712 	socklen_t tmpaddrlen = (socklen_t)sizeof(tmpaddr);
1713 #endif
1714 	if(!auth_name) return 1;
1715 #ifdef HAVE_SSL
1716 	if(use_sni) {
1717 		(void)SSL_set_tlsext_host_name(ssl, auth_name);
1718 	}
1719 #else
1720 	(void)ssl;
1721 	(void)use_sni;
1722 #endif
1723 #ifdef HAVE_SSL_SET1_DNSNAME
1724 	SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1725 	if(ipstrtoaddr(auth_name, UNBOUND_DNS_PORT, &tmpaddr, &tmpaddrlen)) {
1726 		if(!SSL_set1_ipaddr(ssl, auth_name)) {
1727 			log_err("SSL_set1_ipaddr failed");
1728 			return 0;
1729 		}
1730 	} else {
1731 		if(!SSL_set1_dnsname(ssl, auth_name)) {
1732 			log_err("SSL_set1_dnsname failed");
1733 			return 0;
1734 		}
1735 	}
1736 #elif defined(HAVE_SSL_SET1_HOST)
1737 	SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1738 	/* setting the hostname makes openssl verify the
1739 	 * host name in the x509 certificate in the
1740 	 * SSL connection*/
1741 	if(!SSL_set1_host(ssl, auth_name)) {
1742 		log_err("SSL_set1_host failed");
1743 		return 0;
1744 	}
1745 #elif defined(HAVE_X509_VERIFY_PARAM_SET1_HOST)
1746 	/* openssl 1.0.2 has this function that can be used for
1747 	 * set1_host like verification */
1748 	if(auth_name) {
1749 		X509_VERIFY_PARAM* param = SSL_get0_param(ssl);
1750 #  ifdef X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS
1751 		X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1752 #  endif
1753 		if(!X509_VERIFY_PARAM_set1_host(param, auth_name, strlen(auth_name))) {
1754 			log_err("X509_VERIFY_PARAM_set1_host failed");
1755 			return 0;
1756 		}
1757 		SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
1758 	}
1759 #else
1760 	verbose(VERB_ALGO, "the query has an auth_name, but libssl has no call to perform TLS authentication");
1761 #endif /* HAVE_SSL_SET1_HOST */
1762 	return 1;
1763 }
1764 
1765 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1766 /** global lock list for openssl locks */
1767 static lock_basic_type *ub_openssl_locks = NULL;
1768 
1769 /** callback that gets thread id for openssl */
1770 #ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1771 static void
ub_crypto_id_cb(CRYPTO_THREADID * id)1772 ub_crypto_id_cb(CRYPTO_THREADID *id)
1773 {
1774 	CRYPTO_THREADID_set_numeric(id, (unsigned long)log_thread_get());
1775 }
1776 #else
1777 static unsigned long
ub_crypto_id_cb(void)1778 ub_crypto_id_cb(void)
1779 {
1780 	return (unsigned long)log_thread_get();
1781 }
1782 #endif
1783 
1784 static void
ub_crypto_lock_cb(int mode,int type,const char * ATTR_UNUSED (file),int ATTR_UNUSED (line))1785 ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
1786 	int ATTR_UNUSED(line))
1787 {
1788 	if((mode&CRYPTO_LOCK)) {
1789 		lock_basic_lock(&ub_openssl_locks[type]);
1790 	} else {
1791 		lock_basic_unlock(&ub_openssl_locks[type]);
1792 	}
1793 }
1794 #endif /* OPENSSL_THREADS */
1795 
ub_openssl_lock_init(void)1796 int ub_openssl_lock_init(void)
1797 {
1798 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1799 	int i;
1800 	ub_openssl_locks = (lock_basic_type*)reallocarray(
1801 		NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
1802 	if(!ub_openssl_locks)
1803 		return 0;
1804 	for(i=0; i<CRYPTO_num_locks(); i++) {
1805 		lock_basic_init(&ub_openssl_locks[i]);
1806 	}
1807 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1808 	CRYPTO_THREADID_set_callback(&ub_crypto_id_cb);
1809 #  else
1810 	CRYPTO_set_id_callback(&ub_crypto_id_cb);
1811 #  endif
1812 	CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
1813 #endif /* OPENSSL_THREADS */
1814 	return 1;
1815 }
1816 
ub_openssl_lock_delete(void)1817 void ub_openssl_lock_delete(void)
1818 {
1819 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1820 	int i;
1821 	if(!ub_openssl_locks)
1822 		return;
1823 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1824 	CRYPTO_THREADID_set_callback(NULL);
1825 #  else
1826 	CRYPTO_set_id_callback(NULL);
1827 #  endif
1828 	CRYPTO_set_locking_callback(NULL);
1829 	for(i=0; i<CRYPTO_num_locks(); i++) {
1830 		lock_basic_destroy(&ub_openssl_locks[i]);
1831 	}
1832 	free(ub_openssl_locks);
1833 #endif /* OPENSSL_THREADS */
1834 }
1835 
listen_sslctx_setup_ticket_keys(struct config_strlist * tls_session_ticket_keys,char * chroot)1836 int listen_sslctx_setup_ticket_keys(struct config_strlist* tls_session_ticket_keys, char* chroot) {
1837 #ifdef HAVE_SSL
1838 	size_t s = 1;
1839 	struct config_strlist* p;
1840 	struct tls_session_ticket_key *keys;
1841 	for(p = tls_session_ticket_keys; p; p = p->next) {
1842 		s++;
1843 	}
1844 	keys = calloc(s, sizeof(struct tls_session_ticket_key));
1845 	if(!keys)
1846 		return 0;
1847 	memset(keys, 0, s*sizeof(*keys));
1848 	ticket_keys = keys;
1849 
1850 	for(p = tls_session_ticket_keys; p; p = p->next) {
1851 		size_t n;
1852 		unsigned char *data;
1853 		FILE *f;
1854 		char* fstr;
1855 
1856 		data = (unsigned char *)malloc(80);
1857 		if(!data)
1858 			return 0;
1859 
1860 		fstr = p->str;
1861 		if(chroot && strncmp(fstr, chroot, strlen(chroot)) == 0)
1862 			fstr += strlen(chroot);
1863 		f = fopen(fstr, "rb");
1864 		if(!f) {
1865 			log_err("could not read tls-session-ticket-key %s: %s", fstr, strerror(errno));
1866 			free(data);
1867 			return 0;
1868 		}
1869 		n = fread(data, 1, 80, f);
1870 		fclose(f);
1871 
1872 		if(n != 80) {
1873 			log_err("tls-session-ticket-key %s is %d bytes, must be 80 bytes", fstr, (int)n);
1874 			free(data);
1875 			return 0;
1876 		}
1877 		verbose(VERB_OPS, "read tls-session-ticket-key: %s", fstr);
1878 
1879 		keys->key_name = data;
1880 		keys->aes_key = data + 16;
1881 		keys->hmac_key = data + 48;
1882 		keys++;
1883 	}
1884 	/* terminate array with NULL key name entry */
1885 	keys->key_name = NULL;
1886 	return 1;
1887 #else
1888 	(void)tls_session_ticket_keys; (void)chroot;
1889 	return 0;
1890 #endif
1891 }
1892 
1893 #ifdef HAVE_SSL
tls_session_ticket_key_cb(SSL * ATTR_UNUSED (sslctx),unsigned char * key_name,unsigned char * iv,EVP_CIPHER_CTX * evp_sctx,EVP_MAC_CTX * hmac_ctx,int enc)1894 int tls_session_ticket_key_cb(SSL *ATTR_UNUSED(sslctx), unsigned char* key_name,
1895 	unsigned char* iv, EVP_CIPHER_CTX *evp_sctx,
1896 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1897 	EVP_MAC_CTX *hmac_ctx,
1898 #else
1899 	HMAC_CTX* hmac_ctx,
1900 #endif
1901 	int enc)
1902 {
1903 #ifdef HAVE_SSL
1904 #  ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1905 	OSSL_PARAM params[3];
1906 #  else
1907 	const EVP_MD *digest;
1908 #  endif
1909 	const EVP_CIPHER *cipher;
1910 	int evp_cipher_length;
1911 #  ifndef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1912 	digest = EVP_sha256();
1913 #  endif
1914 	cipher = EVP_aes_256_cbc();
1915 	evp_cipher_length = EVP_CIPHER_iv_length(cipher);
1916 	if( enc == 1 ) {
1917 		/* encrypt */
1918 		verbose(VERB_CLIENT, "start session encrypt");
1919 		memcpy(key_name, ticket_keys->key_name, 16);
1920 		if (RAND_bytes(iv, evp_cipher_length) != 1) {
1921 			verbose(VERB_CLIENT, "RAND_bytes failed");
1922 			return -1;
1923 		}
1924 		if (EVP_EncryptInit_ex(evp_sctx, cipher, NULL, ticket_keys->aes_key, iv) != 1) {
1925 			verbose(VERB_CLIENT, "EVP_EncryptInit_ex failed");
1926 			return -1;
1927 		}
1928 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1929 		params[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
1930 			ticket_keys->hmac_key, 32);
1931 		params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1932 			"sha256", 0);
1933 		params[2] = OSSL_PARAM_construct_end();
1934 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1935 		EVP_MAC_CTX_set_params(hmac_ctx, params);
1936 #else
1937 		EVP_MAC_set_ctx_params(hmac_ctx, params);
1938 #endif
1939 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1940 		if (HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL) != 1) {
1941 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1942 			return -1;
1943 		}
1944 #else
1945 		HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL);
1946 #endif
1947 		return 1;
1948 	} else if (enc == 0) {
1949 		/* decrypt */
1950 		struct tls_session_ticket_key *key;
1951 		verbose(VERB_CLIENT, "start session decrypt");
1952 		for(key = ticket_keys; key->key_name != NULL; key++) {
1953 			if (!memcmp(key_name, key->key_name, 16)) {
1954 				verbose(VERB_CLIENT, "Found session_key");
1955 				break;
1956 			}
1957 		}
1958 		if(key->key_name == NULL) {
1959 			verbose(VERB_CLIENT, "Not found session_key");
1960 			return 0;
1961 		}
1962 
1963 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
1964 		params[0] = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
1965 			key->hmac_key, 32);
1966 		params[1] = OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST,
1967 			"sha256", 0);
1968 		params[2] = OSSL_PARAM_construct_end();
1969 #ifdef HAVE_EVP_MAC_CTX_SET_PARAMS
1970 		EVP_MAC_CTX_set_params(hmac_ctx, params);
1971 #else
1972 		EVP_MAC_set_ctx_params(hmac_ctx, params);
1973 #endif
1974 #elif !defined(HMAC_INIT_EX_RETURNS_VOID)
1975 		if (HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL) != 1) {
1976 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1977 			return -1;
1978 		}
1979 #else
1980 		HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL);
1981 #endif
1982 		if (EVP_DecryptInit_ex(evp_sctx, cipher, NULL, key->aes_key, iv) != 1) {
1983 			log_err("EVP_DecryptInit_ex failed");
1984 			return -1;
1985 		}
1986 
1987 		return (key == ticket_keys) ? 1 : 2;
1988 	}
1989 	return -1;
1990 #else
1991 	(void)key_name;
1992 	(void)iv;
1993 	(void)evp_sctx;
1994 	(void)hmac_ctx;
1995 	(void)enc;
1996 	return 0;
1997 #endif
1998 }
1999 #endif /* HAVE_SSL */
2000 
2001 #ifdef HAVE_SSL
2002 void
listen_sslctx_delete_ticket_keys(void)2003 listen_sslctx_delete_ticket_keys(void)
2004 {
2005 	struct tls_session_ticket_key *key;
2006 	if(!ticket_keys) return;
2007 	for(key = ticket_keys; key->key_name != NULL; key++) {
2008 		/* wipe key data from memory*/
2009 #ifdef HAVE_EXPLICIT_BZERO
2010 		explicit_bzero(key->key_name, 80);
2011 #else
2012 		memset(key->key_name, 0xdd, 80);
2013 #endif
2014 		free(key->key_name);
2015 	}
2016 	free(ticket_keys);
2017 	ticket_keys = NULL;
2018 }
2019 #endif /* HAVE_SSL */
2020 
2021 #  ifndef USE_WINSOCK
2022 char*
sock_strerror(int errn)2023 sock_strerror(int errn)
2024 {
2025 	return strerror(errn);
2026 }
2027 
2028 void
sock_close(int socket)2029 sock_close(int socket)
2030 {
2031 	close(socket);
2032 }
2033 
2034 #  else
2035 char*
sock_strerror(int ATTR_UNUSED (errn))2036 sock_strerror(int ATTR_UNUSED(errn))
2037 {
2038 	return wsa_strerror(WSAGetLastError());
2039 }
2040 
2041 void
sock_close(int socket)2042 sock_close(int socket)
2043 {
2044 	closesocket(socket);
2045 }
2046 #  endif /* USE_WINSOCK */
2047 
2048 ssize_t
hex_ntop(uint8_t const * src,size_t srclength,char * target,size_t targsize)2049 hex_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize)
2050 {
2051 	static char hexdigits[] = {
2052 		'0', '1', '2', '3', '4', '5', '6', '7',
2053 		'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
2054 	};
2055 	size_t i;
2056 
2057 	if (targsize < srclength * 2 + 1) {
2058 		return -1;
2059 	}
2060 
2061 	for (i = 0; i < srclength; ++i) {
2062 		*target++ = hexdigits[src[i] >> 4U];
2063 		*target++ = hexdigits[src[i] & 0xfU];
2064 	}
2065 	*target = '\0';
2066 	return 2 * srclength;
2067 }
2068 
2069 ssize_t
hex_pton(const char * src,uint8_t * target,size_t targsize)2070 hex_pton(const char* src, uint8_t* target, size_t targsize)
2071 {
2072 	uint8_t *t = target;
2073 	if(strlen(src) % 2 != 0 || strlen(src)/2 > targsize) {
2074 		return -1;
2075 	}
2076 	while(*src) {
2077 		if(!isxdigit((unsigned char)src[0]) ||
2078 			!isxdigit((unsigned char)src[1]))
2079 			return -1;
2080 		*t++ = sldns_hexdigit_to_int(src[0]) * 16 +
2081 			sldns_hexdigit_to_int(src[1]) ;
2082 		src += 2;
2083 	}
2084 	return t-target;
2085 }
2086