xref: /freebsd/contrib/unbound/util/net_help.c (revision 6419bb52)
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 #include "util/net_help.h"
42 #include "util/log.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"
49 #include <fcntl.h>
50 #ifdef HAVE_OPENSSL_SSL_H
51 #include <openssl/ssl.h>
52 #include <openssl/evp.h>
53 #include <openssl/rand.h>
54 #endif
55 #ifdef HAVE_OPENSSL_ERR_H
56 #include <openssl/err.h>
57 #endif
58 #ifdef USE_WINSOCK
59 #include <wincrypt.h>
60 #endif
61 
62 /** max length of an IP address (the address portion) that we allow */
63 #define MAX_ADDR_STRLEN 128 /* characters */
64 /** default value for EDNS ADVERTISED size */
65 uint16_t EDNS_ADVERTISED_SIZE = 4096;
66 
67 /** minimal responses when positive answer: default is no */
68 int MINIMAL_RESPONSES = 0;
69 
70 /** rrset order roundrobin: default is no */
71 int RRSET_ROUNDROBIN = 0;
72 
73 /** log tag queries with name instead of 'info' for filtering */
74 int LOG_TAG_QUERYREPLY = 0;
75 
76 static struct tls_session_ticket_key {
77 	unsigned char *key_name;
78 	unsigned char *aes_key;
79 	unsigned char *hmac_key;
80 } *ticket_keys;
81 
82 /* returns true is string addr is an ip6 specced address */
83 int
84 str_is_ip6(const char* str)
85 {
86 	if(strchr(str, ':'))
87 		return 1;
88 	else    return 0;
89 }
90 
91 int
92 fd_set_nonblock(int s)
93 {
94 #ifdef HAVE_FCNTL
95 	int flag;
96 	if((flag = fcntl(s, F_GETFL)) == -1) {
97 		log_err("can't fcntl F_GETFL: %s", strerror(errno));
98 		flag = 0;
99 	}
100 	flag |= O_NONBLOCK;
101 	if(fcntl(s, F_SETFL, flag) == -1) {
102 		log_err("can't fcntl F_SETFL: %s", strerror(errno));
103 		return 0;
104 	}
105 #elif defined(HAVE_IOCTLSOCKET)
106 	unsigned long on = 1;
107 	if(ioctlsocket(s, FIONBIO, &on) != 0) {
108 		log_err("can't ioctlsocket FIONBIO on: %s",
109 			wsa_strerror(WSAGetLastError()));
110 	}
111 #endif
112 	return 1;
113 }
114 
115 int
116 fd_set_block(int s)
117 {
118 #ifdef HAVE_FCNTL
119 	int flag;
120 	if((flag = fcntl(s, F_GETFL)) == -1) {
121 		log_err("cannot fcntl F_GETFL: %s", strerror(errno));
122 		flag = 0;
123 	}
124 	flag &= ~O_NONBLOCK;
125 	if(fcntl(s, F_SETFL, flag) == -1) {
126 		log_err("cannot fcntl F_SETFL: %s", strerror(errno));
127 		return 0;
128 	}
129 #elif defined(HAVE_IOCTLSOCKET)
130 	unsigned long off = 0;
131 	if(ioctlsocket(s, FIONBIO, &off) != 0) {
132 		if(WSAGetLastError() != WSAEINVAL || verbosity >= 4)
133 			log_err("can't ioctlsocket FIONBIO off: %s",
134 				wsa_strerror(WSAGetLastError()));
135 	}
136 #endif
137 	return 1;
138 }
139 
140 int
141 is_pow2(size_t num)
142 {
143 	if(num == 0) return 1;
144 	return (num & (num-1)) == 0;
145 }
146 
147 void*
148 memdup(void* data, size_t len)
149 {
150 	void* d;
151 	if(!data) return NULL;
152 	if(len == 0) return NULL;
153 	d = malloc(len);
154 	if(!d) return NULL;
155 	memcpy(d, data, len);
156 	return d;
157 }
158 
159 void
160 log_addr(enum verbosity_value v, const char* str,
161 	struct sockaddr_storage* addr, socklen_t addrlen)
162 {
163 	uint16_t port;
164 	const char* family = "unknown";
165 	char dest[100];
166 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
167 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
168 	if(verbosity < v)
169 		return;
170 	switch(af) {
171 		case AF_INET: family="ip4"; break;
172 		case AF_INET6: family="ip6";
173 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
174 			break;
175 		case AF_LOCAL:
176 			dest[0]=0;
177 			(void)inet_ntop(af, sinaddr, dest,
178 				(socklen_t)sizeof(dest));
179 			verbose(v, "%s local %s", str, dest);
180 			return; /* do not continue and try to get port */
181 		default: break;
182 	}
183 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
184 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
185 	}
186 	dest[sizeof(dest)-1] = 0;
187 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
188 	if(verbosity >= 4)
189 		verbose(v, "%s %s %s port %d (len %d)", str, family, dest,
190 			(int)port, (int)addrlen);
191 	else	verbose(v, "%s %s port %d", str, dest, (int)port);
192 }
193 
194 int
195 extstrtoaddr(const char* str, struct sockaddr_storage* addr,
196 	socklen_t* addrlen)
197 {
198 	char* s;
199 	int port = UNBOUND_DNS_PORT;
200 	if((s=strchr(str, '@'))) {
201 		char buf[MAX_ADDR_STRLEN];
202 		if(s-str >= MAX_ADDR_STRLEN) {
203 			return 0;
204 		}
205 		(void)strlcpy(buf, str, sizeof(buf));
206 		buf[s-str] = 0;
207 		port = atoi(s+1);
208 		if(port == 0 && strcmp(s+1,"0")!=0) {
209 			return 0;
210 		}
211 		return ipstrtoaddr(buf, port, addr, addrlen);
212 	}
213 	return ipstrtoaddr(str, port, addr, addrlen);
214 }
215 
216 
217 int
218 ipstrtoaddr(const char* ip, int port, struct sockaddr_storage* addr,
219 	socklen_t* addrlen)
220 {
221 	uint16_t p;
222 	if(!ip) return 0;
223 	p = (uint16_t) port;
224 	if(str_is_ip6(ip)) {
225 		char buf[MAX_ADDR_STRLEN];
226 		char* s;
227 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
228 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
229 		memset(sa, 0, *addrlen);
230 		sa->sin6_family = AF_INET6;
231 		sa->sin6_port = (in_port_t)htons(p);
232 		if((s=strchr(ip, '%'))) { /* ip6%interface, rfc 4007 */
233 			if(s-ip >= MAX_ADDR_STRLEN)
234 				return 0;
235 			(void)strlcpy(buf, ip, sizeof(buf));
236 			buf[s-ip]=0;
237 			sa->sin6_scope_id = (uint32_t)atoi(s+1);
238 			ip = buf;
239 		}
240 		if(inet_pton((int)sa->sin6_family, ip, &sa->sin6_addr) <= 0) {
241 			return 0;
242 		}
243 	} else { /* ip4 */
244 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
245 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
246 		memset(sa, 0, *addrlen);
247 		sa->sin_family = AF_INET;
248 		sa->sin_port = (in_port_t)htons(p);
249 		if(inet_pton((int)sa->sin_family, ip, &sa->sin_addr) <= 0) {
250 			return 0;
251 		}
252 	}
253 	return 1;
254 }
255 
256 int netblockstrtoaddr(const char* str, int port, struct sockaddr_storage* addr,
257         socklen_t* addrlen, int* net)
258 {
259 	char buf[64];
260 	char* s;
261 	*net = (str_is_ip6(str)?128:32);
262 	if((s=strchr(str, '/'))) {
263 		if(atoi(s+1) > *net) {
264 			log_err("netblock too large: %s", str);
265 			return 0;
266 		}
267 		*net = atoi(s+1);
268 		if(*net == 0 && strcmp(s+1, "0") != 0) {
269 			log_err("cannot parse netblock: '%s'", str);
270 			return 0;
271 		}
272 		strlcpy(buf, str, sizeof(buf));
273 		s = strchr(buf, '/');
274 		if(s) *s = 0;
275 		s = buf;
276 	}
277 	if(!ipstrtoaddr(s?s:str, port, addr, addrlen)) {
278 		log_err("cannot parse ip address: '%s'", str);
279 		return 0;
280 	}
281 	if(s) {
282 		addr_mask(addr, *addrlen, *net);
283 	}
284 	return 1;
285 }
286 
287 /* RPZ format address dname to network byte order address */
288 static int ipdnametoaddr(uint8_t* dname, size_t dnamelen,
289 	struct sockaddr_storage* addr, socklen_t* addrlen, int* af)
290 {
291 	uint8_t* ia;
292 	size_t dnamelabs = dname_count_labels(dname);
293 	uint8_t lablen;
294 	char* e = NULL;
295 	int z = 0;
296 	size_t len = 0;
297 	int i;
298 	*af = AF_INET;
299 
300 	/* need 1 byte for label length */
301 	if(dnamelen < 1)
302 		return 0;
303 
304 	if(dnamelabs > 6 ||
305 		dname_has_label(dname, dnamelen, (uint8_t*)"\002zz")) {
306 		*af = AF_INET6;
307 	}
308 	len = *dname;
309 	lablen = *dname++;
310 	i = (*af == AF_INET) ? 3 : 15;
311 	if(*af == AF_INET6) {
312 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
313 		*addrlen = (socklen_t)sizeof(struct sockaddr_in6);
314 		memset(sa, 0, *addrlen);
315 		sa->sin6_family = AF_INET6;
316 		ia = (uint8_t*)&sa->sin6_addr;
317 	} else { /* ip4 */
318 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
319 		*addrlen = (socklen_t)sizeof(struct sockaddr_in);
320 		memset(sa, 0, *addrlen);
321 		sa->sin_family = AF_INET;
322 		ia = (uint8_t*)&sa->sin_addr;
323 	}
324 	while(lablen && i >= 0 && len <= dnamelen) {
325 		char buff[LDNS_MAX_LABELLEN+1];
326 		uint16_t chunk; /* big enough to not overflow on IPv6 hextet */
327 		if((*af == AF_INET && (lablen > 3 || dnamelabs > 6)) ||
328 			(*af == AF_INET6 && (lablen > 4 || dnamelabs > 10))) {
329 			return 0;
330 		}
331 		if(memcmp(dname, "zz", 2) == 0 && *af == AF_INET6) {
332 			/* Add one or more 0 labels. Address is initialised at
333 			 * 0, so just skip the zero part. */
334 			int zl = 11 - dnamelabs;
335 			if(z || zl < 0)
336 				return 0;
337 			z = 1;
338 			i -= (zl*2);
339 		} else {
340 			memcpy(buff, dname, lablen);
341 			buff[lablen] = '\0';
342 			chunk = strtol(buff, &e, (*af == AF_INET) ? 10 : 16);
343 			if(!e || *e != '\0' || (*af == AF_INET && chunk > 255))
344 				return 0;
345 			if(*af == AF_INET) {
346 				log_assert(i < 4 && i >= 0);
347 				ia[i] = (uint8_t)chunk;
348 				i--;
349 			} else {
350 				log_assert(i < 16 && i >= 1);
351 				/* ia in network byte order */
352 				ia[i-1] = (uint8_t)(chunk >> 8);
353 				ia[i] = (uint8_t)(chunk & 0x00FF);
354 				i -= 2;
355 			}
356 		}
357 		dname += lablen;
358 		lablen = *dname++;
359 		len += lablen;
360 	}
361 	if(i != -1)
362 		/* input too short */
363 		return 0;
364 	return 1;
365 }
366 
367 int netblockdnametoaddr(uint8_t* dname, size_t dnamelen,
368 	struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af)
369 {
370 	char buff[3 /* 3 digit netblock */ + 1];
371 	size_t nlablen;
372 	if(dnamelen < 1 || *dname > 3)
373 		/* netblock invalid */
374 		return 0;
375 	nlablen = *dname;
376 
377 	if(dnamelen < 1 + nlablen)
378 		return 0;
379 
380 	memcpy(buff, dname+1, nlablen);
381 	buff[nlablen] = '\0';
382 	*net = atoi(buff);
383 	if(*net == 0 && strcmp(buff, "0") != 0)
384 		return 0;
385 	dname += nlablen;
386 	dname++;
387 	if(!ipdnametoaddr(dname, dnamelen-1-nlablen, addr, addrlen, af))
388 		return 0;
389 	if((*af == AF_INET6 && *net > 128) || (*af == AF_INET && *net > 32))
390 		return 0;
391 	return 1;
392 }
393 
394 int authextstrtoaddr(char* str, struct sockaddr_storage* addr,
395 	socklen_t* addrlen, char** auth_name)
396 {
397 	char* s;
398 	int port = UNBOUND_DNS_PORT;
399 	if((s=strchr(str, '@'))) {
400 		char buf[MAX_ADDR_STRLEN];
401 		size_t len = (size_t)(s-str);
402 		char* hash = strchr(s+1, '#');
403 		if(hash) {
404 			*auth_name = hash+1;
405 		} else {
406 			*auth_name = NULL;
407 		}
408 		if(len >= MAX_ADDR_STRLEN) {
409 			return 0;
410 		}
411 		(void)strlcpy(buf, str, sizeof(buf));
412 		buf[len] = 0;
413 		port = atoi(s+1);
414 		if(port == 0) {
415 			if(!hash && strcmp(s+1,"0")!=0)
416 				return 0;
417 			if(hash && strncmp(s+1,"0#",2)!=0)
418 				return 0;
419 		}
420 		return ipstrtoaddr(buf, port, addr, addrlen);
421 	}
422 	if((s=strchr(str, '#'))) {
423 		char buf[MAX_ADDR_STRLEN];
424 		size_t len = (size_t)(s-str);
425 		if(len >= MAX_ADDR_STRLEN) {
426 			return 0;
427 		}
428 		(void)strlcpy(buf, str, sizeof(buf));
429 		buf[len] = 0;
430 		port = UNBOUND_DNS_OVER_TLS_PORT;
431 		*auth_name = s+1;
432 		return ipstrtoaddr(buf, port, addr, addrlen);
433 	}
434 	*auth_name = NULL;
435 	return ipstrtoaddr(str, port, addr, addrlen);
436 }
437 
438 /** store port number into sockaddr structure */
439 void
440 sockaddr_store_port(struct sockaddr_storage* addr, socklen_t addrlen, int port)
441 {
442 	if(addr_is_ip6(addr, addrlen)) {
443 		struct sockaddr_in6* sa = (struct sockaddr_in6*)addr;
444 		sa->sin6_port = (in_port_t)htons((uint16_t)port);
445 	} else {
446 		struct sockaddr_in* sa = (struct sockaddr_in*)addr;
447 		sa->sin_port = (in_port_t)htons((uint16_t)port);
448 	}
449 }
450 
451 void
452 log_nametypeclass(enum verbosity_value v, const char* str, uint8_t* name,
453 	uint16_t type, uint16_t dclass)
454 {
455 	char buf[LDNS_MAX_DOMAINLEN+1];
456 	char t[12], c[12];
457 	const char *ts, *cs;
458 	if(verbosity < v)
459 		return;
460 	dname_str(name, buf);
461 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
462 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
463 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
464 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
465 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
466 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
467 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
468 		ts = sldns_rr_descript(type)->_name;
469 	else {
470 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
471 		ts = t;
472 	}
473 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
474 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
475 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
476 	else {
477 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
478 		cs = c;
479 	}
480 	log_info("%s %s %s %s", str, buf, ts, cs);
481 }
482 
483 void
484 log_query_in(const char* str, uint8_t* name, uint16_t type, uint16_t dclass)
485 {
486 	char buf[LDNS_MAX_DOMAINLEN+1];
487 	char t[12], c[12];
488 	const char *ts, *cs;
489 	dname_str(name, buf);
490 	if(type == LDNS_RR_TYPE_TSIG) ts = "TSIG";
491 	else if(type == LDNS_RR_TYPE_IXFR) ts = "IXFR";
492 	else if(type == LDNS_RR_TYPE_AXFR) ts = "AXFR";
493 	else if(type == LDNS_RR_TYPE_MAILB) ts = "MAILB";
494 	else if(type == LDNS_RR_TYPE_MAILA) ts = "MAILA";
495 	else if(type == LDNS_RR_TYPE_ANY) ts = "ANY";
496 	else if(sldns_rr_descript(type) && sldns_rr_descript(type)->_name)
497 		ts = sldns_rr_descript(type)->_name;
498 	else {
499 		snprintf(t, sizeof(t), "TYPE%d", (int)type);
500 		ts = t;
501 	}
502 	if(sldns_lookup_by_id(sldns_rr_classes, (int)dclass) &&
503 		sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name)
504 		cs = sldns_lookup_by_id(sldns_rr_classes, (int)dclass)->name;
505 	else {
506 		snprintf(c, sizeof(c), "CLASS%d", (int)dclass);
507 		cs = c;
508 	}
509 	if(LOG_TAG_QUERYREPLY)
510 		log_query("%s %s %s %s", str, buf, ts, cs);
511 	else	log_info("%s %s %s %s", str, buf, ts, cs);
512 }
513 
514 void log_name_addr(enum verbosity_value v, const char* str, uint8_t* zone,
515 	struct sockaddr_storage* addr, socklen_t addrlen)
516 {
517 	uint16_t port;
518 	const char* family = "unknown_family ";
519 	char namebuf[LDNS_MAX_DOMAINLEN+1];
520 	char dest[100];
521 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
522 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
523 	if(verbosity < v)
524 		return;
525 	switch(af) {
526 		case AF_INET: family=""; break;
527 		case AF_INET6: family="";
528 			sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
529 			break;
530 		case AF_LOCAL: family="local "; break;
531 		default: break;
532 	}
533 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
534 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
535 	}
536 	dest[sizeof(dest)-1] = 0;
537 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
538 	dname_str(zone, namebuf);
539 	if(af != AF_INET && af != AF_INET6)
540 		verbose(v, "%s <%s> %s%s#%d (addrlen %d)",
541 			str, namebuf, family, dest, (int)port, (int)addrlen);
542 	else	verbose(v, "%s <%s> %s%s#%d",
543 			str, namebuf, family, dest, (int)port);
544 }
545 
546 void log_err_addr(const char* str, const char* err,
547 	struct sockaddr_storage* addr, socklen_t addrlen)
548 {
549 	uint16_t port;
550 	char dest[100];
551 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
552 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
553 	if(af == AF_INET6)
554 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
555 	if(inet_ntop(af, sinaddr, dest, (socklen_t)sizeof(dest)) == 0) {
556 		(void)strlcpy(dest, "(inet_ntop error)", sizeof(dest));
557 	}
558 	dest[sizeof(dest)-1] = 0;
559 	port = ntohs(((struct sockaddr_in*)addr)->sin_port);
560 	if(verbosity >= 4)
561 		log_err("%s: %s for %s port %d (len %d)", str, err, dest,
562 			(int)port, (int)addrlen);
563 	else	log_err("%s: %s for %s port %d", str, err, dest, (int)port);
564 }
565 
566 int
567 sockaddr_cmp(struct sockaddr_storage* addr1, socklen_t len1,
568 	struct sockaddr_storage* addr2, socklen_t len2)
569 {
570 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
571 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
572 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
573 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
574 	if(len1 < len2)
575 		return -1;
576 	if(len1 > len2)
577 		return 1;
578 	log_assert(len1 == len2);
579 	if( p1_in->sin_family < p2_in->sin_family)
580 		return -1;
581 	if( p1_in->sin_family > p2_in->sin_family)
582 		return 1;
583 	log_assert( p1_in->sin_family == p2_in->sin_family );
584 	/* compare ip4 */
585 	if( p1_in->sin_family == AF_INET ) {
586 		/* just order it, ntohs not required */
587 		if(p1_in->sin_port < p2_in->sin_port)
588 			return -1;
589 		if(p1_in->sin_port > p2_in->sin_port)
590 			return 1;
591 		log_assert(p1_in->sin_port == p2_in->sin_port);
592 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
593 	} else if (p1_in6->sin6_family == AF_INET6) {
594 		/* just order it, ntohs not required */
595 		if(p1_in6->sin6_port < p2_in6->sin6_port)
596 			return -1;
597 		if(p1_in6->sin6_port > p2_in6->sin6_port)
598 			return 1;
599 		log_assert(p1_in6->sin6_port == p2_in6->sin6_port);
600 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
601 			INET6_SIZE);
602 	} else {
603 		/* eek unknown type, perform this comparison for sanity. */
604 		return memcmp(addr1, addr2, len1);
605 	}
606 }
607 
608 int
609 sockaddr_cmp_addr(struct sockaddr_storage* addr1, socklen_t len1,
610 	struct sockaddr_storage* addr2, socklen_t len2)
611 {
612 	struct sockaddr_in* p1_in = (struct sockaddr_in*)addr1;
613 	struct sockaddr_in* p2_in = (struct sockaddr_in*)addr2;
614 	struct sockaddr_in6* p1_in6 = (struct sockaddr_in6*)addr1;
615 	struct sockaddr_in6* p2_in6 = (struct sockaddr_in6*)addr2;
616 	if(len1 < len2)
617 		return -1;
618 	if(len1 > len2)
619 		return 1;
620 	log_assert(len1 == len2);
621 	if( p1_in->sin_family < p2_in->sin_family)
622 		return -1;
623 	if( p1_in->sin_family > p2_in->sin_family)
624 		return 1;
625 	log_assert( p1_in->sin_family == p2_in->sin_family );
626 	/* compare ip4 */
627 	if( p1_in->sin_family == AF_INET ) {
628 		return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);
629 	} else if (p1_in6->sin6_family == AF_INET6) {
630 		return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
631 			INET6_SIZE);
632 	} else {
633 		/* eek unknown type, perform this comparison for sanity. */
634 		return memcmp(addr1, addr2, len1);
635 	}
636 }
637 
638 int
639 addr_is_ip6(struct sockaddr_storage* addr, socklen_t len)
640 {
641 	if(len == (socklen_t)sizeof(struct sockaddr_in6) &&
642 		((struct sockaddr_in6*)addr)->sin6_family == AF_INET6)
643 		return 1;
644 	else    return 0;
645 }
646 
647 void
648 addr_mask(struct sockaddr_storage* addr, socklen_t len, int net)
649 {
650 	uint8_t mask[8] = {0x0, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
651 	int i, max;
652 	uint8_t* s;
653 	if(addr_is_ip6(addr, len)) {
654 		s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
655 		max = 128;
656 	} else {
657 		s = (uint8_t*)&((struct sockaddr_in*)addr)->sin_addr;
658 		max = 32;
659 	}
660 	if(net >= max)
661 		return;
662 	for(i=net/8+1; i<max/8; i++) {
663 		s[i] = 0;
664 	}
665 	s[net/8] &= mask[net&0x7];
666 }
667 
668 int
669 addr_in_common(struct sockaddr_storage* addr1, int net1,
670 	struct sockaddr_storage* addr2, int net2, socklen_t addrlen)
671 {
672 	int min = (net1<net2)?net1:net2;
673 	int i, to;
674 	int match = 0;
675 	uint8_t* s1, *s2;
676 	if(addr_is_ip6(addr1, addrlen)) {
677 		s1 = (uint8_t*)&((struct sockaddr_in6*)addr1)->sin6_addr;
678 		s2 = (uint8_t*)&((struct sockaddr_in6*)addr2)->sin6_addr;
679 		to = 16;
680 	} else {
681 		s1 = (uint8_t*)&((struct sockaddr_in*)addr1)->sin_addr;
682 		s2 = (uint8_t*)&((struct sockaddr_in*)addr2)->sin_addr;
683 		to = 4;
684 	}
685 	/* match = bits_in_common(s1, s2, to); */
686 	for(i=0; i<to; i++) {
687 		if(s1[i] == s2[i]) {
688 			match += 8;
689 		} else {
690 			uint8_t z = s1[i]^s2[i];
691 			log_assert(z);
692 			while(!(z&0x80)) {
693 				match++;
694 				z<<=1;
695 			}
696 			break;
697 		}
698 	}
699 	if(match > min) match = min;
700 	return match;
701 }
702 
703 void
704 addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
705 	char* buf, size_t len)
706 {
707 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
708 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
709 	if(addr_is_ip6(addr, addrlen))
710 		sinaddr = &((struct sockaddr_in6*)addr)->sin6_addr;
711 	if(inet_ntop(af, sinaddr, buf, (socklen_t)len) == 0) {
712 		snprintf(buf, len, "(inet_ntop_error)");
713 	}
714 }
715 
716 int
717 addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
718 {
719 	/* prefix for ipv4 into ipv6 mapping is ::ffff:x.x.x.x */
720 	const uint8_t map_prefix[16] =
721 		{0,0,0,0,  0,0,0,0, 0,0,0xff,0xff, 0,0,0,0};
722 	uint8_t* s;
723 	if(!addr_is_ip6(addr, addrlen))
724 		return 0;
725 	/* s is 16 octet ipv6 address string */
726 	s = (uint8_t*)&((struct sockaddr_in6*)addr)->sin6_addr;
727 	return (memcmp(s, map_prefix, 12) == 0);
728 }
729 
730 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
731 {
732 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
733 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
734 	return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
735 		&& memcmp(sinaddr, "\377\377\377\377", 4) == 0;
736 }
737 
738 int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
739 {
740 	int af = (int)((struct sockaddr_in*)addr)->sin_family;
741 	void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
742 	void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
743 	if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
744 		&& memcmp(sinaddr, "\000\000\000\000", 4) == 0)
745 		return 1;
746 	else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
747 		&& memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
748 		"\000\000\000\000\000\000\000\000", 16) == 0)
749 		return 1;
750 	return 0;
751 }
752 
753 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
754 	socklen_t len, struct regional* region)
755 {
756 	struct sock_list* add = (struct sock_list*)regional_alloc(region,
757 		sizeof(*add) - sizeof(add->addr) + (size_t)len);
758 	if(!add) {
759 		log_err("out of memory in socketlist insert");
760 		return;
761 	}
762 	log_assert(list);
763 	add->next = *list;
764 	add->len = len;
765 	*list = add;
766 	if(len) memmove(&add->addr, addr, len);
767 }
768 
769 void sock_list_prepend(struct sock_list** list, struct sock_list* add)
770 {
771 	struct sock_list* last = add;
772 	if(!last)
773 		return;
774 	while(last->next)
775 		last = last->next;
776 	last->next = *list;
777 	*list = add;
778 }
779 
780 int sock_list_find(struct sock_list* list, struct sockaddr_storage* addr,
781         socklen_t len)
782 {
783 	while(list) {
784 		if(len == list->len) {
785 			if(len == 0 || sockaddr_cmp_addr(addr, len,
786 				&list->addr, list->len) == 0)
787 				return 1;
788 		}
789 		list = list->next;
790 	}
791 	return 0;
792 }
793 
794 void sock_list_merge(struct sock_list** list, struct regional* region,
795 	struct sock_list* add)
796 {
797 	struct sock_list* p;
798 	for(p=add; p; p=p->next) {
799 		if(!sock_list_find(*list, &p->addr, p->len))
800 			sock_list_insert(list, &p->addr, p->len, region);
801 	}
802 }
803 
804 void
805 log_crypto_err(const char* str)
806 {
807 #ifdef HAVE_SSL
808 	log_crypto_err_code(str, ERR_get_error());
809 #else
810 	(void)str;
811 #endif /* HAVE_SSL */
812 }
813 
814 void log_crypto_err_code(const char* str, unsigned long err)
815 {
816 #ifdef HAVE_SSL
817 	/* error:[error code]:[library name]:[function name]:[reason string] */
818 	char buf[128];
819 	unsigned long e;
820 	ERR_error_string_n(err, buf, sizeof(buf));
821 	log_err("%s crypto %s", str, buf);
822 	while( (e=ERR_get_error()) ) {
823 		ERR_error_string_n(e, buf, sizeof(buf));
824 		log_err("and additionally crypto %s", buf);
825 	}
826 #else
827 	(void)str;
828 	(void)err;
829 #endif /* HAVE_SSL */
830 }
831 
832 int
833 listen_sslctx_setup(void* ctxt)
834 {
835 #ifdef HAVE_SSL
836 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
837 	/* no SSLv2, SSLv3 because has defects */
838 #if SSL_OP_NO_SSLv2 != 0
839 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
840 		!= SSL_OP_NO_SSLv2){
841 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
842 		return 0;
843 	}
844 #endif
845 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
846 		!= SSL_OP_NO_SSLv3){
847 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
848 		return 0;
849 	}
850 #if defined(SSL_OP_NO_TLSv1) && defined(SSL_OP_NO_TLSv1_1)
851 	/* if we have tls 1.1 disable 1.0 */
852 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1) & SSL_OP_NO_TLSv1)
853 		!= SSL_OP_NO_TLSv1){
854 		log_crypto_err("could not set SSL_OP_NO_TLSv1");
855 		return 0;
856 	}
857 #endif
858 #if defined(SSL_OP_NO_TLSv1_1) && defined(SSL_OP_NO_TLSv1_2)
859 	/* if we have tls 1.2 disable 1.1 */
860 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1_1) & SSL_OP_NO_TLSv1_1)
861 		!= SSL_OP_NO_TLSv1_1){
862 		log_crypto_err("could not set SSL_OP_NO_TLSv1_1");
863 		return 0;
864 	}
865 #endif
866 #if defined(SSL_OP_NO_RENEGOTIATION)
867 	/* disable client renegotiation */
868 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
869 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
870 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
871 		return 0;
872 	}
873 #endif
874 #if defined(SHA256_DIGEST_LENGTH) && defined(USE_ECDSA)
875 	/* if we have sha256, set the cipher list to have no known vulns */
876 	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"))
877 		log_crypto_err("could not set cipher list with SSL_CTX_set_cipher_list");
878 #endif
879 
880 	if((SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE) &
881 		SSL_OP_CIPHER_SERVER_PREFERENCE) !=
882 		SSL_OP_CIPHER_SERVER_PREFERENCE) {
883 		log_crypto_err("could not set SSL_OP_CIPHER_SERVER_PREFERENCE");
884 		return 0;
885 	}
886 
887 #ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
888 	SSL_CTX_set_security_level(ctx, 0);
889 #endif
890 #else
891 	(void)ctxt;
892 #endif /* HAVE_SSL */
893 	return 1;
894 }
895 
896 void
897 listen_sslctx_setup_2(void* ctxt)
898 {
899 #ifdef HAVE_SSL
900 	SSL_CTX* ctx = (SSL_CTX*)ctxt;
901 	(void)ctx;
902 #if HAVE_DECL_SSL_CTX_SET_ECDH_AUTO
903 	if(!SSL_CTX_set_ecdh_auto(ctx,1)) {
904 		log_crypto_err("Error in SSL_CTX_ecdh_auto, not enabling ECDHE");
905 	}
906 #elif defined(USE_ECDSA)
907 	if(1) {
908 		EC_KEY *ecdh = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1);
909 		if (!ecdh) {
910 			log_crypto_err("could not find p256, not enabling ECDHE");
911 		} else {
912 			if (1 != SSL_CTX_set_tmp_ecdh (ctx, ecdh)) {
913 				log_crypto_err("Error in SSL_CTX_set_tmp_ecdh, not enabling ECDHE");
914 			}
915 			EC_KEY_free (ecdh);
916 		}
917 	}
918 #endif
919 #else
920 	(void)ctxt;
921 #endif /* HAVE_SSL */
922 }
923 
924 void* listen_sslctx_create(char* key, char* pem, char* verifypem)
925 {
926 #ifdef HAVE_SSL
927 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
928 	if(!ctx) {
929 		log_crypto_err("could not SSL_CTX_new");
930 		return NULL;
931 	}
932 	if(!key || key[0] == 0) {
933 		log_err("error: no tls-service-key file specified");
934 		SSL_CTX_free(ctx);
935 		return NULL;
936 	}
937 	if(!pem || pem[0] == 0) {
938 		log_err("error: no tls-service-pem file specified");
939 		SSL_CTX_free(ctx);
940 		return NULL;
941 	}
942 	if(!listen_sslctx_setup(ctx)) {
943 		SSL_CTX_free(ctx);
944 		return NULL;
945 	}
946 	if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
947 		log_err("error for cert file: %s", pem);
948 		log_crypto_err("error in SSL_CTX use_certificate_chain_file");
949 		SSL_CTX_free(ctx);
950 		return NULL;
951 	}
952 	if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
953 		log_err("error for private key file: %s", key);
954 		log_crypto_err("Error in SSL_CTX use_PrivateKey_file");
955 		SSL_CTX_free(ctx);
956 		return NULL;
957 	}
958 	if(!SSL_CTX_check_private_key(ctx)) {
959 		log_err("error for key file: %s", key);
960 		log_crypto_err("Error in SSL_CTX check_private_key");
961 		SSL_CTX_free(ctx);
962 		return NULL;
963 	}
964 	listen_sslctx_setup_2(ctx);
965 	if(verifypem && verifypem[0]) {
966 		if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
967 			log_crypto_err("Error in SSL_CTX verify locations");
968 			SSL_CTX_free(ctx);
969 			return NULL;
970 		}
971 		SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(
972 			verifypem));
973 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
974 	}
975 	return ctx;
976 #else
977 	(void)key; (void)pem; (void)verifypem;
978 	return NULL;
979 #endif
980 }
981 
982 #ifdef USE_WINSOCK
983 /* For windows, the CA trust store is not read by openssl.
984    Add code to open the trust store using wincrypt API and add
985    the root certs into openssl trust store */
986 static int
987 add_WIN_cacerts_to_openssl_store(SSL_CTX* tls_ctx)
988 {
989 	HCERTSTORE      hSystemStore;
990 	PCCERT_CONTEXT  pTargetCert = NULL;
991 	X509_STORE*	store;
992 
993 	verbose(VERB_ALGO, "Adding Windows certificates from system root store to CA store");
994 
995 	/* load just once per context lifetime for this version
996 	   TODO: dynamically update CA trust changes as they are available */
997 	if (!tls_ctx)
998 		return 0;
999 
1000 	/* Call wincrypt's CertOpenStore to open the CA root store. */
1001 
1002 	if ((hSystemStore = CertOpenStore(
1003 		CERT_STORE_PROV_SYSTEM,
1004 		0,
1005 		0,
1006 		/* NOTE: mingw does not have this const: replace with 1 << 16 from code
1007 		   CERT_SYSTEM_STORE_CURRENT_USER, */
1008 		1 << 16,
1009 		L"root")) == 0)
1010 	{
1011 		return 0;
1012 	}
1013 
1014 	store = SSL_CTX_get_cert_store(tls_ctx);
1015 	if (!store)
1016 		return 0;
1017 
1018 	/* failure if the CA store is empty or the call fails */
1019 	if ((pTargetCert = CertEnumCertificatesInStore(
1020 		hSystemStore, pTargetCert)) == 0) {
1021 		verbose(VERB_ALGO, "CA certificate store for Windows is empty.");
1022 		return 0;
1023 	}
1024 	/* iterate over the windows cert store and add to openssl store */
1025 	do
1026 	{
1027 		X509 *cert1 = d2i_X509(NULL,
1028 			(const unsigned char **)&pTargetCert->pbCertEncoded,
1029 			pTargetCert->cbCertEncoded);
1030 		if (!cert1) {
1031 			/* return error if a cert fails */
1032 			verbose(VERB_ALGO, "%s %d:%s",
1033 				"Unable to parse certificate in memory",
1034 				(int)ERR_get_error(), ERR_error_string(ERR_get_error(), NULL));
1035 			return 0;
1036 		}
1037 		else {
1038 			/* return error if a cert add to store fails */
1039 			if (X509_STORE_add_cert(store, cert1) == 0) {
1040 				unsigned long error = ERR_peek_last_error();
1041 
1042 				/* Ignore error X509_R_CERT_ALREADY_IN_HASH_TABLE which means the
1043 				* certificate is already in the store.  */
1044 				if(ERR_GET_LIB(error) != ERR_LIB_X509 ||
1045 				   ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
1046 					verbose(VERB_ALGO, "%s %d:%s\n",
1047 					    "Error adding certificate", (int)ERR_get_error(),
1048 					     ERR_error_string(ERR_get_error(), NULL));
1049 					X509_free(cert1);
1050 					return 0;
1051 				}
1052 			}
1053 			X509_free(cert1);
1054 		}
1055 	} while ((pTargetCert = CertEnumCertificatesInStore(
1056 		hSystemStore, pTargetCert)) != 0);
1057 
1058 	/* Clean up memory and quit. */
1059 	if (pTargetCert)
1060 		CertFreeCertificateContext(pTargetCert);
1061 	if (hSystemStore)
1062 	{
1063 		if (!CertCloseStore(
1064 			hSystemStore, 0))
1065 			return 0;
1066 	}
1067 	verbose(VERB_ALGO, "Completed adding Windows certificates to CA store successfully");
1068 	return 1;
1069 }
1070 #endif /* USE_WINSOCK */
1071 
1072 void* connect_sslctx_create(char* key, char* pem, char* verifypem, int wincert)
1073 {
1074 #ifdef HAVE_SSL
1075 	SSL_CTX* ctx = SSL_CTX_new(SSLv23_client_method());
1076 	if(!ctx) {
1077 		log_crypto_err("could not allocate SSL_CTX pointer");
1078 		return NULL;
1079 	}
1080 #if SSL_OP_NO_SSLv2 != 0
1081 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2) & SSL_OP_NO_SSLv2)
1082 		!= SSL_OP_NO_SSLv2) {
1083 		log_crypto_err("could not set SSL_OP_NO_SSLv2");
1084 		SSL_CTX_free(ctx);
1085 		return NULL;
1086 	}
1087 #endif
1088 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3) & SSL_OP_NO_SSLv3)
1089 		!= SSL_OP_NO_SSLv3) {
1090 		log_crypto_err("could not set SSL_OP_NO_SSLv3");
1091 		SSL_CTX_free(ctx);
1092 		return NULL;
1093 	}
1094 #if defined(SSL_OP_NO_RENEGOTIATION)
1095 	/* disable client renegotiation */
1096 	if((SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION) &
1097 		SSL_OP_NO_RENEGOTIATION) != SSL_OP_NO_RENEGOTIATION) {
1098 		log_crypto_err("could not set SSL_OP_NO_RENEGOTIATION");
1099 		return 0;
1100 	}
1101 #endif
1102 	if(key && key[0]) {
1103 		if(!SSL_CTX_use_certificate_chain_file(ctx, pem)) {
1104 			log_err("error in client certificate %s", pem);
1105 			log_crypto_err("error in certificate file");
1106 			SSL_CTX_free(ctx);
1107 			return NULL;
1108 		}
1109 		if(!SSL_CTX_use_PrivateKey_file(ctx, key, SSL_FILETYPE_PEM)) {
1110 			log_err("error in client private key %s", key);
1111 			log_crypto_err("error in key file");
1112 			SSL_CTX_free(ctx);
1113 			return NULL;
1114 		}
1115 		if(!SSL_CTX_check_private_key(ctx)) {
1116 			log_err("error in client key %s", key);
1117 			log_crypto_err("error in SSL_CTX_check_private_key");
1118 			SSL_CTX_free(ctx);
1119 			return NULL;
1120 		}
1121 	}
1122 	if((verifypem && verifypem[0]) || wincert) {
1123 		if(verifypem && verifypem[0]) {
1124 			if(!SSL_CTX_load_verify_locations(ctx, verifypem, NULL)) {
1125 				log_crypto_err("error in SSL_CTX verify");
1126 				SSL_CTX_free(ctx);
1127 				return NULL;
1128 			}
1129 		}
1130 #ifdef USE_WINSOCK
1131 		if(wincert) {
1132 			if(!add_WIN_cacerts_to_openssl_store(ctx)) {
1133 				log_crypto_err("error in add_WIN_cacerts_to_openssl_store");
1134 				SSL_CTX_free(ctx);
1135 				return NULL;
1136 			}
1137 		}
1138 #else
1139 		(void)wincert;
1140 #endif
1141 		SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
1142 	}
1143 	return ctx;
1144 #else
1145 	(void)key; (void)pem; (void)verifypem; (void)wincert;
1146 	return NULL;
1147 #endif
1148 }
1149 
1150 void* incoming_ssl_fd(void* sslctx, int fd)
1151 {
1152 #ifdef HAVE_SSL
1153 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1154 	if(!ssl) {
1155 		log_crypto_err("could not SSL_new");
1156 		return NULL;
1157 	}
1158 	SSL_set_accept_state(ssl);
1159 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1160 	if(!SSL_set_fd(ssl, fd)) {
1161 		log_crypto_err("could not SSL_set_fd");
1162 		SSL_free(ssl);
1163 		return NULL;
1164 	}
1165 	return ssl;
1166 #else
1167 	(void)sslctx; (void)fd;
1168 	return NULL;
1169 #endif
1170 }
1171 
1172 void* outgoing_ssl_fd(void* sslctx, int fd)
1173 {
1174 #ifdef HAVE_SSL
1175 	SSL* ssl = SSL_new((SSL_CTX*)sslctx);
1176 	if(!ssl) {
1177 		log_crypto_err("could not SSL_new");
1178 		return NULL;
1179 	}
1180 	SSL_set_connect_state(ssl);
1181 	(void)SSL_set_mode(ssl, (long)SSL_MODE_AUTO_RETRY);
1182 	if(!SSL_set_fd(ssl, fd)) {
1183 		log_crypto_err("could not SSL_set_fd");
1184 		SSL_free(ssl);
1185 		return NULL;
1186 	}
1187 	return ssl;
1188 #else
1189 	(void)sslctx; (void)fd;
1190 	return NULL;
1191 #endif
1192 }
1193 
1194 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1195 /** global lock list for openssl locks */
1196 static lock_basic_type *ub_openssl_locks = NULL;
1197 
1198 /** callback that gets thread id for openssl */
1199 #ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1200 static void
1201 ub_crypto_id_cb(CRYPTO_THREADID *id)
1202 {
1203 	CRYPTO_THREADID_set_numeric(id, (unsigned long)log_thread_get());
1204 }
1205 #else
1206 static unsigned long
1207 ub_crypto_id_cb(void)
1208 {
1209 	return (unsigned long)log_thread_get();
1210 }
1211 #endif
1212 
1213 static void
1214 ub_crypto_lock_cb(int mode, int type, const char *ATTR_UNUSED(file),
1215 	int ATTR_UNUSED(line))
1216 {
1217 	if((mode&CRYPTO_LOCK)) {
1218 		lock_basic_lock(&ub_openssl_locks[type]);
1219 	} else {
1220 		lock_basic_unlock(&ub_openssl_locks[type]);
1221 	}
1222 }
1223 #endif /* OPENSSL_THREADS */
1224 
1225 int ub_openssl_lock_init(void)
1226 {
1227 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1228 	int i;
1229 	ub_openssl_locks = (lock_basic_type*)reallocarray(
1230 		NULL, (size_t)CRYPTO_num_locks(), sizeof(lock_basic_type));
1231 	if(!ub_openssl_locks)
1232 		return 0;
1233 	for(i=0; i<CRYPTO_num_locks(); i++) {
1234 		lock_basic_init(&ub_openssl_locks[i]);
1235 	}
1236 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1237 	CRYPTO_THREADID_set_callback(&ub_crypto_id_cb);
1238 #  else
1239 	CRYPTO_set_id_callback(&ub_crypto_id_cb);
1240 #  endif
1241 	CRYPTO_set_locking_callback(&ub_crypto_lock_cb);
1242 #endif /* OPENSSL_THREADS */
1243 	return 1;
1244 }
1245 
1246 void ub_openssl_lock_delete(void)
1247 {
1248 #if defined(HAVE_SSL) && defined(OPENSSL_THREADS) && !defined(THREADS_DISABLED) && defined(CRYPTO_LOCK) && OPENSSL_VERSION_NUMBER < 0x10100000L
1249 	int i;
1250 	if(!ub_openssl_locks)
1251 		return;
1252 #  ifdef HAVE_CRYPTO_THREADID_SET_CALLBACK
1253 	CRYPTO_THREADID_set_callback(NULL);
1254 #  else
1255 	CRYPTO_set_id_callback(NULL);
1256 #  endif
1257 	CRYPTO_set_locking_callback(NULL);
1258 	for(i=0; i<CRYPTO_num_locks(); i++) {
1259 		lock_basic_destroy(&ub_openssl_locks[i]);
1260 	}
1261 	free(ub_openssl_locks);
1262 #endif /* OPENSSL_THREADS */
1263 }
1264 
1265 int listen_sslctx_setup_ticket_keys(void* sslctx, struct config_strlist* tls_session_ticket_keys) {
1266 #ifdef HAVE_SSL
1267 	size_t s = 1;
1268 	struct config_strlist* p;
1269 	struct tls_session_ticket_key *keys;
1270 	for(p = tls_session_ticket_keys; p; p = p->next) {
1271 		s++;
1272 	}
1273 	keys = calloc(s, sizeof(struct tls_session_ticket_key));
1274 	if(!keys)
1275 		return 0;
1276 	memset(keys, 0, s*sizeof(*keys));
1277 	ticket_keys = keys;
1278 
1279 	for(p = tls_session_ticket_keys; p; p = p->next) {
1280 		size_t n;
1281 		unsigned char *data;
1282 		FILE *f;
1283 
1284 		data = (unsigned char *)malloc(80);
1285 		if(!data)
1286 			return 0;
1287 
1288 		f = fopen(p->str, "r");
1289 		if(!f) {
1290 			log_err("could not read tls-session-ticket-key %s: %s", p->str, strerror(errno));
1291 			free(data);
1292 			return 0;
1293 		}
1294 		n = fread(data, 1, 80, f);
1295 		fclose(f);
1296 
1297 		if(n != 80) {
1298 			log_err("tls-session-ticket-key %s is %d bytes, must be 80 bytes", p->str, (int)n);
1299 			free(data);
1300 			return 0;
1301 		}
1302 		verbose(VERB_OPS, "read tls-session-ticket-key: %s", p->str);
1303 
1304 		keys->key_name = data;
1305 		keys->aes_key = data + 16;
1306 		keys->hmac_key = data + 48;
1307 		keys++;
1308 	}
1309 	/* terminate array with NULL key name entry */
1310 	keys->key_name = NULL;
1311 	if(SSL_CTX_set_tlsext_ticket_key_cb(sslctx, tls_session_ticket_key_cb) == 0) {
1312 		log_err("no support for TLS session ticket");
1313 		return 0;
1314 	}
1315 	return 1;
1316 #else
1317 	(void)sslctx;
1318 	(void)tls_session_ticket_keys;
1319 	return 0;
1320 #endif
1321 
1322 }
1323 
1324 int tls_session_ticket_key_cb(void *ATTR_UNUSED(sslctx), unsigned char* key_name, unsigned char* iv, void *evp_sctx, void *hmac_ctx, int enc)
1325 {
1326 #ifdef HAVE_SSL
1327 	const EVP_MD *digest;
1328 	const EVP_CIPHER *cipher;
1329 	int evp_cipher_length;
1330 	digest = EVP_sha256();
1331 	cipher = EVP_aes_256_cbc();
1332 	evp_cipher_length = EVP_CIPHER_iv_length(cipher);
1333 	if( enc == 1 ) {
1334 		/* encrypt */
1335 		verbose(VERB_CLIENT, "start session encrypt");
1336 		memcpy(key_name, ticket_keys->key_name, 16);
1337 		if (RAND_bytes(iv, evp_cipher_length) != 1) {
1338 			verbose(VERB_CLIENT, "RAND_bytes failed");
1339 			return -1;
1340 		}
1341 		if (EVP_EncryptInit_ex(evp_sctx, cipher, NULL, ticket_keys->aes_key, iv) != 1) {
1342 			verbose(VERB_CLIENT, "EVP_EncryptInit_ex failed");
1343 			return -1;
1344 		}
1345 #ifndef HMAC_INIT_EX_RETURNS_VOID
1346 		if (HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL) != 1) {
1347 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1348 			return -1;
1349 		}
1350 #else
1351 		HMAC_Init_ex(hmac_ctx, ticket_keys->hmac_key, 32, digest, NULL);
1352 #endif
1353 		return 1;
1354 	} else if (enc == 0) {
1355 		/* decrypt */
1356 		struct tls_session_ticket_key *key;
1357 		verbose(VERB_CLIENT, "start session decrypt");
1358 		for(key = ticket_keys; key->key_name != NULL; key++) {
1359 			if (!memcmp(key_name, key->key_name, 16)) {
1360 				verbose(VERB_CLIENT, "Found session_key");
1361 				break;
1362 			}
1363 		}
1364 		if(key->key_name == NULL) {
1365 			verbose(VERB_CLIENT, "Not found session_key");
1366 			return 0;
1367 		}
1368 
1369 #ifndef HMAC_INIT_EX_RETURNS_VOID
1370 		if (HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL) != 1) {
1371 			verbose(VERB_CLIENT, "HMAC_Init_ex failed");
1372 			return -1;
1373 		}
1374 #else
1375 		HMAC_Init_ex(hmac_ctx, key->hmac_key, 32, digest, NULL);
1376 #endif
1377 		if (EVP_DecryptInit_ex(evp_sctx, cipher, NULL, key->aes_key, iv) != 1) {
1378 			log_err("EVP_DecryptInit_ex failed");
1379 			return -1;
1380 		}
1381 
1382 		return (key == ticket_keys) ? 1 : 2;
1383 	}
1384 	return -1;
1385 #else
1386 	(void)key_name;
1387 	(void)iv;
1388 	(void)evp_sctx;
1389 	(void)hmac_ctx;
1390 	(void)enc;
1391 	return 0;
1392 #endif
1393 }
1394 
1395 void
1396 listen_sslctx_delete_ticket_keys(void)
1397 {
1398 	struct tls_session_ticket_key *key;
1399 	if(!ticket_keys) return;
1400 	for(key = ticket_keys; key->key_name != NULL; key++) {
1401 		/* wipe key data from memory*/
1402 #ifdef HAVE_EXPLICIT_BZERO
1403 		explicit_bzero(key->key_name, 80);
1404 #else
1405 		memset(key->key_name, 0xdd, 80);
1406 #endif
1407 		free(key->key_name);
1408 	}
1409 	free(ticket_keys);
1410 	ticket_keys = NULL;
1411 }
1412