Home | History | Annotate | Line # | Download | only in validator
      1 /*
      2  * validator/val_sigcrypt.c - validator signature crypto functions.
      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 /**
     37  * \file
     38  *
     39  * This file contains helper functions for the validator module.
     40  * The functions help with signature verification and checking, the
     41  * bridging between RR wireformat data and crypto calls.
     42  */
     43 #include "config.h"
     44 #include "validator/val_sigcrypt.h"
     45 #include "validator/val_secalgo.h"
     46 #include "validator/validator.h"
     47 #include "util/data/msgreply.h"
     48 #include "util/data/msgparse.h"
     49 #include "util/data/dname.h"
     50 #include "util/rbtree.h"
     51 #include "util/rfc_1982.h"
     52 #include "util/module.h"
     53 #include "util/net_help.h"
     54 #include "util/regional.h"
     55 #include "util/config_file.h"
     56 #include "sldns/keyraw.h"
     57 #include "sldns/sbuffer.h"
     58 #include "sldns/parseutil.h"
     59 #include "sldns/wire2str.h"
     60 #include "services/mesh.h"
     61 
     62 #include <ctype.h>
     63 #if !defined(HAVE_SSL) && !defined(HAVE_NSS) && !defined(HAVE_NETTLE)
     64 #error "Need crypto library to do digital signature cryptography"
     65 #endif
     66 
     67 #ifdef HAVE_OPENSSL_ERR_H
     68 #include <openssl/err.h>
     69 #endif
     70 
     71 #ifdef HAVE_OPENSSL_RAND_H
     72 #include <openssl/rand.h>
     73 #endif
     74 
     75 #ifdef HAVE_OPENSSL_CONF_H
     76 #include <openssl/conf.h>
     77 #endif
     78 
     79 #ifdef HAVE_OPENSSL_ENGINE_H
     80 #include <openssl/engine.h>
     81 #endif
     82 
     83 /** Maximum number of RRSIG validations for an RRset. */
     84 #define MAX_VALIDATE_RRSIGS 8
     85 /** Maximum number of NSEC validations for a message. */
     86 #define MAX_VALIDATE_NSECS 8
     87 
     88 /** return number of rrs in an rrset */
     89 static size_t
     90 rrset_get_count(struct ub_packed_rrset_key* rrset)
     91 {
     92 	struct packed_rrset_data* d = (struct packed_rrset_data*)
     93 	rrset->entry.data;
     94 	if(!d) return 0;
     95 	return d->count;
     96 }
     97 
     98 /**
     99  * Get RR signature count
    100  */
    101 static size_t
    102 rrset_get_sigcount(struct ub_packed_rrset_key* k)
    103 {
    104 	struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
    105 	return d->rrsig_count;
    106 }
    107 
    108 /**
    109  * Get signature keytag value
    110  * @param k: rrset (with signatures)
    111  * @param sig_idx: signature index.
    112  * @return keytag or 0 if malformed rrsig.
    113  */
    114 static uint16_t
    115 rrset_get_sig_keytag(struct ub_packed_rrset_key* k, size_t sig_idx)
    116 {
    117 	uint16_t t;
    118 	struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
    119 	log_assert(sig_idx < d->rrsig_count);
    120 	if(d->rr_len[d->count + sig_idx] < 2+18)
    121 		return 0;
    122 	memmove(&t, d->rr_data[d->count + sig_idx]+2+16, 2);
    123 	return ntohs(t);
    124 }
    125 
    126 /**
    127  * Get signature signing algorithm value
    128  * @param k: rrset (with signatures)
    129  * @param sig_idx: signature index.
    130  * @return algo or 0 if malformed rrsig.
    131  */
    132 static int
    133 rrset_get_sig_algo(struct ub_packed_rrset_key* k, size_t sig_idx)
    134 {
    135 	struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
    136 	log_assert(sig_idx < d->rrsig_count);
    137 	if(d->rr_len[d->count + sig_idx] < 2+3)
    138 		return 0;
    139 	return (int)d->rr_data[d->count + sig_idx][2+2];
    140 }
    141 
    142 /** get rdata pointer and size */
    143 static void
    144 rrset_get_rdata(struct ub_packed_rrset_key* k, size_t idx, uint8_t** rdata,
    145 	size_t* len)
    146 {
    147 	struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
    148 	log_assert(d && idx < (d->count + d->rrsig_count));
    149 	*rdata = d->rr_data[idx];
    150 	*len = d->rr_len[idx];
    151 }
    152 
    153 uint16_t
    154 dnskey_get_flags(struct ub_packed_rrset_key* k, size_t idx)
    155 {
    156 	uint8_t* rdata;
    157 	size_t len;
    158 	uint16_t f;
    159 	rrset_get_rdata(k, idx, &rdata, &len);
    160 	if(len < 2+2)
    161 		return 0;
    162 	memmove(&f, rdata+2, 2);
    163 	f = ntohs(f);
    164 	return f;
    165 }
    166 
    167 /**
    168  * Get DNSKEY protocol value from rdata
    169  * @param k: DNSKEY rrset.
    170  * @param idx: which key.
    171  * @return protocol octet value
    172  */
    173 static int
    174 dnskey_get_protocol(struct ub_packed_rrset_key* k, size_t idx)
    175 {
    176 	uint8_t* rdata;
    177 	size_t len;
    178 	rrset_get_rdata(k, idx, &rdata, &len);
    179 	if(len < 2+4)
    180 		return 0;
    181 	return (int)rdata[2+2];
    182 }
    183 
    184 int
    185 dnskey_get_algo(struct ub_packed_rrset_key* k, size_t idx)
    186 {
    187 	uint8_t* rdata;
    188 	size_t len;
    189 	rrset_get_rdata(k, idx, &rdata, &len);
    190 	if(len < 2+4)
    191 		return 0;
    192 	return (int)rdata[2+3];
    193 }
    194 
    195 /** get public key rdata field from a dnskey RR and do some checks */
    196 static void
    197 dnskey_get_pubkey(struct ub_packed_rrset_key* k, size_t idx,
    198 	unsigned char** pk, unsigned int* pklen)
    199 {
    200 	uint8_t* rdata;
    201 	size_t len;
    202 	rrset_get_rdata(k, idx, &rdata, &len);
    203 	if(len < 2+5) {
    204 		*pk = NULL;
    205 		*pklen = 0;
    206 		return;
    207 	}
    208 	*pk = (unsigned char*)rdata+2+4;
    209 	*pklen = (unsigned)len-2-4;
    210 }
    211 
    212 int
    213 ds_get_key_algo(struct ub_packed_rrset_key* k, size_t idx)
    214 {
    215 	uint8_t* rdata;
    216 	size_t len;
    217 	rrset_get_rdata(k, idx, &rdata, &len);
    218 	if(len < 2+3)
    219 		return 0;
    220 	return (int)rdata[2+2];
    221 }
    222 
    223 int
    224 ds_get_digest_algo(struct ub_packed_rrset_key* k, size_t idx)
    225 {
    226 	uint8_t* rdata;
    227 	size_t len;
    228 	rrset_get_rdata(k, idx, &rdata, &len);
    229 	if(len < 2+4)
    230 		return 0;
    231 	return (int)rdata[2+3];
    232 }
    233 
    234 uint16_t
    235 ds_get_keytag(struct ub_packed_rrset_key* ds_rrset, size_t ds_idx)
    236 {
    237 	uint16_t t;
    238 	uint8_t* rdata;
    239 	size_t len;
    240 	rrset_get_rdata(ds_rrset, ds_idx, &rdata, &len);
    241 	if(len < 2+2)
    242 		return 0;
    243 	memmove(&t, rdata+2, 2);
    244 	return ntohs(t);
    245 }
    246 
    247 /**
    248  * Return pointer to the digest in a DS RR.
    249  * @param k: DS rrset.
    250  * @param idx: which DS.
    251  * @param digest: digest data is returned.
    252  *	on error, this is NULL.
    253  * @param len: length of digest is returned.
    254  *	on error, the length is 0.
    255  */
    256 static void
    257 ds_get_sigdata(struct ub_packed_rrset_key* k, size_t idx, uint8_t** digest,
    258         size_t* len)
    259 {
    260 	uint8_t* rdata;
    261 	size_t rdlen;
    262 	rrset_get_rdata(k, idx, &rdata, &rdlen);
    263 	if(rdlen < 2+5) {
    264 		*digest = NULL;
    265 		*len = 0;
    266 		return;
    267 	}
    268 	*digest = rdata + 2 + 4;
    269 	*len = rdlen - 2 - 4;
    270 }
    271 
    272 /**
    273  * Return size of DS digest according to its hash algorithm.
    274  * @param k: DS rrset.
    275  * @param idx: which DS.
    276  * @return size in bytes of digest, or 0 if not supported.
    277  */
    278 static size_t
    279 ds_digest_size_algo(struct ub_packed_rrset_key* k, size_t idx)
    280 {
    281 	return ds_digest_size_supported(ds_get_digest_algo(k, idx));
    282 }
    283 
    284 /**
    285  * Create a DS digest for a DNSKEY entry.
    286  *
    287  * @param env: module environment. Uses scratch space.
    288  * @param dnskey_rrset: DNSKEY rrset.
    289  * @param dnskey_idx: index of RR in rrset.
    290  * @param ds_rrset: DS rrset
    291  * @param ds_idx: index of RR in DS rrset.
    292  * @param digest: digest is returned in here (must be correctly sized).
    293  * @return false on error.
    294  */
    295 static int
    296 ds_create_dnskey_digest(struct module_env* env,
    297 	struct ub_packed_rrset_key* dnskey_rrset, size_t dnskey_idx,
    298 	struct ub_packed_rrset_key* ds_rrset, size_t ds_idx,
    299 	uint8_t* digest)
    300 {
    301 	sldns_buffer* b = env->scratch_buffer;
    302 	uint8_t* dnskey_rdata;
    303 	size_t dnskey_len;
    304 	rrset_get_rdata(dnskey_rrset, dnskey_idx, &dnskey_rdata, &dnskey_len);
    305 
    306 	/* create digest source material in buffer
    307 	 * digest = digest_algorithm( DNSKEY owner name | DNSKEY RDATA);
    308 	 *	DNSKEY RDATA = Flags | Protocol | Algorithm | Public Key. */
    309 	sldns_buffer_clear(b);
    310 	if(!sldns_buffer_available(b, dnskey_rrset->rk.dname_len + dnskey_len-2))
    311 		return 0; /* buffer too small */
    312 	sldns_buffer_write(b, dnskey_rrset->rk.dname,
    313 		dnskey_rrset->rk.dname_len);
    314 	query_dname_tolower(sldns_buffer_begin(b));
    315 	sldns_buffer_write(b, dnskey_rdata+2, dnskey_len-2); /* skip rdatalen*/
    316 	sldns_buffer_flip(b);
    317 
    318 	return secalgo_ds_digest(ds_get_digest_algo(ds_rrset, ds_idx),
    319 		(unsigned char*)sldns_buffer_begin(b), sldns_buffer_limit(b),
    320 		(unsigned char*)digest);
    321 }
    322 
    323 int ds_digest_match_dnskey(struct module_env* env,
    324 	struct ub_packed_rrset_key* dnskey_rrset, size_t dnskey_idx,
    325 	struct ub_packed_rrset_key* ds_rrset, size_t ds_idx)
    326 {
    327 	uint8_t* ds;	/* DS digest */
    328 	size_t dslen;
    329 	uint8_t* digest; /* generated digest */
    330 	size_t digestlen = ds_digest_size_algo(ds_rrset, ds_idx);
    331 
    332 	if(digestlen == 0) {
    333 		verbose(VERB_QUERY, "DS fail: not supported, or DS RR "
    334 			"format error");
    335 		return 0; /* not supported, or DS RR format error */
    336 	}
    337 #ifndef USE_SHA1
    338 	if(fake_sha1 && ds_get_digest_algo(ds_rrset, ds_idx)==LDNS_SHA1)
    339 		return 1;
    340 #endif
    341 
    342 	/* check digest length in DS with length from hash function */
    343 	ds_get_sigdata(ds_rrset, ds_idx, &ds, &dslen);
    344 	if(!ds || dslen != digestlen) {
    345 		verbose(VERB_QUERY, "DS fail: DS RR algo and digest do not "
    346 			"match each other");
    347 		return 0; /* DS algorithm and digest do not match */
    348 	}
    349 
    350 	digest = regional_alloc(env->scratch, digestlen);
    351 	if(!digest) {
    352 		verbose(VERB_QUERY, "DS fail: out of memory");
    353 		return 0; /* mem error */
    354 	}
    355 	if(!ds_create_dnskey_digest(env, dnskey_rrset, dnskey_idx, ds_rrset,
    356 		ds_idx, digest)) {
    357 		verbose(VERB_QUERY, "DS fail: could not calc key digest");
    358 		return 0; /* digest algo failed */
    359 	}
    360 	if(memcmp(digest, ds, dslen) != 0) {
    361 		verbose(VERB_QUERY, "DS fail: digest is different");
    362 		return 0; /* digest different */
    363 	}
    364 	return 1;
    365 }
    366 
    367 int
    368 ds_digest_algo_is_supported(struct ub_packed_rrset_key* ds_rrset,
    369 	size_t ds_idx)
    370 {
    371 	return (ds_digest_size_algo(ds_rrset, ds_idx) != 0);
    372 }
    373 
    374 int
    375 ds_key_algo_is_supported(struct ub_packed_rrset_key* ds_rrset,
    376 	size_t ds_idx)
    377 {
    378 	return dnskey_algo_id_is_supported(ds_get_key_algo(ds_rrset, ds_idx));
    379 }
    380 
    381 uint16_t
    382 dnskey_calc_keytag(struct ub_packed_rrset_key* dnskey_rrset, size_t dnskey_idx)
    383 {
    384 	uint8_t* data;
    385 	size_t len;
    386 	rrset_get_rdata(dnskey_rrset, dnskey_idx, &data, &len);
    387 	/* do not pass rdatalen to ldns */
    388 	return sldns_calc_keytag_raw(data+2, len-2);
    389 }
    390 
    391 int dnskey_algo_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
    392         size_t dnskey_idx)
    393 {
    394 	return dnskey_algo_id_is_supported(dnskey_get_algo(dnskey_rrset,
    395 		dnskey_idx));
    396 }
    397 
    398 int dnskey_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset,
    399 	size_t dnskey_idx)
    400 {
    401 #ifdef DEPRECATE_RSA_1024
    402 	uint8_t* rdata;
    403 	size_t len;
    404 	int alg = dnskey_get_algo(dnskey_rrset, dnskey_idx);
    405 	size_t keysize;
    406 
    407 	rrset_get_rdata(dnskey_rrset, dnskey_idx, &rdata, &len);
    408 	if(len < 2+4)
    409 		return 0;
    410 	keysize = sldns_rr_dnskey_key_size_raw(rdata+2+4, len-2-4, alg);
    411 
    412 	switch((sldns_algorithm)alg) {
    413 	case LDNS_RSAMD5:
    414 	case LDNS_RSASHA1:
    415 	case LDNS_RSASHA1_NSEC3:
    416 	case LDNS_RSASHA256:
    417 	case LDNS_RSASHA512:
    418 		/* reject RSA keys of 1024 bits and shorter */
    419 		if(keysize <= 1024)
    420 			return 0;
    421 		break;
    422 	default:
    423 		break;
    424 	}
    425 #else
    426 	(void)dnskey_rrset; (void)dnskey_idx;
    427 #endif /* DEPRECATE_RSA_1024 */
    428 	return 1;
    429 }
    430 
    431 int dnskeyset_size_is_supported(struct ub_packed_rrset_key* dnskey_rrset)
    432 {
    433 	size_t i, num = rrset_get_count(dnskey_rrset);
    434 	for(i=0; i<num; i++) {
    435 		if(!dnskey_size_is_supported(dnskey_rrset, i))
    436 			return 0;
    437 	}
    438 	return 1;
    439 }
    440 
    441 void algo_needs_init_dnskey_add(struct algo_needs* n,
    442         struct ub_packed_rrset_key* dnskey, uint8_t* sigalg)
    443 {
    444 	uint8_t algo;
    445 	size_t i, total = n->num;
    446 	size_t num = rrset_get_count(dnskey);
    447 
    448 	for(i=0; i<num; i++) {
    449 		algo = (uint8_t)dnskey_get_algo(dnskey, i);
    450 		if(!dnskey_algo_id_is_supported((int)algo))
    451 			continue;
    452 		if(n->needs[algo] == 0) {
    453 			n->needs[algo] = 1;
    454 			sigalg[total] = algo;
    455 			total++;
    456 		}
    457 	}
    458 	sigalg[total] = 0;
    459 	n->num = total;
    460 }
    461 
    462 void algo_needs_init_list(struct algo_needs* n, uint8_t* sigalg)
    463 {
    464 	uint8_t algo;
    465 	size_t total = 0;
    466 
    467 	memset(n->needs, 0, sizeof(uint8_t)*ALGO_NEEDS_MAX);
    468 	while( (algo=*sigalg++) != 0) {
    469 		log_assert(dnskey_algo_id_is_supported((int)algo));
    470 		log_assert(n->needs[algo] == 0);
    471 		n->needs[algo] = 1;
    472 		total++;
    473 	}
    474 	n->num = total;
    475 }
    476 
    477 void algo_needs_init_ds(struct algo_needs* n, struct ub_packed_rrset_key* ds,
    478 	int fav_ds_algo, uint8_t* sigalg)
    479 {
    480 	uint8_t algo;
    481 	size_t i, total = 0;
    482 	size_t num = rrset_get_count(ds);
    483 
    484 	memset(n->needs, 0, sizeof(uint8_t)*ALGO_NEEDS_MAX);
    485 	for(i=0; i<num; i++) {
    486 		if(ds_get_digest_algo(ds, i) != fav_ds_algo)
    487 			continue;
    488 		algo = (uint8_t)ds_get_key_algo(ds, i);
    489 		if(!dnskey_algo_id_is_supported((int)algo))
    490 			continue;
    491 		log_assert(algo != 0); /* we do not support 0 and is EOS */
    492 		if(n->needs[algo] == 0) {
    493 			n->needs[algo] = 1;
    494 			sigalg[total] = algo;
    495 			total++;
    496 		}
    497 	}
    498 	sigalg[total] = 0;
    499 	n->num = total;
    500 }
    501 
    502 int algo_needs_set_secure(struct algo_needs* n, uint8_t algo)
    503 {
    504 	if(n->needs[algo]) {
    505 		n->needs[algo] = 0;
    506 		n->num --;
    507 		if(n->num == 0) /* done! */
    508 			return 1;
    509 	}
    510 	return 0;
    511 }
    512 
    513 void algo_needs_set_bogus(struct algo_needs* n, uint8_t algo)
    514 {
    515 	if(n->needs[algo]) n->needs[algo] = 2; /* need it, but bogus */
    516 }
    517 
    518 size_t algo_needs_num_missing(struct algo_needs* n)
    519 {
    520 	return n->num;
    521 }
    522 
    523 int algo_needs_missing(struct algo_needs* n)
    524 {
    525 	int i, miss = -1;
    526 	/* check if a needed algo was bogus - report that;
    527 	 * check the first missing algo - report that;
    528 	 * or return 0 */
    529 	for(i=0; i<ALGO_NEEDS_MAX; i++) {
    530 		if(n->needs[i] == 2)
    531 			return 0;
    532 		if(n->needs[i] == 1 && miss == -1)
    533 			miss = i;
    534 	}
    535 	if(miss != -1) return miss;
    536 	return 0;
    537 }
    538 
    539 /**
    540  * verify rrset, with dnskey rrset, for a specific rrsig in rrset
    541  * @param env: module environment, scratch space is used.
    542  * @param ve: validator environment, date settings.
    543  * @param now: current time for validation (can be overridden).
    544  * @param rrset: to be validated.
    545  * @param dnskey: DNSKEY rrset, keyset to try.
    546  * @param sig_idx: which signature to try to validate.
    547  * @param sortree: reused sorted order. Stored in region. Pass NULL at start,
    548  * 	and for a new rrset.
    549  * @param reason: if bogus, a string returned, fixed or alloced in scratch.
    550  * @param reason_bogus: EDE (RFC8914) code paired with the reason of failure.
    551  * @param section: section of packet where this rrset comes from.
    552  * @param qstate: qstate with region.
    553  * @param vq: validator qstate with attempt counts.
    554  * @param numverified: incremented when the number of RRSIG validations
    555  * 	increases.
    556  * @param num_tagmatches: incremented for tag matches.
    557  * @return secure if any key signs *this* signature. bogus if no key signs it,
    558  *	unchecked on error, or indeterminate if all keys are not supported by
    559  *	the crypto library (openssl3+ only).
    560  */
    561 static enum sec_status
    562 dnskeyset_verify_rrset_sig(struct module_env* env, struct val_env* ve,
    563 	time_t now, struct ub_packed_rrset_key* rrset,
    564 	struct ub_packed_rrset_key* dnskey, size_t sig_idx,
    565 	struct rbtree_type** sortree,
    566 	char** reason, sldns_ede_code *reason_bogus,
    567 	sldns_pkt_section section, struct module_qstate* qstate,
    568 	struct val_qstate* vq, int* numverified, size_t* num_tagmatches)
    569 {
    570 	/* find matching keys and check them */
    571 	enum sec_status sec = sec_status_bogus;
    572 	uint16_t tag = rrset_get_sig_keytag(rrset, sig_idx);
    573 	int algo = rrset_get_sig_algo(rrset, sig_idx);
    574 	size_t i, num = rrset_get_count(dnskey);
    575 	size_t numchecked = 0;
    576 	size_t numindeterminate = 0;
    577 	int buf_canon = 0;
    578 	verbose(VERB_ALGO, "verify sig %d %d", (int)tag, algo);
    579 	if(!dnskey_algo_id_is_supported(algo)) {
    580 		if(reason_bogus)
    581 			*reason_bogus = LDNS_EDE_UNSUPPORTED_DNSKEY_ALG;
    582 		verbose(VERB_QUERY, "verify sig: unknown algorithm");
    583 		return sec_status_insecure;
    584 	}
    585 
    586 	for(i=0; i<num; i++) {
    587 		if((*num_tagmatches)++ > MAX_TAG_MATCHES) {
    588 			*reason = "too many tag matches";
    589 			if(reason_bogus)
    590 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    591 			verbose(VERB_ALGO, "verify sig: too many tag matches, "
    592 				"MAX_TAG_MATCHES (%d); bogus", MAX_TAG_MATCHES);
    593 			return sec_status_bogus;
    594 		}
    595 		/* see if key matches keytag and algo */
    596 		if(algo != dnskey_get_algo(dnskey, i) ||
    597 			tag != dnskey_calc_keytag(dnskey, i))
    598 			continue;
    599 		numchecked ++;
    600 		(*numverified)++;
    601 
    602 		if(vq && vq->num_validation_attempts++ > env->cfg->val_validation_attempts) {
    603 			*reason = "too many validation attempts";
    604 			if(reason_bogus)
    605 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    606 			verbose(VERB_ALGO, "verify sig: too many validation attempts, "
    607 				"val-validation-attempts (%d); bogus", env->cfg->val_validation_attempts);
    608 			return sec_status_bogus;
    609 		}
    610 		if(vq && (ntohs(rrset->rk.type) == LDNS_RR_TYPE_NSEC ||
    611 			ntohs(rrset->rk.type) == LDNS_RR_TYPE_NSEC3) &&
    612 			vq->num_nsec_attempts++ > MAX_VALIDATE_NSECS) {
    613 			*reason = "too many NSEC or NSEC3 validation attempts";
    614 			if(reason_bogus)
    615 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    616 			verbose(VERB_ALGO, "verify sig: too many NSEC or NSEC3 validation attempts, "
    617 				"(%d); bogus", MAX_VALIDATE_NSECS);
    618 			vq->num_nsec_attempts_exceeded = 1;
    619 			return sec_status_bogus;
    620 		}
    621 
    622 		/* see if key verifies */
    623 		sec = dnskey_verify_rrset_sig(env->scratch,
    624 			env->scratch_buffer, ve, now, rrset, dnskey, i,
    625 			sig_idx, sortree, &buf_canon, reason, reason_bogus,
    626 			section, qstate);
    627 		if(sec == sec_status_secure)
    628 			return sec;
    629 		else if(sec == sec_status_indeterminate)
    630 			numindeterminate ++;
    631 		if(*numverified > MAX_VALIDATE_RRSIGS) {
    632 			*reason = "too many RRSIG validations";
    633 			if(reason_bogus)
    634 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    635 			verbose(VERB_ALGO, "verify sig: too many RRSIG validations");
    636 			return sec_status_bogus;
    637 		}
    638 	}
    639 	if(numchecked == 0) {
    640 		*reason = "signatures from unknown keys";
    641 		if(reason_bogus)
    642 			*reason_bogus = LDNS_EDE_DNSKEY_MISSING;
    643 		verbose(VERB_QUERY, "verify: could not find appropriate key");
    644 		return sec_status_bogus;
    645 	}
    646 	if(numindeterminate == numchecked) {
    647 		*reason = "unsupported algorithm by crypto library";
    648 		if(reason_bogus)
    649 			*reason_bogus = LDNS_EDE_UNSUPPORTED_DNSKEY_ALG;
    650 		verbose(VERB_ALGO, "verify sig: unsupported algorithm by "
    651 			"crypto library");
    652 		return sec_status_indeterminate;
    653 	}
    654 	return sec_status_bogus;
    655 }
    656 
    657 enum sec_status
    658 dnskeyset_verify_rrset(struct module_env* env, struct val_env* ve,
    659 	struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey,
    660 	uint8_t* sigalg, char** reason, sldns_ede_code *reason_bogus,
    661 	sldns_pkt_section section, struct module_qstate* qstate,
    662 	struct val_qstate* vq, int* verified, char* reasonbuf,
    663 	size_t reasonlen)
    664 {
    665 	enum sec_status sec;
    666 	size_t i, num, num_tagmatches = 0;
    667 	rbtree_type* sortree = NULL;
    668 	/* make sure that for all DNSKEY algorithms there are valid sigs */
    669 	struct algo_needs needs;
    670 	int alg;
    671 	*verified = 0;
    672 
    673 	num = rrset_get_sigcount(rrset);
    674 	if(num == 0) {
    675 		verbose(VERB_QUERY, "rrset failed to verify due to a lack of "
    676 			"signatures");
    677 		*reason = "no signatures";
    678 		if(reason_bogus)
    679 			*reason_bogus = LDNS_EDE_RRSIGS_MISSING;
    680 		return sec_status_bogus;
    681 	}
    682 
    683 	if(sigalg) {
    684 		algo_needs_init_list(&needs, sigalg);
    685 		if(algo_needs_num_missing(&needs) == 0) {
    686 			verbose(VERB_QUERY, "zone has no known algorithms");
    687 			*reason = "zone has no known algorithms";
    688 			if(reason_bogus)
    689 				*reason_bogus = LDNS_EDE_UNSUPPORTED_DNSKEY_ALG;
    690 			return sec_status_insecure;
    691 		}
    692 	}
    693 	for(i=0; i<num; i++) {
    694 		if(num_tagmatches > MAX_TAG_MATCHES) {
    695 			*reason = "too many tag matches";
    696 			if(reason_bogus)
    697 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    698 			verbose(VERB_ALGO, "rrset failed to verify: too many tag matches, "
    699 				"MAX_TAG_MATCHES (%d)", MAX_TAG_MATCHES);
    700 			if(reason_bogus)
    701 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    702 			return sec_status_bogus;
    703 		}
    704 		sec = dnskeyset_verify_rrset_sig(env, ve, *env->now, rrset,
    705 			dnskey, i, &sortree, reason, reason_bogus,
    706 			section, qstate, vq, verified, &num_tagmatches);
    707 		/* see which algorithm has been fixed up */
    708 		if(sec == sec_status_secure) {
    709 			if(!sigalg)
    710 				return sec; /* done! */
    711 			else if(algo_needs_set_secure(&needs,
    712 				(uint8_t)rrset_get_sig_algo(rrset, i)))
    713 				return sec; /* done! */
    714 		} else if(sigalg && sec == sec_status_bogus) {
    715 			algo_needs_set_bogus(&needs,
    716 				(uint8_t)rrset_get_sig_algo(rrset, i));
    717 		}
    718 		if(*verified > MAX_VALIDATE_RRSIGS) {
    719 			verbose(VERB_QUERY, "rrset failed to verify, too many RRSIG validations");
    720 			*reason = "too many RRSIG validations";
    721 			if(reason_bogus)
    722 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    723 			return sec_status_bogus;
    724 		}
    725 	}
    726 	if(sigalg && (alg=algo_needs_missing(&needs)) != 0) {
    727 		verbose(VERB_ALGO, "rrset failed to verify: "
    728 			"no valid signatures for %d algorithms",
    729 			(int)algo_needs_num_missing(&needs));
    730 		algo_needs_reason(alg, reason, "no signatures", reasonbuf,
    731 			reasonlen);
    732 	} else {
    733 		verbose(VERB_ALGO, "rrset failed to verify: "
    734 			"no valid signatures");
    735 	}
    736 	return sec_status_bogus;
    737 }
    738 
    739 void algo_needs_reason(int alg, char** reason, char* s, char* reasonbuf,
    740 	size_t reasonlen)
    741 {
    742 	sldns_lookup_table *t = sldns_lookup_by_id(sldns_algorithms, alg);
    743 	if(t&&t->name)
    744 		snprintf(reasonbuf, reasonlen, "%s with algorithm %s", s,
    745 			t->name);
    746 	else	snprintf(reasonbuf, reasonlen, "%s with algorithm ALG%u", s,
    747 			(unsigned)alg);
    748 	*reason = reasonbuf;
    749 }
    750 
    751 enum sec_status
    752 dnskey_verify_rrset(struct module_env* env, struct val_env* ve,
    753         struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey,
    754 	size_t dnskey_idx, char** reason, sldns_ede_code *reason_bogus,
    755 	sldns_pkt_section section, struct module_qstate* qstate,
    756 	struct val_qstate* vq, size_t* num_tagmatches)
    757 {
    758 	enum sec_status sec;
    759 	size_t i, num, numchecked = 0, numindeterminate = 0;
    760 	rbtree_type* sortree = NULL;
    761 	int buf_canon = 0;
    762 	uint16_t tag = dnskey_calc_keytag(dnskey, dnskey_idx);
    763 	int algo = dnskey_get_algo(dnskey, dnskey_idx);
    764 	int numverified = 0;
    765 
    766 	num = rrset_get_sigcount(rrset);
    767 	if(num == 0) {
    768 		verbose(VERB_QUERY, "rrset failed to verify due to a lack of "
    769 			"signatures");
    770 		*reason = "no signatures";
    771 		if(reason_bogus)
    772 			*reason_bogus = LDNS_EDE_RRSIGS_MISSING;
    773 		return sec_status_bogus;
    774 	}
    775 	for(i=0; i<num; i++) {
    776 		/* see if sig matches keytag and algo */
    777 		if((*num_tagmatches)++ > MAX_TAG_MATCHES) {
    778 			*reason = "too many tag matches";
    779 			if(reason_bogus)
    780 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    781 			verbose(VERB_ALGO, "rrset failed to verify: too many tag matches, "
    782 				"MAX_TAG_MATCHES (%d); bogus", MAX_TAG_MATCHES);
    783 			return sec_status_bogus;
    784 		}
    785 		if(algo != rrset_get_sig_algo(rrset, i) ||
    786 			tag != rrset_get_sig_keytag(rrset, i))
    787 			continue;
    788 		if(vq && vq->num_validation_attempts++ > env->cfg->val_validation_attempts) {
    789 			*reason = "too many validation attempts";
    790 			if(reason_bogus)
    791 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    792 			verbose(VERB_ALGO, "rrset failed to verify: too many validation attempts, "
    793 				"val-validation-attempts (%d); bogus", env->cfg->val_validation_attempts);
    794 			return sec_status_bogus;
    795 		}
    796 
    797 		buf_canon = 0;
    798 		sec = dnskey_verify_rrset_sig(env->scratch,
    799 			env->scratch_buffer, ve, *env->now, rrset,
    800 			dnskey, dnskey_idx, i, &sortree, &buf_canon, reason,
    801 			reason_bogus, section, qstate);
    802 		if(sec == sec_status_secure)
    803 			return sec;
    804 		numchecked ++;
    805 		numverified ++;
    806 		if(sec == sec_status_indeterminate)
    807 			numindeterminate ++;
    808 		if(numverified > MAX_VALIDATE_RRSIGS) {
    809 			verbose(VERB_QUERY, "rrset failed to verify, too many RRSIG validations");
    810 			*reason = "too many RRSIG validations";
    811 			if(reason_bogus)
    812 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    813 			return sec_status_bogus;
    814 		}
    815 	}
    816 	if(!numchecked) {
    817 		*reason = "signature for expected key and algorithm missing";
    818 		if(reason_bogus)
    819 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
    820 	} else if(numchecked == numindeterminate) {
    821 		verbose(VERB_ALGO, "rrset failed to verify due to algorithm "
    822 			"refusal by cryptolib");
    823 		if(reason_bogus)
    824 			*reason_bogus = LDNS_EDE_UNSUPPORTED_DNSKEY_ALG;
    825 		*reason = "algorithm refused by cryptolib";
    826 		return sec_status_indeterminate;
    827 	}
    828 	verbose(VERB_ALGO, "rrset failed to verify: all signatures are bogus");
    829 	return sec_status_bogus;
    830 }
    831 
    832 /**
    833  * RR entries in a canonical sorted tree of RRs
    834  */
    835 struct canon_rr {
    836 	/** rbtree node, key is this structure */
    837 	rbnode_type node;
    838 	/** rrset the RR is in */
    839 	struct ub_packed_rrset_key* rrset;
    840 	/** which RR in the rrset */
    841 	size_t rr_idx;
    842 };
    843 
    844 /**
    845  * Compare two RR for canonical order, in a field-style sweep.
    846  * @param d: rrset data
    847  * @param desc: ldns wireformat descriptor.
    848  * @param i: first RR to compare
    849  * @param j: first RR to compare
    850  * @return comparison code.
    851  */
    852 static int
    853 canonical_compare_byfield(struct packed_rrset_data* d,
    854 	const sldns_rr_descriptor* desc, size_t i, size_t j)
    855 {
    856 	/* sweep across rdata, keep track of some state:
    857 	 * 	which rr field, and bytes left in field.
    858 	 * 	current position in rdata, length left.
    859 	 * 	are we in a dname, length left in a label.
    860 	 */
    861 	int wfi = -1;	/* current wireformat rdata field (rdf) */
    862 	int wfj = -1;
    863 	uint8_t* di = d->rr_data[i]+2; /* ptr to current rdata byte */
    864 	uint8_t* dj = d->rr_data[j]+2;
    865 	size_t ilen = d->rr_len[i]-2; /* length left in rdata */
    866 	size_t jlen = d->rr_len[j]-2;
    867 	int dname_i = 0;  /* true if these bytes are part of a name */
    868 	int dname_j = 0;
    869 	size_t lablen_i = 0; /* 0 for label length byte,for first byte of rdf*/
    870 	size_t lablen_j = 0; /* otherwise remaining length of rdf or label */
    871 	int dname_num_i = (int)desc->_dname_count; /* decreased at root label */
    872 	int dname_num_j = (int)desc->_dname_count;
    873 
    874 	/* loop while there are rdata bytes available for both rrs,
    875 	 * and still some lowercasing needs to be done; either the dnames
    876 	 * have not been reached yet, or they are currently being processed */
    877 	while(ilen > 0 && jlen > 0 && (dname_num_i > 0 || dname_num_j > 0)) {
    878 		/* compare these two bytes */
    879 		/* lowercase if in a dname and not a label length byte */
    880 		if( ((dname_i && lablen_i)?(uint8_t)tolower((int)*di):*di)
    881 		 != ((dname_j && lablen_j)?(uint8_t)tolower((int)*dj):*dj)
    882 		 ) {
    883 		  if(((dname_i && lablen_i)?(uint8_t)tolower((int)*di):*di)
    884 		  < ((dname_j && lablen_j)?(uint8_t)tolower((int)*dj):*dj))
    885 		 	return -1;
    886 		    return 1;
    887 		}
    888 		ilen--;
    889 		jlen--;
    890 		/* bytes are equal */
    891 
    892 		/* advance field i */
    893 		/* lablen 0 means that this byte is the first byte of the
    894 		 * next rdata field; inspect this rdata field and setup
    895 		 * to process the rest of this rdata field.
    896 		 * The reason to first read the byte, then setup the rdf,
    897 		 * is that we are then sure the byte is available and short
    898 		 * rdata is handled gracefully (even if it is a formerr). */
    899 		if(lablen_i == 0) {
    900 			if(dname_i) {
    901 				/* scan this dname label */
    902 				/* capture length to lowercase */
    903 				lablen_i = (size_t)*di;
    904 				if(lablen_i == 0) {
    905 					/* end root label */
    906 					dname_i = 0;
    907 					dname_num_i--;
    908 					/* if dname num is 0, then the
    909 					 * remainder is binary only */
    910 					if(dname_num_i == 0)
    911 						lablen_i = ilen;
    912 				}
    913 			} else {
    914 				/* scan this rdata field */
    915 				wfi++;
    916 				if(desc->_wireformat[wfi]
    917 					== LDNS_RDF_TYPE_DNAME) {
    918 					dname_i = 1;
    919 					lablen_i = (size_t)*di;
    920 					if(lablen_i == 0) {
    921 						dname_i = 0;
    922 						dname_num_i--;
    923 						if(dname_num_i == 0)
    924 							lablen_i = ilen;
    925 					}
    926 				} else if(desc->_wireformat[wfi]
    927 					== LDNS_RDF_TYPE_STR)
    928 					lablen_i = (size_t)*di;
    929 				else	lablen_i = get_rdf_size(
    930 					desc->_wireformat[wfi]) - 1;
    931 			}
    932 		} else	lablen_i--;
    933 
    934 		/* advance field j; same as for i */
    935 		if(lablen_j == 0) {
    936 			if(dname_j) {
    937 				lablen_j = (size_t)*dj;
    938 				if(lablen_j == 0) {
    939 					dname_j = 0;
    940 					dname_num_j--;
    941 					if(dname_num_j == 0)
    942 						lablen_j = jlen;
    943 				}
    944 			} else {
    945 				wfj++;
    946 				if(desc->_wireformat[wfj]
    947 					== LDNS_RDF_TYPE_DNAME) {
    948 					dname_j = 1;
    949 					lablen_j = (size_t)*dj;
    950 					if(lablen_j == 0) {
    951 						dname_j = 0;
    952 						dname_num_j--;
    953 						if(dname_num_j == 0)
    954 							lablen_j = jlen;
    955 					}
    956 				} else if(desc->_wireformat[wfj]
    957 					== LDNS_RDF_TYPE_STR)
    958 					lablen_j = (size_t)*dj;
    959 				else	lablen_j = get_rdf_size(
    960 					desc->_wireformat[wfj]) - 1;
    961 			}
    962 		} else	lablen_j--;
    963 		di++;
    964 		dj++;
    965 	}
    966 	/* end of the loop; because we advanced byte by byte; now we have
    967 	 * that the rdata has ended, or that there is a binary remainder */
    968 	/* shortest first */
    969 	if(ilen == 0 && jlen == 0)
    970 		return 0;
    971 	if(ilen == 0)
    972 		return -1;
    973 	if(jlen == 0)
    974 		return 1;
    975 	/* binary remainder, capture comparison in wfi variable */
    976 	if((wfi = memcmp(di, dj, (ilen<jlen)?ilen:jlen)) != 0)
    977 		return wfi;
    978 	if(ilen < jlen)
    979 		return -1;
    980 	if(jlen < ilen)
    981 		return 1;
    982 	return 0;
    983 }
    984 
    985 /**
    986  * Compare two RRs in the same RRset and determine their relative
    987  * canonical order.
    988  * @param rrset: the rrset in which to perform compares.
    989  * @param i: first RR to compare
    990  * @param j: first RR to compare
    991  * @return 0 if RR i== RR j, -1 if <, +1 if >.
    992  */
    993 static int
    994 canonical_compare(struct ub_packed_rrset_key* rrset, size_t i, size_t j)
    995 {
    996 	struct packed_rrset_data* d = (struct packed_rrset_data*)
    997 		rrset->entry.data;
    998 	const sldns_rr_descriptor* desc;
    999 	uint16_t type = ntohs(rrset->rk.type);
   1000 	size_t minlen;
   1001 	int c;
   1002 
   1003 	if(i==j)
   1004 		return 0;
   1005 
   1006 	switch(type) {
   1007 		/* These RR types have only a name as RDATA.
   1008 		 * This name has to be canonicalized.*/
   1009 		case LDNS_RR_TYPE_NS:
   1010 		case LDNS_RR_TYPE_MD:
   1011 		case LDNS_RR_TYPE_MF:
   1012 		case LDNS_RR_TYPE_CNAME:
   1013 		case LDNS_RR_TYPE_MB:
   1014 		case LDNS_RR_TYPE_MG:
   1015 		case LDNS_RR_TYPE_MR:
   1016 		case LDNS_RR_TYPE_PTR:
   1017 		case LDNS_RR_TYPE_DNAME:
   1018 			/* the wireread function has already checked these
   1019 			 * dname's for correctness, and this double checks */
   1020 			if(!dname_valid(d->rr_data[i]+2, d->rr_len[i]-2) ||
   1021 				!dname_valid(d->rr_data[j]+2, d->rr_len[j]-2))
   1022 				return 0;
   1023 			return query_dname_compare(d->rr_data[i]+2,
   1024 				d->rr_data[j]+2);
   1025 
   1026 		/* These RR types have STR and fixed size rdata fields
   1027 		 * before one or more name fields that need canonicalizing,
   1028 		 * and after that a byte-for byte remainder can be compared.
   1029 		 */
   1030 		/* type starts with the name; remainder is binary compared */
   1031 		case LDNS_RR_TYPE_NXT:
   1032 		/* use rdata field formats */
   1033 		case LDNS_RR_TYPE_MINFO:
   1034 		case LDNS_RR_TYPE_RP:
   1035 		case LDNS_RR_TYPE_SOA:
   1036 		case LDNS_RR_TYPE_RT:
   1037 		case LDNS_RR_TYPE_AFSDB:
   1038 		case LDNS_RR_TYPE_KX:
   1039 		case LDNS_RR_TYPE_MX:
   1040 		case LDNS_RR_TYPE_SIG:
   1041 		/* RRSIG signer name has to be downcased */
   1042 		case LDNS_RR_TYPE_RRSIG:
   1043 		case LDNS_RR_TYPE_PX:
   1044 		case LDNS_RR_TYPE_NAPTR:
   1045 		case LDNS_RR_TYPE_SRV:
   1046 			desc = sldns_rr_descript(type);
   1047 			log_assert(desc);
   1048 			/* this holds for the types that need canonicalizing */
   1049 			log_assert(desc->_minimum == desc->_maximum);
   1050 			return canonical_compare_byfield(d, desc, i, j);
   1051 
   1052 		case LDNS_RR_TYPE_HINFO: /* no longer downcased */
   1053 		case LDNS_RR_TYPE_NSEC:
   1054 	default:
   1055 		/* For unknown RR types, or types not listed above,
   1056 		 * no canonicalization is needed, do binary compare */
   1057 		/* byte for byte compare, equal means shortest first*/
   1058 		minlen = d->rr_len[i]-2;
   1059 		if(minlen > d->rr_len[j]-2)
   1060 			minlen = d->rr_len[j]-2;
   1061 		c = memcmp(d->rr_data[i]+2, d->rr_data[j]+2, minlen);
   1062 		if(c!=0)
   1063 			return c;
   1064 		/* rdata equal, shortest is first */
   1065 		if(d->rr_len[i] < d->rr_len[j])
   1066 			return -1;
   1067 		if(d->rr_len[i] > d->rr_len[j])
   1068 			return 1;
   1069 		/* rdata equal, length equal */
   1070 		break;
   1071 	}
   1072 	return 0;
   1073 }
   1074 
   1075 int
   1076 canonical_tree_compare(const void* k1, const void* k2)
   1077 {
   1078 	struct canon_rr* r1 = (struct canon_rr*)k1;
   1079 	struct canon_rr* r2 = (struct canon_rr*)k2;
   1080 	log_assert(r1->rrset == r2->rrset);
   1081 	return canonical_compare(r1->rrset, r1->rr_idx, r2->rr_idx);
   1082 }
   1083 
   1084 /**
   1085  * Sort RRs for rrset in canonical order.
   1086  * Does not actually canonicalize the RR rdatas.
   1087  * Does not touch rrsigs.
   1088  * @param rrset: to sort.
   1089  * @param d: rrset data.
   1090  * @param sortree: tree to sort into.
   1091  * @param rrs: rr storage.
   1092  */
   1093 static void
   1094 canonical_sort(struct ub_packed_rrset_key* rrset, struct packed_rrset_data* d,
   1095 	rbtree_type* sortree, struct canon_rr* rrs)
   1096 {
   1097 	size_t i;
   1098 	/* insert into rbtree to sort and detect duplicates */
   1099 	for(i=0; i<d->count; i++) {
   1100 		rrs[i].node.key = &rrs[i];
   1101 		rrs[i].rrset = rrset;
   1102 		rrs[i].rr_idx = i;
   1103 		if(!rbtree_insert(sortree, &rrs[i].node)) {
   1104 			/* this was a duplicate */
   1105 		}
   1106 	}
   1107 }
   1108 
   1109 /**
   1110  * Insert canonical owner name into buffer.
   1111  * @param buf: buffer to insert into at current position.
   1112  * @param k: rrset with its owner name.
   1113  * @param sig: signature with signer name and label count.
   1114  * 	must be length checked, at least 18 bytes long.
   1115  * @param can_owner: position in buffer returned for future use.
   1116  * @param can_owner_len: length of canonical owner name.
   1117  */
   1118 static void
   1119 insert_can_owner(sldns_buffer* buf, struct ub_packed_rrset_key* k,
   1120 	uint8_t* sig, uint8_t** can_owner, size_t* can_owner_len)
   1121 {
   1122 	int rrsig_labels = (int)sig[3];
   1123 	int fqdn_labels = dname_signame_label_count(k->rk.dname);
   1124 	*can_owner = sldns_buffer_current(buf);
   1125 	if(rrsig_labels == fqdn_labels) {
   1126 		/* no change */
   1127 		sldns_buffer_write(buf, k->rk.dname, k->rk.dname_len);
   1128 		query_dname_tolower(*can_owner);
   1129 		*can_owner_len = k->rk.dname_len;
   1130 		return;
   1131 	}
   1132 	log_assert(rrsig_labels < fqdn_labels);
   1133 	/* *. | fqdn(rightmost rrsig_labels) */
   1134 	if(rrsig_labels < fqdn_labels) {
   1135 		int i;
   1136 		uint8_t* nm = k->rk.dname;
   1137 		size_t len = k->rk.dname_len;
   1138 		/* so skip fqdn_labels-rrsig_labels */
   1139 		for(i=0; i<fqdn_labels-rrsig_labels; i++) {
   1140 			dname_remove_label(&nm, &len);
   1141 		}
   1142 		*can_owner_len = len+2;
   1143 		sldns_buffer_write(buf, (uint8_t*)"\001*", 2);
   1144 		sldns_buffer_write(buf, nm, len);
   1145 		query_dname_tolower(*can_owner);
   1146 	}
   1147 }
   1148 
   1149 /** lowercase a wire dname but never step past end */
   1150 static void
   1151 canon_dname_tolower(uint8_t* d, uint8_t* end)
   1152 {
   1153 	uint8_t lab;
   1154 	while(d < end && (lab = *d) != 0) {
   1155 		if((size_t)lab+1 > (size_t)(end-d)) return; /* malformed */
   1156 		for(d++; lab; lab--, d++)
   1157 			*d = (uint8_t)tolower((unsigned char)*d);
   1158 	}
   1159 }
   1160 
   1161 /**
   1162  * Canonicalize Rdata in buffer.
   1163  * @param buf: buffer at position just after the rdata.
   1164  * @param rrset: rrset with type.
   1165  * @param len: length of the rdata (including rdatalen uint16).
   1166  */
   1167 static void
   1168 canonicalize_rdata(sldns_buffer* buf, struct ub_packed_rrset_key* rrset,
   1169 	size_t len)
   1170 {
   1171 	uint8_t* datstart = sldns_buffer_current(buf)-len+2;
   1172 	uint8_t* datend = sldns_buffer_current(buf);
   1173 	size_t firstlen;
   1174 	switch(ntohs(rrset->rk.type)) {
   1175 		case LDNS_RR_TYPE_NXT:
   1176 		case LDNS_RR_TYPE_NS:
   1177 		case LDNS_RR_TYPE_MD:
   1178 		case LDNS_RR_TYPE_MF:
   1179 		case LDNS_RR_TYPE_CNAME:
   1180 		case LDNS_RR_TYPE_MB:
   1181 		case LDNS_RR_TYPE_MG:
   1182 		case LDNS_RR_TYPE_MR:
   1183 		case LDNS_RR_TYPE_PTR:
   1184 		case LDNS_RR_TYPE_DNAME:
   1185 			/* type only has a single argument, the name */
   1186 			canon_dname_tolower(datstart, datend);
   1187 			return;
   1188 		case LDNS_RR_TYPE_MINFO:
   1189 		case LDNS_RR_TYPE_RP:
   1190 		case LDNS_RR_TYPE_SOA:
   1191 			/* two names after another */
   1192 			canon_dname_tolower(datstart, datend);
   1193 			firstlen = dname_valid(datstart, len-2);
   1194 			if(firstlen && firstlen < len-2)
   1195 				canon_dname_tolower(datstart + firstlen, datend);
   1196 			return;
   1197 		case LDNS_RR_TYPE_RT:
   1198 		case LDNS_RR_TYPE_AFSDB:
   1199 		case LDNS_RR_TYPE_KX:
   1200 		case LDNS_RR_TYPE_MX:
   1201 			/* skip fixed part */
   1202 			if(len < 2+2+1) /* rdlen, skiplen, 1byteroot */
   1203 				return;
   1204 			datstart += 2;
   1205 			canon_dname_tolower(datstart, datend);
   1206 			return;
   1207 		case LDNS_RR_TYPE_SIG:
   1208 		/* downcase the RRSIG, compat with BIND (kept it from SIG) */
   1209 		case LDNS_RR_TYPE_RRSIG:
   1210 			/* skip fixed part */
   1211 			if(len < 2+18+1)
   1212 				return;
   1213 			datstart += 18;
   1214 			canon_dname_tolower(datstart, datend);
   1215 			return;
   1216 		case LDNS_RR_TYPE_PX:
   1217 			/* skip, then two names after another */
   1218 			if(len < 2+2+1)
   1219 				return;
   1220 			datstart += 2;
   1221 			canon_dname_tolower(datstart, datend);
   1222 			firstlen = dname_valid(datstart, len-2-2);
   1223 			if(firstlen && firstlen < len-2-2)
   1224 				canon_dname_tolower(datstart + firstlen, datend);
   1225 			return;
   1226 		case LDNS_RR_TYPE_NAPTR:
   1227 			if(len < 2+4)
   1228 				return;
   1229 			len -= 2+4;
   1230 			datstart += 4;
   1231 			if(len < (size_t)datstart[0]+1) /* skip text field */
   1232 				return;
   1233 			len -= (size_t)datstart[0]+1;
   1234 			datstart += (size_t)datstart[0]+1;
   1235 			if(len < (size_t)datstart[0]+1) /* skip text field */
   1236 				return;
   1237 			len -= (size_t)datstart[0]+1;
   1238 			datstart += (size_t)datstart[0]+1;
   1239 			if(len < (size_t)datstart[0]+1) /* skip text field */
   1240 				return;
   1241 			len -= (size_t)datstart[0]+1;
   1242 			datstart += (size_t)datstart[0]+1;
   1243 			if(len < 1)	/* check name is at least 1 byte*/
   1244 				return;
   1245 			canon_dname_tolower(datstart, datend);
   1246 			return;
   1247 		case LDNS_RR_TYPE_SRV:
   1248 			/* skip fixed part */
   1249 			if(len < 2+6+1)
   1250 				return;
   1251 			datstart += 6;
   1252 			canon_dname_tolower(datstart, datend);
   1253 			return;
   1254 
   1255 		/* do not canonicalize NSEC rdata name, compat with
   1256 		 * from bind 9.4 signer, where it does not do so */
   1257 		case LDNS_RR_TYPE_NSEC: /* type starts with the name */
   1258 		case LDNS_RR_TYPE_HINFO: /* not downcased */
   1259 		/* A6 not supported */
   1260 		default:
   1261 			/* nothing to do for unknown types */
   1262 			return;
   1263 	}
   1264 }
   1265 
   1266 int rrset_canonical_equal(struct regional* region,
   1267 	struct ub_packed_rrset_key* k1, struct ub_packed_rrset_key* k2)
   1268 {
   1269 	struct rbtree_type sortree1, sortree2;
   1270 	struct canon_rr *rrs1, *rrs2, *p1, *p2;
   1271 	struct packed_rrset_data* d1=(struct packed_rrset_data*)k1->entry.data;
   1272 	struct packed_rrset_data* d2=(struct packed_rrset_data*)k2->entry.data;
   1273 	struct ub_packed_rrset_key fk;
   1274 	struct packed_rrset_data fd;
   1275 	size_t flen[2];
   1276 	uint8_t* fdata[2];
   1277 
   1278 	/* basic compare */
   1279 	if(k1->rk.dname_len != k2->rk.dname_len ||
   1280 		k1->rk.flags != k2->rk.flags ||
   1281 		k1->rk.type != k2->rk.type ||
   1282 		k1->rk.rrset_class != k2->rk.rrset_class ||
   1283 		query_dname_compare(k1->rk.dname, k2->rk.dname) != 0)
   1284 		return 0;
   1285 	if(d1->ttl != d2->ttl ||
   1286 		d1->count != d2->count ||
   1287 		d1->rrsig_count != d2->rrsig_count ||
   1288 		d1->trust != d2->trust ||
   1289 		d1->security != d2->security)
   1290 		return 0;
   1291 
   1292 	/* init */
   1293 	memset(&fk, 0, sizeof(fk));
   1294 	memset(&fd, 0, sizeof(fd));
   1295 	fk.entry.data = &fd;
   1296 	fd.count = 2;
   1297 	fd.rr_len = flen;
   1298 	fd.rr_data = fdata;
   1299 	rbtree_init(&sortree1, &canonical_tree_compare);
   1300 	rbtree_init(&sortree2, &canonical_tree_compare);
   1301 	if(d1->count > RR_COUNT_MAX || d2->count > RR_COUNT_MAX)
   1302 		return 1; /* protection against integer overflow */
   1303 	rrs1 = regional_alloc(region, sizeof(struct canon_rr)*d1->count);
   1304 	rrs2 = regional_alloc(region, sizeof(struct canon_rr)*d2->count);
   1305 	if(!rrs1 || !rrs2) return 1; /* alloc failure */
   1306 
   1307 	/* sort */
   1308 	canonical_sort(k1, d1, &sortree1, rrs1);
   1309 	canonical_sort(k2, d2, &sortree2, rrs2);
   1310 
   1311 	/* compare canonical-sorted RRs for canonical-equality */
   1312 	if(sortree1.count != sortree2.count)
   1313 		return 0;
   1314 	p1 = (struct canon_rr*)rbtree_first(&sortree1);
   1315 	p2 = (struct canon_rr*)rbtree_first(&sortree2);
   1316 	while(p1 != (struct canon_rr*)RBTREE_NULL &&
   1317 		p2 != (struct canon_rr*)RBTREE_NULL) {
   1318 		flen[0] = d1->rr_len[p1->rr_idx];
   1319 		flen[1] = d2->rr_len[p2->rr_idx];
   1320 		fdata[0] = d1->rr_data[p1->rr_idx];
   1321 		fdata[1] = d2->rr_data[p2->rr_idx];
   1322 
   1323 		if(canonical_compare(&fk, 0, 1) != 0)
   1324 			return 0;
   1325 		p1 = (struct canon_rr*)rbtree_next(&p1->node);
   1326 		p2 = (struct canon_rr*)rbtree_next(&p2->node);
   1327 	}
   1328 	return 1;
   1329 }
   1330 
   1331 /**
   1332  * Create canonical form of rrset in the scratch buffer.
   1333  * @param region: temporary region.
   1334  * @param buf: the buffer to use.
   1335  * @param k: the rrset to insert.
   1336  * @param sig: RRSIG rdata to include.
   1337  * @param siglen: RRSIG rdata len excluding signature field, but inclusive
   1338  * 	signer name length.
   1339  * @param sortree: if NULL is passed a new sorted rrset tree is built.
   1340  * 	Otherwise it is reused.
   1341  * @param section: section of packet where this rrset comes from.
   1342  * @param qstate: qstate with region.
   1343  * @return false on alloc error.
   1344  */
   1345 static int
   1346 rrset_canonical(struct regional* region, sldns_buffer* buf,
   1347 	struct ub_packed_rrset_key* k, uint8_t* sig, size_t siglen,
   1348 	struct rbtree_type** sortree, sldns_pkt_section section,
   1349 	struct module_qstate* qstate)
   1350 {
   1351 	struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
   1352 	uint8_t* can_owner = NULL;
   1353 	size_t can_owner_len = 0;
   1354 	struct canon_rr* walk;
   1355 	struct canon_rr* rrs;
   1356 
   1357 	if(!*sortree) {
   1358 		*sortree = (struct rbtree_type*)regional_alloc(region,
   1359 			sizeof(rbtree_type));
   1360 		if(!*sortree)
   1361 			return 0;
   1362 		if(d->count > RR_COUNT_MAX)
   1363 			return 0; /* integer overflow protection */
   1364 		rrs = regional_alloc(region, sizeof(struct canon_rr)*d->count);
   1365 		if(!rrs) {
   1366 			*sortree = NULL;
   1367 			return 0;
   1368 		}
   1369 		rbtree_init(*sortree, &canonical_tree_compare);
   1370 		canonical_sort(k, d, *sortree, rrs);
   1371 	}
   1372 
   1373 	sldns_buffer_clear(buf);
   1374 	if(sldns_buffer_remaining(buf) < siglen || siglen < 18+1) {
   1375 		verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1376 			"rrset too big");
   1377 		return 0;
   1378 	}
   1379 	sldns_buffer_write(buf, sig, siglen);
   1380 	/* canonicalize signer name */
   1381 	canon_dname_tolower(sldns_buffer_begin(buf)+18,
   1382 		sldns_buffer_current(buf));
   1383 
   1384 	if(sldns_buffer_remaining(buf) < k->rk.dname_len+2) {
   1385 		/* Check if the first can_owner name can fit in the buffer.
   1386 		 * The length is k->rk.dname_len or k->rk.dname_len+2
   1387 		 * if it has '*.' in prefixed. Checks the upper bound,
   1388 		 * also realistically the rest of the rrtype, rrclass, origttl,
   1389 		 * rdata and so on has to be inserted, so that extra space has
   1390 		 * to be there. */
   1391 		verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1392 			"rrset too big");
   1393 		return 0;
   1394 	}
   1395 	RBTREE_FOR(walk, struct canon_rr*, (*sortree)) {
   1396 		/* see if there is enough space left in the buffer */
   1397 		if(sldns_buffer_remaining(buf) < can_owner_len + 2 + 2 + 4
   1398 			+ d->rr_len[walk->rr_idx]) {
   1399 			verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1400 				"rrset too big");
   1401 			return 0;
   1402 		}
   1403 		/* determine canonical owner name */
   1404 		if(can_owner)
   1405 			sldns_buffer_write(buf, can_owner, can_owner_len);
   1406 		else	insert_can_owner(buf, k, sig, &can_owner,
   1407 				&can_owner_len);
   1408 		/* Check again, if the rdata can fit in the buffer */
   1409 		if(sldns_buffer_remaining(buf) < 2 + 2 + 4
   1410                         + d->rr_len[walk->rr_idx]) {
   1411 			verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1412 				"rrset too big");
   1413                         return 0;
   1414                 }
   1415 		sldns_buffer_write(buf, &k->rk.type, 2);
   1416 		sldns_buffer_write(buf, &k->rk.rrset_class, 2);
   1417 		sldns_buffer_write(buf, sig+4, 4);
   1418 		sldns_buffer_write(buf, d->rr_data[walk->rr_idx],
   1419 			d->rr_len[walk->rr_idx]);
   1420 		canonicalize_rdata(buf, k, d->rr_len[walk->rr_idx]);
   1421 	}
   1422 	sldns_buffer_flip(buf);
   1423 
   1424 	/* Replace RR owner with canonical owner for NSEC records in authority
   1425 	 * section, to prevent that a wildcard synthesized NSEC can be used in
   1426 	 * the non-existence proves. */
   1427 	if(ntohs(k->rk.type) == LDNS_RR_TYPE_NSEC &&
   1428 		section == LDNS_SECTION_AUTHORITY && qstate) {
   1429 		uint8_t* new_dname = regional_alloc_init(qstate->region, can_owner,
   1430 			can_owner_len);
   1431 		if(!new_dname)
   1432 			return 0;
   1433 		k->rk.dname = new_dname;
   1434 		k->rk.dname_len = can_owner_len;
   1435 	}
   1436 
   1437 
   1438 	return 1;
   1439 }
   1440 
   1441 int
   1442 rrset_canonicalize_to_buffer(struct regional* region, sldns_buffer* buf,
   1443 	struct ub_packed_rrset_key* k)
   1444 {
   1445 	struct rbtree_type* sortree = NULL;
   1446 	struct packed_rrset_data* d = (struct packed_rrset_data*)k->entry.data;
   1447 	uint8_t* can_owner = NULL;
   1448 	size_t can_owner_len = 0;
   1449 	struct canon_rr* walk;
   1450 	struct canon_rr* rrs;
   1451 
   1452 	sortree = (struct rbtree_type*)regional_alloc(region,
   1453 		sizeof(rbtree_type));
   1454 	if(!sortree)
   1455 		return 0;
   1456 	if(d->count > RR_COUNT_MAX)
   1457 		return 0; /* integer overflow protection */
   1458 	rrs = regional_alloc(region, sizeof(struct canon_rr)*d->count);
   1459 	if(!rrs) {
   1460 		return 0;
   1461 	}
   1462 	rbtree_init(sortree, &canonical_tree_compare);
   1463 	canonical_sort(k, d, sortree, rrs);
   1464 
   1465 	sldns_buffer_clear(buf);
   1466 	if(sldns_buffer_remaining(buf) < k->rk.dname_len) {
   1467 		/* Check if the first can_owner name can fit in the buffer. */
   1468 		verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1469 			"rrset too big");
   1470 		return 0;
   1471 	}
   1472 	RBTREE_FOR(walk, struct canon_rr*, sortree) {
   1473 		/* see if there is enough space left in the buffer */
   1474 		if(sldns_buffer_remaining(buf) < can_owner_len + 2 + 2 + 4
   1475 			+ d->rr_len[walk->rr_idx]) {
   1476 			verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1477 				"rrset too big");
   1478 			return 0;
   1479 		}
   1480 		/* determine canonical owner name */
   1481 		if(can_owner)
   1482 			sldns_buffer_write(buf, can_owner, can_owner_len);
   1483 		else	{
   1484 			can_owner = sldns_buffer_current(buf);
   1485 			sldns_buffer_write(buf, k->rk.dname, k->rk.dname_len);
   1486 			query_dname_tolower(can_owner);
   1487 			can_owner_len = k->rk.dname_len;
   1488 		}
   1489 		/* Check again, if the rdata can fit in the buffer */
   1490 		if(sldns_buffer_remaining(buf) < 2 + 2 + 4
   1491                         + d->rr_len[walk->rr_idx]) {
   1492 			verbose(VERB_ALGO, "verify: failed to canonicalize, "
   1493 				"rrset too big");
   1494                         return 0;
   1495                 }
   1496 		sldns_buffer_write(buf, &k->rk.type, 2);
   1497 		sldns_buffer_write(buf, &k->rk.rrset_class, 2);
   1498 		sldns_buffer_write_u32(buf, d->rr_ttl[walk->rr_idx]);
   1499 		sldns_buffer_write(buf, d->rr_data[walk->rr_idx],
   1500 			d->rr_len[walk->rr_idx]);
   1501 		canonicalize_rdata(buf, k, d->rr_len[walk->rr_idx]);
   1502 	}
   1503 	sldns_buffer_flip(buf);
   1504 	return 1;
   1505 }
   1506 
   1507 /** pretty print rrsig error with dates */
   1508 static void
   1509 sigdate_error(const char* str, int32_t expi, int32_t incep, int32_t now)
   1510 {
   1511 	struct tm tm;
   1512 	char expi_buf[16];
   1513 	char incep_buf[16];
   1514 	char now_buf[16];
   1515 	time_t te, ti, tn;
   1516 
   1517 	if(verbosity < VERB_QUERY)
   1518 		return;
   1519 	te = (time_t)expi;
   1520 	ti = (time_t)incep;
   1521 	tn = (time_t)now;
   1522 	memset(&tm, 0, sizeof(tm));
   1523 	if(gmtime_r(&te, &tm) && strftime(expi_buf, 15, "%Y%m%d%H%M%S", &tm)
   1524 	 &&gmtime_r(&ti, &tm) && strftime(incep_buf, 15, "%Y%m%d%H%M%S", &tm)
   1525 	 &&gmtime_r(&tn, &tm) && strftime(now_buf, 15, "%Y%m%d%H%M%S", &tm)) {
   1526 		log_info("%s expi=%s incep=%s now=%s", str, expi_buf,
   1527 			incep_buf, now_buf);
   1528 	} else
   1529 		log_info("%s expi=%u incep=%u now=%u", str, (unsigned)expi,
   1530 			(unsigned)incep, (unsigned)now);
   1531 }
   1532 
   1533 /** check rrsig dates */
   1534 static int
   1535 check_dates(struct val_env* ve, uint32_t unow, uint8_t* expi_p,
   1536 	uint8_t* incep_p, char** reason, sldns_ede_code *reason_bogus)
   1537 {
   1538 	/* read out the dates */
   1539 	uint32_t expi, incep, now;
   1540 	memmove(&expi, expi_p, sizeof(expi));
   1541 	memmove(&incep, incep_p, sizeof(incep));
   1542 	expi = ntohl(expi);
   1543 	incep = ntohl(incep);
   1544 
   1545 	/* get current date */
   1546 	if(ve->date_override) {
   1547 		if(ve->date_override == -1) {
   1548 			verbose(VERB_ALGO, "date override: ignore date");
   1549 			return 1;
   1550 		}
   1551 		now = ve->date_override;
   1552 		verbose(VERB_ALGO, "date override option %d", (int)now);
   1553 	} else	now = unow;
   1554 
   1555 	/* check them */
   1556 	if(compare_1982(incep, expi) > 0) {
   1557 		sigdate_error("verify: inception after expiration, "
   1558 			"signature bad", expi, incep, now);
   1559 		*reason = "signature inception after expiration";
   1560 		if(reason_bogus){
   1561 			/* from RFC8914 on Signature Not Yet Valid: The resolver
   1562 			 * attempted to perform DNSSEC validation, but no
   1563 			 * signatures are presently valid and at least some are
   1564 			 * not yet valid. */
   1565 			*reason_bogus = LDNS_EDE_SIGNATURE_NOT_YET_VALID;
   1566 		}
   1567 
   1568 		return 0;
   1569 	}
   1570 	if(compare_1982(incep, now) > 0) {
   1571 		/* within skew ? (calc here to avoid calculation normally) */
   1572 		uint32_t skew = subtract_1982(incep, expi)/10;
   1573 		if(skew < (uint32_t)ve->skew_min) skew = ve->skew_min;
   1574 		if(skew > (uint32_t)ve->skew_max) skew = ve->skew_max;
   1575 		if(subtract_1982(now, incep) > skew) {
   1576 			sigdate_error("verify: signature bad, current time is"
   1577 				" before inception date", expi, incep, now);
   1578 			*reason = "signature before inception date";
   1579 			if(reason_bogus)
   1580 				*reason_bogus = LDNS_EDE_SIGNATURE_NOT_YET_VALID;
   1581 			return 0;
   1582 		}
   1583 		sigdate_error("verify warning suspicious signature inception "
   1584 			" or bad local clock", expi, incep, now);
   1585 	}
   1586 	if(compare_1982(now, expi) > 0) {
   1587 		uint32_t skew = subtract_1982(incep, expi)/10;
   1588 		if(skew < (uint32_t)ve->skew_min) skew = ve->skew_min;
   1589 		if(skew > (uint32_t)ve->skew_max) skew = ve->skew_max;
   1590 		if(subtract_1982(expi, now) > skew) {
   1591 			sigdate_error("verify: signature expired", expi,
   1592 				incep, now);
   1593 			*reason = "signature expired";
   1594 			if(reason_bogus)
   1595 				*reason_bogus = LDNS_EDE_SIGNATURE_EXPIRED;
   1596 			return 0;
   1597 		}
   1598 		sigdate_error("verify warning suspicious signature expiration "
   1599 			" or bad local clock", expi, incep, now);
   1600 	}
   1601 	return 1;
   1602 }
   1603 
   1604 /** adjust rrset TTL for verified rrset, compare to original TTL and expi */
   1605 static void
   1606 adjust_ttl(struct val_env* ve, uint32_t unow,
   1607 	struct ub_packed_rrset_key* rrset, uint8_t* orig_p,
   1608 	uint8_t* expi_p, uint8_t* incep_p)
   1609 {
   1610 	struct packed_rrset_data* d =
   1611 		(struct packed_rrset_data*)rrset->entry.data;
   1612 	/* read out the dates */
   1613 	int32_t origttl, expittl, expi, incep, now;
   1614 	memmove(&origttl, orig_p, sizeof(origttl));
   1615 	memmove(&expi, expi_p, sizeof(expi));
   1616 	memmove(&incep, incep_p, sizeof(incep));
   1617 	expi = ntohl(expi);
   1618 	incep = ntohl(incep);
   1619 	origttl = ntohl(origttl);
   1620 
   1621 	/* get current date */
   1622 	if(ve->date_override) {
   1623 		now = ve->date_override;
   1624 	} else	now = (int32_t)unow;
   1625 	expittl = (int32_t)((uint32_t)expi - (uint32_t)now);
   1626 
   1627 	/* so now:
   1628 	 * d->ttl: rrset ttl read from message or cache. May be reduced
   1629 	 * origttl: original TTL from signature, authoritative TTL max.
   1630 	 * MIN_TTL: minimum TTL from config.
   1631 	 * expittl: TTL until the signature expires.
   1632 	 *
   1633 	 * Use the smallest of these, but don't let origttl set the TTL
   1634 	 * below the minimum.
   1635 	 */
   1636 	if(MIN_TTL > (time_t)origttl && d->ttl > MIN_TTL) {
   1637 		verbose(VERB_QUERY, "rrset TTL larger than original and minimum"
   1638 			" TTL, adjusting TTL downwards to minimum ttl");
   1639 		d->ttl = MIN_TTL;
   1640 	}
   1641 	else if(MIN_TTL <= origttl && d->ttl > (time_t)origttl) {
   1642 		verbose(VERB_QUERY, "rrset TTL larger than original TTL, "
   1643 		"adjusting TTL downwards to original ttl");
   1644 		d->ttl = origttl;
   1645 	}
   1646 
   1647 	if(expittl > 0 && d->ttl > (time_t)expittl) {
   1648 		verbose(VERB_ALGO, "rrset TTL larger than sig expiration ttl,"
   1649 			" adjusting TTL downwards");
   1650 		d->ttl = expittl;
   1651 	}
   1652 }
   1653 
   1654 enum sec_status
   1655 dnskey_verify_rrset_sig(struct regional* region, sldns_buffer* buf,
   1656 	struct val_env* ve, time_t now,
   1657         struct ub_packed_rrset_key* rrset, struct ub_packed_rrset_key* dnskey,
   1658         size_t dnskey_idx, size_t sig_idx,
   1659 	struct rbtree_type** sortree, int* buf_canon,
   1660 	char** reason, sldns_ede_code *reason_bogus,
   1661 	sldns_pkt_section section, struct module_qstate* qstate)
   1662 {
   1663 	enum sec_status sec;
   1664 	uint8_t* sig;		/* RRSIG rdata */
   1665 	size_t siglen;
   1666 	size_t rrnum = rrset_get_count(rrset);
   1667 	uint8_t* signer;	/* rrsig signer name */
   1668 	size_t signer_len;
   1669 	unsigned char* sigblock; /* signature rdata field */
   1670 	unsigned int sigblock_len;
   1671 	uint16_t ktag;		/* DNSKEY key tag */
   1672 	unsigned char* key;	/* public key rdata field */
   1673 	unsigned int keylen;
   1674 	rrset_get_rdata(rrset, rrnum + sig_idx, &sig, &siglen);
   1675 	/* min length of rdatalen, fixed rrsig, root signer, 1 byte sig */
   1676 	if(siglen < 2+20) {
   1677 		verbose(VERB_QUERY, "verify: signature too short");
   1678 		*reason = "signature too short";
   1679 		if(reason_bogus)
   1680 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1681 		return sec_status_bogus;
   1682 	}
   1683 
   1684 	if(!(dnskey_get_flags(dnskey, dnskey_idx) & DNSKEY_BIT_ZSK)) {
   1685 		verbose(VERB_QUERY, "verify: dnskey without ZSK flag");
   1686 		*reason = "dnskey without ZSK flag";
   1687 		if(reason_bogus)
   1688 			*reason_bogus = LDNS_EDE_NO_ZONE_KEY_BIT_SET;
   1689 		return sec_status_bogus;
   1690 	}
   1691 	if((dnskey_get_flags(dnskey, dnskey_idx) & LDNS_KEY_REVOKE_KEY) &&
   1692 		/* The REVOKE key is allowed to check sigs on itself. */
   1693 		!(ntohs(rrset->rk.type) == LDNS_RR_TYPE_DNSKEY &&
   1694 		  query_dname_compare(rrset->rk.dname, dnskey->rk.dname)==0)
   1695 		) {
   1696 		verbose(VERB_QUERY, "verify: dnskey has REVOKE bit set, "
   1697 			"not usable for data validation per RFC 5011 s2.1");
   1698 		*reason = "dnskey revoked";
   1699 		if(reason_bogus)
   1700 			*reason_bogus = LDNS_EDE_DNSKEY_MISSING;
   1701 		return sec_status_bogus;
   1702 	}
   1703 
   1704 	if(dnskey_get_protocol(dnskey, dnskey_idx) != LDNS_DNSSEC_KEYPROTO) {
   1705 		/* RFC 4034 says DNSKEY PROTOCOL MUST be 3 */
   1706 		verbose(VERB_QUERY, "verify: dnskey has wrong key protocol");
   1707 		*reason = "dnskey has wrong protocolnumber";
   1708 		if(reason_bogus)
   1709 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1710 		return sec_status_bogus;
   1711 	}
   1712 
   1713 	/* verify as many fields in rrsig as possible */
   1714 	signer = sig+2+18;
   1715 	signer_len = dname_valid(signer, siglen-2-18);
   1716 	if(!signer_len) {
   1717 		verbose(VERB_QUERY, "verify: malformed signer name");
   1718 		*reason = "signer name malformed";
   1719 		if(reason_bogus)
   1720 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1721 		return sec_status_bogus; /* signer name invalid */
   1722 	}
   1723 	if(!dname_subdomain_c(rrset->rk.dname, signer)) {
   1724 		verbose(VERB_QUERY, "verify: signer name is off-tree");
   1725 		*reason = "signer name off-tree";
   1726 		if(reason_bogus)
   1727 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1728 		return sec_status_bogus; /* signer name offtree */
   1729 	}
   1730 	/* NSEC3, the owner name must be the <base32hash>.signername */
   1731 	if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_NSEC3 &&
   1732 		rrset->rk.dname_len > 0) {
   1733 		uint8_t* dnameless = rrset->rk.dname;
   1734 		size_t dnamelesslen = rrset->rk.dname_len;
   1735 		dname_remove_label(&dnameless, &dnamelesslen);
   1736 		if(query_dname_compare(dnameless, signer) != 0) {
   1737 			verbose(VERB_QUERY, "verify: NSEC3 owner name is not b32.signer name");
   1738 			*reason = "NSEC3 owner name is not b32.signer name";
   1739 			if(reason_bogus)
   1740 				*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1741 			return sec_status_bogus; /* NSEC3 owner not b32.signer */
   1742 		}
   1743 	}
   1744 	/* NSEC, a next owner that is not under the signer is not allowed.*/
   1745 	if(ntohs(rrset->rk.type) == LDNS_RR_TYPE_NSEC &&
   1746 		!nsec_nextowner_subdomain(rrset, signer)) {
   1747 		verbose(VERB_QUERY, "verify: NSEC next owner overreaches signer name");
   1748 		*reason = "NSEC next owner overreaches signer name";
   1749 		if(reason_bogus)
   1750 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1751 		return sec_status_bogus; /* nextowner overreaching */
   1752 	}
   1753 
   1754 	sigblock = (unsigned char*)signer+signer_len;
   1755 	if(siglen < 2+18+signer_len+1) {
   1756 		verbose(VERB_QUERY, "verify: too short, no signature data");
   1757 		*reason = "signature too short, no signature data";
   1758 		if(reason_bogus)
   1759 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1760 		return sec_status_bogus; /* sig rdf is < 1 byte */
   1761 	}
   1762 	sigblock_len = (unsigned int)(siglen - 2 - 18 - signer_len);
   1763 
   1764 	/* verify key dname == sig signer name */
   1765 	if(query_dname_compare(signer, dnskey->rk.dname) != 0) {
   1766 		verbose(VERB_QUERY, "verify: wrong key for rrsig");
   1767 		log_nametypeclass(VERB_QUERY, "RRSIG signername is",
   1768 			signer, 0, 0);
   1769 		log_nametypeclass(VERB_QUERY, "the key name is",
   1770 			dnskey->rk.dname, 0, 0);
   1771 		*reason = "signer name mismatches key name";
   1772 		if(reason_bogus)
   1773 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1774 		return sec_status_bogus;
   1775 	}
   1776 
   1777 	/* verify covered type */
   1778 	/* memcmp works because type is in network format for rrset */
   1779 	if(memcmp(sig+2, &rrset->rk.type, 2) != 0) {
   1780 		verbose(VERB_QUERY, "verify: wrong type covered");
   1781 		*reason = "signature covers wrong type";
   1782 		if(reason_bogus)
   1783 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1784 		return sec_status_bogus;
   1785 	}
   1786 	/* verify keytag and sig algo (possibly again) */
   1787 	if((int)sig[2+2] != dnskey_get_algo(dnskey, dnskey_idx)) {
   1788 		verbose(VERB_QUERY, "verify: wrong algorithm");
   1789 		*reason = "signature has wrong algorithm";
   1790 		if(reason_bogus)
   1791 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1792 		return sec_status_bogus;
   1793 	}
   1794 	ktag = htons(dnskey_calc_keytag(dnskey, dnskey_idx));
   1795 	if(memcmp(sig+2+16, &ktag, 2) != 0) {
   1796 		verbose(VERB_QUERY, "verify: wrong keytag");
   1797 		*reason = "signature has wrong keytag";
   1798 		if(reason_bogus)
   1799 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1800 		return sec_status_bogus;
   1801 	}
   1802 
   1803 	/* verify labels is in a valid range */
   1804 	if((int)sig[2+3] > dname_signame_label_count(rrset->rk.dname)) {
   1805 		verbose(VERB_QUERY, "verify: labelcount out of range");
   1806 		*reason = "signature labelcount out of range";
   1807 		if(reason_bogus)
   1808 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1809 		return sec_status_bogus;
   1810 	}
   1811 	if((int)sig[2+3] < dname_signame_label_count(signer)) {
   1812 		verbose(VERB_QUERY, "verify: RRSIG label count too low for signer");
   1813 		*reason = "signature labelcount lower than signature signer";
   1814 		if(reason_bogus)
   1815 			*reason_bogus = LDNS_EDE_DNSSEC_BOGUS;
   1816 		return sec_status_bogus;
   1817 	}
   1818 
   1819 	/* original ttl, always ok */
   1820 
   1821 	if(!*buf_canon) {
   1822 		/* create rrset canonical format in buffer, ready for
   1823 		 * signature */
   1824 		if(!rrset_canonical(region, buf, rrset, sig+2,
   1825 			18 + signer_len, sortree, section, qstate)) {
   1826 			log_err("verify: failed due to alloc error");
   1827 			return sec_status_unchecked;
   1828 		}
   1829 		*buf_canon = 1;
   1830 	}
   1831 
   1832 	/* check that dnskey is available */
   1833 	dnskey_get_pubkey(dnskey, dnskey_idx, &key, &keylen);
   1834 	if(!key) {
   1835 		verbose(VERB_QUERY, "verify: short DNSKEY RR");
   1836 		return sec_status_unchecked;
   1837 	}
   1838 
   1839 	/* verify */
   1840 	sec = verify_canonrrset(buf, (int)sig[2+2],
   1841 		sigblock, sigblock_len, key, keylen, reason);
   1842 
   1843 	/* count validation operation */
   1844 	if(qstate && qstate->env && qstate->env->mesh)
   1845 		qstate->env->mesh->val_ops++;
   1846 
   1847 	if(sec == sec_status_secure) {
   1848 		/* check if TTL is too high - reduce if so */
   1849 		adjust_ttl(ve, now, rrset, sig+2+4, sig+2+8, sig+2+12);
   1850 
   1851 		/* verify inception, expiration dates
   1852 		 * Do this last so that if you ignore expired-sigs the
   1853 		 * rest is sure to be OK. */
   1854 		if(!check_dates(ve, now, sig+2+8, sig+2+12,
   1855 			reason, reason_bogus)) {
   1856 			return sec_status_bogus;
   1857 		}
   1858 	}
   1859 
   1860 	return sec;
   1861 }
   1862