dnsmasq: update to 2.73 (23.06.2015)
[tomato.git] / release / src / router / dnsmasq / src / dnssec.c
blobfe36fe61fd74e04c23a17b10a595ac3b56aca595
1 /* dnssec.c is Copyright (c) 2012 Giovanni Bajo <rasky@develer.com>
2 and Copyright (c) 2012-2015 Simon Kelley
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; version 2 dated June, 1991, or
7 (at your option) version 3 dated 29 June, 2007.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #include "dnsmasq.h"
20 #ifdef HAVE_DNSSEC
22 #include <nettle/rsa.h>
23 #include <nettle/dsa.h>
24 #ifndef NO_NETTLE_ECC
25 # include <nettle/ecdsa.h>
26 # include <nettle/ecc-curve.h>
27 #endif
28 #include <nettle/nettle-meta.h>
29 #include <nettle/bignum.h>
31 /* Nettle-3.0 moved to a new API for DSA. We use a name that's defined in the new API
32 to detect Nettle-3, and invoke the backwards compatibility mode. */
33 #ifdef dsa_params_init
34 #include <nettle/dsa-compat.h>
35 #endif
37 #include <utime.h>
39 #define SERIAL_UNDEF -100
40 #define SERIAL_EQ 0
41 #define SERIAL_LT -1
42 #define SERIAL_GT 1
44 /* http://www.iana.org/assignments/ds-rr-types/ds-rr-types.xhtml */
45 static char *ds_digest_name(int digest)
47 switch (digest)
49 case 1: return "sha1";
50 case 2: return "sha256";
51 case 3: return "gosthash94";
52 case 4: return "sha384";
53 default: return NULL;
57 /* http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml */
58 static char *algo_digest_name(int algo)
60 switch (algo)
62 case 1: return "md5";
63 case 3: return "sha1";
64 case 5: return "sha1";
65 case 6: return "sha1";
66 case 7: return "sha1";
67 case 8: return "sha256";
68 case 10: return "sha512";
69 case 12: return "gosthash94";
70 case 13: return "sha256";
71 case 14: return "sha384";
72 default: return NULL;
76 /* Find pointer to correct hash function in nettle library */
77 static const struct nettle_hash *hash_find(char *name)
79 int i;
81 if (!name)
82 return NULL;
84 for (i = 0; nettle_hashes[i]; i++)
86 if (strcmp(nettle_hashes[i]->name, name) == 0)
87 return nettle_hashes[i];
90 return NULL;
93 /* expand ctx and digest memory allocations if necessary and init hash function */
94 static int hash_init(const struct nettle_hash *hash, void **ctxp, unsigned char **digestp)
96 static void *ctx = NULL;
97 static unsigned char *digest = NULL;
98 static unsigned int ctx_sz = 0;
99 static unsigned int digest_sz = 0;
101 void *new;
103 if (ctx_sz < hash->context_size)
105 if (!(new = whine_malloc(hash->context_size)))
106 return 0;
107 if (ctx)
108 free(ctx);
109 ctx = new;
110 ctx_sz = hash->context_size;
113 if (digest_sz < hash->digest_size)
115 if (!(new = whine_malloc(hash->digest_size)))
116 return 0;
117 if (digest)
118 free(digest);
119 digest = new;
120 digest_sz = hash->digest_size;
123 *ctxp = ctx;
124 *digestp = digest;
126 hash->init(ctx);
128 return 1;
131 static int dnsmasq_rsa_verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
132 unsigned char *digest, int algo)
134 unsigned char *p;
135 size_t exp_len;
137 static struct rsa_public_key *key = NULL;
138 static mpz_t sig_mpz;
140 if (key == NULL)
142 if (!(key = whine_malloc(sizeof(struct rsa_public_key))))
143 return 0;
145 nettle_rsa_public_key_init(key);
146 mpz_init(sig_mpz);
149 if ((key_len < 3) || !(p = blockdata_retrieve(key_data, key_len, NULL)))
150 return 0;
152 key_len--;
153 if ((exp_len = *p++) == 0)
155 GETSHORT(exp_len, p);
156 key_len -= 2;
159 if (exp_len >= key_len)
160 return 0;
162 key->size = key_len - exp_len;
163 mpz_import(key->e, exp_len, 1, 1, 0, 0, p);
164 mpz_import(key->n, key->size, 1, 1, 0, 0, p + exp_len);
166 mpz_import(sig_mpz, sig_len, 1, 1, 0, 0, sig);
168 switch (algo)
170 case 1:
171 return nettle_rsa_md5_verify_digest(key, digest, sig_mpz);
172 case 5: case 7:
173 return nettle_rsa_sha1_verify_digest(key, digest, sig_mpz);
174 case 8:
175 return nettle_rsa_sha256_verify_digest(key, digest, sig_mpz);
176 case 10:
177 return nettle_rsa_sha512_verify_digest(key, digest, sig_mpz);
180 return 0;
183 static int dnsmasq_dsa_verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
184 unsigned char *digest, int algo)
186 unsigned char *p;
187 unsigned int t;
189 static struct dsa_public_key *key = NULL;
190 static struct dsa_signature *sig_struct;
192 if (key == NULL)
194 if (!(sig_struct = whine_malloc(sizeof(struct dsa_signature))) ||
195 !(key = whine_malloc(sizeof(struct dsa_public_key))))
196 return 0;
198 nettle_dsa_public_key_init(key);
199 nettle_dsa_signature_init(sig_struct);
202 if ((sig_len < 41) || !(p = blockdata_retrieve(key_data, key_len, NULL)))
203 return 0;
205 t = *p++;
207 if (key_len < (213 + (t * 24)))
208 return 0;
210 mpz_import(key->q, 20, 1, 1, 0, 0, p); p += 20;
211 mpz_import(key->p, 64 + (t*8), 1, 1, 0, 0, p); p += 64 + (t*8);
212 mpz_import(key->g, 64 + (t*8), 1, 1, 0, 0, p); p += 64 + (t*8);
213 mpz_import(key->y, 64 + (t*8), 1, 1, 0, 0, p); p += 64 + (t*8);
215 mpz_import(sig_struct->r, 20, 1, 1, 0, 0, sig+1);
216 mpz_import(sig_struct->s, 20, 1, 1, 0, 0, sig+21);
218 (void)algo;
220 return nettle_dsa_sha1_verify_digest(key, digest, sig_struct);
223 #ifndef NO_NETTLE_ECC
224 static int dnsmasq_ecdsa_verify(struct blockdata *key_data, unsigned int key_len,
225 unsigned char *sig, size_t sig_len,
226 unsigned char *digest, size_t digest_len, int algo)
228 unsigned char *p;
229 unsigned int t;
230 struct ecc_point *key;
232 static struct ecc_point *key_256 = NULL, *key_384 = NULL;
233 static mpz_t x, y;
234 static struct dsa_signature *sig_struct;
236 if (!sig_struct)
238 if (!(sig_struct = whine_malloc(sizeof(struct dsa_signature))))
239 return 0;
241 nettle_dsa_signature_init(sig_struct);
242 mpz_init(x);
243 mpz_init(y);
246 switch (algo)
248 case 13:
249 if (!key_256)
251 if (!(key_256 = whine_malloc(sizeof(struct ecc_point))))
252 return 0;
254 nettle_ecc_point_init(key_256, &nettle_secp_256r1);
257 key = key_256;
258 t = 32;
259 break;
261 case 14:
262 if (!key_384)
264 if (!(key_384 = whine_malloc(sizeof(struct ecc_point))))
265 return 0;
267 nettle_ecc_point_init(key_384, &nettle_secp_384r1);
270 key = key_384;
271 t = 48;
272 break;
274 default:
275 return 0;
278 if (sig_len != 2*t || key_len != 2*t ||
279 !(p = blockdata_retrieve(key_data, key_len, NULL)))
280 return 0;
282 mpz_import(x, t , 1, 1, 0, 0, p);
283 mpz_import(y, t , 1, 1, 0, 0, p + t);
285 if (!ecc_point_set(key, x, y))
286 return 0;
288 mpz_import(sig_struct->r, t, 1, 1, 0, 0, sig);
289 mpz_import(sig_struct->s, t, 1, 1, 0, 0, sig + t);
291 return nettle_ecdsa_verify(key, digest_len, digest, sig_struct);
293 #endif
295 static int verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
296 unsigned char *digest, size_t digest_len, int algo)
298 (void)digest_len;
300 switch (algo)
302 case 1: case 5: case 7: case 8: case 10:
303 return dnsmasq_rsa_verify(key_data, key_len, sig, sig_len, digest, algo);
305 case 3: case 6:
306 return dnsmasq_dsa_verify(key_data, key_len, sig, sig_len, digest, algo);
308 #ifndef NO_NETTLE_ECC
309 case 13: case 14:
310 return dnsmasq_ecdsa_verify(key_data, key_len, sig, sig_len, digest, digest_len, algo);
311 #endif
314 return 0;
317 /* Convert from presentation format to wire format, in place.
318 Also map UC -> LC.
319 Note that using extract_name to get presentation format
320 then calling to_wire() removes compression and maps case,
321 thus generating names in canonical form.
322 Calling to_wire followed by from_wire is almost an identity,
323 except that the UC remains mapped to LC.
325 Note that both /000 and '.' are allowed within labels. These get
326 represented in presentation format using NAME_ESCAPE as an escape
327 character. In theory, if all the characters in a name were /000 or
328 '.' or NAME_ESCAPE then all would have to be escaped, so the
329 presentation format would be twice as long as the spec (1024).
330 The buffers are all delcared as 2049 (allowing for the trailing zero)
331 for this reason.
333 static int to_wire(char *name)
335 unsigned char *l, *p, *q, term;
336 int len;
338 for (l = (unsigned char*)name; *l != 0; l = p)
340 for (p = l; *p != '.' && *p != 0; p++)
341 if (*p >= 'A' && *p <= 'Z')
342 *p = *p - 'A' + 'a';
343 else if (*p == NAME_ESCAPE)
345 for (q = p; *q; q++)
346 *q = *(q+1);
347 (*p)--;
349 term = *p;
351 if ((len = p - l) != 0)
352 memmove(l+1, l, len);
353 *l = len;
355 p++;
357 if (term == 0)
358 *p = 0;
361 return l + 1 - (unsigned char *)name;
364 /* Note: no compression allowed in input. */
365 static void from_wire(char *name)
367 unsigned char *l, *p, *last;
368 int len;
370 for (last = (unsigned char *)name; *last != 0; last += *last+1);
372 for (l = (unsigned char *)name; *l != 0; l += len+1)
374 len = *l;
375 memmove(l, l+1, len);
376 for (p = l; p < l + len; p++)
377 if (*p == '.' || *p == 0 || *p == NAME_ESCAPE)
379 memmove(p+1, p, 1 + last - p);
380 len++;
381 *p++ = NAME_ESCAPE;
382 (*p)++;
385 l[len] = '.';
388 if ((char *)l != name)
389 *(l-1) = 0;
392 /* Input in presentation format */
393 static int count_labels(char *name)
395 int i;
397 if (*name == 0)
398 return 0;
400 for (i = 0; *name; name++)
401 if (*name == '.')
402 i++;
404 return i+1;
407 /* Implement RFC1982 wrapped compare for 32-bit numbers */
408 static int serial_compare_32(unsigned long s1, unsigned long s2)
410 if (s1 == s2)
411 return SERIAL_EQ;
413 if ((s1 < s2 && (s2 - s1) < (1UL<<31)) ||
414 (s1 > s2 && (s1 - s2) > (1UL<<31)))
415 return SERIAL_LT;
416 if ((s1 < s2 && (s2 - s1) > (1UL<<31)) ||
417 (s1 > s2 && (s1 - s2) < (1UL<<31)))
418 return SERIAL_GT;
419 return SERIAL_UNDEF;
422 /* Called at startup. If the timestamp file is configured and exists, put its mtime on
423 timestamp_time. If it doesn't exist, create it, and set the mtime to 1-1-2015.
424 return -1 -> Cannot create file.
425 0 -> not using timestamp, or timestamp exists and is in past.
426 1 -> timestamp exists and is in future.
429 static time_t timestamp_time;
430 static int back_to_the_future;
432 int setup_timestamp(void)
434 struct stat statbuf;
436 back_to_the_future = 0;
438 if (!daemon->timestamp_file)
439 return 0;
441 if (stat(daemon->timestamp_file, &statbuf) != -1)
443 timestamp_time = statbuf.st_mtime;
444 check_and_exit:
445 if (difftime(timestamp_time, time(0)) <= 0)
447 /* time already OK, update timestamp, and do key checking from the start. */
448 if (utime(daemon->timestamp_file, NULL) == -1)
449 my_syslog(LOG_ERR, _("failed to update mtime on %s: %s"), daemon->timestamp_file, strerror(errno));
450 back_to_the_future = 1;
451 return 0;
453 return 1;
456 if (errno == ENOENT)
458 /* NB. for explanation of O_EXCL flag, see comment on pidfile in dnsmasq.c */
459 int fd = open(daemon->timestamp_file, O_WRONLY | O_CREAT | O_NONBLOCK | O_EXCL, 0666);
460 if (fd != -1)
462 struct utimbuf timbuf;
464 close(fd);
466 timestamp_time = timbuf.actime = timbuf.modtime = 1420070400; /* 1-1-2015 */
467 if (utime(daemon->timestamp_file, &timbuf) == 0)
468 goto check_and_exit;
472 return -1;
475 /* Check whether today/now is between date_start and date_end */
476 static int check_date_range(unsigned long date_start, unsigned long date_end)
478 unsigned long curtime = time(0);
480 /* Checking timestamps may be temporarily disabled */
482 /* If the current time if _before_ the timestamp
483 on our persistent timestamp file, then assume the
484 time if not yet correct, and don't check the
485 key timestamps. As soon as the current time is
486 later then the timestamp, update the timestamp
487 and start checking keys */
488 if (daemon->timestamp_file)
490 if (back_to_the_future == 0 && difftime(timestamp_time, curtime) <= 0)
492 if (utime(daemon->timestamp_file, NULL) != 0)
493 my_syslog(LOG_ERR, _("failed to update mtime on %s: %s"), daemon->timestamp_file, strerror(errno));
495 back_to_the_future = 1;
496 set_option_bool(OPT_DNSSEC_TIME);
497 queue_event(EVENT_RELOAD); /* purge cache */
500 if (back_to_the_future == 0)
501 return 1;
503 else if (option_bool(OPT_DNSSEC_TIME))
504 return 1;
506 /* We must explicitly check against wanted values, because of SERIAL_UNDEF */
507 return serial_compare_32(curtime, date_start) == SERIAL_GT
508 && serial_compare_32(curtime, date_end) == SERIAL_LT;
511 static u16 *get_desc(int type)
513 /* List of RRtypes which include domains in the data.
514 0 -> domain
515 integer -> no of plain bytes
516 -1 -> end
518 zero is not a valid RRtype, so the final entry is returned for
519 anything which needs no mangling.
522 static u16 rr_desc[] =
524 T_NS, 0, -1,
525 T_MD, 0, -1,
526 T_MF, 0, -1,
527 T_CNAME, 0, -1,
528 T_SOA, 0, 0, -1,
529 T_MB, 0, -1,
530 T_MG, 0, -1,
531 T_MR, 0, -1,
532 T_PTR, 0, -1,
533 T_MINFO, 0, 0, -1,
534 T_MX, 2, 0, -1,
535 T_RP, 0, 0, -1,
536 T_AFSDB, 2, 0, -1,
537 T_RT, 2, 0, -1,
538 T_SIG, 18, 0, -1,
539 T_PX, 2, 0, 0, -1,
540 T_NXT, 0, -1,
541 T_KX, 2, 0, -1,
542 T_SRV, 6, 0, -1,
543 T_DNAME, 0, -1,
544 0, -1 /* wildcard/catchall */
547 u16 *p = rr_desc;
549 while (*p != type && *p != 0)
550 while (*p++ != (u16)-1);
552 return p+1;
555 /* Return bytes of canonicalised rdata, when the return value is zero, the remaining
556 data, pointed to by *p, should be used raw. */
557 static int get_rdata(struct dns_header *header, size_t plen, unsigned char *end, char *buff, int bufflen,
558 unsigned char **p, u16 **desc)
560 int d = **desc;
562 /* No more data needs mangling */
563 if (d == (u16)-1)
565 /* If there's more data than we have space for, just return what fits,
566 we'll get called again for more chunks */
567 if (end - *p > bufflen)
569 memcpy(buff, *p, bufflen);
570 *p += bufflen;
571 return bufflen;
574 return 0;
577 (*desc)++;
579 if (d == 0 && extract_name(header, plen, p, buff, 1, 0))
580 /* domain-name, canonicalise */
581 return to_wire(buff);
582 else
584 /* plain data preceding a domain-name, don't run off the end of the data */
585 if ((end - *p) < d)
586 d = end - *p;
588 if (d != 0)
590 memcpy(buff, *p, d);
591 *p += d;
594 return d;
598 static int expand_workspace(unsigned char ***wkspc, int *sz, int new)
600 unsigned char **p;
601 int new_sz = *sz;
603 if (new_sz > new)
604 return 1;
606 if (new >= 100)
607 return 0;
609 new_sz += 5;
611 if (!(p = whine_malloc((new_sz) * sizeof(unsigned char **))))
612 return 0;
614 if (*wkspc)
616 memcpy(p, *wkspc, *sz * sizeof(unsigned char **));
617 free(*wkspc);
620 *wkspc = p;
621 *sz = new_sz;
623 return 1;
626 /* Bubble sort the RRset into the canonical order.
627 Note that the byte-streams from two RRs may get unsynced: consider
628 RRs which have two domain-names at the start and then other data.
629 The domain-names may have different lengths in each RR, but sort equal
631 ------------
632 |abcde|fghi|
633 ------------
634 |abcd|efghi|
635 ------------
637 leaving the following bytes as deciding the order. Hence the nasty left1 and left2 variables.
640 static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int rrsetidx,
641 unsigned char **rrset, char *buff1, char *buff2)
643 int swap, quit, i;
647 for (swap = 0, i = 0; i < rrsetidx-1; i++)
649 int rdlen1, rdlen2, left1, left2, len1, len2, len, rc;
650 u16 *dp1, *dp2;
651 unsigned char *end1, *end2;
652 /* Note that these have been determined to be OK previously,
653 so we don't need to check for NULL return here. */
654 unsigned char *p1 = skip_name(rrset[i], header, plen, 10);
655 unsigned char *p2 = skip_name(rrset[i+1], header, plen, 10);
657 p1 += 8; /* skip class, type, ttl */
658 GETSHORT(rdlen1, p1);
659 end1 = p1 + rdlen1;
661 p2 += 8; /* skip class, type, ttl */
662 GETSHORT(rdlen2, p2);
663 end2 = p2 + rdlen2;
665 dp1 = dp2 = rr_desc;
667 for (quit = 0, left1 = 0, left2 = 0, len1 = 0, len2 = 0; !quit;)
669 if (left1 != 0)
670 memmove(buff1, buff1 + len1 - left1, left1);
672 if ((len1 = get_rdata(header, plen, end1, buff1 + left1, (MAXDNAME * 2) - left1, &p1, &dp1)) == 0)
674 quit = 1;
675 len1 = end1 - p1;
676 memcpy(buff1 + left1, p1, len1);
678 len1 += left1;
680 if (left2 != 0)
681 memmove(buff2, buff2 + len2 - left2, left2);
683 if ((len2 = get_rdata(header, plen, end2, buff2 + left2, (MAXDNAME *2) - left2, &p2, &dp2)) == 0)
685 quit = 1;
686 len2 = end2 - p2;
687 memcpy(buff2 + left2, p2, len2);
689 len2 += left2;
691 if (len1 > len2)
692 left1 = len1 - len2, left2 = 0, len = len2;
693 else
694 left2 = len2 - len1, left1 = 0, len = len1;
696 rc = (len == 0) ? 0 : memcmp(buff1, buff2, len);
698 if (rc > 0 || (rc == 0 && quit && len1 > len2))
700 unsigned char *tmp = rrset[i+1];
701 rrset[i+1] = rrset[i];
702 rrset[i] = tmp;
703 swap = quit = 1;
705 else if (rc < 0)
706 quit = 1;
709 } while (swap);
712 /* Validate a single RRset (class, type, name) in the supplied DNS reply
713 Return code:
714 STAT_SECURE if it validates.
715 STAT_SECURE_WILDCARD if it validates and is the result of wildcard expansion.
716 (In this case *wildcard_out points to the "body" of the wildcard within name.)
717 STAT_NO_SIG no RRsigs found.
718 STAT_INSECURE RRset empty.
719 STAT_BOGUS signature is wrong, bad packet.
720 STAT_NEED_KEY need DNSKEY to complete validation (name is returned in keyname)
722 if key is non-NULL, use that key, which has the algo and tag given in the params of those names,
723 otherwise find the key in the cache.
725 name is unchanged on exit. keyname is used as workspace and trashed.
727 static int validate_rrset(time_t now, struct dns_header *header, size_t plen, int class, int type,
728 char *name, char *keyname, char **wildcard_out, struct blockdata *key, int keylen, int algo_in, int keytag_in)
730 static unsigned char **rrset = NULL, **sigs = NULL;
731 static int rrset_sz = 0, sig_sz = 0;
733 unsigned char *p;
734 int rrsetidx, sigidx, res, rdlen, j, name_labels;
735 struct crec *crecp = NULL;
736 int type_covered, algo, labels, orig_ttl, sig_expiration, sig_inception, key_tag;
737 u16 *rr_desc = get_desc(type);
739 if (wildcard_out)
740 *wildcard_out = NULL;
742 if (!(p = skip_questions(header, plen)))
743 return STAT_BOGUS;
745 name_labels = count_labels(name); /* For 4035 5.3.2 check */
747 /* look for RRSIGs for this RRset and get pointers to each RR in the set. */
748 for (rrsetidx = 0, sigidx = 0, j = ntohs(header->ancount) + ntohs(header->nscount);
749 j != 0; j--)
751 unsigned char *pstart, *pdata;
752 int stype, sclass;
754 pstart = p;
756 if (!(res = extract_name(header, plen, &p, name, 0, 10)))
757 return STAT_BOGUS; /* bad packet */
759 GETSHORT(stype, p);
760 GETSHORT(sclass, p);
761 p += 4; /* TTL */
763 pdata = p;
765 GETSHORT(rdlen, p);
767 if (!CHECK_LEN(header, p, plen, rdlen))
768 return STAT_BOGUS;
770 if (res == 1 && sclass == class)
772 if (stype == type)
774 if (!expand_workspace(&rrset, &rrset_sz, rrsetidx))
775 return STAT_BOGUS;
777 rrset[rrsetidx++] = pstart;
780 if (stype == T_RRSIG)
782 if (rdlen < 18)
783 return STAT_BOGUS; /* bad packet */
785 GETSHORT(type_covered, p);
787 if (type_covered == type)
789 if (!expand_workspace(&sigs, &sig_sz, sigidx))
790 return STAT_BOGUS;
792 sigs[sigidx++] = pdata;
795 p = pdata + 2; /* restore for ADD_RDLEN */
799 if (!ADD_RDLEN(header, p, plen, rdlen))
800 return STAT_BOGUS;
803 /* RRset empty */
804 if (rrsetidx == 0)
805 return STAT_INSECURE;
807 /* no RRSIGs */
808 if (sigidx == 0)
809 return STAT_NO_SIG;
811 /* Sort RRset records into canonical order.
812 Note that at this point keyname and daemon->workspacename buffs are
813 unused, and used as workspace by the sort. */
814 sort_rrset(header, plen, rr_desc, rrsetidx, rrset, daemon->workspacename, keyname);
816 /* Now try all the sigs to try and find one which validates */
817 for (j = 0; j <sigidx; j++)
819 unsigned char *psav, *sig, *digest;
820 int i, wire_len, sig_len;
821 const struct nettle_hash *hash;
822 void *ctx;
823 char *name_start;
824 u32 nsigttl;
826 p = sigs[j];
827 GETSHORT(rdlen, p); /* rdlen >= 18 checked previously */
828 psav = p;
830 p += 2; /* type_covered - already checked */
831 algo = *p++;
832 labels = *p++;
833 GETLONG(orig_ttl, p);
834 GETLONG(sig_expiration, p);
835 GETLONG(sig_inception, p);
836 GETSHORT(key_tag, p);
838 if (!extract_name(header, plen, &p, keyname, 1, 0))
839 return STAT_BOGUS;
841 /* RFC 4035 5.3.1 says that the Signer's Name field MUST equal
842 the name of the zone containing the RRset. We can't tell that
843 for certain, but we can check that the RRset name is equal to
844 or encloses the signers name, which should be enough to stop
845 an attacker using signatures made with the key of an unrelated
846 zone he controls. Note that the root key is always allowed. */
847 if (*keyname != 0)
849 int failed = 0;
851 for (name_start = name; !hostname_isequal(name_start, keyname); )
852 if ((name_start = strchr(name_start, '.')))
853 name_start++; /* chop a label off and try again */
854 else
856 failed = 1;
857 break;
860 /* Bad sig, try another */
861 if (failed)
862 continue;
865 /* Other 5.3.1 checks */
866 if (!check_date_range(sig_inception, sig_expiration) ||
867 labels > name_labels ||
868 !(hash = hash_find(algo_digest_name(algo))) ||
869 !hash_init(hash, &ctx, &digest))
870 continue;
872 /* OK, we have the signature record, see if the relevant DNSKEY is in the cache. */
873 if (!key && !(crecp = cache_find_by_name(NULL, keyname, now, F_DNSKEY)))
874 return STAT_NEED_KEY;
876 sig = p;
877 sig_len = rdlen - (p - psav);
879 nsigttl = htonl(orig_ttl);
881 hash->update(ctx, 18, psav);
882 wire_len = to_wire(keyname);
883 hash->update(ctx, (unsigned int)wire_len, (unsigned char*)keyname);
884 from_wire(keyname);
886 for (i = 0; i < rrsetidx; ++i)
888 int seg;
889 unsigned char *end, *cp;
890 u16 len, *dp;
892 p = rrset[i];
893 if (!extract_name(header, plen, &p, name, 1, 10))
894 return STAT_BOGUS;
896 name_start = name;
898 /* if more labels than in RRsig name, hash *.<no labels in rrsig labels field> 4035 5.3.2 */
899 if (labels < name_labels)
901 int k;
902 for (k = name_labels - labels; k != 0; k--)
904 while (*name_start != '.' && *name_start != 0)
905 name_start++;
906 if (k != 1 && *name_start == '.')
907 name_start++;
910 if (wildcard_out)
911 *wildcard_out = name_start+1;
913 name_start--;
914 *name_start = '*';
917 wire_len = to_wire(name_start);
918 hash->update(ctx, (unsigned int)wire_len, (unsigned char *)name_start);
919 hash->update(ctx, 4, p); /* class and type */
920 hash->update(ctx, 4, (unsigned char *)&nsigttl);
922 p += 8; /* skip class, type, ttl */
923 GETSHORT(rdlen, p);
924 if (!CHECK_LEN(header, p, plen, rdlen))
925 return STAT_BOGUS;
927 end = p + rdlen;
929 /* canonicalise rdata and calculate length of same, use name buffer as workspace.
930 Note that name buffer is twice MAXDNAME long in DNSSEC mode. */
931 cp = p;
932 dp = rr_desc;
933 for (len = 0; (seg = get_rdata(header, plen, end, name, MAXDNAME * 2, &cp, &dp)) != 0; len += seg);
934 len += end - cp;
935 len = htons(len);
936 hash->update(ctx, 2, (unsigned char *)&len);
938 /* Now canonicalise again and digest. */
939 cp = p;
940 dp = rr_desc;
941 while ((seg = get_rdata(header, plen, end, name, MAXDNAME * 2, &cp, &dp)))
942 hash->update(ctx, seg, (unsigned char *)name);
943 if (cp != end)
944 hash->update(ctx, end - cp, cp);
947 hash->digest(ctx, hash->digest_size, digest);
949 /* namebuff used for workspace above, restore to leave unchanged on exit */
950 p = (unsigned char*)(rrset[0]);
951 extract_name(header, plen, &p, name, 1, 0);
953 if (key)
955 if (algo_in == algo && keytag_in == key_tag &&
956 verify(key, keylen, sig, sig_len, digest, hash->digest_size, algo))
957 return STAT_SECURE;
959 else
961 /* iterate through all possible keys 4035 5.3.1 */
962 for (; crecp; crecp = cache_find_by_name(crecp, keyname, now, F_DNSKEY))
963 if (crecp->addr.key.algo == algo &&
964 crecp->addr.key.keytag == key_tag &&
965 crecp->uid == (unsigned int)class &&
966 verify(crecp->addr.key.keydata, crecp->addr.key.keylen, sig, sig_len, digest, hash->digest_size, algo))
967 return (labels < name_labels) ? STAT_SECURE_WILDCARD : STAT_SECURE;
971 return STAT_BOGUS;
974 /* The DNS packet is expected to contain the answer to a DNSKEY query.
975 Put all DNSKEYs in the answer which are valid into the cache.
976 return codes:
977 STAT_SECURE At least one valid DNSKEY found and in cache.
978 STAT_BOGUS No DNSKEYs found, which can be validated with DS,
979 or self-sign for DNSKEY RRset is not valid, bad packet.
980 STAT_NEED_DS DS records to validate a key not found, name in keyname
982 int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class)
984 unsigned char *psave, *p = (unsigned char *)(header+1);
985 struct crec *crecp, *recp1;
986 int rc, j, qtype, qclass, ttl, rdlen, flags, algo, valid, keytag, type_covered;
987 struct blockdata *key;
988 struct all_addr a;
990 if (ntohs(header->qdcount) != 1 ||
991 !extract_name(header, plen, &p, name, 1, 4))
992 return STAT_BOGUS;
994 GETSHORT(qtype, p);
995 GETSHORT(qclass, p);
997 if (qtype != T_DNSKEY || qclass != class || ntohs(header->ancount) == 0)
998 return STAT_BOGUS;
1000 /* See if we have cached a DS record which validates this key */
1001 if (!(crecp = cache_find_by_name(NULL, name, now, F_DS)))
1003 strcpy(keyname, name);
1004 return STAT_NEED_DS;
1007 /* If we've cached that DS provably doesn't exist, result must be INSECURE */
1008 if (crecp->flags & F_NEG)
1009 return STAT_INSECURE_DS;
1011 /* NOTE, we need to find ONE DNSKEY which matches the DS */
1012 for (valid = 0, j = ntohs(header->ancount); j != 0 && !valid; j--)
1014 /* Ensure we have type, class TTL and length */
1015 if (!(rc = extract_name(header, plen, &p, name, 0, 10)))
1016 return STAT_BOGUS; /* bad packet */
1018 GETSHORT(qtype, p);
1019 GETSHORT(qclass, p);
1020 GETLONG(ttl, p);
1021 GETSHORT(rdlen, p);
1023 if (!CHECK_LEN(header, p, plen, rdlen) || rdlen < 4)
1024 return STAT_BOGUS; /* bad packet */
1026 if (qclass != class || qtype != T_DNSKEY || rc == 2)
1028 p += rdlen;
1029 continue;
1032 psave = p;
1034 GETSHORT(flags, p);
1035 if (*p++ != 3)
1036 return STAT_BOGUS;
1037 algo = *p++;
1038 keytag = dnskey_keytag(algo, flags, p, rdlen - 4);
1039 key = NULL;
1041 /* key must have zone key flag set */
1042 if (flags & 0x100)
1043 key = blockdata_alloc((char*)p, rdlen - 4);
1045 p = psave;
1047 if (!ADD_RDLEN(header, p, plen, rdlen))
1049 if (key)
1050 blockdata_free(key);
1051 return STAT_BOGUS; /* bad packet */
1054 /* No zone key flag or malloc failure */
1055 if (!key)
1056 continue;
1058 for (recp1 = crecp; recp1; recp1 = cache_find_by_name(recp1, name, now, F_DS))
1060 void *ctx;
1061 unsigned char *digest, *ds_digest;
1062 const struct nettle_hash *hash;
1064 if (recp1->addr.ds.algo == algo &&
1065 recp1->addr.ds.keytag == keytag &&
1066 recp1->uid == (unsigned int)class &&
1067 (hash = hash_find(ds_digest_name(recp1->addr.ds.digest))) &&
1068 hash_init(hash, &ctx, &digest))
1071 int wire_len = to_wire(name);
1073 /* Note that digest may be different between DSs, so
1074 we can't move this outside the loop. */
1075 hash->update(ctx, (unsigned int)wire_len, (unsigned char *)name);
1076 hash->update(ctx, (unsigned int)rdlen, psave);
1077 hash->digest(ctx, hash->digest_size, digest);
1079 from_wire(name);
1081 if (recp1->addr.ds.keylen == (int)hash->digest_size &&
1082 (ds_digest = blockdata_retrieve(recp1->addr.key.keydata, recp1->addr.ds.keylen, NULL)) &&
1083 memcmp(ds_digest, digest, recp1->addr.ds.keylen) == 0 &&
1084 validate_rrset(now, header, plen, class, T_DNSKEY, name, keyname, NULL, key, rdlen - 4, algo, keytag) == STAT_SECURE)
1086 valid = 1;
1087 break;
1091 blockdata_free(key);
1094 if (valid)
1096 /* DNSKEY RRset determined to be OK, now cache it and the RRsigs that sign it. */
1097 cache_start_insert();
1099 p = skip_questions(header, plen);
1101 for (j = ntohs(header->ancount); j != 0; j--)
1103 /* Ensure we have type, class TTL and length */
1104 if (!(rc = extract_name(header, plen, &p, name, 0, 10)))
1105 return STAT_INSECURE; /* bad packet */
1107 GETSHORT(qtype, p);
1108 GETSHORT(qclass, p);
1109 GETLONG(ttl, p);
1110 GETSHORT(rdlen, p);
1112 if (!CHECK_LEN(header, p, plen, rdlen))
1113 return STAT_BOGUS; /* bad packet */
1115 if (qclass == class && rc == 1)
1117 psave = p;
1119 if (qtype == T_DNSKEY)
1121 if (rdlen < 4)
1122 return STAT_BOGUS; /* bad packet */
1124 GETSHORT(flags, p);
1125 if (*p++ != 3)
1126 return STAT_BOGUS;
1127 algo = *p++;
1128 keytag = dnskey_keytag(algo, flags, p, rdlen - 4);
1130 /* Cache needs to known class for DNSSEC stuff */
1131 a.addr.dnssec.class = class;
1133 if ((key = blockdata_alloc((char*)p, rdlen - 4)))
1135 if (!(recp1 = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DNSSECOK)))
1136 blockdata_free(key);
1137 else
1139 a.addr.keytag = keytag;
1140 log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DNSKEY keytag %u");
1142 recp1->addr.key.keylen = rdlen - 4;
1143 recp1->addr.key.keydata = key;
1144 recp1->addr.key.algo = algo;
1145 recp1->addr.key.keytag = keytag;
1146 recp1->addr.key.flags = flags;
1150 else if (qtype == T_RRSIG)
1152 /* RRSIG, cache if covers DNSKEY RRset */
1153 if (rdlen < 18)
1154 return STAT_BOGUS; /* bad packet */
1156 GETSHORT(type_covered, p);
1158 if (type_covered == T_DNSKEY)
1160 a.addr.dnssec.class = class;
1161 a.addr.dnssec.type = type_covered;
1163 algo = *p++;
1164 p += 13; /* labels, orig_ttl, expiration, inception */
1165 GETSHORT(keytag, p);
1166 if ((key = blockdata_alloc((char*)psave, rdlen)))
1168 if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DS)))
1169 blockdata_free(key);
1170 else
1172 crecp->addr.sig.keydata = key;
1173 crecp->addr.sig.keylen = rdlen;
1174 crecp->addr.sig.keytag = keytag;
1175 crecp->addr.sig.type_covered = type_covered;
1176 crecp->addr.sig.algo = algo;
1182 p = psave;
1185 if (!ADD_RDLEN(header, p, plen, rdlen))
1186 return STAT_BOGUS; /* bad packet */
1189 /* commit cache insert. */
1190 cache_end_insert();
1191 return STAT_SECURE;
1194 log_query(F_NOEXTRA | F_UPSTREAM, name, NULL, "BOGUS DNSKEY");
1195 return STAT_BOGUS;
1198 /* The DNS packet is expected to contain the answer to a DS query
1199 Put all DSs in the answer which are valid into the cache.
1200 return codes:
1201 STAT_SECURE At least one valid DS found and in cache.
1202 STAT_NO_DS It's proved there's no DS here.
1203 STAT_NO_NS It's proved there's no DS _or_ NS here.
1204 STAT_BOGUS no DS in reply or not signed, fails validation, bad packet.
1205 STAT_NEED_KEY DNSKEY records to validate a DS not found, name in keyname
1208 int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class)
1210 unsigned char *p = (unsigned char *)(header+1);
1211 int qtype, qclass, val, i, neganswer, nons;
1213 if (ntohs(header->qdcount) != 1 ||
1214 !(p = skip_name(p, header, plen, 4)))
1215 return STAT_BOGUS;
1217 GETSHORT(qtype, p);
1218 GETSHORT(qclass, p);
1220 if (qtype != T_DS || qclass != class)
1221 val = STAT_BOGUS;
1222 else
1223 val = dnssec_validate_reply(now, header, plen, name, keyname, NULL, &neganswer, &nons);
1224 /* Note dnssec_validate_reply() will have cached positive answers */
1226 if (val == STAT_INSECURE)
1227 val = STAT_BOGUS;
1229 if (val == STAT_NO_SIG)
1230 return val;
1232 p = (unsigned char *)(header+1);
1233 extract_name(header, plen, &p, name, 1, 4);
1234 p += 4; /* qtype, qclass */
1236 if (!(p = skip_section(p, ntohs(header->ancount), header, plen)))
1237 val = STAT_BOGUS;
1239 /* If the key needed to validate the DS is on the same domain as the DS, we'll
1240 loop getting nowhere. Stop that now. This can happen of the DS answer comes
1241 from the DS's zone, and not the parent zone. */
1242 if (val == STAT_BOGUS || (val == STAT_NEED_KEY && hostname_isequal(name, keyname)))
1244 log_query(F_NOEXTRA | F_UPSTREAM, name, NULL, "BOGUS DS");
1245 return STAT_BOGUS;
1248 /* By here, the answer is proved secure, and a positive answer has been cached. */
1249 if (val == STAT_SECURE && neganswer)
1251 int rdlen, flags = F_FORWARD | F_DS | F_NEG | F_DNSSECOK;
1252 unsigned long ttl, minttl = ULONG_MAX;
1253 struct all_addr a;
1255 if (RCODE(header) == NXDOMAIN)
1256 flags |= F_NXDOMAIN;
1258 /* We only cache validated DS records, DNSSECOK flag hijacked
1259 to store presence/absence of NS. */
1260 if (nons)
1261 flags &= ~F_DNSSECOK;
1263 for (i = ntohs(header->nscount); i != 0; i--)
1265 if (!(p = skip_name(p, header, plen, 0)))
1266 return STAT_BOGUS;
1268 GETSHORT(qtype, p);
1269 GETSHORT(qclass, p);
1270 GETLONG(ttl, p);
1271 GETSHORT(rdlen, p);
1273 if (!CHECK_LEN(header, p, plen, rdlen))
1274 return STAT_BOGUS; /* bad packet */
1276 if (qclass != class || qtype != T_SOA)
1278 p += rdlen;
1279 continue;
1282 if (ttl < minttl)
1283 minttl = ttl;
1285 /* MNAME */
1286 if (!(p = skip_name(p, header, plen, 0)))
1287 return STAT_BOGUS;
1288 /* RNAME */
1289 if (!(p = skip_name(p, header, plen, 20)))
1290 return STAT_BOGUS;
1291 p += 16; /* SERIAL REFRESH RETRY EXPIRE */
1293 GETLONG(ttl, p); /* minTTL */
1294 if (ttl < minttl)
1295 minttl = ttl;
1297 break;
1300 if (i != 0)
1302 cache_start_insert();
1304 a.addr.dnssec.class = class;
1305 cache_insert(name, &a, now, ttl, flags);
1307 cache_end_insert();
1309 log_query(F_NOEXTRA | F_UPSTREAM, name, NULL, nons ? "no delegation" : "no DS");
1312 return nons ? STAT_NO_NS : STAT_NO_DS;
1315 return val;
1318 /* 4034 6.1 */
1319 static int hostname_cmp(const char *a, const char *b)
1321 char *sa, *ea, *ca, *sb, *eb, *cb;
1322 unsigned char ac, bc;
1324 sa = ea = (char *)a + strlen(a);
1325 sb = eb = (char *)b + strlen(b);
1327 while (1)
1329 while (sa != a && *(sa-1) != '.')
1330 sa--;
1332 while (sb != b && *(sb-1) != '.')
1333 sb--;
1335 ca = sa;
1336 cb = sb;
1338 while (1)
1340 if (ca == ea)
1342 if (cb == eb)
1343 break;
1345 return -1;
1348 if (cb == eb)
1349 return 1;
1351 ac = (unsigned char) *ca++;
1352 bc = (unsigned char) *cb++;
1354 if (ac >= 'A' && ac <= 'Z')
1355 ac += 'a' - 'A';
1356 if (bc >= 'A' && bc <= 'Z')
1357 bc += 'a' - 'A';
1359 if (ac < bc)
1360 return -1;
1361 else if (ac != bc)
1362 return 1;
1366 if (sa == a)
1368 if (sb == b)
1369 return 0;
1371 return -1;
1374 if (sb == b)
1375 return 1;
1377 ea = sa--;
1378 eb = sb--;
1382 /* Find all the NSEC or NSEC3 records in a reply.
1383 return an array of pointers to them. */
1384 static int find_nsec_records(struct dns_header *header, size_t plen, unsigned char ***nsecsetp, int *nsecsetl, int class_reqd)
1386 static unsigned char **nsecset = NULL;
1387 static int nsecset_sz = 0;
1389 int type_found = 0;
1390 unsigned char *p = skip_questions(header, plen);
1391 int type, class, rdlen, i, nsecs_found;
1393 /* Move to NS section */
1394 if (!p || !(p = skip_section(p, ntohs(header->ancount), header, plen)))
1395 return 0;
1397 for (nsecs_found = 0, i = ntohs(header->nscount); i != 0; i--)
1399 unsigned char *pstart = p;
1401 if (!(p = skip_name(p, header, plen, 10)))
1402 return 0;
1404 GETSHORT(type, p);
1405 GETSHORT(class, p);
1406 p += 4; /* TTL */
1407 GETSHORT(rdlen, p);
1409 if (class == class_reqd && (type == T_NSEC || type == T_NSEC3))
1411 /* No mixed NSECing 'round here, thankyouverymuch */
1412 if (type_found == T_NSEC && type == T_NSEC3)
1413 return 0;
1414 if (type_found == T_NSEC3 && type == T_NSEC)
1415 return 0;
1417 type_found = type;
1419 if (!expand_workspace(&nsecset, &nsecset_sz, nsecs_found))
1420 return 0;
1422 nsecset[nsecs_found++] = pstart;
1425 if (!ADD_RDLEN(header, p, plen, rdlen))
1426 return 0;
1429 *nsecsetp = nsecset;
1430 *nsecsetl = nsecs_found;
1432 return type_found;
1435 static int prove_non_existence_nsec(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
1436 char *workspace1, char *workspace2, char *name, int type, int *nons)
1438 int i, rc, rdlen;
1439 unsigned char *p, *psave;
1440 int offset = (type & 0xff) >> 3;
1441 int mask = 0x80 >> (type & 0x07);
1443 if (nons)
1444 *nons = 0;
1446 /* Find NSEC record that proves name doesn't exist */
1447 for (i = 0; i < nsec_count; i++)
1449 p = nsecs[i];
1450 if (!extract_name(header, plen, &p, workspace1, 1, 10))
1451 return STAT_BOGUS;
1452 p += 8; /* class, type, TTL */
1453 GETSHORT(rdlen, p);
1454 psave = p;
1455 if (!extract_name(header, plen, &p, workspace2, 1, 10))
1456 return STAT_BOGUS;
1458 rc = hostname_cmp(workspace1, name);
1460 if (rc == 0)
1462 /* 4035 para 5.4. Last sentence */
1463 if (type == T_NSEC || type == T_RRSIG)
1464 return STAT_SECURE;
1466 /* NSEC with the same name as the RR we're testing, check
1467 that the type in question doesn't appear in the type map */
1468 rdlen -= p - psave;
1469 /* rdlen is now length of type map, and p points to it */
1471 /* If we can prove that there's no NS record, return that information. */
1472 if (nons && rdlen >= 2 && p[0] == 0 && (p[2] & (0x80 >> T_NS)) == 0)
1473 *nons = 1;
1475 while (rdlen >= 2)
1477 if (!CHECK_LEN(header, p, plen, rdlen))
1478 return STAT_BOGUS;
1480 if (p[0] == type >> 8)
1482 /* Does the NSEC say our type exists? */
1483 if (offset < p[1] && (p[offset+2] & mask) != 0)
1484 return STAT_BOGUS;
1486 break; /* finshed checking */
1489 rdlen -= p[1];
1490 p += p[1];
1493 return STAT_SECURE;
1495 else if (rc == -1)
1497 /* Normal case, name falls between NSEC name and next domain name,
1498 wrap around case, name falls between NSEC name (rc == -1) and end */
1499 if (hostname_cmp(workspace2, name) >= 0 || hostname_cmp(workspace1, workspace2) >= 0)
1500 return STAT_SECURE;
1502 else
1504 /* wrap around case, name falls between start and next domain name */
1505 if (hostname_cmp(workspace1, workspace2) >= 0 && hostname_cmp(workspace2, name) >=0 )
1506 return STAT_SECURE;
1510 return STAT_BOGUS;
1513 /* return digest length, or zero on error */
1514 static int hash_name(char *in, unsigned char **out, struct nettle_hash const *hash,
1515 unsigned char *salt, int salt_len, int iterations)
1517 void *ctx;
1518 unsigned char *digest;
1519 int i;
1521 if (!hash_init(hash, &ctx, &digest))
1522 return 0;
1524 hash->update(ctx, to_wire(in), (unsigned char *)in);
1525 hash->update(ctx, salt_len, salt);
1526 hash->digest(ctx, hash->digest_size, digest);
1528 for(i = 0; i < iterations; i++)
1530 hash->update(ctx, hash->digest_size, digest);
1531 hash->update(ctx, salt_len, salt);
1532 hash->digest(ctx, hash->digest_size, digest);
1535 from_wire(in);
1537 *out = digest;
1538 return hash->digest_size;
1541 /* Decode base32 to first "." or end of string */
1542 static int base32_decode(char *in, unsigned char *out)
1544 int oc, on, c, mask, i;
1545 unsigned char *p = out;
1547 for (c = *in, oc = 0, on = 0; c != 0 && c != '.'; c = *++in)
1549 if (c >= '0' && c <= '9')
1550 c -= '0';
1551 else if (c >= 'a' && c <= 'v')
1552 c -= 'a', c += 10;
1553 else if (c >= 'A' && c <= 'V')
1554 c -= 'A', c += 10;
1555 else
1556 return 0;
1558 for (mask = 0x10, i = 0; i < 5; i++)
1560 if (c & mask)
1561 oc |= 1;
1562 mask = mask >> 1;
1563 if (((++on) & 7) == 0)
1564 *p++ = oc;
1565 oc = oc << 1;
1569 if ((on & 7) != 0)
1570 return 0;
1572 return p - out;
1575 static int check_nsec3_coverage(struct dns_header *header, size_t plen, int digest_len, unsigned char *digest, int type,
1576 char *workspace1, char *workspace2, unsigned char **nsecs, int nsec_count, int *nons)
1578 int i, hash_len, salt_len, base32_len, rdlen;
1579 unsigned char *p, *psave;
1581 for (i = 0; i < nsec_count; i++)
1582 if ((p = nsecs[i]))
1584 if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
1585 !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
1586 return 0;
1588 p += 8; /* class, type, TTL */
1589 GETSHORT(rdlen, p);
1590 psave = p;
1591 p += 4; /* algo, flags, iterations */
1592 salt_len = *p++; /* salt_len */
1593 p += salt_len; /* salt */
1594 hash_len = *p++; /* p now points to next hashed name */
1596 if (!CHECK_LEN(header, p, plen, hash_len))
1597 return 0;
1599 if (digest_len == base32_len && hash_len == base32_len)
1601 int rc = memcmp(workspace2, digest, digest_len);
1603 if (rc == 0)
1605 /* We found an NSEC3 whose hashed name exactly matches the query, so
1606 we just need to check the type map. p points to the RR data for the record. */
1608 int offset = (type & 0xff) >> 3;
1609 int mask = 0x80 >> (type & 0x07);
1611 p += hash_len; /* skip next-domain hash */
1612 rdlen -= p - psave;
1614 if (!CHECK_LEN(header, p, plen, rdlen))
1615 return 0;
1617 /* If we can prove that there's no NS record, return that information. */
1618 if (nons && rdlen >= 2 && p[0] == 0 && (p[2] & (0x80 >> T_NS)) == 0)
1619 *nons = 1;
1621 while (rdlen >= 2)
1623 if (p[0] == type >> 8)
1625 /* Does the NSEC3 say our type exists? */
1626 if (offset < p[1] && (p[offset+2] & mask) != 0)
1627 return STAT_BOGUS;
1629 break; /* finshed checking */
1632 rdlen -= p[1];
1633 p += p[1];
1636 return 1;
1638 else if (rc < 0)
1640 /* Normal case, hash falls between NSEC3 name-hash and next domain name-hash,
1641 wrap around case, name-hash falls between NSEC3 name-hash and end */
1642 if (memcmp(p, digest, digest_len) >= 0 || memcmp(workspace2, p, digest_len) >= 0)
1643 return 1;
1645 else
1647 /* wrap around case, name falls between start and next domain name */
1648 if (memcmp(workspace2, p, digest_len) >= 0 && memcmp(p, digest, digest_len) >= 0)
1649 return 1;
1653 return 0;
1656 static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
1657 char *workspace1, char *workspace2, char *name, int type, char *wildname, int *nons)
1659 unsigned char *salt, *p, *digest;
1660 int digest_len, i, iterations, salt_len, base32_len, algo = 0;
1661 struct nettle_hash const *hash;
1662 char *closest_encloser, *next_closest, *wildcard;
1664 if (nons)
1665 *nons = 0;
1667 /* Look though the NSEC3 records to find the first one with
1668 an algorithm we support (currently only algo == 1).
1670 Take the algo, iterations, and salt of that record
1671 as the ones we're going to use, and prune any
1672 that don't match. */
1674 for (i = 0; i < nsec_count; i++)
1676 if (!(p = skip_name(nsecs[i], header, plen, 15)))
1677 return STAT_BOGUS; /* bad packet */
1679 p += 10; /* type, class, TTL, rdlen */
1680 algo = *p++;
1682 if (algo == 1)
1683 break; /* known algo */
1686 /* No usable NSEC3s */
1687 if (i == nsec_count)
1688 return STAT_BOGUS;
1690 p++; /* flags */
1691 GETSHORT (iterations, p);
1692 salt_len = *p++;
1693 salt = p;
1694 if (!CHECK_LEN(header, salt, plen, salt_len))
1695 return STAT_BOGUS; /* bad packet */
1697 /* Now prune so we only have NSEC3 records with same iterations, salt and algo */
1698 for (i = 0; i < nsec_count; i++)
1700 unsigned char *nsec3p = nsecs[i];
1701 int this_iter;
1703 nsecs[i] = NULL; /* Speculative, will be restored if OK. */
1705 if (!(p = skip_name(nsec3p, header, plen, 15)))
1706 return STAT_BOGUS; /* bad packet */
1708 p += 10; /* type, class, TTL, rdlen */
1710 if (*p++ != algo)
1711 continue;
1713 p++; /* flags */
1715 GETSHORT(this_iter, p);
1716 if (this_iter != iterations)
1717 continue;
1719 if (salt_len != *p++)
1720 continue;
1722 if (!CHECK_LEN(header, p, plen, salt_len))
1723 return STAT_BOGUS; /* bad packet */
1725 if (memcmp(p, salt, salt_len) != 0)
1726 continue;
1728 /* All match, put the pointer back */
1729 nsecs[i] = nsec3p;
1732 /* Algo is checked as 1 above */
1733 if (!(hash = hash_find("sha1")))
1734 return STAT_BOGUS;
1736 if ((digest_len = hash_name(name, &digest, hash, salt, salt_len, iterations)) == 0)
1737 return STAT_BOGUS;
1739 if (check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count, nons))
1740 return STAT_SECURE;
1742 /* Can't find an NSEC3 which covers the name directly, we need the "closest encloser NSEC3"
1743 or an answer inferred from a wildcard record. */
1744 closest_encloser = name;
1745 next_closest = NULL;
1749 if (*closest_encloser == '.')
1750 closest_encloser++;
1752 if (wildname && hostname_isequal(closest_encloser, wildname))
1753 break;
1755 if ((digest_len = hash_name(closest_encloser, &digest, hash, salt, salt_len, iterations)) == 0)
1756 return STAT_BOGUS;
1758 for (i = 0; i < nsec_count; i++)
1759 if ((p = nsecs[i]))
1761 if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
1762 !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
1763 return STAT_BOGUS;
1765 if (digest_len == base32_len &&
1766 memcmp(digest, workspace2, digest_len) == 0)
1767 break; /* Gotit */
1770 if (i != nsec_count)
1771 break;
1773 next_closest = closest_encloser;
1775 while ((closest_encloser = strchr(closest_encloser, '.')));
1777 if (!closest_encloser)
1778 return STAT_BOGUS;
1780 /* Look for NSEC3 that proves the non-existence of the next-closest encloser */
1781 if ((digest_len = hash_name(next_closest, &digest, hash, salt, salt_len, iterations)) == 0)
1782 return STAT_BOGUS;
1784 if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count, NULL))
1785 return STAT_BOGUS;
1787 /* Finally, check that there's no seat of wildcard synthesis */
1788 if (!wildname)
1790 if (!(wildcard = strchr(next_closest, '.')) || wildcard == next_closest)
1791 return STAT_BOGUS;
1793 wildcard--;
1794 *wildcard = '*';
1796 if ((digest_len = hash_name(wildcard, &digest, hash, salt, salt_len, iterations)) == 0)
1797 return STAT_BOGUS;
1799 if (!check_nsec3_coverage(header, plen, digest_len, digest, type, workspace1, workspace2, nsecs, nsec_count, NULL))
1800 return STAT_BOGUS;
1803 return STAT_SECURE;
1806 /* Validate all the RRsets in the answer and authority sections of the reply (4035:3.2.3) */
1807 /* Returns are the same as validate_rrset, plus the class if the missing key is in *class */
1808 int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname,
1809 int *class, int *neganswer, int *nons)
1811 unsigned char *ans_start, *qname, *p1, *p2, **nsecs;
1812 int type1, class1, rdlen1, type2, class2, rdlen2, qclass, qtype;
1813 int i, j, rc, nsec_count, cname_count = CNAME_CHAIN;
1814 int nsec_type = 0, have_answer = 0;
1816 if (neganswer)
1817 *neganswer = 0;
1819 if (RCODE(header) == SERVFAIL || ntohs(header->qdcount) != 1)
1820 return STAT_BOGUS;
1822 if (RCODE(header) != NXDOMAIN && RCODE(header) != NOERROR)
1823 return STAT_INSECURE;
1825 qname = p1 = (unsigned char *)(header+1);
1827 if (!extract_name(header, plen, &p1, name, 1, 4))
1828 return STAT_BOGUS;
1830 GETSHORT(qtype, p1);
1831 GETSHORT(qclass, p1);
1832 ans_start = p1;
1834 if (qtype == T_ANY)
1835 have_answer = 1;
1837 /* Can't validate an RRISG query */
1838 if (qtype == T_RRSIG)
1839 return STAT_INSECURE;
1841 cname_loop:
1842 for (j = ntohs(header->ancount); j != 0; j--)
1844 /* leave pointer to missing name in qname */
1846 if (!(rc = extract_name(header, plen, &p1, name, 0, 10)))
1847 return STAT_BOGUS; /* bad packet */
1849 GETSHORT(type2, p1);
1850 GETSHORT(class2, p1);
1851 p1 += 4; /* TTL */
1852 GETSHORT(rdlen2, p1);
1854 if (rc == 1 && qclass == class2)
1856 /* Do we have an answer for the question? */
1857 if (type2 == qtype)
1859 have_answer = 1;
1860 break;
1862 else if (type2 == T_CNAME)
1864 qname = p1;
1866 /* looped CNAMES */
1867 if (!cname_count-- || !extract_name(header, plen, &p1, name, 1, 0))
1868 return STAT_BOGUS;
1870 p1 = ans_start;
1871 goto cname_loop;
1875 if (!ADD_RDLEN(header, p1, plen, rdlen2))
1876 return STAT_BOGUS;
1879 if (neganswer && !have_answer)
1880 *neganswer = 1;
1882 /* No data, therefore no sigs */
1883 if (ntohs(header->ancount) + ntohs(header->nscount) == 0)
1885 *keyname = 0;
1886 return STAT_NO_SIG;
1889 for (p1 = ans_start, i = 0; i < ntohs(header->ancount) + ntohs(header->nscount); i++)
1891 if (!extract_name(header, plen, &p1, name, 1, 10))
1892 return STAT_BOGUS; /* bad packet */
1894 GETSHORT(type1, p1);
1895 GETSHORT(class1, p1);
1896 p1 += 4; /* TTL */
1897 GETSHORT(rdlen1, p1);
1899 /* Don't try and validate RRSIGs! */
1900 if (type1 != T_RRSIG)
1902 /* Check if we've done this RRset already */
1903 for (p2 = ans_start, j = 0; j < i; j++)
1905 if (!(rc = extract_name(header, plen, &p2, name, 0, 10)))
1906 return STAT_BOGUS; /* bad packet */
1908 GETSHORT(type2, p2);
1909 GETSHORT(class2, p2);
1910 p2 += 4; /* TTL */
1911 GETSHORT(rdlen2, p2);
1913 if (type2 == type1 && class2 == class1 && rc == 1)
1914 break; /* Done it before: name, type, class all match. */
1916 if (!ADD_RDLEN(header, p2, plen, rdlen2))
1917 return STAT_BOGUS;
1920 /* Not done, validate now */
1921 if (j == i)
1923 int ttl, keytag, algo, digest, type_covered;
1924 unsigned char *psave;
1925 struct all_addr a;
1926 struct blockdata *key;
1927 struct crec *crecp;
1928 char *wildname;
1929 int have_wildcard = 0;
1931 rc = validate_rrset(now, header, plen, class1, type1, name, keyname, &wildname, NULL, 0, 0, 0);
1933 if (rc == STAT_SECURE_WILDCARD)
1935 have_wildcard = 1;
1937 /* An attacker replay a wildcard answer with a different
1938 answer and overlay a genuine RR. To prove this
1939 hasn't happened, the answer must prove that
1940 the gennuine record doesn't exist. Check that here. */
1941 if (!nsec_type && !(nsec_type = find_nsec_records(header, plen, &nsecs, &nsec_count, class1)))
1942 return STAT_BOGUS; /* No NSECs or bad packet */
1944 if (nsec_type == T_NSEC)
1945 rc = prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1, NULL);
1946 else
1947 rc = prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename,
1948 keyname, name, type1, wildname, NULL);
1950 if (rc != STAT_SECURE)
1951 return rc;
1953 else if (rc != STAT_SECURE)
1955 if (class)
1956 *class = class1; /* Class for DS or DNSKEY */
1958 if (rc == STAT_NO_SIG)
1960 /* If we dropped off the end of a CNAME chain, return
1961 STAT_NO_SIG and the last name is keyname. This is used for proving non-existence
1962 if DS records in CNAME chains. */
1963 if (cname_count == CNAME_CHAIN || i < ntohs(header->ancount))
1964 /* No CNAME chain, or no sig in answer section, return empty name. */
1965 *keyname = 0;
1966 else if (!extract_name(header, plen, &qname, keyname, 1, 0))
1967 return STAT_BOGUS;
1970 return rc;
1973 /* Cache RRsigs in answer section, and if we just validated a DS RRset, cache it */
1974 cache_start_insert();
1976 for (p2 = ans_start, j = 0; j < ntohs(header->ancount); j++)
1978 if (!(rc = extract_name(header, plen, &p2, name, 0, 10)))
1979 return STAT_BOGUS; /* bad packet */
1981 GETSHORT(type2, p2);
1982 GETSHORT(class2, p2);
1983 GETLONG(ttl, p2);
1984 GETSHORT(rdlen2, p2);
1986 if (!CHECK_LEN(header, p2, plen, rdlen2))
1987 return STAT_BOGUS; /* bad packet */
1989 if (class2 == class1 && rc == 1)
1991 psave = p2;
1993 if (type1 == T_DS && type2 == T_DS)
1995 if (rdlen2 < 4)
1996 return STAT_BOGUS; /* bad packet */
1998 GETSHORT(keytag, p2);
1999 algo = *p2++;
2000 digest = *p2++;
2002 /* Cache needs to known class for DNSSEC stuff */
2003 a.addr.dnssec.class = class2;
2005 if ((key = blockdata_alloc((char*)p2, rdlen2 - 4)))
2007 if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DS | F_DNSSECOK)))
2008 blockdata_free(key);
2009 else
2011 a.addr.keytag = keytag;
2012 log_query(F_NOEXTRA | F_KEYTAG | F_UPSTREAM, name, &a, "DS keytag %u");
2013 crecp->addr.ds.digest = digest;
2014 crecp->addr.ds.keydata = key;
2015 crecp->addr.ds.algo = algo;
2016 crecp->addr.ds.keytag = keytag;
2017 crecp->addr.ds.keylen = rdlen2 - 4;
2021 else if (type2 == T_RRSIG)
2023 if (rdlen2 < 18)
2024 return STAT_BOGUS; /* bad packet */
2026 GETSHORT(type_covered, p2);
2028 if (type_covered == type1 &&
2029 (type_covered == T_A || type_covered == T_AAAA ||
2030 type_covered == T_CNAME || type_covered == T_DS ||
2031 type_covered == T_DNSKEY || type_covered == T_PTR))
2033 a.addr.dnssec.type = type_covered;
2034 a.addr.dnssec.class = class1;
2036 algo = *p2++;
2037 p2 += 13; /* labels, orig_ttl, expiration, inception */
2038 GETSHORT(keytag, p2);
2040 /* We don't cache sigs for wildcard answers, because to reproduce the
2041 answer from the cache will require one or more NSEC/NSEC3 records
2042 which we don't cache. The lack of the RRSIG ensures that a query for
2043 this RRset asking for a secure answer will always be forwarded. */
2044 if (!have_wildcard && (key = blockdata_alloc((char*)psave, rdlen2)))
2046 if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DS)))
2047 blockdata_free(key);
2048 else
2050 crecp->addr.sig.keydata = key;
2051 crecp->addr.sig.keylen = rdlen2;
2052 crecp->addr.sig.keytag = keytag;
2053 crecp->addr.sig.type_covered = type_covered;
2054 crecp->addr.sig.algo = algo;
2060 p2 = psave;
2063 if (!ADD_RDLEN(header, p2, plen, rdlen2))
2064 return STAT_BOGUS; /* bad packet */
2067 cache_end_insert();
2071 if (!ADD_RDLEN(header, p1, plen, rdlen1))
2072 return STAT_BOGUS;
2075 /* OK, all the RRsets validate, now see if we have a NODATA or NXDOMAIN reply */
2076 if (have_answer)
2077 return STAT_SECURE;
2079 /* NXDOMAIN or NODATA reply, prove that (name, class1, type1) can't exist */
2080 /* First marshall the NSEC records, if we've not done it previously */
2081 if (!nsec_type && !(nsec_type = find_nsec_records(header, plen, &nsecs, &nsec_count, qclass)))
2083 /* No NSEC records. If we dropped off the end of a CNAME chain, return
2084 STAT_NO_SIG and the last name is keyname. This is used for proving non-existence
2085 if DS records in CNAME chains. */
2086 if (cname_count == CNAME_CHAIN) /* No CNAME chain, return empty name. */
2087 *keyname = 0;
2088 else if (!extract_name(header, plen, &qname, keyname, 1, 0))
2089 return STAT_BOGUS;
2090 return STAT_NO_SIG; /* No NSECs, this is probably a dangling CNAME pointing into
2091 an unsigned zone. Return STAT_NO_SIG to cause this to be proved. */
2094 /* Get name of missing answer */
2095 if (!extract_name(header, plen, &qname, name, 1, 0))
2096 return STAT_BOGUS;
2098 if (nsec_type == T_NSEC)
2099 return prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype, nons);
2100 else
2101 return prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype, NULL, nons);
2104 /* Chase the CNAME chain in the packet until the first record which _doesn't validate.
2105 Needed for proving answer in unsigned space.
2106 Return STAT_NEED_*
2107 STAT_BOGUS - error
2108 STAT_INSECURE - name of first non-secure record in name
2110 int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname)
2112 unsigned char *p = (unsigned char *)(header+1);
2113 int type, class, qclass, rdlen, j, rc;
2114 int cname_count = CNAME_CHAIN;
2116 /* Get question */
2117 if (!extract_name(header, plen, &p, name, 1, 4))
2118 return STAT_BOGUS;
2120 p +=2; /* type */
2121 GETSHORT(qclass, p);
2123 while (1)
2125 for (j = ntohs(header->ancount); j != 0; j--)
2127 if (!(rc = extract_name(header, plen, &p, name, 0, 10)))
2128 return STAT_BOGUS; /* bad packet */
2130 GETSHORT(type, p);
2131 GETSHORT(class, p);
2132 p += 4; /* TTL */
2133 GETSHORT(rdlen, p);
2135 /* Not target, loop */
2136 if (rc == 2 || qclass != class)
2138 if (!ADD_RDLEN(header, p, plen, rdlen))
2139 return STAT_BOGUS;
2140 continue;
2143 /* Got to end of CNAME chain. */
2144 if (type != T_CNAME)
2145 return STAT_INSECURE;
2147 /* validate CNAME chain, return if insecure or need more data */
2148 rc = validate_rrset(now, header, plen, class, type, name, keyname, NULL, NULL, 0, 0, 0);
2149 if (rc != STAT_SECURE)
2151 if (rc == STAT_NO_SIG)
2152 rc = STAT_INSECURE;
2153 return rc;
2156 /* Loop down CNAME chain/ */
2157 if (!cname_count-- ||
2158 !extract_name(header, plen, &p, name, 1, 0) ||
2159 !(p = skip_questions(header, plen)))
2160 return STAT_BOGUS;
2162 break;
2165 /* End of CNAME chain */
2166 return STAT_INSECURE;
2171 /* Compute keytag (checksum to quickly index a key). See RFC4034 */
2172 int dnskey_keytag(int alg, int flags, unsigned char *key, int keylen)
2174 if (alg == 1)
2176 /* Algorithm 1 (RSAMD5) has a different (older) keytag calculation algorithm.
2177 See RFC4034, Appendix B.1 */
2178 return key[keylen-4] * 256 + key[keylen-3];
2180 else
2182 unsigned long ac = flags + 0x300 + alg;
2183 int i;
2185 for (i = 0; i < keylen; ++i)
2186 ac += (i & 1) ? key[i] : key[i] << 8;
2188 ac += (ac >> 16) & 0xffff;
2189 return ac & 0xffff;
2193 size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class,
2194 int type, union mysockaddr *addr, int edns_pktsz)
2196 unsigned char *p;
2197 char *types = querystr("dnssec-query", type);
2198 size_t ret;
2200 if (addr->sa.sa_family == AF_INET)
2201 log_query(F_NOEXTRA | F_DNSSEC | F_IPV4, name, (struct all_addr *)&addr->in.sin_addr, types);
2202 #ifdef HAVE_IPV6
2203 else
2204 log_query(F_NOEXTRA | F_DNSSEC | F_IPV6, name, (struct all_addr *)&addr->in6.sin6_addr, types);
2205 #endif
2207 header->qdcount = htons(1);
2208 header->ancount = htons(0);
2209 header->nscount = htons(0);
2210 header->arcount = htons(0);
2212 header->hb3 = HB3_RD;
2213 SET_OPCODE(header, QUERY);
2214 /* For debugging, set Checking Disabled, otherwise, have the upstream check too,
2215 this allows it to select auth servers when one is returning bad data. */
2216 header->hb4 = option_bool(OPT_DNSSEC_DEBUG) ? HB4_CD : 0;
2218 /* ID filled in later */
2220 p = (unsigned char *)(header+1);
2222 p = do_rfc1035_name(p, name);
2223 *p++ = 0;
2224 PUTSHORT(type, p);
2225 PUTSHORT(class, p);
2227 ret = add_do_bit(header, p - (unsigned char *)header, end);
2229 if (find_pseudoheader(header, ret, NULL, &p, NULL))
2230 PUTSHORT(edns_pktsz, p);
2232 return ret;
2235 /* Go through a domain name, find "pointers" and fix them up based on how many bytes
2236 we've chopped out of the packet, or check they don't point into an elided part. */
2237 static int check_name(unsigned char **namep, struct dns_header *header, size_t plen, int fixup, unsigned char **rrs, int rr_count)
2239 unsigned char *ansp = *namep;
2241 while(1)
2243 unsigned int label_type;
2245 if (!CHECK_LEN(header, ansp, plen, 1))
2246 return 0;
2248 label_type = (*ansp) & 0xc0;
2250 if (label_type == 0xc0)
2252 /* pointer for compression. */
2253 unsigned int offset;
2254 int i;
2255 unsigned char *p;
2257 if (!CHECK_LEN(header, ansp, plen, 2))
2258 return 0;
2260 offset = ((*ansp++) & 0x3f) << 8;
2261 offset |= *ansp++;
2263 p = offset + (unsigned char *)header;
2265 for (i = 0; i < rr_count; i++)
2266 if (p < rrs[i])
2267 break;
2268 else
2269 if (i & 1)
2270 offset -= rrs[i] - rrs[i-1];
2272 /* does the pointer end up in an elided RR? */
2273 if (i & 1)
2274 return 0;
2276 /* No, scale the pointer */
2277 if (fixup)
2279 ansp -= 2;
2280 *ansp++ = (offset >> 8) | 0xc0;
2281 *ansp++ = offset & 0xff;
2283 break;
2285 else if (label_type == 0x80)
2286 return 0; /* reserved */
2287 else if (label_type == 0x40)
2289 /* Extended label type */
2290 unsigned int count;
2292 if (!CHECK_LEN(header, ansp, plen, 2))
2293 return 0;
2295 if (((*ansp++) & 0x3f) != 1)
2296 return 0; /* we only understand bitstrings */
2298 count = *(ansp++); /* Bits in bitstring */
2300 if (count == 0) /* count == 0 means 256 bits */
2301 ansp += 32;
2302 else
2303 ansp += ((count-1)>>3)+1;
2305 else
2306 { /* label type == 0 Bottom six bits is length */
2307 unsigned int len = (*ansp++) & 0x3f;
2309 if (!ADD_RDLEN(header, ansp, plen, len))
2310 return 0;
2312 if (len == 0)
2313 break; /* zero length label marks the end. */
2317 *namep = ansp;
2319 return 1;
2322 /* Go through RRs and check or fixup the domain names contained within */
2323 static int check_rrs(unsigned char *p, struct dns_header *header, size_t plen, int fixup, unsigned char **rrs, int rr_count)
2325 int i, type, class, rdlen;
2326 unsigned char *pp;
2328 for (i = 0; i < ntohs(header->ancount) + ntohs(header->nscount) + ntohs(header->arcount); i++)
2330 pp = p;
2332 if (!(p = skip_name(p, header, plen, 10)))
2333 return 0;
2335 GETSHORT(type, p);
2336 GETSHORT(class, p);
2337 p += 4; /* TTL */
2338 GETSHORT(rdlen, p);
2340 if (type != T_NSEC && type != T_NSEC3 && type != T_RRSIG)
2342 /* fixup name of RR */
2343 if (!check_name(&pp, header, plen, fixup, rrs, rr_count))
2344 return 0;
2346 if (class == C_IN)
2348 u16 *d;
2350 for (pp = p, d = get_desc(type); *d != (u16)-1; d++)
2352 if (*d != 0)
2353 pp += *d;
2354 else if (!check_name(&pp, header, plen, fixup, rrs, rr_count))
2355 return 0;
2360 if (!ADD_RDLEN(header, p, plen, rdlen))
2361 return 0;
2364 return 1;
2368 size_t filter_rrsigs(struct dns_header *header, size_t plen)
2370 static unsigned char **rrs;
2371 static int rr_sz = 0;
2373 unsigned char *p = (unsigned char *)(header+1);
2374 int i, rdlen, qtype, qclass, rr_found, chop_an, chop_ns, chop_ar;
2376 if (ntohs(header->qdcount) != 1 ||
2377 !(p = skip_name(p, header, plen, 4)))
2378 return plen;
2380 GETSHORT(qtype, p);
2381 GETSHORT(qclass, p);
2383 /* First pass, find pointers to start and end of all the records we wish to elide:
2384 records added for DNSSEC, unless explicity queried for */
2385 for (rr_found = 0, chop_ns = 0, chop_an = 0, chop_ar = 0, i = 0;
2386 i < ntohs(header->ancount) + ntohs(header->nscount) + ntohs(header->arcount);
2387 i++)
2389 unsigned char *pstart = p;
2390 int type, class;
2392 if (!(p = skip_name(p, header, plen, 10)))
2393 return plen;
2395 GETSHORT(type, p);
2396 GETSHORT(class, p);
2397 p += 4; /* TTL */
2398 GETSHORT(rdlen, p);
2400 if ((type == T_NSEC || type == T_NSEC3 || type == T_RRSIG) &&
2401 (type != qtype || class != qclass))
2403 if (!expand_workspace(&rrs, &rr_sz, rr_found + 1))
2404 return plen;
2406 rrs[rr_found++] = pstart;
2408 if (!ADD_RDLEN(header, p, plen, rdlen))
2409 return plen;
2411 rrs[rr_found++] = p;
2413 if (i < ntohs(header->ancount))
2414 chop_an++;
2415 else if (i < (ntohs(header->nscount) + ntohs(header->ancount)))
2416 chop_ns++;
2417 else
2418 chop_ar++;
2420 else if (!ADD_RDLEN(header, p, plen, rdlen))
2421 return plen;
2424 /* Nothing to do. */
2425 if (rr_found == 0)
2426 return plen;
2428 /* Second pass, look for pointers in names in the records we're keeping and make sure they don't
2429 point to records we're going to elide. This is theoretically possible, but unlikely. If
2430 it happens, we give up and leave the answer unchanged. */
2431 p = (unsigned char *)(header+1);
2433 /* question first */
2434 if (!check_name(&p, header, plen, 0, rrs, rr_found))
2435 return plen;
2436 p += 4; /* qclass, qtype */
2438 /* Now answers and NS */
2439 if (!check_rrs(p, header, plen, 0, rrs, rr_found))
2440 return plen;
2442 /* Third pass, elide records */
2443 for (p = rrs[0], i = 1; i < rr_found; i += 2)
2445 unsigned char *start = rrs[i];
2446 unsigned char *end = (i != rr_found - 1) ? rrs[i+1] : ((unsigned char *)(header+1)) + plen;
2448 memmove(p, start, end-start);
2449 p += end-start;
2452 plen = p - (unsigned char *)header;
2453 header->ancount = htons(ntohs(header->ancount) - chop_an);
2454 header->nscount = htons(ntohs(header->nscount) - chop_ns);
2455 header->arcount = htons(ntohs(header->arcount) - chop_ar);
2457 /* Fourth pass, fix up pointers in the remaining records */
2458 p = (unsigned char *)(header+1);
2460 check_name(&p, header, plen, 1, rrs, rr_found);
2461 p += 4; /* qclass, qtype */
2463 check_rrs(p, header, plen, 1, rrs, rr_found);
2465 return plen;
2468 unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name)
2470 int q;
2471 unsigned int len;
2472 unsigned char *p = (unsigned char *)(header+1);
2473 const struct nettle_hash *hash;
2474 void *ctx;
2475 unsigned char *digest;
2477 if (!(hash = hash_find("sha1")) || !hash_init(hash, &ctx, &digest))
2478 return NULL;
2480 for (q = ntohs(header->qdcount); q != 0; q--)
2482 if (!extract_name(header, plen, &p, name, 1, 4))
2483 break; /* bad packet */
2485 len = to_wire(name);
2486 hash->update(ctx, len, (unsigned char *)name);
2487 /* CRC the class and type as well */
2488 hash->update(ctx, 4, p);
2490 p += 4;
2491 if (!CHECK_LEN(header, p, plen, 0))
2492 break; /* bad packet */
2495 hash->digest(ctx, hash->digest_size, digest);
2496 return digest;
2499 #endif /* HAVE_DNSSEC */