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