Annotation of embedaddon/curl/tests/unit/unit1650.c, revision 1.1.1.1

1.1       misho       1: /***************************************************************************
                      2:  *                                  _   _ ____  _
                      3:  *  Project                     ___| | | |  _ \| |
                      4:  *                             / __| | | | |_) | |
                      5:  *                            | (__| |_| |  _ <| |___
                      6:  *                             \___|\___/|_| \_\_____|
                      7:  *
                      8:  * Copyright (C) 2018 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9:  *
                     10:  * This software is licensed as described in the file COPYING, which
                     11:  * you should have received as part of this distribution. The terms
                     12:  * are also available at https://curl.haxx.se/docs/copyright.html.
                     13:  *
                     14:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15:  * copies of the Software, and permit persons to whom the Software is
                     16:  * furnished to do so, under the terms of the COPYING file.
                     17:  *
                     18:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19:  * KIND, either express or implied.
                     20:  *
                     21:  ***************************************************************************/
                     22: #include "curlcheck.h"
                     23: 
                     24: #include "doh.h"
                     25: 
                     26: static CURLcode unit_setup(void)
                     27: {
                     28:   return CURLE_OK;
                     29: }
                     30: 
                     31: static void unit_stop(void)
                     32: {
                     33: 
                     34: }
                     35: 
                     36: #ifndef CURL_DISABLE_DOH
                     37: #define DNS_PREAMBLE "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00"
                     38: #define LABEL_TEST "\x04\x74\x65\x73\x74"
                     39: #define LABEL_HOST "\x04\x68\x6f\x73\x74"
                     40: #define LABEL_NAME "\x04\x6e\x61\x6d\x65"
                     41: #define DNSA_TYPE "\x01"
                     42: #define DNSAAAA_TYPE "\x1c"
                     43: #define DNSA_EPILOGUE "\x00\x00" DNSA_TYPE "\x00\x01"
                     44: #define DNSAAAA_EPILOGUE "\x00\x00" DNSAAAA_TYPE "\x00\x01"
                     45: 
                     46: #define DNS_Q1 DNS_PREAMBLE LABEL_TEST LABEL_HOST LABEL_NAME DNSA_EPILOGUE
                     47: #define DNS_Q2 DNS_PREAMBLE LABEL_TEST LABEL_HOST LABEL_NAME DNSAAAA_EPILOGUE
                     48: 
                     49: struct dohrequest {
                     50:   /* input */
                     51:   const char *name;
                     52:   DNStype type;
                     53: 
                     54:   /* output */
                     55:   const char *packet;
                     56:   size_t size;
                     57:   int rc;
                     58: };
                     59: 
                     60: 
                     61: static struct dohrequest req[] = {
                     62:   {"test.host.name", DNS_TYPE_A, DNS_Q1, sizeof(DNS_Q1)-1, 0 },
                     63:   {"test.host.name", DNS_TYPE_AAAA, DNS_Q2, sizeof(DNS_Q2)-1, 0 },
                     64:   {"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
                     65:    ".host.name",
                     66:    DNS_TYPE_AAAA, NULL, 0, DOH_DNS_BAD_LABEL }
                     67: };
                     68: 
                     69: struct dohresp {
                     70:   /* input */
                     71:   const char *packet;
                     72:   size_t size;
                     73:   DNStype type;
                     74: 
                     75:   /* output */
                     76:   int rc;
                     77:   const char *out;
                     78: };
                     79: 
                     80: #define DNS_FOO_EXAMPLE_COM                                          \
                     81:   "\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x03\x66\x6f\x6f" \
                     82:   "\x07\x65\x78\x61\x6d\x70\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00" \
                     83:   "\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\x37\x00\x04\x7f\x00\x00" \
                     84:   "\x01"
                     85: 
                     86: static const char full49[] = DNS_FOO_EXAMPLE_COM;
                     87: 
                     88: static struct dohresp resp[] = {
                     89:   {"\x00\x00", 2, DNS_TYPE_A, DOH_TOO_SMALL_BUFFER, NULL },
                     90:   {"\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01", 12,
                     91:    DNS_TYPE_A, DOH_DNS_BAD_ID, NULL },
                     92:   {"\x00\x00\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01", 12,
                     93:    DNS_TYPE_A, DOH_DNS_BAD_RCODE, NULL },
                     94:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x03\x66\x6f\x6f", 16,
                     95:    DNS_TYPE_A, DOH_DNS_OUT_OF_RANGE, NULL },
                     96:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x03\x66\x6f\x6f\x00", 17,
                     97:    DNS_TYPE_A, DOH_DNS_OUT_OF_RANGE, NULL },
                     98:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x03\x66\x6f\x6f\x00"
                     99:    "\x00\x01\x00\x01", 21,
                    100:    DNS_TYPE_A, DOH_DNS_OUT_OF_RANGE, NULL },
                    101:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x03\x66\x6f\x6f\x00"
                    102:    "\x00\x01\x00\x01"
                    103:    "\x04", 18,
                    104:    DNS_TYPE_A, DOH_DNS_OUT_OF_RANGE, NULL },
                    105: 
                    106:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x04\x63\x75\x72"
                    107:    "\x6c\x04\x63\x75\x72\x6c\x00\x00\x05\x00\x01\xc0\x0c\x00\x05\x00"
                    108:    "\x01\x00\x00\x00\x37\x00\x11\x08\x61\x6e\x79\x77\x68\x65\x72\x65"
                    109:    "\x06\x72\x65\x61\x6c\x6c\x79\x00", 56,
                    110:    DNS_TYPE_A, DOH_OK, "anywhere.really "},
                    111: 
                    112:   {DNS_FOO_EXAMPLE_COM, 49, DNS_TYPE_A, DOH_OK, "127.0.0.1 "},
                    113: 
                    114:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x04\x61\x61\x61"
                    115:    "\x61\x07\x65\x78\x61\x6d\x70\x6c\x65\x03\x63\x6f\x6d\x00\x00\x1c"
                    116:    "\x00\x01\xc0\x0c\x00\x1c\x00\x01\x00\x00\x00\x37\x00\x10\x20\x20"
                    117:    "\x20\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20", 62,
                    118:    DNS_TYPE_AAAA, DOH_OK,
                    119:    "2020:2020:0000:0000:0000:0000:0000:2020 " },
                    120: 
                    121:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x00\x04\x63\x75\x72"
                    122:    "\x6c\x04\x63\x75\x72\x6c\x00\x00\x05\x00\x01\xc0\x0c\x00\x05\x00"
                    123:    "\x01\x00\x00\x00\x37\x00"
                    124:    "\x07\x03\x61\x6e\x79\xc0\x27\x00", 46,
                    125:    DNS_TYPE_A, DOH_DNS_LABEL_LOOP, NULL},
                    126: 
                    127:   /* packet with NSCOUNT == 1 */
                    128:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x01\x00\x00\x04\x61\x61\x61"
                    129:    "\x61\x07\x65\x78\x61\x6d\x70\x6c\x65\x03\x63\x6f\x6d\x00\x00\x1c"
                    130:    "\x00\x01\xc0\x0c\x00\x1c\x00\x01\x00\x00\x00\x37\x00\x10\x20\x20"
                    131:    "\x20\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20"
                    132:    LABEL_TEST LABEL_HOST LABEL_NAME DNSAAAA_EPILOGUE "\x00\x00\x00\x01"
                    133:    "\00\x04\x01\x01\x01\x01", /* RDDATA */
                    134: 
                    135:    62 + 30,
                    136:    DNS_TYPE_AAAA, DOH_OK,
                    137:    "2020:2020:0000:0000:0000:0000:0000:2020 " },
                    138: 
                    139:   /* packet with ARCOUNT == 1 */
                    140:   {"\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x01\x04\x61\x61\x61"
                    141:    "\x61\x07\x65\x78\x61\x6d\x70\x6c\x65\x03\x63\x6f\x6d\x00\x00\x1c"
                    142:    "\x00\x01\xc0\x0c\x00\x1c\x00\x01\x00\x00\x00\x37\x00\x10\x20\x20"
                    143:    "\x20\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x20"
                    144:    LABEL_TEST LABEL_HOST LABEL_NAME DNSAAAA_EPILOGUE "\x00\x00\x00\x01"
                    145:    "\00\x04\x01\x01\x01\x01", /* RDDATA */
                    146: 
                    147:    62 + 30,
                    148:    DNS_TYPE_AAAA, DOH_OK,
                    149:    "2020:2020:0000:0000:0000:0000:0000:2020 " },
                    150: 
                    151: };
                    152: 
                    153: UNITTEST_START
                    154: {
                    155:   size_t size = 0;
                    156:   unsigned char buffer[256];
                    157:   size_t i;
                    158:   unsigned char *p;
                    159:   for(i = 0; i < sizeof(req) / sizeof(req[0]); i++) {
                    160:     int rc = doh_encode(req[i].name, req[i].type,
                    161:                         buffer, sizeof(buffer), &size);
                    162:     if(rc != req[i].rc) {
                    163:       fprintf(stderr, "req %zu: Expected return code %d got %d\n", i,
                    164:               req[i].rc, rc);
                    165:       return 1;
                    166:     }
                    167:     else if(size != req[i].size) {
                    168:       fprintf(stderr, "req %zu: Expected size %zu got %zu\n", i,
                    169:               req[i].size, size);
                    170:       fprintf(stderr, "DNS encode made: %s\n", hexdump(buffer, size));
                    171:       return 2;
                    172:     }
                    173:     else if(req[i].packet && memcmp(req[i].packet, buffer, size)) {
                    174:       fprintf(stderr, "DNS encode made: %s\n", hexdump(buffer, size));
                    175:       fprintf(stderr, "... instead of: %s\n",
                    176:              hexdump((unsigned char *)req[i].packet, size));
                    177:       return 3;
                    178:     }
                    179:   }
                    180: 
                    181:   for(i = 0; i < sizeof(resp) / sizeof(resp[0]); i++) {
                    182:     struct dohentry d;
                    183:     int rc;
                    184:     char *ptr;
                    185:     size_t len;
                    186:     int u;
                    187:     memset(&d, 0, sizeof(d));
                    188:     rc = doh_decode((const unsigned char *)resp[i].packet, resp[i].size,
                    189:                     resp[i].type, &d);
                    190:     if(rc != resp[i].rc) {
                    191:       fprintf(stderr, "resp %zu: Expected return code %d got %d\n", i,
                    192:               resp[i].rc, rc);
                    193:       return 4;
                    194:     }
                    195:     len = sizeof(buffer);
                    196:     ptr = (char *)buffer;
                    197:     for(u = 0; u < d.numaddr; u++) {
                    198:       size_t o;
                    199:       struct dohaddr *a;
                    200:       a = &d.addr[u];
                    201:       if(resp[i].type == DNS_TYPE_A) {
                    202:         p = &a->ip.v4[0];
                    203:         msnprintf(ptr, len, "%u.%u.%u.%u ", p[0], p[1], p[2], p[3]);
                    204:         o = strlen(ptr);
                    205:         len -= o;
                    206:         ptr += o;
                    207:       }
                    208:       else {
                    209:         int j;
                    210:         for(j = 0; j < 16; j += 2) {
                    211:           size_t l;
                    212:           msnprintf(ptr, len, "%s%02x%02x", j?":":"", a->ip.v6[j],
                    213:                    a->ip.v6[j + 1]);
                    214:           l = strlen(ptr);
                    215:           len -= l;
                    216:           ptr += l;
                    217:         }
                    218:         msnprintf(ptr, len, " ");
                    219:         len--;
                    220:         ptr++;
                    221:       }
                    222:     }
                    223:     for(u = 0; u < d.numcname; u++) {
                    224:       size_t o;
                    225:       msnprintf(ptr, len, "%s ", d.cname[u].alloc);
                    226:       o = strlen(ptr);
                    227:       len -= o;
                    228:       ptr += o;
                    229:     }
                    230:     de_cleanup(&d);
                    231:     if(resp[i].out && strcmp((char *)buffer, resp[i].out)) {
                    232:       fprintf(stderr, "resp %zu: Expected %s got %s\n", i,
                    233:               resp[i].out, buffer);
                    234:       return 1;
                    235:     }
                    236:   }
                    237: 
                    238:   {
                    239:     /* pass all sizes into the decoder until full */
                    240:     for(i = 0; i < sizeof(full49)-1; i++) {
                    241:       struct dohentry d;
                    242:       int rc;
                    243:       memset(&d, 0, sizeof(d));
                    244:       rc = doh_decode((const unsigned char *)full49, i, DNS_TYPE_A, &d);
                    245:       if(!rc) {
                    246:         /* none of them should work */
                    247:         fprintf(stderr, "%zu: %d\n", i, rc);
                    248:         return 5;
                    249:       }
                    250:     }
                    251:     /* and try all pieces from the other end of the packet */
                    252:     for(i = 1; i < sizeof(full49); i++) {
                    253:       struct dohentry d;
                    254:       int rc;
                    255:       memset(&d, 0, sizeof(d));
                    256:       rc = doh_decode((const unsigned char *)&full49[i], sizeof(full49)-i-1,
                    257:                       DNS_TYPE_A, &d);
                    258:       if(!rc) {
                    259:         /* none of them should work */
                    260:         fprintf(stderr, "2 %zu: %d\n", i, rc);
                    261:         return 7;
                    262:       }
                    263:     }
                    264:     {
                    265:       int rc;
                    266:       struct dohentry d;
                    267:       struct dohaddr *a;
                    268:       memset(&d, 0, sizeof(d));
                    269:       rc = doh_decode((const unsigned char *)full49, sizeof(full49)-1,
                    270:                       DNS_TYPE_A, &d);
                    271:       fail_if(d.numaddr != 1, "missing address");
                    272:       a = &d.addr[0];
                    273:       p = &a->ip.v4[0];
                    274:       msnprintf((char *)buffer, sizeof(buffer),
                    275:                 "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
                    276:       if(rc || strcmp((char *)buffer, "127.0.0.1")) {
                    277:         fprintf(stderr, "bad address decoded: %s, rc == %d\n", buffer, rc);
                    278:         return 7;
                    279:       }
                    280:       fail_if(d.numcname, "bad cname counter");
                    281:     }
                    282:   }
                    283: }
                    284: UNITTEST_STOP
                    285: 
                    286: #else /* CURL_DISABLE_DOH */
                    287: UNITTEST_START
                    288: {
                    289:   return 1; /* nothing to do, just fail */
                    290: }
                    291: UNITTEST_STOP
                    292: 
                    293: 
                    294: #endif

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