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