Annotation of embedaddon/curl/tests/unit/unit1650.c, revision 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>