Annotation of embedaddon/dnsmasq/src/dnssec.c, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>