]> git.ipfire.org Git - people/ms/dnsmasq.git/blame - src/dnssec.c
Warn about non-local queries once only for UDP.
[people/ms/dnsmasq.git] / src / dnssec.c
CommitLineData
8d41ebd8 1/* dnssec.c is Copyright (c) 2012 Giovanni Bajo <rasky@develer.com>
0fc2f313 2 and Copyright (c) 2012-2014 Simon Kelley
8d41ebd8
GB
3
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.
8
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.
13
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/>.
16*/
e292e93d
GB
17
18#include "dnsmasq.h"
0fc2f313
SK
19
20#ifdef HAVE_DNSSEC
21
86bec2d3
SK
22#include <nettle/rsa.h>
23#include <nettle/dsa.h>
c152dc84
SK
24#ifndef NO_NETTLE_ECC
25# include <nettle/ecdsa.h>
26# include <nettle/ecc-curve.h>
27#endif
86bec2d3
SK
28#include <nettle/nettle-meta.h>
29#include <gmp.h>
c3e0b9b6 30
e292e93d
GB
31#define SERIAL_UNDEF -100
32#define SERIAL_EQ 0
33#define SERIAL_LT -1
34#define SERIAL_GT 1
35
86bec2d3
SK
36/* http://www.iana.org/assignments/ds-rr-types/ds-rr-types.xhtml */
37static char *ds_digest_name(int digest)
38{
39 switch (digest)
40 {
41 case 1: return "sha1";
42 case 2: return "sha256";
43 case 3: return "gosthash94";
44 case 4: return "sha384";
45 default: return NULL;
46 }
47}
48
49/* http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml */
50static char *algo_digest_name(int algo)
51{
52 switch (algo)
53 {
54 case 1: return "md5";
55 case 3: return "sha1";
56 case 5: return "sha1";
57 case 6: return "sha1";
58 case 7: return "sha1";
59 case 8: return "sha256";
60 case 10: return "sha512";
61 case 12: return "gosthash94";
62 case 13: return "sha256";
63 case 14: return "sha384";
64 default: return NULL;
65 }
66}
67
68/* Find pointer to correct hash function in nettle library */
69static const struct nettle_hash *hash_find(char *name)
70{
71 int i;
72
73 if (!name)
74 return NULL;
75
76 for (i = 0; nettle_hashes[i]; i++)
77 {
78 if (strcmp(nettle_hashes[i]->name, name) == 0)
79 return nettle_hashes[i];
80 }
81
82 return NULL;
83}
84
85/* expand ctx and digest memory allocations if necessary and init hash function */
86static int hash_init(const struct nettle_hash *hash, void **ctxp, unsigned char **digestp)
87{
88 static void *ctx = NULL;
89 static unsigned char *digest = NULL;
90 static unsigned int ctx_sz = 0;
91 static unsigned int digest_sz = 0;
92
93 void *new;
94
95 if (ctx_sz < hash->context_size)
96 {
97 if (!(new = whine_malloc(hash->context_size)))
98 return 0;
99 if (ctx)
100 free(ctx);
101 ctx = new;
102 ctx_sz = hash->context_size;
103 }
104
105 if (digest_sz < hash->digest_size)
106 {
107 if (!(new = whine_malloc(hash->digest_size)))
108 return 0;
109 if (digest)
110 free(digest);
111 digest = new;
112 digest_sz = hash->digest_size;
113 }
114
115 *ctxp = ctx;
116 *digestp = digest;
117
118 hash->init(ctx);
119
120 return 1;
121}
122
123static int rsa_verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
124 unsigned char *digest, int algo)
125{
126 unsigned char *p;
127 size_t exp_len;
128
129 static struct rsa_public_key *key = NULL;
130 static mpz_t sig_mpz;
131
132 if (key == NULL)
133 {
134 if (!(key = whine_malloc(sizeof(struct rsa_public_key))))
135 return 0;
136
137 nettle_rsa_public_key_init(key);
138 mpz_init(sig_mpz);
139 }
140
141 if ((key_len < 3) || !(p = blockdata_retrieve(key_data, key_len, NULL)))
142 return 0;
143
144 key_len--;
145 if ((exp_len = *p++) == 0)
146 {
147 GETSHORT(exp_len, p);
148 key_len -= 2;
149 }
150
151 if (exp_len >= key_len)
152 return 0;
153
154 key->size = key_len - exp_len;
155 mpz_import(key->e, exp_len, 1, 1, 0, 0, p);
156 mpz_import(key->n, key->size, 1, 1, 0, 0, p + exp_len);
157
158 mpz_import(sig_mpz, sig_len, 1, 1, 0, 0, sig);
159
160 switch (algo)
161 {
162 case 1:
163 return nettle_rsa_md5_verify_digest(key, digest, sig_mpz);
164 case 5: case 7:
165 return nettle_rsa_sha1_verify_digest(key, digest, sig_mpz);
166 case 8:
167 return nettle_rsa_sha256_verify_digest(key, digest, sig_mpz);
168 case 10:
169 return nettle_rsa_sha512_verify_digest(key, digest, sig_mpz);
170 }
171
172 return 0;
173}
174
175static int dsa_verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
176 unsigned char *digest, int algo)
177{
178 unsigned char *p;
179 unsigned int t;
180
181 static struct dsa_public_key *key = NULL;
182 static struct dsa_signature *sig_struct;
183
184 if (key == NULL)
185 {
186 if (!(sig_struct = whine_malloc(sizeof(struct dsa_signature))) ||
187 !(key = whine_malloc(sizeof(struct dsa_public_key))))
188 return 0;
189
190 nettle_dsa_public_key_init(key);
191 nettle_dsa_signature_init(sig_struct);
192 }
193
194 if ((sig_len < 41) || !(p = blockdata_retrieve(key_data, key_len, NULL)))
195 return 0;
196
197 t = *p++;
198
199 if (key_len < (213 + (t * 24)))
200 return 0;
ebe95a83 201
86bec2d3
SK
202 mpz_import(key->q, 20, 1, 1, 0, 0, p); p += 20;
203 mpz_import(key->p, 64 + (t*8), 1, 1, 0, 0, p); p += 64 + (t*8);
204 mpz_import(key->g, 64 + (t*8), 1, 1, 0, 0, p); p += 64 + (t*8);
205 mpz_import(key->y, 64 + (t*8), 1, 1, 0, 0, p); p += 64 + (t*8);
206
207 mpz_import(sig_struct->r, 20, 1, 1, 0, 0, sig+1);
208 mpz_import(sig_struct->s, 20, 1, 1, 0, 0, sig+21);
209
210 (void)algo;
ebe95a83 211
86bec2d3
SK
212 return nettle_dsa_sha1_verify_digest(key, digest, sig_struct);
213}
214
c152dc84
SK
215#ifndef NO_NETTLE_ECC
216static int dnsmasq_ecdsa_verify(struct blockdata *key_data, unsigned int key_len,
217 unsigned char *sig, size_t sig_len,
ebe95a83
SK
218 unsigned char *digest, size_t digest_len, int algo)
219{
220 unsigned char *p;
221 unsigned int t;
222 struct ecc_point *key;
223
224 static struct ecc_point *key_256 = NULL, *key_384 = NULL;
225 static mpz_t x, y;
226 static struct dsa_signature *sig_struct;
227
228 if (!sig_struct)
229 {
230 if (!(sig_struct = whine_malloc(sizeof(struct dsa_signature))))
231 return 0;
232
233 nettle_dsa_signature_init(sig_struct);
234 mpz_init(x);
235 mpz_init(y);
236 }
237
238 switch (algo)
239 {
240 case 13:
241 if (!key_256)
242 {
243 if (!(key_256 = whine_malloc(sizeof(struct ecc_point))))
244 return 0;
245
246 nettle_ecc_point_init(key_256, &nettle_secp_256r1);
247 }
248
249 key = key_256;
250 t = 32;
251 break;
252
253 case 14:
254 if (!key_384)
255 {
256 if (!(key_384 = whine_malloc(sizeof(struct ecc_point))))
257 return 0;
258
259 nettle_ecc_point_init(key_384, &nettle_secp_384r1);
260 }
261
262 key = key_384;
263 t = 48;
264 break;
265
266 default:
267 return 0;
268 }
269
270 if (sig_len != 2*t || key_len != 2*t ||
271 (p = blockdata_retrieve(key_data, key_len, NULL)))
272 return 0;
273
274 mpz_import(x, t , 1, 1, 0, 0, p);
275 mpz_import(y, t , 1, 1, 0, 0, p + t);
276
277 if (!ecc_point_set(key, x, y))
278 return 0;
279
280 mpz_import(sig_struct->r, t, 1, 1, 0, 0, sig);
281 mpz_import(sig_struct->s, t, 1, 1, 0, 0, sig + t);
282
283 return nettle_ecdsa_verify(key, digest_len, digest, sig_struct);
284}
c152dc84
SK
285#endif
286
86bec2d3 287static int verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
ebe95a83 288 unsigned char *digest, size_t digest_len, int algo)
86bec2d3 289{
7b1eae4f
SK
290 (void)digest_len;
291
86bec2d3
SK
292 switch (algo)
293 {
294 case 1: case 5: case 7: case 8: case 10:
295 return rsa_verify(key_data, key_len, sig, sig_len, digest, algo);
296
297 case 3: case 6:
298 return dsa_verify(key_data, key_len, sig, sig_len, digest, algo);
c152dc84
SK
299
300#ifndef NO_NETTLE_ECC
ebe95a83
SK
301 case 13: case 14:
302 return dnsmasq_ecdsa_verify(key_data, key_len, sig, sig_len, digest, digest_len, algo);
c152dc84
SK
303#endif
304 }
86bec2d3
SK
305
306 return 0;
307}
308
0fc2f313
SK
309/* Convert from presentation format to wire format, in place.
310 Also map UC -> LC.
311 Note that using extract_name to get presentation format
312 then calling to_wire() removes compression and maps case,
313 thus generating names in canonical form.
314 Calling to_wire followed by from_wire is almost an identity,
315 except that the UC remains mapped to LC.
316*/
317static int to_wire(char *name)
7f0485cf 318{
0fc2f313
SK
319 unsigned char *l, *p, term;
320 int len;
321
322 for (l = (unsigned char*)name; *l != 0; l = p)
323 {
324 for (p = l; *p != '.' && *p != 0; p++)
325 if (*p >= 'A' && *p <= 'Z')
326 *p = *p - 'A' + 'a';
327
328 term = *p;
329
330 if ((len = p - l) != 0)
331 memmove(l+1, l, len);
332 *l = len;
333
334 p++;
335
336 if (term == 0)
337 *p = 0;
338 }
339
340 return l + 1 - (unsigned char *)name;
7f0485cf
GB
341}
342
0fc2f313
SK
343/* Note: no compression allowed in input. */
344static void from_wire(char *name)
13e435eb 345{
0fc2f313
SK
346 unsigned char *l;
347 int len;
13e435eb 348
0fc2f313 349 for (l = (unsigned char *)name; *l != 0; l += len+1)
13e435eb 350 {
0fc2f313
SK
351 len = *l;
352 memmove(l, l+1, len);
353 l[len] = '.';
13e435eb 354 }
7f0485cf 355
e3f14558 356 if ((char *)l != name)
bd9b3cf5 357 *(l-1) = 0;
13e435eb
GB
358}
359
5ada8885
SK
360/* Input in presentation format */
361static int count_labels(char *name)
362{
363 int i;
364
365 if (*name == 0)
366 return 0;
367
368 for (i = 0; *name; name++)
369 if (*name == '.')
370 i++;
371
372 return i+1;
373}
374
5f8e58f4
SK
375/* Implement RFC1982 wrapped compare for 32-bit numbers */
376static int serial_compare_32(unsigned long s1, unsigned long s2)
377{
378 if (s1 == s2)
379 return SERIAL_EQ;
0ca895f5 380
5f8e58f4
SK
381 if ((s1 < s2 && (s2 - s1) < (1UL<<31)) ||
382 (s1 > s2 && (s1 - s2) > (1UL<<31)))
383 return SERIAL_LT;
384 if ((s1 < s2 && (s2 - s1) > (1UL<<31)) ||
385 (s1 > s2 && (s1 - s2) < (1UL<<31)))
386 return SERIAL_GT;
387 return SERIAL_UNDEF;
388}
0852d76b 389
5f8e58f4
SK
390/* Check whether today/now is between date_start and date_end */
391static int check_date_range(unsigned long date_start, unsigned long date_end)
0852d76b 392{
5f8e58f4
SK
393 unsigned long curtime = time(0);
394
395 /* We must explicitly check against wanted values, because of SERIAL_UNDEF */
396 return serial_compare_32(curtime, date_start) == SERIAL_GT
397 && serial_compare_32(curtime, date_end) == SERIAL_LT;
398}
f119ed38 399
5f8e58f4
SK
400static u16 *get_desc(int type)
401{
402 /* List of RRtypes which include domains in the data.
403 0 -> domain
404 integer -> no of plain bytes
405 -1 -> end
406
407 zero is not a valid RRtype, so the final entry is returned for
408 anything which needs no mangling.
409 */
410
411 static u16 rr_desc[] =
412 {
413 T_NS, 0, -1,
414 T_MD, 0, -1,
415 T_MF, 0, -1,
416 T_CNAME, 0, -1,
417 T_SOA, 0, 0, -1,
418 T_MB, 0, -1,
419 T_MG, 0, -1,
420 T_MR, 0, -1,
421 T_PTR, 0, -1,
422 T_MINFO, 0, 0, -1,
423 T_MX, 2, 0, -1,
424 T_RP, 0, 0, -1,
425 T_AFSDB, 2, 0, -1,
426 T_RT, 2, 0, -1,
427 T_SIG, 18, 0, -1,
428 T_PX, 2, 0, 0, -1,
429 T_NXT, 0, -1,
430 T_KX, 2, 0, -1,
431 T_SRV, 6, 0, -1,
432 T_DNAME, 0, -1,
5f8e58f4
SK
433 0, -1 /* wildcard/catchall */
434 };
435
436 u16 *p = rr_desc;
437
438 while (*p != type && *p != 0)
439 while (*p++ != (u16)-1);
f119ed38 440
5f8e58f4
SK
441 return p+1;
442}
0852d76b 443
5f8e58f4
SK
444/* Return bytes of canonicalised rdata, when the return value is zero, the remaining
445 data, pointed to by *p, should be used raw. */
446static int get_rdata(struct dns_header *header, size_t plen, unsigned char *end, char *buff,
447 unsigned char **p, u16 **desc)
448{
449 int d = **desc;
450
451 (*desc)++;
452
453 /* No more data needs mangling */
454 if (d == (u16)-1)
455 return 0;
456
457 if (d == 0 && extract_name(header, plen, p, buff, 1, 0))
458 /* domain-name, canonicalise */
459 return to_wire(buff);
460 else
461 {
462 /* plain data preceding a domain-name, don't run off the end of the data */
463 if ((end - *p) < d)
464 d = end - *p;
465
466 if (d != 0)
467 {
468 memcpy(buff, *p, d);
469 *p += d;
470 }
471
472 return d;
473 }
0852d76b
GB
474}
475
613ad15d
SK
476static int expand_workspace(unsigned char ***wkspc, int *sz, int new)
477{
478 unsigned char **p;
479 int new_sz = *sz;
480
481 if (new_sz > new)
482 return 1;
483
484 if (new >= 100)
485 return 0;
486
487 new_sz += 5;
488
489 if (!(p = whine_malloc((new_sz) * sizeof(unsigned char **))))
490 return 0;
491
492 if (*wkspc)
493 {
494 memcpy(p, *wkspc, *sz * sizeof(unsigned char **));
495 free(*wkspc);
496 }
497
498 *wkspc = p;
499 *sz = new_sz;
00a5b5d4
SK
500
501 return 1;
613ad15d
SK
502}
503
5f8e58f4
SK
504/* Bubble sort the RRset into the canonical order.
505 Note that the byte-streams from two RRs may get unsynced: consider
506 RRs which have two domain-names at the start and then other data.
507 The domain-names may have different lengths in each RR, but sort equal
508
509 ------------
510 |abcde|fghi|
511 ------------
512 |abcd|efghi|
513 ------------
514
515 leaving the following bytes as deciding the order. Hence the nasty left1 and left2 variables.
516*/
517
518static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int rrsetidx,
519 unsigned char **rrset, char *buff1, char *buff2)
c3e0b9b6 520{
5f8e58f4 521 int swap, quit, i;
0fc2f313 522
5f8e58f4
SK
523 do
524 {
525 for (swap = 0, i = 0; i < rrsetidx-1; i++)
526 {
527 int rdlen1, rdlen2, left1, left2, len1, len2, len, rc;
528 u16 *dp1, *dp2;
529 unsigned char *end1, *end2;
5107ace1
SK
530 /* Note that these have been determined to be OK previously,
531 so we don't need to check for NULL return here. */
5f8e58f4
SK
532 unsigned char *p1 = skip_name(rrset[i], header, plen, 10);
533 unsigned char *p2 = skip_name(rrset[i+1], header, plen, 10);
534
535 p1 += 8; /* skip class, type, ttl */
536 GETSHORT(rdlen1, p1);
537 end1 = p1 + rdlen1;
538
539 p2 += 8; /* skip class, type, ttl */
540 GETSHORT(rdlen2, p2);
541 end2 = p2 + rdlen2;
542
543 dp1 = dp2 = rr_desc;
544
1486a9c7 545 for (quit = 0, left1 = 0, left2 = 0, len1 = 0, len2 = 0; !quit;)
5f8e58f4 546 {
1486a9c7
SK
547 if (left1 != 0)
548 memmove(buff1, buff1 + len1 - left1, left1);
549
5f8e58f4
SK
550 if ((len1 = get_rdata(header, plen, end1, buff1 + left1, &p1, &dp1)) == 0)
551 {
552 quit = 1;
553 len1 = end1 - p1;
554 memcpy(buff1 + left1, p1, len1);
555 }
556 len1 += left1;
557
1486a9c7
SK
558 if (left2 != 0)
559 memmove(buff2, buff2 + len2 - left2, left2);
560
5f8e58f4
SK
561 if ((len2 = get_rdata(header, plen, end2, buff2 + left2, &p2, &dp2)) == 0)
562 {
563 quit = 1;
564 len2 = end2 - p2;
565 memcpy(buff2 + left2, p2, len2);
566 }
567 len2 += left2;
568
569 if (len1 > len2)
1486a9c7 570 left1 = len1 - len2, left2 = 0, len = len2;
5f8e58f4 571 else
1486a9c7 572 left2 = len2 - len1, left1 = 0, len = len1;
5f8e58f4 573
6fd6dacb 574 rc = (len == 0) ? 0 : memcmp(buff1, buff2, len);
5f8e58f4 575
4619d946 576 if (rc > 0 || (rc == 0 && quit && len1 > len2))
5f8e58f4
SK
577 {
578 unsigned char *tmp = rrset[i+1];
579 rrset[i+1] = rrset[i];
580 rrset[i] = tmp;
581 swap = quit = 1;
582 }
6fd6dacb
SK
583 else if (rc < 0)
584 quit = 1;
5f8e58f4
SK
585 }
586 }
587 } while (swap);
588}
c3e0b9b6 589
5f8e58f4
SK
590/* Validate a single RRset (class, type, name) in the supplied DNS reply
591 Return code:
592 STAT_SECURE if it validates.
5107ace1 593 STAT_SECURE_WILDCARD if it validates and is the result of wildcard expansion.
00a5b5d4 594 STAT_NO_SIG no RRsigs found.
87070192
SK
595 STAT_INSECURE RRset empty.
596 STAT_BOGUS signature is wrong, bad packet.
5f8e58f4
SK
597 STAT_NEED_KEY need DNSKEY to complete validation (name is returned in keyname)
598
599 if key is non-NULL, use that key, which has the algo and tag given in the params of those names,
600 otherwise find the key in the cache.
5107ace1
SK
601
602 name is unchanged on exit. keyname is used as workspace and trashed.
5f8e58f4
SK
603*/
604static int validate_rrset(time_t now, struct dns_header *header, size_t plen, int class,
e7829aef 605 int type, char *name, char *keyname, struct blockdata *key, int keylen, int algo_in, int keytag_in)
5f8e58f4
SK
606{
607 static unsigned char **rrset = NULL, **sigs = NULL;
608 static int rrset_sz = 0, sig_sz = 0;
0fc2f313 609
5f8e58f4 610 unsigned char *p;
5ada8885 611 int rrsetidx, sigidx, res, rdlen, j, name_labels;
5f8e58f4
SK
612 struct crec *crecp = NULL;
613 int type_covered, algo, labels, orig_ttl, sig_expiration, sig_inception, key_tag;
614 u16 *rr_desc = get_desc(type);
c3e0b9b6 615
5f8e58f4 616 if (!(p = skip_questions(header, plen)))
87070192 617 return STAT_BOGUS;
c3e0b9b6 618
5ada8885
SK
619 name_labels = count_labels(name); /* For 4035 5.3.2 check */
620
621 /* look for RRSIGs for this RRset and get pointers to each RR in the set. */
5f8e58f4
SK
622 for (rrsetidx = 0, sigidx = 0, j = ntohs(header->ancount) + ntohs(header->nscount);
623 j != 0; j--)
624 {
625 unsigned char *pstart, *pdata;
b98d22c1 626 int stype, sclass;
c3e0b9b6 627
5f8e58f4
SK
628 pstart = p;
629
630 if (!(res = extract_name(header, plen, &p, name, 0, 10)))
87070192 631 return STAT_BOGUS; /* bad packet */
5f8e58f4
SK
632
633 GETSHORT(stype, p);
634 GETSHORT(sclass, p);
b98d22c1 635 p += 4; /* TTL */
5f8e58f4
SK
636
637 pdata = p;
c3e0b9b6 638
5f8e58f4
SK
639 GETSHORT(rdlen, p);
640
e7829aef 641 if (!CHECK_LEN(header, p, plen, rdlen))
87070192 642 return STAT_BOGUS;
e7829aef 643
5f8e58f4
SK
644 if (res == 1 && sclass == class)
645 {
646 if (stype == type)
647 {
613ad15d 648 if (!expand_workspace(&rrset, &rrset_sz, rrsetidx))
87070192 649 return STAT_BOGUS;
613ad15d 650
5f8e58f4
SK
651 rrset[rrsetidx++] = pstart;
652 }
653
654 if (stype == T_RRSIG)
655 {
613ad15d 656 if (rdlen < 18)
87070192 657 return STAT_BOGUS; /* bad packet */
613ad15d
SK
658
659 GETSHORT(type_covered, p);
660
661 if (type_covered == type)
662 {
663 if (!expand_workspace(&sigs, &sig_sz, sigidx))
87070192 664 return STAT_BOGUS;
613ad15d
SK
665
666 sigs[sigidx++] = pdata;
667 }
668
669 p = pdata + 2; /* restore for ADD_RDLEN */
5f8e58f4
SK
670 }
671 }
613ad15d 672
5f8e58f4 673 if (!ADD_RDLEN(header, p, plen, rdlen))
87070192 674 return STAT_BOGUS;
5f8e58f4 675 }
c3e0b9b6 676
00a5b5d4
SK
677 /* RRset empty */
678 if (rrsetidx == 0)
5f8e58f4 679 return STAT_INSECURE;
00a5b5d4
SK
680
681 /* no RRSIGs */
682 if (sigidx == 0)
683 return STAT_NO_SIG;
5f8e58f4
SK
684
685 /* Sort RRset records into canonical order.
d387380a 686 Note that at this point keyname and daemon->workspacename buffs are
5f8e58f4 687 unused, and used as workspace by the sort. */
d387380a 688 sort_rrset(header, plen, rr_desc, rrsetidx, rrset, daemon->workspacename, keyname);
5f8e58f4
SK
689
690 /* Now try all the sigs to try and find one which validates */
691 for (j = 0; j <sigidx; j++)
692 {
d387380a 693 unsigned char *psav, *sig, *digest;
86bec2d3
SK
694 int i, wire_len, sig_len;
695 const struct nettle_hash *hash;
696 void *ctx;
d387380a 697 char *name_start;
5f8e58f4
SK
698 u32 nsigttl;
699
700 p = sigs[j];
5ada8885 701 GETSHORT(rdlen, p); /* rdlen >= 18 checked previously */
5f8e58f4
SK
702 psav = p;
703
5ada8885 704 p += 2; /* type_covered - already checked */
5f8e58f4
SK
705 algo = *p++;
706 labels = *p++;
707 GETLONG(orig_ttl, p);
e7829aef
SK
708 GETLONG(sig_expiration, p);
709 GETLONG(sig_inception, p);
5f8e58f4
SK
710 GETSHORT(key_tag, p);
711
5f8e58f4 712 if (!extract_name(header, plen, &p, keyname, 1, 0))
87070192 713 return STAT_BOGUS;
d387380a
SK
714
715 /* RFC 4035 5.3.1 says that the Signer's Name field MUST equal
716 the name of the zone containing the RRset. We can't tell that
717 for certain, but we can check that the RRset name is equal to
718 or encloses the signers name, which should be enough to stop
719 an attacker using signatures made with the key of an unrelated
720 zone he controls. Note that the root key is always allowed. */
721 if (*keyname != 0)
722 {
723 int failed = 0;
724
725 for (name_start = name; !hostname_isequal(name_start, keyname); )
726 if ((name_start = strchr(name_start, '.')))
727 name_start++; /* chop a label off and try again */
728 else
729 {
730 failed = 1;
731 break;
732 }
733
734 /* Bad sig, try another */
735 if (failed)
736 continue;
737 }
5f8e58f4 738
d387380a 739 /* Other 5.3.1 checks */
e7829aef
SK
740 if (!check_date_range(sig_inception, sig_expiration) ||
741 labels > name_labels ||
742 !(hash = hash_find(algo_digest_name(algo))) ||
743 !hash_init(hash, &ctx, &digest))
744 continue;
745
5f8e58f4
SK
746 /* OK, we have the signature record, see if the relevant DNSKEY is in the cache. */
747 if (!key && !(crecp = cache_find_by_name(NULL, keyname, now, F_DNSKEY)))
748 return STAT_NEED_KEY;
749
86bec2d3
SK
750 sig = p;
751 sig_len = rdlen - (p - psav);
e7829aef 752
5f8e58f4
SK
753 nsigttl = htonl(orig_ttl);
754
86bec2d3 755 hash->update(ctx, 18, psav);
5f8e58f4 756 wire_len = to_wire(keyname);
86bec2d3 757 hash->update(ctx, (unsigned int)wire_len, (unsigned char*)keyname);
5f8e58f4
SK
758 from_wire(keyname);
759
5f8e58f4
SK
760 for (i = 0; i < rrsetidx; ++i)
761 {
762 int seg;
763 unsigned char *end, *cp;
764 u16 len, *dp;
d387380a 765
5f8e58f4
SK
766 p = rrset[i];
767 if (!extract_name(header, plen, &p, name, 1, 10))
87070192 768 return STAT_BOGUS;
5ada8885 769
d387380a
SK
770 name_start = name;
771
5ada8885
SK
772 /* if more labels than in RRsig name, hash *.<no labels in rrsig labels field> 4035 5.3.2 */
773 if (labels < name_labels)
774 {
775 int k;
776 for (k = name_labels - labels; k != 0; k--)
777 while (*name_start != '.' && *name_start != 0)
778 name_start++;
779 name_start--;
780 *name_start = '*';
781 }
782
783 wire_len = to_wire(name_start);
86bec2d3
SK
784 hash->update(ctx, (unsigned int)wire_len, (unsigned char *)name_start);
785 hash->update(ctx, 4, p); /* class and type */
786 hash->update(ctx, 4, (unsigned char *)&nsigttl);
5f8e58f4
SK
787
788 p += 8; /* skip class, type, ttl */
789 GETSHORT(rdlen, p);
5ada8885 790 if (!CHECK_LEN(header, p, plen, rdlen))
87070192 791 return STAT_BOGUS;
5ada8885 792
5f8e58f4
SK
793 end = p + rdlen;
794
795 /* canonicalise rdata and calculate length of same, use name buffer as workspace */
796 cp = p;
797 dp = rr_desc;
798 for (len = 0; (seg = get_rdata(header, plen, end, name, &cp, &dp)) != 0; len += seg);
799 len += end - cp;
800 len = htons(len);
86bec2d3 801 hash->update(ctx, 2, (unsigned char *)&len);
5f8e58f4
SK
802
803 /* Now canonicalise again and digest. */
804 cp = p;
805 dp = rr_desc;
806 while ((seg = get_rdata(header, plen, end, name, &cp, &dp)))
86bec2d3 807 hash->update(ctx, seg, (unsigned char *)name);
5f8e58f4 808 if (cp != end)
86bec2d3 809 hash->update(ctx, end - cp, cp);
5f8e58f4 810 }
86bec2d3
SK
811
812 hash->digest(ctx, hash->digest_size, digest);
813
5ada8885
SK
814 /* namebuff used for workspace above, restore to leave unchanged on exit */
815 p = (unsigned char*)(rrset[0]);
816 extract_name(header, plen, &p, name, 1, 0);
817
5f8e58f4
SK
818 if (key)
819 {
820 if (algo_in == algo && keytag_in == key_tag &&
ebe95a83 821 verify(key, keylen, sig, sig_len, digest, hash->digest_size, algo))
5f8e58f4
SK
822 return STAT_SECURE;
823 }
824 else
825 {
826 /* iterate through all possible keys 4035 5.3.1 */
827 for (; crecp; crecp = cache_find_by_name(crecp, keyname, now, F_DNSKEY))
51ea3ca2
SK
828 if (crecp->addr.key.algo == algo &&
829 crecp->addr.key.keytag == key_tag &&
824202ef 830 crecp->uid == class &&
ebe95a83 831 verify(crecp->addr.key.keydata, crecp->addr.key.keylen, sig, sig_len, digest, hash->digest_size, algo))
5107ace1 832 return (labels < name_labels) ? STAT_SECURE_WILDCARD : STAT_SECURE;
5f8e58f4
SK
833 }
834 }
835
836 return STAT_BOGUS;
837}
838
0fc2f313 839/* The DNS packet is expected to contain the answer to a DNSKEY query.
c3e0b9b6
SK
840 Put all DNSKEYs in the answer which are valid into the cache.
841 return codes:
87070192 842 STAT_INSECURE No DNSKEYs in reply.
c3e0b9b6 843 STAT_SECURE At least one valid DNSKEY found and in cache.
0fc2f313 844 STAT_BOGUS No DNSKEYs found, which can be validated with DS,
87070192 845 or self-sign for DNSKEY RRset is not valid, bad packet.
0fc2f313 846 STAT_NEED_DS DS records to validate a key not found, name in keyname
c3e0b9b6
SK
847*/
848int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class)
849{
0fc2f313 850 unsigned char *psave, *p = (unsigned char *)(header+1);
c3e0b9b6 851 struct crec *crecp, *recp1;
8d718cbb 852 int rc, j, qtype, qclass, ttl, rdlen, flags, algo, valid, keytag, type_covered;
c3e0b9b6 853 struct blockdata *key;
51ea3ca2 854 struct all_addr a;
c3e0b9b6 855
5f8e58f4
SK
856 if (ntohs(header->qdcount) != 1 ||
857 !extract_name(header, plen, &p, name, 1, 4))
87070192 858 return STAT_BOGUS;
5f8e58f4 859
c3e0b9b6
SK
860 GETSHORT(qtype, p);
861 GETSHORT(qclass, p);
862
87070192 863 if (qtype != T_DNSKEY || qclass != class)
f01d7be6 864 return STAT_BOGUS;
87070192
SK
865
866 if (ntohs(header->ancount) == 0)
867 return STAT_INSECURE;
c3e0b9b6 868
b8eac191 869 /* See if we have cached a DS record which validates this key */
0fc2f313
SK
870 if (!(crecp = cache_find_by_name(NULL, name, now, F_DS)))
871 {
872 strcpy(keyname, name);
873 return STAT_NEED_DS;
874 }
b8eac191
SK
875
876 /* If we've cached that DS provably doesn't exist, result must be INSECURE */
877 if (crecp->flags & F_NEG)
878 return STAT_INSECURE;
879
0fc2f313 880 /* NOTE, we need to find ONE DNSKEY which matches the DS */
e7829aef 881 for (valid = 0, j = ntohs(header->ancount); j != 0 && !valid; j--)
c3e0b9b6
SK
882 {
883 /* Ensure we have type, class TTL and length */
0fc2f313 884 if (!(rc = extract_name(header, plen, &p, name, 0, 10)))
87070192 885 return STAT_BOGUS; /* bad packet */
c3e0b9b6
SK
886
887 GETSHORT(qtype, p);
888 GETSHORT(qclass, p);
889 GETLONG(ttl, p);
890 GETSHORT(rdlen, p);
6f468103 891
0fc2f313 892 if (!CHECK_LEN(header, p, plen, rdlen) || rdlen < 4)
87070192 893 return STAT_BOGUS; /* bad packet */
0fc2f313 894
6f468103
SK
895 if (qclass != class || qtype != T_DNSKEY || rc == 2)
896 {
897 p += rdlen;
898 continue;
899 }
900
0fc2f313 901 psave = p;
c3e0b9b6 902
c3e0b9b6 903 GETSHORT(flags, p);
0fc2f313 904 if (*p++ != 3)
f01d7be6 905 return STAT_BOGUS;
c3e0b9b6 906 algo = *p++;
0fc2f313 907 keytag = dnskey_keytag(algo, flags, p, rdlen - 4);
e7829aef 908 key = NULL;
c3e0b9b6 909
e7829aef
SK
910 /* key must have zone key flag set */
911 if (flags & 0x100)
912 key = blockdata_alloc((char*)p, rdlen - 4);
c3e0b9b6 913
0fc2f313 914 p = psave;
e7829aef 915
0fc2f313 916 if (!ADD_RDLEN(header, p, plen, rdlen))
8d718cbb
SK
917 {
918 if (key)
919 blockdata_free(key);
87070192 920 return STAT_BOGUS; /* bad packet */
8d718cbb
SK
921 }
922
e7829aef
SK
923 /* No zone key flag or malloc failure */
924 if (!key)
0fc2f313
SK
925 continue;
926
927 for (recp1 = crecp; recp1; recp1 = cache_find_by_name(recp1, name, now, F_DS))
86bec2d3
SK
928 {
929 void *ctx;
930 unsigned char *digest, *ds_digest;
931 const struct nettle_hash *hash;
932
51ea3ca2
SK
933 if (recp1->addr.ds.algo == algo &&
934 recp1->addr.ds.keytag == keytag &&
824202ef 935 recp1->uid == class &&
51ea3ca2 936 (hash = hash_find(ds_digest_name(recp1->addr.ds.digest))) &&
86bec2d3 937 hash_init(hash, &ctx, &digest))
0fc2f313 938
86bec2d3
SK
939 {
940 int wire_len = to_wire(name);
941
942 /* Note that digest may be different between DSs, so
943 we can't move this outside the loop. */
944 hash->update(ctx, (unsigned int)wire_len, (unsigned char *)name);
945 hash->update(ctx, (unsigned int)rdlen, psave);
946 hash->digest(ctx, hash->digest_size, digest);
947
948 from_wire(name);
949
824202ef
SK
950 if (recp1->addr.ds.keylen == (int)hash->digest_size &&
951 (ds_digest = blockdata_retrieve(recp1->addr.key.keydata, recp1->addr.ds.keylen, NULL)) &&
952 memcmp(ds_digest, digest, recp1->addr.ds.keylen) == 0 &&
f6a2b793 953 validate_rrset(now, header, plen, class, T_DNSKEY, name, keyname, key, rdlen - 4, algo, keytag) == STAT_SECURE)
86bec2d3 954 {
86bec2d3 955 valid = 1;
86bec2d3
SK
956 break;
957 }
958 }
959 }
e7829aef 960 blockdata_free(key);
c3e0b9b6 961 }
c3e0b9b6 962
0fc2f313
SK
963 if (valid)
964 {
8d718cbb 965 /* DNSKEY RRset determined to be OK, now cache it and the RRsigs that sign it. */
e7829aef
SK
966 cache_start_insert();
967
968 p = skip_questions(header, plen);
969
970 for (j = ntohs(header->ancount); j != 0; j--)
971 {
972 /* Ensure we have type, class TTL and length */
973 if (!(rc = extract_name(header, plen, &p, name, 0, 10)))
974 return STAT_INSECURE; /* bad packet */
975
976 GETSHORT(qtype, p);
977 GETSHORT(qclass, p);
978 GETLONG(ttl, p);
979 GETSHORT(rdlen, p);
8d718cbb
SK
980
981 if (!CHECK_LEN(header, p, plen, rdlen))
87070192 982 return STAT_BOGUS; /* bad packet */
e7829aef 983
8d718cbb 984 if (qclass == class && rc == 1)
e7829aef 985 {
8d718cbb 986 psave = p;
e7829aef 987
8d718cbb
SK
988 if (qtype == T_DNSKEY)
989 {
990 if (rdlen < 4)
87070192 991 return STAT_BOGUS; /* bad packet */
8d718cbb
SK
992
993 GETSHORT(flags, p);
994 if (*p++ != 3)
f01d7be6 995 return STAT_BOGUS;
8d718cbb
SK
996 algo = *p++;
997 keytag = dnskey_keytag(algo, flags, p, rdlen - 4);
998
999 /* Cache needs to known class for DNSSEC stuff */
1000 a.addr.dnssec.class = class;
1001
1002 if ((key = blockdata_alloc((char*)p, rdlen - 4)))
1003 {
1004 if (!(recp1 = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DNSSECOK)))
1005 blockdata_free(key);
1006 else
1007 {
1008 a.addr.keytag = keytag;
1009 log_query(F_KEYTAG | F_UPSTREAM, name, &a, "DNSKEY keytag %u");
1010
1011 recp1->addr.key.keylen = rdlen - 4;
1012 recp1->addr.key.keydata = key;
1013 recp1->addr.key.algo = algo;
1014 recp1->addr.key.keytag = keytag;
1015 recp1->addr.key.flags = flags;
8d718cbb
SK
1016 }
1017 }
1018 }
1019 else if (qtype == T_RRSIG)
1020 {
1021 /* RRSIG, cache if covers DNSKEY RRset */
1022 if (rdlen < 18)
87070192 1023 return STAT_BOGUS; /* bad packet */
8d718cbb
SK
1024
1025 GETSHORT(type_covered, p);
1026
1027 if (type_covered == T_DNSKEY)
1028 {
1029 a.addr.dnssec.class = class;
1030 a.addr.dnssec.type = type_covered;
1031
1032 algo = *p++;
1033 p += 13; /* labels, orig_ttl, expiration, inception */
1034 GETSHORT(keytag, p);
1035 if ((key = blockdata_alloc((char*)psave, rdlen)))
1036 {
1037 if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DS)))
1038 blockdata_free(key);
1039 else
1040 {
8d718cbb
SK
1041 crecp->addr.sig.keydata = key;
1042 crecp->addr.sig.keylen = rdlen;
1043 crecp->addr.sig.keytag = keytag;
1044 crecp->addr.sig.type_covered = type_covered;
1045 crecp->addr.sig.algo = algo;
1046 }
1047 }
1048 }
1049 }
e7829aef 1050
8d718cbb 1051 p = psave;
e7829aef 1052 }
8d718cbb 1053
e7829aef 1054 if (!ADD_RDLEN(header, p, plen, rdlen))
87070192 1055 return STAT_BOGUS; /* bad packet */
e7829aef
SK
1056 }
1057
0fc2f313
SK
1058 /* commit cache insert. */
1059 cache_end_insert();
1060 return STAT_SECURE;
1061 }
1062
1063 log_query(F_UPSTREAM, name, NULL, "BOGUS DNSKEY");
1064 return STAT_BOGUS;
c3e0b9b6 1065}
0fc2f313 1066
c3e0b9b6
SK
1067/* The DNS packet is expected to contain the answer to a DS query
1068 Put all DSs in the answer which are valid into the cache.
1069 return codes:
87070192 1070 STAT_INSECURE no DS in reply or not signed.
c3e0b9b6 1071 STAT_SECURE At least one valid DS found and in cache.
00a5b5d4 1072 STAT_NO_DS It's proved there's no DS here.
87070192 1073 STAT_BOGUS At least one DS found, which fails validation, bad packet.
c3e0b9b6
SK
1074 STAT_NEED_DNSKEY DNSKEY records to validate a DS not found, name in keyname
1075*/
1076
1077int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class)
1078{
51ea3ca2 1079 unsigned char *p = (unsigned char *)(header+1);
00a5b5d4 1080 int qtype, qclass, val, i, neganswer;
c3e0b9b6 1081
5f8e58f4 1082 if (ntohs(header->qdcount) != 1 ||
b8eac191 1083 !(p = skip_name(p, header, plen, 4)))
87070192 1084 return STAT_BOGUS;
8d718cbb 1085
c3e0b9b6
SK
1086 GETSHORT(qtype, p);
1087 GETSHORT(qclass, p);
1088
b47b04c8
SK
1089 if (qtype != T_DS || qclass != class)
1090 val = STAT_BOGUS;
1091 else
00a5b5d4
SK
1092 val = dnssec_validate_reply(now, header, plen, name, keyname, NULL, &neganswer);
1093
1094 if (val == STAT_NO_SIG)
1095 val = STAT_INSECURE;
51ea3ca2 1096
b8eac191
SK
1097 p = (unsigned char *)(header+1);
1098 extract_name(header, plen, &p, name, 1, 4);
1099 p += 4; /* qtype, qclass */
1100
00a5b5d4 1101 if (!(p = skip_section(p, ntohs(header->ancount), header, plen)))
87070192 1102 return STAT_BOGUS;
00a5b5d4 1103
0fc2f313 1104 if (val == STAT_BOGUS)
b8eac191 1105 log_query(F_UPSTREAM, name, NULL, "BOGUS DS");
b47b04c8 1106
00a5b5d4 1107 if ((val == STAT_SECURE || val == STAT_INSECURE) && neganswer)
b8eac191 1108 {
14db4212 1109 int rdlen, flags = F_FORWARD | F_DS | F_NEG;
b8eac191
SK
1110 unsigned long ttl, minttl = ULONG_MAX;
1111 struct all_addr a;
00a5b5d4
SK
1112
1113 if (RCODE(header) == NXDOMAIN)
1114 flags |= F_NXDOMAIN;
1115
1116 if (val == STAT_SECURE)
1117 flags |= F_DNSSECOK;
b8eac191
SK
1118
1119 for (i = ntohs(header->nscount); i != 0; i--)
1120 {
00a5b5d4 1121 if (!(p = skip_name(p, header, plen, 0)))
87070192 1122 return STAT_BOGUS;
b8eac191
SK
1123
1124 GETSHORT(qtype, p);
1125 GETSHORT(qclass, p);
1126 GETLONG(ttl, p);
1127 GETSHORT(rdlen, p);
1128
00a5b5d4 1129 if (!CHECK_LEN(header, p, plen, rdlen))
87070192 1130 return STAT_BOGUS; /* bad packet */
00a5b5d4
SK
1131
1132 if (qclass != class || qtype != T_SOA)
b8eac191
SK
1133 {
1134 p += rdlen;
1135 continue;
1136 }
1137
1138 if (ttl < minttl)
1139 minttl = ttl;
1140
1141 /* MNAME */
1142 if (!(p = skip_name(p, header, plen, 0)))
87070192 1143 return STAT_BOGUS;
b8eac191
SK
1144 /* RNAME */
1145 if (!(p = skip_name(p, header, plen, 20)))
87070192 1146 return STAT_BOGUS;
b8eac191
SK
1147 p += 16; /* SERIAL REFRESH RETRY EXPIRE */
1148
1149 GETLONG(ttl, p); /* minTTL */
1150 if (ttl < minttl)
1151 minttl = ttl;
00a5b5d4
SK
1152
1153 break;
b8eac191
SK
1154 }
1155
00a5b5d4
SK
1156 if (i != 0)
1157 {
1158 cache_start_insert();
1159
1160 a.addr.dnssec.class = class;
1161 cache_insert(name, &a, now, ttl, flags);
1162
1163 cache_end_insert();
1164 }
b8eac191 1165
00a5b5d4 1166 return (val == STAT_SECURE) ? STAT_NO_DS : STAT_INSECURE;
b8eac191
SK
1167 }
1168
51ea3ca2 1169 return val;
c3e0b9b6
SK
1170}
1171
c5f4ec7d
SK
1172/* 4034 6.1 */
1173static int hostname_cmp(const char *a, const char *b)
1174{
dbf72123
SK
1175 char *sa, *ea, *ca, *sb, *eb, *cb;
1176 unsigned char ac, bc;
1177
1178 sa = ea = (char *)a + strlen(a);
1179 sb = eb = (char *)b + strlen(b);
1180
c5f4ec7d
SK
1181 while (1)
1182 {
dbf72123
SK
1183 while (sa != a && *(sa-1) != '.')
1184 sa--;
c5f4ec7d 1185
dbf72123
SK
1186 while (sb != b && *(sb-1) != '.')
1187 sb--;
1188
1189 ca = sa;
1190 cb = sb;
1191
1192 while (1)
1193 {
1194 if (ca == ea)
1195 {
1196 if (cb == eb)
1197 break;
1198
1199 return -1;
1200 }
c5f4ec7d 1201
dbf72123
SK
1202 if (cb == eb)
1203 return 1;
1204
1205 ac = (unsigned char) *ca++;
1206 bc = (unsigned char) *cb++;
1207
1208 if (ac >= 'A' && ac <= 'Z')
1209 ac += 'a' - 'A';
1210 if (bc >= 'A' && bc <= 'Z')
1211 bc += 'a' - 'A';
1212
979cdf9b 1213 if (ac < bc)
dbf72123
SK
1214 return -1;
1215 else if (ac != bc)
1216 return 1;
1217 }
c5f4ec7d 1218
dbf72123
SK
1219
1220 if (sa == a)
c5f4ec7d 1221 {
dbf72123
SK
1222 if (sb == b)
1223 return 0;
c5f4ec7d 1224
dbf72123 1225 return -1;
c5f4ec7d
SK
1226 }
1227
dbf72123
SK
1228 if (sb == b)
1229 return 1;
c5f4ec7d 1230
dbf72123
SK
1231 ea = sa--;
1232 eb = sb--;
c5f4ec7d
SK
1233 }
1234}
1235
5107ace1
SK
1236/* Find all the NSEC or NSEC3 records in a reply.
1237 return an array of pointers to them. */
1238static int find_nsec_records(struct dns_header *header, size_t plen, unsigned char ***nsecsetp, int *nsecsetl, int class_reqd)
1239{
1240 static unsigned char **nsecset = NULL;
1241 static int nsecset_sz = 0;
1242
87070192 1243 int type_found = 0;
5107ace1
SK
1244 unsigned char *p = skip_questions(header, plen);
1245 int type, class, rdlen, i, nsecs_found;
1246
1247 /* Move to NS section */
1248 if (!p || !(p = skip_section(p, ntohs(header->ancount), header, plen)))
1249 return 0;
1250
1251 for (nsecs_found = 0, i = ntohs(header->nscount); i != 0; i--)
1252 {
1253 unsigned char *pstart = p;
1254
1255 if (!(p = skip_name(p, header, plen, 10)))
1256 return 0;
1257
1258 GETSHORT(type, p);
1259 GETSHORT(class, p);
1260 p += 4; /* TTL */
1261 GETSHORT(rdlen, p);
1262
1263 if (class == class_reqd && (type == T_NSEC || type == T_NSEC3))
1264 {
1265 /* No mixed NSECing 'round here, thankyouverymuch */
1266 if (type_found == T_NSEC && type == T_NSEC3)
1267 return 0;
1268 if (type_found == T_NSEC3 && type == T_NSEC)
1269 return 0;
1270
1271 type_found = type;
1272
613ad15d
SK
1273 if (!expand_workspace(&nsecset, &nsecset_sz, nsecs_found))
1274 return 0;
1275
5107ace1
SK
1276 nsecset[nsecs_found++] = pstart;
1277 }
613ad15d 1278
5107ace1
SK
1279 if (!ADD_RDLEN(header, p, plen, rdlen))
1280 return 0;
1281 }
1282
1283 *nsecsetp = nsecset;
1284 *nsecsetl = nsecs_found;
1285
1286 return type_found;
1287}
1288
24187530 1289static int prove_non_existence_nsec(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
5107ace1
SK
1290 char *workspace1, char *workspace2, char *name, int type)
1291{
1292 int i, rc, rdlen;
1293 unsigned char *p, *psave;
1294 int offset = (type & 0xff) >> 3;
1295 int mask = 0x80 >> (type & 0x07);
1296
1297 /* Find NSEC record that proves name doesn't exist */
1298 for (i = 0; i < nsec_count; i++)
1299 {
1300 p = nsecs[i];
1301 if (!extract_name(header, plen, &p, workspace1, 1, 10))
87070192 1302 return STAT_BOGUS;
5107ace1
SK
1303 p += 8; /* class, type, TTL */
1304 GETSHORT(rdlen, p);
1305 psave = p;
1306 if (!extract_name(header, plen, &p, workspace2, 1, 10))
87070192 1307 return STAT_BOGUS;
5107ace1
SK
1308
1309 rc = hostname_cmp(workspace1, name);
1310
1311 if (rc == 0)
1312 {
f01d7be6
SK
1313 /* 4035 para 5.4. Last sentence */
1314 if (type == T_NSEC || type == T_RRSIG)
1315 return STAT_SECURE;
1316
5107ace1
SK
1317 /* NSEC with the same name as the RR we're testing, check
1318 that the type in question doesn't appear in the type map */
1319 rdlen -= p - psave;
1320 /* rdlen is now length of type map, and p points to it */
1321
1322 while (rdlen >= 2)
1323 {
1324 if (!CHECK_LEN(header, p, plen, rdlen))
87070192 1325 return STAT_BOGUS;
5107ace1
SK
1326
1327 if (p[0] == type >> 8)
1328 {
1329 /* Does the NSEC say our type exists? */
a857daa3 1330 if (offset < p[1] && (p[offset+2] & mask) != 0)
5107ace1
SK
1331 return STAT_BOGUS;
1332
1333 break; /* finshed checking */
1334 }
1335
1336 rdlen -= p[1];
1337 p += p[1];
1338 }
1339
1340 return STAT_SECURE;
1341 }
1342 else if (rc == -1)
1343 {
1344 /* Normal case, name falls between NSEC name and next domain name,
1345 wrap around case, name falls between NSEC name (rc == -1) and end */
1346 if (hostname_cmp(workspace2, name) == 1 || hostname_cmp(workspace1, workspace2) == 1)
1347 return STAT_SECURE;
1348 }
1349 else
1350 {
1351 /* wrap around case, name falls between start and next domain name */
1352 if (hostname_cmp(workspace1, workspace2) == 1 && hostname_cmp(workspace2, name) == 1)
1353 return STAT_SECURE;
1354 }
1355 }
1356
1357 return STAT_BOGUS;
1358}
1359
1360/* return digest length, or zero on error */
1361static int hash_name(char *in, unsigned char **out, struct nettle_hash const *hash,
1362 unsigned char *salt, int salt_len, int iterations)
1363{
1364 void *ctx;
1365 unsigned char *digest;
1366 int i;
1367
1368 if (!hash_init(hash, &ctx, &digest))
1369 return 0;
1370
1371 hash->update(ctx, to_wire(in), (unsigned char *)in);
1372 hash->update(ctx, salt_len, salt);
1373 hash->digest(ctx, hash->digest_size, digest);
1374
1375 for(i = 0; i < iterations; i++)
1376 {
1377 hash->update(ctx, hash->digest_size, digest);
1378 hash->update(ctx, salt_len, salt);
1379 hash->digest(ctx, hash->digest_size, digest);
1380 }
1381
1382 from_wire(in);
1383
1384 *out = digest;
1385 return hash->digest_size;
1386}
1387
1388/* Decode base32 to first "." or end of string */
1389static int base32_decode(char *in, unsigned char *out)
1390{
a857daa3 1391 int oc, on, c, mask, i;
5107ace1
SK
1392 unsigned char *p = out;
1393
a857daa3 1394 for (c = *in, oc = 0, on = 0; c != 0 && c != '.'; c = *++in)
5107ace1 1395 {
5107ace1
SK
1396 if (c >= '0' && c <= '9')
1397 c -= '0';
1398 else if (c >= 'a' && c <= 'v')
1399 c -= 'a', c += 10;
1400 else if (c >= 'A' && c <= 'V')
1401 c -= 'A', c += 10;
1402 else
1403 return 0;
1404
1405 for (mask = 0x10, i = 0; i < 5; i++)
1406 {
a857daa3
SK
1407 if (c & mask)
1408 oc |= 1;
1409 mask = mask >> 1;
1410 if (((++on) & 7) == 0)
1411 *p++ = oc;
1412 oc = oc << 1;
5107ace1
SK
1413 }
1414 }
1415
1416 if ((on & 7) != 0)
1417 return 0;
1418
1419 return p - out;
1420}
1421
24187530 1422static int prove_non_existence_nsec3(struct dns_header *header, size_t plen, unsigned char **nsecs, int nsec_count,
5107ace1
SK
1423 char *workspace1, char *workspace2, char *name, int type)
1424{
a857daa3
SK
1425 unsigned char *salt, *p, *digest;
1426 int digest_len, i, iterations, salt_len, hash_len, base32_len, algo = 0;
5107ace1
SK
1427 struct nettle_hash const *hash;
1428 char *closest_encloser, *next_closest, *wildcard;
1429
1430 /* Look though the NSEC3 records to find the first one with
1431 an algorithm we support (currently only algo == 1).
1432
1433 Take the algo, iterations, and salt of that record
1434 as the ones we're going to use, and prune any
1435 that don't match. */
1436
1437 for (i = 0; i < nsec_count; i++)
1438 {
1439 if (!(p = skip_name(nsecs[i], header, plen, 15)))
87070192 1440 return STAT_BOGUS; /* bad packet */
5107ace1
SK
1441
1442 p += 10; /* type, class, TTL, rdlen */
1443 algo = *p++;
1444
1445 if (algo == 1)
1446 break; /* known algo */
1447 }
1448
1449 /* No usable NSEC3s */
1450 if (i == nsec_count)
1451 return STAT_BOGUS;
1452
1453 p++; /* flags */
1454 GETSHORT (iterations, p);
1455 salt_len = *p++;
1456 salt = p;
1457 if (!CHECK_LEN(header, salt, plen, salt_len))
87070192 1458 return STAT_BOGUS; /* bad packet */
5107ace1
SK
1459
1460 /* Now prune so we only have NSEC3 records with same iterations, salt and algo */
1461 for (i = 0; i < nsec_count; i++)
1462 {
1463 unsigned char *nsec3p = nsecs[i];
1464 int this_iter;
1465
1466 nsecs[i] = NULL; /* Speculative, will be restored if OK. */
1467
1468 if (!(p = skip_name(nsec3p, header, plen, 15)))
87070192 1469 return STAT_BOGUS; /* bad packet */
5107ace1
SK
1470
1471 p += 10; /* type, class, TTL, rdlen */
1472
1473 if (*p++ != algo)
1474 continue;
1475
1476 p++; /* flags */
1477
a857daa3 1478 GETSHORT(this_iter, p);
5107ace1
SK
1479 if (this_iter != iterations)
1480 continue;
1481
1482 if (salt_len != *p++)
1483 continue;
1484
1485 if (!CHECK_LEN(header, p, plen, salt_len))
87070192 1486 return STAT_BOGUS; /* bad packet */
5107ace1
SK
1487
1488 if (memcmp(p, salt, salt_len) != 0)
1489 continue;
1490
1491 /* All match, put the pointer back */
1492 nsecs[i] = nsec3p;
1493 }
1494
1495 /* Algo is checked as 1 above */
1496 if (!(hash = hash_find("sha1")))
87070192 1497 return STAT_BOGUS;
5107ace1
SK
1498
1499 /* Now, we need the "closest encloser NSEC3" */
1500 closest_encloser = name;
1501 next_closest = NULL;
1502
1503 do
1504 {
1505 if (*closest_encloser == '.')
1506 closest_encloser++;
c5f4ec7d 1507
a857daa3 1508 if ((digest_len = hash_name(closest_encloser, &digest, hash, salt, salt_len, iterations)) == 0)
87070192 1509 return STAT_BOGUS;
5107ace1
SK
1510
1511 for (i = 0; i < nsec_count; i++)
1512 if ((p = nsecs[i]))
1513 {
5107ace1 1514 if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
a857daa3 1515 !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
87070192 1516 return STAT_BOGUS;
5107ace1 1517
a857daa3
SK
1518 if (digest_len == base32_len &&
1519 memcmp(digest, workspace2, digest_len) == 0)
5107ace1
SK
1520 break; /* Gotit */
1521 }
1522
1523 if (i != nsec_count)
1524 break;
1525
1526 next_closest = closest_encloser;
1527 }
1528 while ((closest_encloser = strchr(closest_encloser, '.')));
1529
1530 /* No usable NSEC3s */
1531 if (i == nsec_count)
1532 return STAT_BOGUS;
1533
1534 if (!next_closest)
1535 {
1536 /* We found an NSEC3 whose hashed name exactly matches the query, so
1537 Now we just need to check the type map. p points to the RR data for the record. */
a857daa3 1538 int rdlen;
5107ace1
SK
1539 unsigned char *psave;
1540 int offset = (type & 0xff) >> 3;
1541 int mask = 0x80 >> (type & 0x07);
1542
1543 p += 8; /* class, type, TTL */
1544 GETSHORT(rdlen, p);
1545 psave = p;
1546 p += 5 + salt_len; /* algo, flags, iterations, salt_len, salt */
1547 hash_len = *p++;
1548 if (!CHECK_LEN(header, p, plen, hash_len))
87070192 1549 return STAT_BOGUS; /* bad packet */
5107ace1
SK
1550 p += hash_len;
1551 rdlen -= p - psave;
1552
1553 while (rdlen >= 2)
1554 {
1555 if (!CHECK_LEN(header, p, plen, rdlen))
87070192 1556 return STAT_BOGUS;
5107ace1
SK
1557
1558 if (p[0] == type >> 8)
1559 {
a857daa3
SK
1560 /* Does the NSEC3 say our type exists? */
1561 if (offset < p[1] && (p[offset+2] & mask) != 0)
5107ace1
SK
1562 return STAT_BOGUS;
1563
1564 break; /* finshed checking */
1565 }
1566
1567 rdlen -= p[1];
1568 p += p[1];
1569 }
1570
1571 return STAT_SECURE;
1572 }
1573
24187530 1574 /* Look for NSEC3 that proves the non-existence of the next-closest encloser */
a857daa3 1575 if ((digest_len = hash_name(next_closest, &digest, hash, salt, salt_len, iterations)) == 0)
87070192 1576 return STAT_BOGUS;
5107ace1
SK
1577
1578 for (i = 0; i < nsec_count; i++)
1579 if ((p = nsecs[i]))
1580 {
a857daa3
SK
1581 if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
1582 !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
87070192 1583 return STAT_BOGUS;
5107ace1
SK
1584
1585 p += 15 + salt_len; /* class, type, TTL, rdlen, algo, flags, iterations, salt_len, salt */
1586 hash_len = *p++; /* p now points to next hashed name */
1587
1588 if (!CHECK_LEN(header, p, plen, hash_len))
87070192 1589 return STAT_BOGUS;
5107ace1 1590
a857daa3 1591 if (digest_len == base32_len && hash_len == base32_len)
5107ace1 1592 {
a857daa3 1593 if (memcmp(workspace2, digest, digest_len) <= 0)
5107ace1
SK
1594 {
1595 /* Normal case, hash falls between NSEC3 name-hash and next domain name-hash,
1596 wrap around case, name-hash falls between NSEC3 name-hash and end */
a857daa3 1597 if (memcmp(p, digest, digest_len) > 0 || memcmp(workspace2, p, digest_len) > 0)
5107ace1
SK
1598 return STAT_SECURE;
1599 }
1600 else
1601 {
1602 /* wrap around case, name falls between start and next domain name */
a857daa3 1603 if (memcmp(workspace2, p, digest_len) > 0 && memcmp(p, digest, digest_len) > 0)
5107ace1
SK
1604 return STAT_SECURE;
1605 }
1606 }
1607 }
1608
1609 /* Finally, check that there's no seat of wildcard synthesis */
1610 if (!(wildcard = strchr(next_closest, '.')) || wildcard == next_closest)
1611 return STAT_BOGUS;
1612
1613 wildcard--;
1614 *wildcard = '*';
1615
a857daa3 1616 if ((digest_len = hash_name(wildcard, &digest, hash, salt, salt_len, iterations)) == 0)
87070192 1617 return STAT_BOGUS;
5107ace1
SK
1618
1619 for (i = 0; i < nsec_count; i++)
1620 if ((p = nsecs[i]))
1621 {
5107ace1 1622 if (!extract_name(header, plen, &p, workspace1, 1, 0) ||
a857daa3 1623 !(base32_len = base32_decode(workspace1, (unsigned char *)workspace2)))
87070192 1624 return STAT_BOGUS;
5107ace1
SK
1625
1626 p += 15 + salt_len; /* class, type, TTL, rdlen, algo, flags, iterations, salt_len, salt */
1627 hash_len = *p++; /* p now points to next hashed name */
1628
1629 if (!CHECK_LEN(header, p, plen, hash_len))
87070192 1630 return STAT_BOGUS;
5107ace1 1631
a857daa3 1632 if (digest_len == base32_len && hash_len == base32_len)
5107ace1 1633 {
a857daa3 1634 if (memcmp(workspace2, digest, digest_len) <= 0)
5107ace1
SK
1635 {
1636 /* Normal case, hash falls between NSEC3 name-hash and next domain name-hash,
1637 wrap around case, name-hash falls between NSEC3 name-hash and end */
a857daa3 1638 if (memcmp(p, digest, digest_len) > 0 || memcmp(workspace2, p, digest_len) > 0)
5107ace1
SK
1639 return STAT_SECURE;
1640 }
1641 else
1642 {
1643 /* wrap around case, name falls between start and next domain name */
a857daa3 1644 if (memcmp(workspace2, p, digest_len) > 0 && memcmp(p, digest, digest_len) > 0)
5107ace1
SK
1645 return STAT_SECURE;
1646 }
1647 }
1648 }
1649
1650 return STAT_BOGUS;
1651}
1652
0fc2f313 1653/* Validate all the RRsets in the answer and authority sections of the reply (4035:3.2.3) */
51ea3ca2 1654/* Returns are the same as validate_rrset, plus the class if the missing key is in *class */
00a5b5d4 1655int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer)
adca3e9c 1656{
00a5b5d4
SK
1657 unsigned char *ans_start, *qname, *p1, *p2, **nsecs;
1658 int type1, class1, rdlen1, type2, class2, rdlen2, qclass, qtype;
1fbe4d2f 1659 int i, j, rc, nsec_count, cname_count = CNAME_CHAIN;
00a5b5d4 1660 int nsec_type = 0, have_answer = 0;
adca3e9c 1661
00a5b5d4
SK
1662 if (neganswer)
1663 *neganswer = 0;
1664
87070192 1665 if (RCODE(header) == SERVFAIL || ntohs(header->qdcount) != 1)
e3ec15af
SK
1666 return STAT_BOGUS;
1667
87070192 1668 if (RCODE(header) != NXDOMAIN && RCODE(header) != NOERROR)
72ae2f3d 1669 return STAT_INSECURE;
00a5b5d4
SK
1670
1671 qname = p1 = (unsigned char *)(header+1);
c5f4ec7d 1672
00a5b5d4 1673 if (!extract_name(header, plen, &p1, name, 1, 4))
87070192 1674 return STAT_BOGUS;
00a5b5d4
SK
1675
1676 GETSHORT(qtype, p1);
1677 GETSHORT(qclass, p1);
1678 ans_start = p1;
1679
1680 /* Can't validate an RRISG query */
1681 if (qtype == T_RRSIG)
0fc2f313 1682 return STAT_INSECURE;
00a5b5d4
SK
1683
1684 cname_loop:
1685 for (j = ntohs(header->ancount); j != 0; j--)
1686 {
1687 /* leave pointer to missing name in qname */
1688
1689 if (!(rc = extract_name(header, plen, &p1, name, 0, 10)))
87070192 1690 return STAT_BOGUS; /* bad packet */
00a5b5d4
SK
1691
1692 GETSHORT(type2, p1);
1693 GETSHORT(class2, p1);
1694 p1 += 4; /* TTL */
1695 GETSHORT(rdlen2, p1);
1696
1697 if (rc == 1 && qclass == class2)
1698 {
1699 /* Do we have an answer for the question? */
1700 if (type2 == qtype)
1701 {
1702 have_answer = 1;
1703 break;
1704 }
1705 else if (type2 == T_CNAME)
1706 {
1707 qname = p1;
1708
1709 /* looped CNAMES */
1710 if (!cname_count-- || !extract_name(header, plen, &p1, name, 1, 0))
87070192 1711 return STAT_BOGUS;
00a5b5d4
SK
1712
1713 p1 = ans_start;
1714 goto cname_loop;
1715 }
1716 }
1717
1718 if (!ADD_RDLEN(header, p1, plen, rdlen2))
87070192 1719 return STAT_BOGUS;
00a5b5d4 1720 }
0fc2f313 1721
00a5b5d4
SK
1722 if (neganswer && !have_answer)
1723 *neganswer = 1;
0575610f
SK
1724
1725 /* No data, therefore no sigs */
1726 if (ntohs(header->ancount) + ntohs(header->nscount) == 0)
1727 return STAT_NO_SIG;
00a5b5d4 1728
0fc2f313 1729 for (p1 = ans_start, i = 0; i < ntohs(header->ancount) + ntohs(header->nscount); i++)
adca3e9c 1730 {
0fc2f313 1731 if (!extract_name(header, plen, &p1, name, 1, 10))
87070192 1732 return STAT_BOGUS; /* bad packet */
0fc2f313
SK
1733
1734 GETSHORT(type1, p1);
1735 GETSHORT(class1, p1);
1736 p1 += 4; /* TTL */
1737 GETSHORT(rdlen1, p1);
1738
1739 /* Don't try and validate RRSIGs! */
1740 if (type1 != T_RRSIG)
1741 {
1742 /* Check if we've done this RRset already */
1743 for (p2 = ans_start, j = 0; j < i; j++)
1744 {
1745 if (!(rc = extract_name(header, plen, &p2, name, 0, 10)))
87070192 1746 return STAT_BOGUS; /* bad packet */
0fc2f313
SK
1747
1748 GETSHORT(type2, p2);
1749 GETSHORT(class2, p2);
1750 p2 += 4; /* TTL */
1751 GETSHORT(rdlen2, p2);
1752
1753 if (type2 == type1 && class2 == class1 && rc == 1)
1754 break; /* Done it before: name, type, class all match. */
1755
1756 if (!ADD_RDLEN(header, p2, plen, rdlen2))
87070192 1757 return STAT_BOGUS;
0fc2f313
SK
1758 }
1759
1760 /* Not done, validate now */
51ea3ca2 1761 if (j == i)
0fc2f313 1762 {
8d718cbb
SK
1763 int ttl, keytag, algo, digest, type_covered;
1764 unsigned char *psave;
1765 struct all_addr a;
1766 struct blockdata *key;
1767 struct crec *crecp;
1768
5107ace1
SK
1769 rc = validate_rrset(now, header, plen, class1, type1, name, keyname, NULL, 0, 0, 0);
1770
1771 if (rc == STAT_SECURE_WILDCARD)
1772 {
1773 /* An attacker replay a wildcard answer with a different
a857daa3 1774 answer and overlay a genuine RR. To prove this
5107ace1 1775 hasn't happened, the answer must prove that
a857daa3 1776 the gennuine record doesn't exist. Check that here. */
87070192
SK
1777 if (!nsec_type && !(nsec_type = find_nsec_records(header, plen, &nsecs, &nsec_count, class1)))
1778 return STAT_BOGUS; /* No NSECs or bad packet */
5107ace1
SK
1779
1780 if (nsec_type == T_NSEC)
24187530 1781 rc = prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1);
5107ace1 1782 else
24187530 1783 rc = prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, type1);
5107ace1
SK
1784
1785 if (rc != STAT_SECURE)
1786 return rc;
1787 }
1788 else if (rc != STAT_SECURE)
51ea3ca2
SK
1789 {
1790 if (class)
1791 *class = class1; /* Class for DS or DNSKEY */
1792 return rc;
1793 }
5107ace1 1794
8d718cbb
SK
1795 /* Cache RRsigs in answer section, and if we just validated a DS RRset, cache it */
1796 cache_start_insert();
1797
1798 for (p2 = ans_start, j = 0; j < ntohs(header->ancount); j++)
51ea3ca2 1799 {
8d718cbb 1800 if (!(rc = extract_name(header, plen, &p2, name, 0, 10)))
87070192 1801 return STAT_BOGUS; /* bad packet */
51ea3ca2 1802
8d718cbb
SK
1803 GETSHORT(type2, p2);
1804 GETSHORT(class2, p2);
1805 GETLONG(ttl, p2);
1806 GETSHORT(rdlen2, p2);
1807
1808 if (!CHECK_LEN(header, p2, plen, rdlen2))
87070192 1809 return STAT_BOGUS; /* bad packet */
8d718cbb
SK
1810
1811 if (class2 == class1 && rc == 1)
1812 {
1813 psave = p2;
1814
1815 if (type1 == T_DS && type2 == T_DS)
51ea3ca2 1816 {
8d718cbb 1817 if (rdlen2 < 4)
87070192 1818 return STAT_BOGUS; /* bad packet */
8d718cbb 1819
51ea3ca2
SK
1820 GETSHORT(keytag, p2);
1821 algo = *p2++;
1822 digest = *p2++;
1823
1824 /* Cache needs to known class for DNSSEC stuff */
1825 a.addr.dnssec.class = class2;
1826
8d718cbb 1827 if ((key = blockdata_alloc((char*)p2, rdlen2 - 4)))
51ea3ca2 1828 {
8d718cbb
SK
1829 if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DS | F_DNSSECOK)))
1830 blockdata_free(key);
1831 else
1832 {
1833 a.addr.keytag = keytag;
1834 log_query(F_KEYTAG | F_UPSTREAM, name, &a, "DS keytag %u");
1835 crecp->addr.ds.digest = digest;
1836 crecp->addr.ds.keydata = key;
1837 crecp->addr.ds.algo = algo;
1838 crecp->addr.ds.keytag = keytag;
8d718cbb
SK
1839 crecp->addr.ds.keylen = rdlen2 - 4;
1840 }
1841 }
1842 }
1843 else if (type2 == T_RRSIG)
1844 {
1845 if (rdlen2 < 18)
87070192 1846 return STAT_BOGUS; /* bad packet */
51ea3ca2 1847
8d718cbb
SK
1848 GETSHORT(type_covered, p2);
1849
1850 if (type_covered == type1 &&
1851 (type_covered == T_A || type_covered == T_AAAA ||
1852 type_covered == T_CNAME || type_covered == T_DS ||
1853 type_covered == T_DNSKEY || type_covered == T_PTR))
1854 {
1855 a.addr.dnssec.type = type_covered;
c8ca33f8 1856 a.addr.dnssec.class = class1;
8d718cbb
SK
1857
1858 algo = *p2++;
1859 p2 += 13; /* labels, orig_ttl, expiration, inception */
1860 GETSHORT(keytag, p2);
1861
1862 if ((key = blockdata_alloc((char*)psave, rdlen2)))
1863 {
1864 if (!(crecp = cache_insert(name, &a, now, ttl, F_FORWARD | F_DNSKEY | F_DS)))
1865 blockdata_free(key);
1866 else
1867 {
8d718cbb
SK
1868 crecp->addr.sig.keydata = key;
1869 crecp->addr.sig.keylen = rdlen2;
1870 crecp->addr.sig.keytag = keytag;
1871 crecp->addr.sig.type_covered = type_covered;
1872 crecp->addr.sig.algo = algo;
1873 }
1874 }
1875 }
51ea3ca2
SK
1876 }
1877
8d718cbb 1878 p2 = psave;
51ea3ca2
SK
1879 }
1880
8d718cbb 1881 if (!ADD_RDLEN(header, p2, plen, rdlen2))
87070192 1882 return STAT_BOGUS; /* bad packet */
51ea3ca2 1883 }
8d718cbb
SK
1884
1885 cache_end_insert();
0fc2f313
SK
1886 }
1887 }
adca3e9c 1888
0fc2f313 1889 if (!ADD_RDLEN(header, p1, plen, rdlen1))
87070192 1890 return STAT_BOGUS;
adca3e9c
GB
1891 }
1892
c5f4ec7d 1893 /* OK, all the RRsets validate, now see if we have a NODATA or NXDOMAIN reply */
00a5b5d4
SK
1894 if (have_answer)
1895 return STAT_SECURE;
1896
5107ace1 1897 /* NXDOMAIN or NODATA reply, prove that (name, class1, type1) can't exist */
5107ace1 1898 /* First marshall the NSEC records, if we've not done it previously */
87070192
SK
1899 if (!nsec_type && !(nsec_type = find_nsec_records(header, plen, &nsecs, &nsec_count, qclass)))
1900 return STAT_BOGUS; /* No NSECs */
00a5b5d4
SK
1901
1902 /* Get name of missing answer */
1903 if (!extract_name(header, plen, &qname, name, 1, 0))
87070192 1904 return STAT_BOGUS;
5107ace1
SK
1905
1906 if (nsec_type == T_NSEC)
00a5b5d4 1907 return prove_non_existence_nsec(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype);
5107ace1 1908 else
00a5b5d4 1909 return prove_non_existence_nsec3(header, plen, nsecs, nsec_count, daemon->workspacename, keyname, name, qtype);
e292e93d
GB
1910}
1911
00a5b5d4
SK
1912/* Chase the CNAME chain in the packet until the first record which _doesn't validate.
1913 Needed for proving answer in unsigned space.
1914 Return STAT_NEED_*
1915 STAT_BOGUS - error
1916 STAT_INSECURE - name of first non-secure record in name
1917*/
1918int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname)
1919{
1920 unsigned char *p = (unsigned char *)(header+1);
c07d30dc 1921 int type, class, qclass, rdlen, j, rc;
1fbe4d2f 1922 int cname_count = CNAME_CHAIN;
00a5b5d4
SK
1923
1924 /* Get question */
1925 if (!extract_name(header, plen, &p, name, 1, 4))
1926 return STAT_BOGUS;
1927
c07d30dc 1928 p +=2; /* type */
00a5b5d4
SK
1929 GETSHORT(qclass, p);
1930
1931 while (1)
1932 {
1933 for (j = ntohs(header->ancount); j != 0; j--)
1934 {
1935 if (!(rc = extract_name(header, plen, &p, name, 0, 10)))
1936 return STAT_BOGUS; /* bad packet */
1937
1938 GETSHORT(type, p);
1939 GETSHORT(class, p);
1940 p += 4; /* TTL */
1941 GETSHORT(rdlen, p);
1942
1943 /* Not target, loop */
1944 if (rc == 2 || qclass != class)
1945 {
1946 if (!ADD_RDLEN(header, p, plen, rdlen))
1947 return STAT_BOGUS;
1948 continue;
1949 }
1950
1951 /* Got to end of CNAME chain. */
1952 if (type != T_CNAME)
1953 return STAT_INSECURE;
1954
1955 /* validate CNAME chain, return if insecure or need more data */
1956 rc = validate_rrset(now, header, plen, class, type, name, keyname, NULL, 0, 0, 0);
1957 if (rc != STAT_SECURE)
1958 {
1959 if (rc == STAT_NO_SIG)
1960 rc = STAT_INSECURE;
1961 return rc;
1962 }
1963
1964 /* Loop down CNAME chain/ */
1965 if (!cname_count-- ||
1966 !extract_name(header, plen, &p, name, 1, 0) ||
1967 !(p = skip_questions(header, plen)))
1968 return STAT_BOGUS;
1969
1970 break;
1971 }
1972
1973 /* End of CNAME chain */
1974 return STAT_INSECURE;
1975 }
1976}
1977
1978
3471f181 1979/* Compute keytag (checksum to quickly index a key). See RFC4034 */
0fc2f313 1980int dnskey_keytag(int alg, int flags, unsigned char *key, int keylen)
3471f181 1981{
75ffc9bf
GB
1982 if (alg == 1)
1983 {
1984 /* Algorithm 1 (RSAMD5) has a different (older) keytag calculation algorithm.
1985 See RFC4034, Appendix B.1 */
0fc2f313 1986 return key[keylen-4] * 256 + key[keylen-3];
75ffc9bf
GB
1987 }
1988 else
1989 {
1633e308 1990 unsigned long ac = flags + 0x300 + alg;
75ffc9bf
GB
1991 int i;
1992
0fc2f313
SK
1993 for (i = 0; i < keylen; ++i)
1994 ac += (i & 1) ? key[i] : key[i] << 8;
1633e308 1995
0fc2f313
SK
1996 ac += (ac >> 16) & 0xffff;
1997 return ac & 0xffff;
0304d28f 1998 }
3471f181 1999}
e292e93d 2000
5f8e58f4
SK
2001size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr)
2002{
2003 unsigned char *p;
610e782a 2004 char *types = querystr("dnssec-query", type);
5f8e58f4
SK
2005
2006 if (addr->sa.sa_family == AF_INET)
2007 log_query(F_DNSSEC | F_IPV4, name, (struct all_addr *)&addr->in.sin_addr, types);
2008#ifdef HAVE_IPV6
2009 else
2010 log_query(F_DNSSEC | F_IPV6, name, (struct all_addr *)&addr->in6.sin6_addr, types);
2011#endif
2012
2013 header->qdcount = htons(1);
2014 header->ancount = htons(0);
2015 header->nscount = htons(0);
2016 header->arcount = htons(0);
e292e93d 2017
5f8e58f4
SK
2018 header->hb3 = HB3_RD;
2019 SET_OPCODE(header, QUERY);
5b3bf921
SK
2020 /* For debugging, set Checking Disabled, otherwise, have the upstream check too,
2021 this allows it to select auth servers when one is returning bad data. */
2022 header->hb4 = option_bool(OPT_DNSSEC_DEBUG) ? HB4_CD : 0;
5f8e58f4
SK
2023
2024 /* ID filled in later */
2025
2026 p = (unsigned char *)(header+1);
2027
2028 p = do_rfc1035_name(p, name);
2029 *p++ = 0;
2030 PUTSHORT(type, p);
2031 PUTSHORT(class, p);
2032
2033 return add_do_bit(header, p - (unsigned char *)header, end);
2034}
8a9be9e4 2035
613ad15d
SK
2036/* Go through a domain name, find "pointers" and fix them up based on how many bytes
2037 we've chopped out of the packet, or check they don't point into an elided part. */
2038static int check_name(unsigned char **namep, struct dns_header *header, size_t plen, int fixup, unsigned char **rrs, int rr_count)
2039{
2040 unsigned char *ansp = *namep;
2041
2042 while(1)
2043 {
2044 unsigned int label_type;
2045
2046 if (!CHECK_LEN(header, ansp, plen, 1))
2047 return 0;
2048
2049 label_type = (*ansp) & 0xc0;
2050
2051 if (label_type == 0xc0)
2052 {
2053 /* pointer for compression. */
00a5b5d4
SK
2054 unsigned int offset;
2055 int i;
613ad15d
SK
2056 unsigned char *p;
2057
2058 if (!CHECK_LEN(header, ansp, plen, 2))
2059 return 0;
2060
2061 offset = ((*ansp++) & 0x3f) << 8;
2062 offset |= *ansp++;
2063
2064 p = offset + (unsigned char *)header;
2065
2066 for (i = 0; i < rr_count; i++)
2067 if (p < rrs[i])
2068 break;
2069 else
2070 if (i & 1)
2071 offset -= rrs[i] - rrs[i-1];
2072
2073 /* does the pointer end up in an elided RR? */
2074 if (i & 1)
00a5b5d4 2075 return 0;
613ad15d
SK
2076
2077 /* No, scale the pointer */
2078 if (fixup)
2079 {
2080 ansp -= 2;
2081 *ansp++ = (offset >> 8) | 0xc0;
2082 *ansp++ = offset & 0xff;
2083 }
2084 break;
2085 }
2086 else if (label_type == 0x80)
2087 return 0; /* reserved */
2088 else if (label_type == 0x40)
2089 {
2090 /* Extended label type */
2091 unsigned int count;
2092
2093 if (!CHECK_LEN(header, ansp, plen, 2))
2094 return 0;
2095
2096 if (((*ansp++) & 0x3f) != 1)
2097 return 0; /* we only understand bitstrings */
2098
2099 count = *(ansp++); /* Bits in bitstring */
2100
2101 if (count == 0) /* count == 0 means 256 bits */
2102 ansp += 32;
2103 else
2104 ansp += ((count-1)>>3)+1;
2105 }
2106 else
2107 { /* label type == 0 Bottom six bits is length */
2108 unsigned int len = (*ansp++) & 0x3f;
2109
2110 if (!ADD_RDLEN(header, ansp, plen, len))
2111 return 0;
2112
2113 if (len == 0)
2114 break; /* zero length label marks the end. */
2115 }
2116 }
2117
2118 *namep = ansp;
2119
2120 return 1;
2121}
2122
2123/* Go through RRs and check or fixup the domain names contained within */
2124static int check_rrs(unsigned char *p, struct dns_header *header, size_t plen, int fixup, unsigned char **rrs, int rr_count)
2125{
2126 int i, type, class, rdlen;
00a5b5d4 2127 unsigned char *pp;
613ad15d
SK
2128
2129 for (i = 0; i < ntohs(header->ancount) + ntohs(header->nscount); i++)
2130 {
00a5b5d4
SK
2131 pp = p;
2132
2133 if (!(p = skip_name(p, header, plen, 10)))
2134 return 0;
613ad15d
SK
2135
2136 GETSHORT(type, p);
2137 GETSHORT(class, p);
2138 p += 4; /* TTL */
2139 GETSHORT(rdlen, p);
00a5b5d4 2140
613ad15d
SK
2141 if (type != T_NSEC && type != T_NSEC3 && type != T_RRSIG)
2142 {
00a5b5d4
SK
2143 /* fixup name of RR */
2144 if (!check_name(&pp, header, plen, fixup, rrs, rr_count))
2145 return 0;
2146
613ad15d
SK
2147 if (class == C_IN)
2148 {
2149 u16 *d;
14db4212
SK
2150
2151 for (pp = p, d = get_desc(type); *d != (u16)-1; d++)
613ad15d
SK
2152 {
2153 if (*d != 0)
2154 pp += *d;
2155 else if (!check_name(&pp, header, plen, fixup, rrs, rr_count))
2156 return 0;
2157 }
2158 }
2159 }
2160
2161 if (!ADD_RDLEN(header, p, plen, rdlen))
2162 return 0;
2163 }
2164
2165 return 1;
2166}
2167
2168
2169size_t filter_rrsigs(struct dns_header *header, size_t plen)
2170{
2171 static unsigned char **rrs;
2172 static int rr_sz = 0;
2173
2174 unsigned char *p = (unsigned char *)(header+1);
2175 int i, rdlen, qtype, qclass, rr_found, chop_an, chop_ns;
2176
2177 if (ntohs(header->qdcount) != 1 ||
2178 !(p = skip_name(p, header, plen, 4)))
2179 return plen;
2180
2181 GETSHORT(qtype, p);
2182 GETSHORT(qclass, p);
2183
2184 /* First pass, find pointers to start and end of all the records we wish to elide:
2185 records added for DNSSEC, unless explicity queried for */
2186 for (rr_found = 0, chop_ns = 0, chop_an = 0, i = 0; i < ntohs(header->ancount) + ntohs(header->nscount); i++)
2187 {
2188 unsigned char *pstart = p;
2189 int type, class;
2190
2191 if (!(p = skip_name(p, header, plen, 10)))
2192 return plen;
2193
2194 GETSHORT(type, p);
2195 GETSHORT(class, p);
2196 p += 4; /* TTL */
2197 GETSHORT(rdlen, p);
2198
2199 if ((type == T_NSEC || type == T_NSEC3 || type == T_RRSIG) &&
2200 (type != qtype || class != qclass))
2201 {
2202 if (!expand_workspace(&rrs, &rr_sz, rr_found + 1))
2203 return plen;
2204
2205 rrs[rr_found++] = pstart;
2206
2207 if (!ADD_RDLEN(header, p, plen, rdlen))
2208 return plen;
2209
2210 rrs[rr_found++] = p;
2211
2212 if (i < ntohs(header->ancount))
2213 chop_an++;
2214 else
2215 chop_ns++;
2216 }
2217 else if (!ADD_RDLEN(header, p, plen, rdlen))
2218 return plen;
2219 }
2220
2221 /* Nothing to do. */
2222 if (rr_found == 0)
2223 return plen;
2224
2225 /* Second pass, look for pointers in names in the records we're keeping and make sure they don't
2226 point to records we're going to elide. This is theoretically possible, but unlikely. If
2227 it happens, we give up and leave the answer unchanged. */
2228 p = (unsigned char *)(header+1);
2229
2230 /* question first */
2231 if (!check_name(&p, header, plen, 0, rrs, rr_found))
2232 return plen;
2233 p += 4; /* qclass, qtype */
2234
2235 /* Now answers and NS */
2236 if (!check_rrs(p, header, plen, 0, rrs, rr_found))
2237 return plen;
2238
2239 /* Third pass, elide records */
2240 for (p = rrs[0], i = 1; i < rr_found; i += 2)
2241 {
2242 unsigned char *start = rrs[i];
2243 unsigned char *end = (i != rr_found - 1) ? rrs[i+1] : ((unsigned char *)(header+1)) + plen;
2244
2245 memmove(p, start, end-start);
2246 p += end-start;
2247 }
2248
2249 plen = p - (unsigned char *)header;
2250 header->ancount = htons(ntohs(header->ancount) - chop_an);
2251 header->nscount = htons(ntohs(header->nscount) - chop_ns);
2252
2253 /* Fourth pass, fix up pointers in the remaining records */
2254 p = (unsigned char *)(header+1);
2255
2256 check_name(&p, header, plen, 1, rrs, rr_found);
2257 p += 4; /* qclass, qtype */
2258
2259 check_rrs(p, header, plen, 1, rrs, rr_found);
2260
2261 return plen;
2262}
2263
8a9be9e4
SK
2264unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name)
2265{
2266 int q;
2267 unsigned int len;
2268 unsigned char *p = (unsigned char *)(header+1);
2269 const struct nettle_hash *hash;
2270 void *ctx;
2271 unsigned char *digest;
5f8e58f4 2272
8a9be9e4
SK
2273 if (!(hash = hash_find("sha1")) || !hash_init(hash, &ctx, &digest))
2274 return NULL;
2275
2276 for (q = ntohs(header->qdcount); q != 0; q--)
2277 {
2278 if (!extract_name(header, plen, &p, name, 1, 4))
7d23a66f 2279 break; /* bad packet */
8a9be9e4
SK
2280
2281 len = to_wire(name);
2282 hash->update(ctx, len, (unsigned char *)name);
2283 /* CRC the class and type as well */
2284 hash->update(ctx, 4, p);
2285
2286 p += 4;
2287 if (!CHECK_LEN(header, p, plen, 0))
7d23a66f 2288 break; /* bad packet */
8a9be9e4 2289 }
703c7ff4
SK
2290
2291 hash->digest(ctx, hash->digest_size, digest);
8a9be9e4
SK
2292 return digest;
2293}
2294
0fc2f313 2295#endif /* HAVE_DNSSEC */