Coverage Report

Created: 2024-01-06 06:11

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