17c478bd9Sstevel@tonic-gate /* 2*9525b14bSRao Shoaib * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 37c478bd9Sstevel@tonic-gate * Copyright (c) 1996-1999 by Internet Software Consortium. 47c478bd9Sstevel@tonic-gate * 57c478bd9Sstevel@tonic-gate * Permission to use, copy, modify, and distribute this software for any 67c478bd9Sstevel@tonic-gate * purpose with or without fee is hereby granted, provided that the above 77c478bd9Sstevel@tonic-gate * copyright notice and this permission notice appear in all copies. 87c478bd9Sstevel@tonic-gate * 9*9525b14bSRao Shoaib * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 10*9525b14bSRao Shoaib * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*9525b14bSRao Shoaib * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 12*9525b14bSRao Shoaib * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*9525b14bSRao Shoaib * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*9525b14bSRao Shoaib * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 15*9525b14bSRao Shoaib * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 167c478bd9Sstevel@tonic-gate */ 177c478bd9Sstevel@tonic-gate 187c478bd9Sstevel@tonic-gate #ifndef lint 19*9525b14bSRao Shoaib static const char rcsid[] = "$Id: ns_print.c,v 1.12 2009/03/03 05:29:58 each Exp $"; 207c478bd9Sstevel@tonic-gate #endif 217c478bd9Sstevel@tonic-gate 227c478bd9Sstevel@tonic-gate /* Import. */ 237c478bd9Sstevel@tonic-gate 247c478bd9Sstevel@tonic-gate #include "port_before.h" 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #include <sys/types.h> 277c478bd9Sstevel@tonic-gate #include <sys/socket.h> 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate #include <netinet/in.h> 307c478bd9Sstevel@tonic-gate #include <arpa/nameser.h> 317c478bd9Sstevel@tonic-gate #include <arpa/inet.h> 327c478bd9Sstevel@tonic-gate 337c478bd9Sstevel@tonic-gate #include <isc/assertions.h> 347c478bd9Sstevel@tonic-gate #include <isc/dst.h> 357c478bd9Sstevel@tonic-gate #include <errno.h> 367c478bd9Sstevel@tonic-gate #include <resolv.h> 377c478bd9Sstevel@tonic-gate #include <string.h> 387c478bd9Sstevel@tonic-gate #include <ctype.h> 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #include "port_after.h" 417c478bd9Sstevel@tonic-gate 427c478bd9Sstevel@tonic-gate #ifdef SPRINTF_CHAR 437c478bd9Sstevel@tonic-gate # define SPRINTF(x) strlen(sprintf/**/x) 447c478bd9Sstevel@tonic-gate #else 457c478bd9Sstevel@tonic-gate # define SPRINTF(x) ((size_t)sprintf x) 467c478bd9Sstevel@tonic-gate #endif 477c478bd9Sstevel@tonic-gate 487c478bd9Sstevel@tonic-gate /* Forward. */ 497c478bd9Sstevel@tonic-gate 507c478bd9Sstevel@tonic-gate static size_t prune_origin(const char *name, const char *origin); 517c478bd9Sstevel@tonic-gate static int charstr(const u_char *rdata, const u_char *edata, 527c478bd9Sstevel@tonic-gate char **buf, size_t *buflen); 537c478bd9Sstevel@tonic-gate static int addname(const u_char *msg, size_t msglen, 547c478bd9Sstevel@tonic-gate const u_char **p, const char *origin, 557c478bd9Sstevel@tonic-gate char **buf, size_t *buflen); 567c478bd9Sstevel@tonic-gate static void addlen(size_t len, char **buf, size_t *buflen); 577c478bd9Sstevel@tonic-gate static int addstr(const char *src, size_t len, 587c478bd9Sstevel@tonic-gate char **buf, size_t *buflen); 597c478bd9Sstevel@tonic-gate static int addtab(size_t len, size_t target, int spaced, 607c478bd9Sstevel@tonic-gate char **buf, size_t *buflen); 617c478bd9Sstevel@tonic-gate 627c478bd9Sstevel@tonic-gate /* Macros. */ 637c478bd9Sstevel@tonic-gate 647c478bd9Sstevel@tonic-gate #define T(x) \ 657c478bd9Sstevel@tonic-gate do { \ 667c478bd9Sstevel@tonic-gate if ((x) < 0) \ 677c478bd9Sstevel@tonic-gate return (-1); \ 687c478bd9Sstevel@tonic-gate } while (0) 697c478bd9Sstevel@tonic-gate 70*9525b14bSRao Shoaib static const char base32hex[] = 71*9525b14bSRao Shoaib "0123456789ABCDEFGHIJKLMNOPQRSTUV=0123456789abcdefghijklmnopqrstuv"; 72*9525b14bSRao Shoaib 737c478bd9Sstevel@tonic-gate /* Public. */ 747c478bd9Sstevel@tonic-gate 75*9525b14bSRao Shoaib /*% 767c478bd9Sstevel@tonic-gate * Convert an RR to presentation format. 77*9525b14bSRao Shoaib * 787c478bd9Sstevel@tonic-gate * return: 79*9525b14bSRao Shoaib *\li Number of characters written to buf, or -1 (check errno). 807c478bd9Sstevel@tonic-gate */ 817c478bd9Sstevel@tonic-gate int 827c478bd9Sstevel@tonic-gate ns_sprintrr(const ns_msg *handle, const ns_rr *rr, 837c478bd9Sstevel@tonic-gate const char *name_ctx, const char *origin, 847c478bd9Sstevel@tonic-gate char *buf, size_t buflen) 857c478bd9Sstevel@tonic-gate { 867c478bd9Sstevel@tonic-gate int n; 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle), 897c478bd9Sstevel@tonic-gate ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr), 907c478bd9Sstevel@tonic-gate ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr), 917c478bd9Sstevel@tonic-gate name_ctx, origin, buf, buflen); 927c478bd9Sstevel@tonic-gate return (n); 937c478bd9Sstevel@tonic-gate } 947c478bd9Sstevel@tonic-gate 95*9525b14bSRao Shoaib /*% 967c478bd9Sstevel@tonic-gate * Convert the fields of an RR into presentation format. 97*9525b14bSRao Shoaib * 987c478bd9Sstevel@tonic-gate * return: 99*9525b14bSRao Shoaib *\li Number of characters written to buf, or -1 (check errno). 1007c478bd9Sstevel@tonic-gate */ 1017c478bd9Sstevel@tonic-gate int 1027c478bd9Sstevel@tonic-gate ns_sprintrrf(const u_char *msg, size_t msglen, 1037c478bd9Sstevel@tonic-gate const char *name, ns_class class, ns_type type, 1047c478bd9Sstevel@tonic-gate u_long ttl, const u_char *rdata, size_t rdlen, 1057c478bd9Sstevel@tonic-gate const char *name_ctx, const char *origin, 1067c478bd9Sstevel@tonic-gate char *buf, size_t buflen) 1077c478bd9Sstevel@tonic-gate { 1087c478bd9Sstevel@tonic-gate const char *obuf = buf; 1097c478bd9Sstevel@tonic-gate const u_char *edata = rdata + rdlen; 1107c478bd9Sstevel@tonic-gate int spaced = 0; 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate const char *comment; 1137c478bd9Sstevel@tonic-gate char tmp[100]; 1147c478bd9Sstevel@tonic-gate int len, x; 1157c478bd9Sstevel@tonic-gate 1167c478bd9Sstevel@tonic-gate /* 1177c478bd9Sstevel@tonic-gate * Owner. 1187c478bd9Sstevel@tonic-gate */ 1197c478bd9Sstevel@tonic-gate if (name_ctx != NULL && ns_samename(name_ctx, name) == 1) { 1207c478bd9Sstevel@tonic-gate T(addstr("\t\t\t", 3, &buf, &buflen)); 1217c478bd9Sstevel@tonic-gate } else { 1227c478bd9Sstevel@tonic-gate len = prune_origin(name, origin); 1237c478bd9Sstevel@tonic-gate if (*name == '\0') { 1247c478bd9Sstevel@tonic-gate goto root; 1257c478bd9Sstevel@tonic-gate } else if (len == 0) { 1267c478bd9Sstevel@tonic-gate T(addstr("@\t\t\t", 4, &buf, &buflen)); 1277c478bd9Sstevel@tonic-gate } else { 1287c478bd9Sstevel@tonic-gate T(addstr(name, len, &buf, &buflen)); 1297c478bd9Sstevel@tonic-gate /* Origin not used or not root, and no trailing dot? */ 1307c478bd9Sstevel@tonic-gate if (((origin == NULL || origin[0] == '\0') || 1317c478bd9Sstevel@tonic-gate (origin[0] != '.' && origin[1] != '\0' && 1327c478bd9Sstevel@tonic-gate name[len] == '\0')) && name[len - 1] != '.') { 1337c478bd9Sstevel@tonic-gate root: 1347c478bd9Sstevel@tonic-gate T(addstr(".", 1, &buf, &buflen)); 1357c478bd9Sstevel@tonic-gate len++; 1367c478bd9Sstevel@tonic-gate } 1377c478bd9Sstevel@tonic-gate T(spaced = addtab(len, 24, spaced, &buf, &buflen)); 1387c478bd9Sstevel@tonic-gate } 1397c478bd9Sstevel@tonic-gate } 1407c478bd9Sstevel@tonic-gate 1417c478bd9Sstevel@tonic-gate /* 1427c478bd9Sstevel@tonic-gate * TTL, Class, Type. 1437c478bd9Sstevel@tonic-gate */ 1447c478bd9Sstevel@tonic-gate T(x = ns_format_ttl(ttl, buf, buflen)); 1457c478bd9Sstevel@tonic-gate addlen(x, &buf, &buflen); 1467c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type))); 1477c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 1487c478bd9Sstevel@tonic-gate T(spaced = addtab(x + len, 16, spaced, &buf, &buflen)); 1497c478bd9Sstevel@tonic-gate 1507c478bd9Sstevel@tonic-gate /* 1517c478bd9Sstevel@tonic-gate * RData. 1527c478bd9Sstevel@tonic-gate */ 1537c478bd9Sstevel@tonic-gate switch (type) { 1547c478bd9Sstevel@tonic-gate case ns_t_a: 155*9525b14bSRao Shoaib if (rdlen != (size_t)NS_INADDRSZ) 1567c478bd9Sstevel@tonic-gate goto formerr; 1577c478bd9Sstevel@tonic-gate (void) inet_ntop(AF_INET, rdata, buf, buflen); 1587c478bd9Sstevel@tonic-gate addlen(strlen(buf), &buf, &buflen); 1597c478bd9Sstevel@tonic-gate break; 1607c478bd9Sstevel@tonic-gate 1617c478bd9Sstevel@tonic-gate case ns_t_cname: 1627c478bd9Sstevel@tonic-gate case ns_t_mb: 1637c478bd9Sstevel@tonic-gate case ns_t_mg: 1647c478bd9Sstevel@tonic-gate case ns_t_mr: 1657c478bd9Sstevel@tonic-gate case ns_t_ns: 1667c478bd9Sstevel@tonic-gate case ns_t_ptr: 1677c478bd9Sstevel@tonic-gate case ns_t_dname: 1687c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 1697c478bd9Sstevel@tonic-gate break; 1707c478bd9Sstevel@tonic-gate 1717c478bd9Sstevel@tonic-gate case ns_t_hinfo: 1727c478bd9Sstevel@tonic-gate case ns_t_isdn: 1737c478bd9Sstevel@tonic-gate /* First word. */ 1747c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 1757c478bd9Sstevel@tonic-gate if (len == 0) 1767c478bd9Sstevel@tonic-gate goto formerr; 1777c478bd9Sstevel@tonic-gate rdata += len; 1787c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 1797c478bd9Sstevel@tonic-gate 1807c478bd9Sstevel@tonic-gate 1817c478bd9Sstevel@tonic-gate /* Second word, optional in ISDN records. */ 1827c478bd9Sstevel@tonic-gate if (type == ns_t_isdn && rdata == edata) 1837c478bd9Sstevel@tonic-gate break; 1847c478bd9Sstevel@tonic-gate 1857c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 1867c478bd9Sstevel@tonic-gate if (len == 0) 1877c478bd9Sstevel@tonic-gate goto formerr; 1887c478bd9Sstevel@tonic-gate rdata += len; 1897c478bd9Sstevel@tonic-gate break; 1907c478bd9Sstevel@tonic-gate 1917c478bd9Sstevel@tonic-gate case ns_t_soa: { 1927c478bd9Sstevel@tonic-gate u_long t; 1937c478bd9Sstevel@tonic-gate 1947c478bd9Sstevel@tonic-gate /* Server name. */ 1957c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 1967c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 1977c478bd9Sstevel@tonic-gate 1987c478bd9Sstevel@tonic-gate /* Administrator name. */ 1997c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 2007c478bd9Sstevel@tonic-gate T(addstr(" (\n", 3, &buf, &buflen)); 2017c478bd9Sstevel@tonic-gate spaced = 0; 2027c478bd9Sstevel@tonic-gate 2037c478bd9Sstevel@tonic-gate if ((edata - rdata) != 5*NS_INT32SZ) 2047c478bd9Sstevel@tonic-gate goto formerr; 2057c478bd9Sstevel@tonic-gate 2067c478bd9Sstevel@tonic-gate /* Serial number. */ 2077c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 2087c478bd9Sstevel@tonic-gate T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); 2097c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%lu", t)); 2107c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 2117c478bd9Sstevel@tonic-gate T(spaced = addtab(len, 16, spaced, &buf, &buflen)); 2127c478bd9Sstevel@tonic-gate T(addstr("; serial\n", 9, &buf, &buflen)); 2137c478bd9Sstevel@tonic-gate spaced = 0; 2147c478bd9Sstevel@tonic-gate 2157c478bd9Sstevel@tonic-gate /* Refresh interval. */ 2167c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 2177c478bd9Sstevel@tonic-gate T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); 2187c478bd9Sstevel@tonic-gate T(len = ns_format_ttl(t, buf, buflen)); 2197c478bd9Sstevel@tonic-gate addlen(len, &buf, &buflen); 2207c478bd9Sstevel@tonic-gate T(spaced = addtab(len, 16, spaced, &buf, &buflen)); 2217c478bd9Sstevel@tonic-gate T(addstr("; refresh\n", 10, &buf, &buflen)); 2227c478bd9Sstevel@tonic-gate spaced = 0; 2237c478bd9Sstevel@tonic-gate 2247c478bd9Sstevel@tonic-gate /* Retry interval. */ 2257c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 2267c478bd9Sstevel@tonic-gate T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); 2277c478bd9Sstevel@tonic-gate T(len = ns_format_ttl(t, buf, buflen)); 2287c478bd9Sstevel@tonic-gate addlen(len, &buf, &buflen); 2297c478bd9Sstevel@tonic-gate T(spaced = addtab(len, 16, spaced, &buf, &buflen)); 2307c478bd9Sstevel@tonic-gate T(addstr("; retry\n", 8, &buf, &buflen)); 2317c478bd9Sstevel@tonic-gate spaced = 0; 2327c478bd9Sstevel@tonic-gate 2337c478bd9Sstevel@tonic-gate /* Expiry. */ 2347c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 2357c478bd9Sstevel@tonic-gate T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); 2367c478bd9Sstevel@tonic-gate T(len = ns_format_ttl(t, buf, buflen)); 2377c478bd9Sstevel@tonic-gate addlen(len, &buf, &buflen); 2387c478bd9Sstevel@tonic-gate T(spaced = addtab(len, 16, spaced, &buf, &buflen)); 2397c478bd9Sstevel@tonic-gate T(addstr("; expiry\n", 9, &buf, &buflen)); 2407c478bd9Sstevel@tonic-gate spaced = 0; 2417c478bd9Sstevel@tonic-gate 2427c478bd9Sstevel@tonic-gate /* Minimum TTL. */ 2437c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 2447c478bd9Sstevel@tonic-gate T(addstr("\t\t\t\t\t", 5, &buf, &buflen)); 2457c478bd9Sstevel@tonic-gate T(len = ns_format_ttl(t, buf, buflen)); 2467c478bd9Sstevel@tonic-gate addlen(len, &buf, &buflen); 2477c478bd9Sstevel@tonic-gate T(addstr(" )", 2, &buf, &buflen)); 2487c478bd9Sstevel@tonic-gate T(spaced = addtab(len, 16, spaced, &buf, &buflen)); 2497c478bd9Sstevel@tonic-gate T(addstr("; minimum\n", 10, &buf, &buflen)); 2507c478bd9Sstevel@tonic-gate 2517c478bd9Sstevel@tonic-gate break; 2527c478bd9Sstevel@tonic-gate } 2537c478bd9Sstevel@tonic-gate 2547c478bd9Sstevel@tonic-gate case ns_t_mx: 2557c478bd9Sstevel@tonic-gate case ns_t_afsdb: 256*9525b14bSRao Shoaib case ns_t_rt: 257*9525b14bSRao Shoaib case ns_t_kx: { 2587c478bd9Sstevel@tonic-gate u_int t; 2597c478bd9Sstevel@tonic-gate 260*9525b14bSRao Shoaib if (rdlen < (size_t)NS_INT16SZ) 2617c478bd9Sstevel@tonic-gate goto formerr; 2627c478bd9Sstevel@tonic-gate 2637c478bd9Sstevel@tonic-gate /* Priority. */ 2647c478bd9Sstevel@tonic-gate t = ns_get16(rdata); 2657c478bd9Sstevel@tonic-gate rdata += NS_INT16SZ; 2667c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%u ", t)); 2677c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 2687c478bd9Sstevel@tonic-gate 2697c478bd9Sstevel@tonic-gate /* Target. */ 2707c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 2717c478bd9Sstevel@tonic-gate 2727c478bd9Sstevel@tonic-gate break; 2737c478bd9Sstevel@tonic-gate } 2747c478bd9Sstevel@tonic-gate 2757c478bd9Sstevel@tonic-gate case ns_t_px: { 2767c478bd9Sstevel@tonic-gate u_int t; 2777c478bd9Sstevel@tonic-gate 278*9525b14bSRao Shoaib if (rdlen < (size_t)NS_INT16SZ) 2797c478bd9Sstevel@tonic-gate goto formerr; 2807c478bd9Sstevel@tonic-gate 2817c478bd9Sstevel@tonic-gate /* Priority. */ 2827c478bd9Sstevel@tonic-gate t = ns_get16(rdata); 2837c478bd9Sstevel@tonic-gate rdata += NS_INT16SZ; 2847c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%u ", t)); 2857c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate /* Name1. */ 2887c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 2897c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 2907c478bd9Sstevel@tonic-gate 2917c478bd9Sstevel@tonic-gate /* Name2. */ 2927c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 2937c478bd9Sstevel@tonic-gate 2947c478bd9Sstevel@tonic-gate break; 2957c478bd9Sstevel@tonic-gate } 2967c478bd9Sstevel@tonic-gate 2977c478bd9Sstevel@tonic-gate case ns_t_x25: 2987c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 2997c478bd9Sstevel@tonic-gate if (len == 0) 3007c478bd9Sstevel@tonic-gate goto formerr; 3017c478bd9Sstevel@tonic-gate rdata += len; 3027c478bd9Sstevel@tonic-gate break; 3037c478bd9Sstevel@tonic-gate 3047c478bd9Sstevel@tonic-gate case ns_t_txt: 305*9525b14bSRao Shoaib case ns_t_spf: 3067c478bd9Sstevel@tonic-gate while (rdata < edata) { 3077c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 3087c478bd9Sstevel@tonic-gate if (len == 0) 3097c478bd9Sstevel@tonic-gate goto formerr; 3107c478bd9Sstevel@tonic-gate rdata += len; 3117c478bd9Sstevel@tonic-gate if (rdata < edata) 3127c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 3137c478bd9Sstevel@tonic-gate } 3147c478bd9Sstevel@tonic-gate break; 3157c478bd9Sstevel@tonic-gate 3167c478bd9Sstevel@tonic-gate case ns_t_nsap: { 3177c478bd9Sstevel@tonic-gate char t[2+255*3]; 3187c478bd9Sstevel@tonic-gate 3197c478bd9Sstevel@tonic-gate (void) inet_nsap_ntoa(rdlen, rdata, t); 3207c478bd9Sstevel@tonic-gate T(addstr(t, strlen(t), &buf, &buflen)); 3217c478bd9Sstevel@tonic-gate break; 3227c478bd9Sstevel@tonic-gate } 3237c478bd9Sstevel@tonic-gate 3247c478bd9Sstevel@tonic-gate case ns_t_aaaa: 325*9525b14bSRao Shoaib if (rdlen != (size_t)NS_IN6ADDRSZ) 3267c478bd9Sstevel@tonic-gate goto formerr; 3277c478bd9Sstevel@tonic-gate (void) inet_ntop(AF_INET6, rdata, buf, buflen); 3287c478bd9Sstevel@tonic-gate addlen(strlen(buf), &buf, &buflen); 3297c478bd9Sstevel@tonic-gate break; 3307c478bd9Sstevel@tonic-gate 3317c478bd9Sstevel@tonic-gate case ns_t_loc: { 3327c478bd9Sstevel@tonic-gate char t[255]; 3337c478bd9Sstevel@tonic-gate 3347c478bd9Sstevel@tonic-gate /* XXX protocol format checking? */ 3357c478bd9Sstevel@tonic-gate (void) loc_ntoa(rdata, t); 3367c478bd9Sstevel@tonic-gate T(addstr(t, strlen(t), &buf, &buflen)); 3377c478bd9Sstevel@tonic-gate break; 3387c478bd9Sstevel@tonic-gate } 3397c478bd9Sstevel@tonic-gate 3407c478bd9Sstevel@tonic-gate case ns_t_naptr: { 3417c478bd9Sstevel@tonic-gate u_int order, preference; 3427c478bd9Sstevel@tonic-gate char t[50]; 3437c478bd9Sstevel@tonic-gate 344*9525b14bSRao Shoaib if (rdlen < 2U*NS_INT16SZ) 3457c478bd9Sstevel@tonic-gate goto formerr; 3467c478bd9Sstevel@tonic-gate 3477c478bd9Sstevel@tonic-gate /* Order, Precedence. */ 3487c478bd9Sstevel@tonic-gate order = ns_get16(rdata); rdata += NS_INT16SZ; 3497c478bd9Sstevel@tonic-gate preference = ns_get16(rdata); rdata += NS_INT16SZ; 3507c478bd9Sstevel@tonic-gate len = SPRINTF((t, "%u %u ", order, preference)); 3517c478bd9Sstevel@tonic-gate T(addstr(t, len, &buf, &buflen)); 3527c478bd9Sstevel@tonic-gate 3537c478bd9Sstevel@tonic-gate /* Flags. */ 3547c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 3557c478bd9Sstevel@tonic-gate if (len == 0) 3567c478bd9Sstevel@tonic-gate goto formerr; 3577c478bd9Sstevel@tonic-gate rdata += len; 3587c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 3597c478bd9Sstevel@tonic-gate 3607c478bd9Sstevel@tonic-gate /* Service. */ 3617c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 3627c478bd9Sstevel@tonic-gate if (len == 0) 3637c478bd9Sstevel@tonic-gate goto formerr; 3647c478bd9Sstevel@tonic-gate rdata += len; 3657c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 3667c478bd9Sstevel@tonic-gate 3677c478bd9Sstevel@tonic-gate /* Regexp. */ 3687c478bd9Sstevel@tonic-gate T(len = charstr(rdata, edata, &buf, &buflen)); 3697c478bd9Sstevel@tonic-gate if (len < 0) 3707c478bd9Sstevel@tonic-gate return (-1); 3717c478bd9Sstevel@tonic-gate if (len == 0) 3727c478bd9Sstevel@tonic-gate goto formerr; 3737c478bd9Sstevel@tonic-gate rdata += len; 3747c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 3757c478bd9Sstevel@tonic-gate 3767c478bd9Sstevel@tonic-gate /* Server. */ 3777c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 3787c478bd9Sstevel@tonic-gate break; 3797c478bd9Sstevel@tonic-gate } 3807c478bd9Sstevel@tonic-gate 3817c478bd9Sstevel@tonic-gate case ns_t_srv: { 3827c478bd9Sstevel@tonic-gate u_int priority, weight, port; 3837c478bd9Sstevel@tonic-gate char t[50]; 3847c478bd9Sstevel@tonic-gate 385*9525b14bSRao Shoaib if (rdlen < 3U*NS_INT16SZ) 3867c478bd9Sstevel@tonic-gate goto formerr; 3877c478bd9Sstevel@tonic-gate 3887c478bd9Sstevel@tonic-gate /* Priority, Weight, Port. */ 3897c478bd9Sstevel@tonic-gate priority = ns_get16(rdata); rdata += NS_INT16SZ; 3907c478bd9Sstevel@tonic-gate weight = ns_get16(rdata); rdata += NS_INT16SZ; 3917c478bd9Sstevel@tonic-gate port = ns_get16(rdata); rdata += NS_INT16SZ; 3927c478bd9Sstevel@tonic-gate len = SPRINTF((t, "%u %u %u ", priority, weight, port)); 3937c478bd9Sstevel@tonic-gate T(addstr(t, len, &buf, &buflen)); 3947c478bd9Sstevel@tonic-gate 3957c478bd9Sstevel@tonic-gate /* Server. */ 3967c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 3977c478bd9Sstevel@tonic-gate break; 3987c478bd9Sstevel@tonic-gate } 3997c478bd9Sstevel@tonic-gate 4007c478bd9Sstevel@tonic-gate case ns_t_minfo: 4017c478bd9Sstevel@tonic-gate case ns_t_rp: 4027c478bd9Sstevel@tonic-gate /* Name1. */ 4037c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 4047c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 4057c478bd9Sstevel@tonic-gate 4067c478bd9Sstevel@tonic-gate /* Name2. */ 4077c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 4087c478bd9Sstevel@tonic-gate 4097c478bd9Sstevel@tonic-gate break; 4107c478bd9Sstevel@tonic-gate 4117c478bd9Sstevel@tonic-gate case ns_t_wks: { 4127c478bd9Sstevel@tonic-gate int n, lcnt; 4137c478bd9Sstevel@tonic-gate 414*9525b14bSRao Shoaib if (rdlen < 1U + NS_INT32SZ) 4157c478bd9Sstevel@tonic-gate goto formerr; 4167c478bd9Sstevel@tonic-gate 4177c478bd9Sstevel@tonic-gate /* Address. */ 4187c478bd9Sstevel@tonic-gate (void) inet_ntop(AF_INET, rdata, buf, buflen); 4197c478bd9Sstevel@tonic-gate addlen(strlen(buf), &buf, &buflen); 4207c478bd9Sstevel@tonic-gate rdata += NS_INADDRSZ; 4217c478bd9Sstevel@tonic-gate 4227c478bd9Sstevel@tonic-gate /* Protocol. */ 4237c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, " %u ( ", *rdata)); 4247c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 4257c478bd9Sstevel@tonic-gate rdata += NS_INT8SZ; 4267c478bd9Sstevel@tonic-gate 4277c478bd9Sstevel@tonic-gate /* Bit map. */ 4287c478bd9Sstevel@tonic-gate n = 0; 4297c478bd9Sstevel@tonic-gate lcnt = 0; 4307c478bd9Sstevel@tonic-gate while (rdata < edata) { 4317c478bd9Sstevel@tonic-gate u_int c = *rdata++; 4327c478bd9Sstevel@tonic-gate do { 4337c478bd9Sstevel@tonic-gate if (c & 0200) { 4347c478bd9Sstevel@tonic-gate if (lcnt == 0) { 4357c478bd9Sstevel@tonic-gate T(addstr("\n\t\t\t\t", 5, 4367c478bd9Sstevel@tonic-gate &buf, &buflen)); 4377c478bd9Sstevel@tonic-gate lcnt = 10; 4387c478bd9Sstevel@tonic-gate spaced = 0; 4397c478bd9Sstevel@tonic-gate } 4407c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%d ", n)); 4417c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 4427c478bd9Sstevel@tonic-gate lcnt--; 4437c478bd9Sstevel@tonic-gate } 4447c478bd9Sstevel@tonic-gate c <<= 1; 4457c478bd9Sstevel@tonic-gate } while (++n & 07); 4467c478bd9Sstevel@tonic-gate } 4477c478bd9Sstevel@tonic-gate T(addstr(")", 1, &buf, &buflen)); 4487c478bd9Sstevel@tonic-gate 4497c478bd9Sstevel@tonic-gate break; 4507c478bd9Sstevel@tonic-gate } 4517c478bd9Sstevel@tonic-gate 452*9525b14bSRao Shoaib case ns_t_key: 453*9525b14bSRao Shoaib case ns_t_dnskey: { 4547c478bd9Sstevel@tonic-gate char base64_key[NS_MD5RSA_MAX_BASE64]; 4557c478bd9Sstevel@tonic-gate u_int keyflags, protocol, algorithm, key_id; 4567c478bd9Sstevel@tonic-gate const char *leader; 4577c478bd9Sstevel@tonic-gate int n; 4587c478bd9Sstevel@tonic-gate 459*9525b14bSRao Shoaib if (rdlen < 0U + NS_INT16SZ + NS_INT8SZ + NS_INT8SZ) 4607c478bd9Sstevel@tonic-gate goto formerr; 4617c478bd9Sstevel@tonic-gate 4627c478bd9Sstevel@tonic-gate /* Key flags, Protocol, Algorithm. */ 4637c478bd9Sstevel@tonic-gate key_id = dst_s_dns_key_id(rdata, edata-rdata); 4647c478bd9Sstevel@tonic-gate keyflags = ns_get16(rdata); rdata += NS_INT16SZ; 4657c478bd9Sstevel@tonic-gate protocol = *rdata++; 4667c478bd9Sstevel@tonic-gate algorithm = *rdata++; 4677c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "0x%04x %u %u", 4687c478bd9Sstevel@tonic-gate keyflags, protocol, algorithm)); 4697c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate /* Public key data. */ 4727c478bd9Sstevel@tonic-gate len = b64_ntop(rdata, edata - rdata, 4737c478bd9Sstevel@tonic-gate base64_key, sizeof base64_key); 4747c478bd9Sstevel@tonic-gate if (len < 0) 4757c478bd9Sstevel@tonic-gate goto formerr; 4767c478bd9Sstevel@tonic-gate if (len > 15) { 4777c478bd9Sstevel@tonic-gate T(addstr(" (", 2, &buf, &buflen)); 4787c478bd9Sstevel@tonic-gate leader = "\n\t\t"; 4797c478bd9Sstevel@tonic-gate spaced = 0; 4807c478bd9Sstevel@tonic-gate } else 4817c478bd9Sstevel@tonic-gate leader = " "; 4827c478bd9Sstevel@tonic-gate for (n = 0; n < len; n += 48) { 4837c478bd9Sstevel@tonic-gate T(addstr(leader, strlen(leader), &buf, &buflen)); 4847c478bd9Sstevel@tonic-gate T(addstr(base64_key + n, MIN(len - n, 48), 4857c478bd9Sstevel@tonic-gate &buf, &buflen)); 4867c478bd9Sstevel@tonic-gate } 4877c478bd9Sstevel@tonic-gate if (len > 15) 4887c478bd9Sstevel@tonic-gate T(addstr(" )", 2, &buf, &buflen)); 4897c478bd9Sstevel@tonic-gate n = SPRINTF((tmp, " ; key_tag= %u", key_id)); 4907c478bd9Sstevel@tonic-gate T(addstr(tmp, n, &buf, &buflen)); 4917c478bd9Sstevel@tonic-gate 4927c478bd9Sstevel@tonic-gate break; 4937c478bd9Sstevel@tonic-gate } 4947c478bd9Sstevel@tonic-gate 495*9525b14bSRao Shoaib case ns_t_sig: 496*9525b14bSRao Shoaib case ns_t_rrsig: { 4977c478bd9Sstevel@tonic-gate char base64_key[NS_MD5RSA_MAX_BASE64]; 4987c478bd9Sstevel@tonic-gate u_int type, algorithm, labels, footprint; 4997c478bd9Sstevel@tonic-gate const char *leader; 5007c478bd9Sstevel@tonic-gate u_long t; 5017c478bd9Sstevel@tonic-gate int n; 5027c478bd9Sstevel@tonic-gate 503*9525b14bSRao Shoaib if (rdlen < 22U) 5047c478bd9Sstevel@tonic-gate goto formerr; 5057c478bd9Sstevel@tonic-gate 5067c478bd9Sstevel@tonic-gate /* Type covered, Algorithm, Label count, Original TTL. */ 507*9525b14bSRao Shoaib type = ns_get16(rdata); rdata += NS_INT16SZ; 5087c478bd9Sstevel@tonic-gate algorithm = *rdata++; 5097c478bd9Sstevel@tonic-gate labels = *rdata++; 5107c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 5117c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%s %d %d %lu ", 5127c478bd9Sstevel@tonic-gate p_type(type), algorithm, labels, t)); 5137c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 5147c478bd9Sstevel@tonic-gate if (labels > (u_int)dn_count_labels(name)) 5157c478bd9Sstevel@tonic-gate goto formerr; 5167c478bd9Sstevel@tonic-gate 5177c478bd9Sstevel@tonic-gate /* Signature expiry. */ 5187c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 5197c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%s ", p_secstodate(t))); 5207c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 5217c478bd9Sstevel@tonic-gate 5227c478bd9Sstevel@tonic-gate /* Time signed. */ 5237c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 5247c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%s ", p_secstodate(t))); 5257c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 5267c478bd9Sstevel@tonic-gate 5277c478bd9Sstevel@tonic-gate /* Signature Footprint. */ 5287c478bd9Sstevel@tonic-gate footprint = ns_get16(rdata); rdata += NS_INT16SZ; 5297c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%u ", footprint)); 5307c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 5317c478bd9Sstevel@tonic-gate 5327c478bd9Sstevel@tonic-gate /* Signer's name. */ 5337c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 5347c478bd9Sstevel@tonic-gate 5357c478bd9Sstevel@tonic-gate /* Signature. */ 5367c478bd9Sstevel@tonic-gate len = b64_ntop(rdata, edata - rdata, 5377c478bd9Sstevel@tonic-gate base64_key, sizeof base64_key); 5387c478bd9Sstevel@tonic-gate if (len > 15) { 5397c478bd9Sstevel@tonic-gate T(addstr(" (", 2, &buf, &buflen)); 5407c478bd9Sstevel@tonic-gate leader = "\n\t\t"; 5417c478bd9Sstevel@tonic-gate spaced = 0; 5427c478bd9Sstevel@tonic-gate } else 5437c478bd9Sstevel@tonic-gate leader = " "; 5447c478bd9Sstevel@tonic-gate if (len < 0) 5457c478bd9Sstevel@tonic-gate goto formerr; 5467c478bd9Sstevel@tonic-gate for (n = 0; n < len; n += 48) { 5477c478bd9Sstevel@tonic-gate T(addstr(leader, strlen(leader), &buf, &buflen)); 5487c478bd9Sstevel@tonic-gate T(addstr(base64_key + n, MIN(len - n, 48), 5497c478bd9Sstevel@tonic-gate &buf, &buflen)); 5507c478bd9Sstevel@tonic-gate } 5517c478bd9Sstevel@tonic-gate if (len > 15) 5527c478bd9Sstevel@tonic-gate T(addstr(" )", 2, &buf, &buflen)); 5537c478bd9Sstevel@tonic-gate break; 5547c478bd9Sstevel@tonic-gate } 5557c478bd9Sstevel@tonic-gate 5567c478bd9Sstevel@tonic-gate case ns_t_nxt: { 5577c478bd9Sstevel@tonic-gate int n, c; 5587c478bd9Sstevel@tonic-gate 5597c478bd9Sstevel@tonic-gate /* Next domain name. */ 5607c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 5617c478bd9Sstevel@tonic-gate 5627c478bd9Sstevel@tonic-gate /* Type bit map. */ 5637c478bd9Sstevel@tonic-gate n = edata - rdata; 5647c478bd9Sstevel@tonic-gate for (c = 0; c < n*8; c++) 5657c478bd9Sstevel@tonic-gate if (NS_NXT_BIT_ISSET(c, rdata)) { 5667c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, " %s", p_type(c))); 5677c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 5687c478bd9Sstevel@tonic-gate } 5697c478bd9Sstevel@tonic-gate break; 5707c478bd9Sstevel@tonic-gate } 5717c478bd9Sstevel@tonic-gate 5727c478bd9Sstevel@tonic-gate case ns_t_cert: { 5737c478bd9Sstevel@tonic-gate u_int c_type, key_tag, alg; 5747c478bd9Sstevel@tonic-gate int n; 5757c478bd9Sstevel@tonic-gate unsigned int siz; 5767c478bd9Sstevel@tonic-gate char base64_cert[8192], tmp[40]; 5777c478bd9Sstevel@tonic-gate const char *leader; 5787c478bd9Sstevel@tonic-gate 5797c478bd9Sstevel@tonic-gate c_type = ns_get16(rdata); rdata += NS_INT16SZ; 5807c478bd9Sstevel@tonic-gate key_tag = ns_get16(rdata); rdata += NS_INT16SZ; 5817c478bd9Sstevel@tonic-gate alg = (u_int) *rdata++; 5827c478bd9Sstevel@tonic-gate 5837c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%d %d %d ", c_type, key_tag, alg)); 5847c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 5857c478bd9Sstevel@tonic-gate siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ 5867c478bd9Sstevel@tonic-gate if (siz > sizeof(base64_cert) * 3/4) { 5877c478bd9Sstevel@tonic-gate const char *str = "record too long to print"; 5887c478bd9Sstevel@tonic-gate T(addstr(str, strlen(str), &buf, &buflen)); 5897c478bd9Sstevel@tonic-gate } 5907c478bd9Sstevel@tonic-gate else { 5917c478bd9Sstevel@tonic-gate len = b64_ntop(rdata, edata-rdata, base64_cert, siz); 5927c478bd9Sstevel@tonic-gate 5937c478bd9Sstevel@tonic-gate if (len < 0) 5947c478bd9Sstevel@tonic-gate goto formerr; 5957c478bd9Sstevel@tonic-gate else if (len > 15) { 5967c478bd9Sstevel@tonic-gate T(addstr(" (", 2, &buf, &buflen)); 5977c478bd9Sstevel@tonic-gate leader = "\n\t\t"; 5987c478bd9Sstevel@tonic-gate spaced = 0; 5997c478bd9Sstevel@tonic-gate } 6007c478bd9Sstevel@tonic-gate else 6017c478bd9Sstevel@tonic-gate leader = " "; 6027c478bd9Sstevel@tonic-gate 6037c478bd9Sstevel@tonic-gate for (n = 0; n < len; n += 48) { 6047c478bd9Sstevel@tonic-gate T(addstr(leader, strlen(leader), 6057c478bd9Sstevel@tonic-gate &buf, &buflen)); 6067c478bd9Sstevel@tonic-gate T(addstr(base64_cert + n, MIN(len - n, 48), 6077c478bd9Sstevel@tonic-gate &buf, &buflen)); 6087c478bd9Sstevel@tonic-gate } 6097c478bd9Sstevel@tonic-gate if (len > 15) 6107c478bd9Sstevel@tonic-gate T(addstr(" )", 2, &buf, &buflen)); 6117c478bd9Sstevel@tonic-gate } 6127c478bd9Sstevel@tonic-gate break; 6137c478bd9Sstevel@tonic-gate } 6147c478bd9Sstevel@tonic-gate 6157c478bd9Sstevel@tonic-gate case ns_t_tkey: { 6167c478bd9Sstevel@tonic-gate /* KJD - need to complete this */ 6177c478bd9Sstevel@tonic-gate u_long t; 6187c478bd9Sstevel@tonic-gate int mode, err, keysize; 6197c478bd9Sstevel@tonic-gate 6207c478bd9Sstevel@tonic-gate /* Algorithm name. */ 6217c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 6227c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 6237c478bd9Sstevel@tonic-gate 6247c478bd9Sstevel@tonic-gate /* Inception. */ 6257c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 6267c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%s ", p_secstodate(t))); 6277c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 6287c478bd9Sstevel@tonic-gate 6297c478bd9Sstevel@tonic-gate /* Experation. */ 6307c478bd9Sstevel@tonic-gate t = ns_get32(rdata); rdata += NS_INT32SZ; 6317c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%s ", p_secstodate(t))); 6327c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 6337c478bd9Sstevel@tonic-gate 6347c478bd9Sstevel@tonic-gate /* Mode , Error, Key Size. */ 6357c478bd9Sstevel@tonic-gate /* Priority, Weight, Port. */ 6367c478bd9Sstevel@tonic-gate mode = ns_get16(rdata); rdata += NS_INT16SZ; 6377c478bd9Sstevel@tonic-gate err = ns_get16(rdata); rdata += NS_INT16SZ; 6387c478bd9Sstevel@tonic-gate keysize = ns_get16(rdata); rdata += NS_INT16SZ; 6397c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize)); 6407c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 6417c478bd9Sstevel@tonic-gate 642*9525b14bSRao Shoaib /* XXX need to dump key, print otherdata length & other data */ 6437c478bd9Sstevel@tonic-gate break; 6447c478bd9Sstevel@tonic-gate } 6457c478bd9Sstevel@tonic-gate 6467c478bd9Sstevel@tonic-gate case ns_t_tsig: { 6477c478bd9Sstevel@tonic-gate /* BEW - need to complete this */ 6487c478bd9Sstevel@tonic-gate int n; 6497c478bd9Sstevel@tonic-gate 6507c478bd9Sstevel@tonic-gate T(len = addname(msg, msglen, &rdata, origin, &buf, &buflen)); 6517c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 652*9525b14bSRao Shoaib rdata += 8; /*%< time */ 6537c478bd9Sstevel@tonic-gate n = ns_get16(rdata); rdata += INT16SZ; 654*9525b14bSRao Shoaib rdata += n; /*%< sig */ 655*9525b14bSRao Shoaib n = ns_get16(rdata); rdata += INT16SZ; /*%< original id */ 6567c478bd9Sstevel@tonic-gate sprintf(buf, "%d", ns_get16(rdata)); 6577c478bd9Sstevel@tonic-gate rdata += INT16SZ; 6587c478bd9Sstevel@tonic-gate addlen(strlen(buf), &buf, &buflen); 6597c478bd9Sstevel@tonic-gate break; 6607c478bd9Sstevel@tonic-gate } 6617c478bd9Sstevel@tonic-gate 6627c478bd9Sstevel@tonic-gate case ns_t_a6: { 6637c478bd9Sstevel@tonic-gate struct in6_addr a; 6647c478bd9Sstevel@tonic-gate int pbyte, pbit; 6657c478bd9Sstevel@tonic-gate 6667c478bd9Sstevel@tonic-gate /* prefix length */ 667*9525b14bSRao Shoaib if (rdlen == 0U) goto formerr; 6687c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%d ", *rdata)); 6697c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 6707c478bd9Sstevel@tonic-gate pbit = *rdata; 6717c478bd9Sstevel@tonic-gate if (pbit > 128) goto formerr; 6727c478bd9Sstevel@tonic-gate pbyte = (pbit & ~7) / 8; 6737c478bd9Sstevel@tonic-gate rdata++; 6747c478bd9Sstevel@tonic-gate 6757c478bd9Sstevel@tonic-gate /* address suffix: provided only when prefix len != 128 */ 6767c478bd9Sstevel@tonic-gate if (pbit < 128) { 6777c478bd9Sstevel@tonic-gate if (rdata + pbyte >= edata) goto formerr; 6787c478bd9Sstevel@tonic-gate memset(&a, 0, sizeof(a)); 6797c478bd9Sstevel@tonic-gate memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte); 6807c478bd9Sstevel@tonic-gate (void) inet_ntop(AF_INET6, &a, buf, buflen); 6817c478bd9Sstevel@tonic-gate addlen(strlen(buf), &buf, &buflen); 6827c478bd9Sstevel@tonic-gate rdata += sizeof(a) - pbyte; 6837c478bd9Sstevel@tonic-gate } 6847c478bd9Sstevel@tonic-gate 6857c478bd9Sstevel@tonic-gate /* prefix name: provided only when prefix len > 0 */ 6867c478bd9Sstevel@tonic-gate if (pbit == 0) 6877c478bd9Sstevel@tonic-gate break; 6887c478bd9Sstevel@tonic-gate if (rdata >= edata) goto formerr; 6897c478bd9Sstevel@tonic-gate T(addstr(" ", 1, &buf, &buflen)); 6907c478bd9Sstevel@tonic-gate T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 6917c478bd9Sstevel@tonic-gate 6927c478bd9Sstevel@tonic-gate break; 693*9525b14bSRao Shoaib } 6947c478bd9Sstevel@tonic-gate 6957c478bd9Sstevel@tonic-gate case ns_t_opt: { 6967c478bd9Sstevel@tonic-gate len = SPRINTF((tmp, "%u bytes", class)); 6977c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 6987c478bd9Sstevel@tonic-gate break; 699*9525b14bSRao Shoaib } 700*9525b14bSRao Shoaib 701*9525b14bSRao Shoaib case ns_t_ds: 702*9525b14bSRao Shoaib case ns_t_dlv: 703*9525b14bSRao Shoaib case ns_t_sshfp: { 704*9525b14bSRao Shoaib u_int t; 705*9525b14bSRao Shoaib 706*9525b14bSRao Shoaib if (type == ns_t_ds || type == ns_t_dlv) { 707*9525b14bSRao Shoaib if (rdlen < 4U) goto formerr; 708*9525b14bSRao Shoaib t = ns_get16(rdata); 709*9525b14bSRao Shoaib rdata += NS_INT16SZ; 710*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", t)); 711*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 712*9525b14bSRao Shoaib } else 713*9525b14bSRao Shoaib if (rdlen < 2U) goto formerr; 714*9525b14bSRao Shoaib 715*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 716*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 717*9525b14bSRao Shoaib rdata++; 718*9525b14bSRao Shoaib 719*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 720*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 721*9525b14bSRao Shoaib rdata++; 722*9525b14bSRao Shoaib 723*9525b14bSRao Shoaib while (rdata < edata) { 724*9525b14bSRao Shoaib len = SPRINTF((tmp, "%02X", *rdata)); 725*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 726*9525b14bSRao Shoaib rdata++; 727*9525b14bSRao Shoaib } 728*9525b14bSRao Shoaib break; 729*9525b14bSRao Shoaib } 730*9525b14bSRao Shoaib 731*9525b14bSRao Shoaib case ns_t_nsec3: 732*9525b14bSRao Shoaib case ns_t_nsec3param: { 733*9525b14bSRao Shoaib u_int t, w, l, j, k, c; 734*9525b14bSRao Shoaib 735*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 736*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 737*9525b14bSRao Shoaib rdata++; 738*9525b14bSRao Shoaib 739*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 740*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 741*9525b14bSRao Shoaib rdata++; 742*9525b14bSRao Shoaib 743*9525b14bSRao Shoaib t = ns_get16(rdata); 744*9525b14bSRao Shoaib rdata += NS_INT16SZ; 745*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", t)); 746*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 747*9525b14bSRao Shoaib 748*9525b14bSRao Shoaib t = *rdata++; 749*9525b14bSRao Shoaib if (t == 0) { 750*9525b14bSRao Shoaib T(addstr("-", 1, &buf, &buflen)); 751*9525b14bSRao Shoaib } else { 752*9525b14bSRao Shoaib while (t-- > 0) { 753*9525b14bSRao Shoaib len = SPRINTF((tmp, "%02X", *rdata)); 754*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 755*9525b14bSRao Shoaib rdata++; 756*9525b14bSRao Shoaib } 757*9525b14bSRao Shoaib } 758*9525b14bSRao Shoaib if (type == ns_t_nsec3param) 759*9525b14bSRao Shoaib break; 760*9525b14bSRao Shoaib T(addstr(" ", 1, &buf, &buflen)); 761*9525b14bSRao Shoaib 762*9525b14bSRao Shoaib t = *rdata++; 763*9525b14bSRao Shoaib while (t > 0) { 764*9525b14bSRao Shoaib switch (t) { 765*9525b14bSRao Shoaib case 1: 766*9525b14bSRao Shoaib tmp[0] = base32hex[((rdata[0]>>3)&0x1f)]; 767*9525b14bSRao Shoaib tmp[1] = base32hex[((rdata[0]<<2)&0x1c)]; 768*9525b14bSRao Shoaib tmp[2] = tmp[3] = tmp[4] = '='; 769*9525b14bSRao Shoaib tmp[5] = tmp[6] = tmp[7] = '='; 770*9525b14bSRao Shoaib break; 771*9525b14bSRao Shoaib case 2: 772*9525b14bSRao Shoaib tmp[0] = base32hex[((rdata[0]>>3)&0x1f)]; 773*9525b14bSRao Shoaib tmp[1] = base32hex[((rdata[0]<<2)&0x1c)| 774*9525b14bSRao Shoaib ((rdata[1]>>6)&0x03)]; 775*9525b14bSRao Shoaib tmp[2] = base32hex[((rdata[1]>>1)&0x1f)]; 776*9525b14bSRao Shoaib tmp[3] = base32hex[((rdata[1]<<4)&0x10)]; 777*9525b14bSRao Shoaib tmp[4] = tmp[5] = tmp[6] = tmp[7] = '='; 778*9525b14bSRao Shoaib break; 779*9525b14bSRao Shoaib case 3: 780*9525b14bSRao Shoaib tmp[0] = base32hex[((rdata[0]>>3)&0x1f)]; 781*9525b14bSRao Shoaib tmp[1] = base32hex[((rdata[0]<<2)&0x1c)| 782*9525b14bSRao Shoaib ((rdata[1]>>6)&0x03)]; 783*9525b14bSRao Shoaib tmp[2] = base32hex[((rdata[1]>>1)&0x1f)]; 784*9525b14bSRao Shoaib tmp[3] = base32hex[((rdata[1]<<4)&0x10)| 785*9525b14bSRao Shoaib ((rdata[2]>>4)&0x0f)]; 786*9525b14bSRao Shoaib tmp[4] = base32hex[((rdata[2]<<1)&0x1e)]; 787*9525b14bSRao Shoaib tmp[5] = tmp[6] = tmp[7] = '='; 788*9525b14bSRao Shoaib break; 789*9525b14bSRao Shoaib case 4: 790*9525b14bSRao Shoaib tmp[0] = base32hex[((rdata[0]>>3)&0x1f)]; 791*9525b14bSRao Shoaib tmp[1] = base32hex[((rdata[0]<<2)&0x1c)| 792*9525b14bSRao Shoaib ((rdata[1]>>6)&0x03)]; 793*9525b14bSRao Shoaib tmp[2] = base32hex[((rdata[1]>>1)&0x1f)]; 794*9525b14bSRao Shoaib tmp[3] = base32hex[((rdata[1]<<4)&0x10)| 795*9525b14bSRao Shoaib ((rdata[2]>>4)&0x0f)]; 796*9525b14bSRao Shoaib tmp[4] = base32hex[((rdata[2]<<1)&0x1e)| 797*9525b14bSRao Shoaib ((rdata[3]>>7)&0x01)]; 798*9525b14bSRao Shoaib tmp[5] = base32hex[((rdata[3]>>2)&0x1f)]; 799*9525b14bSRao Shoaib tmp[6] = base32hex[(rdata[3]<<3)&0x18]; 800*9525b14bSRao Shoaib tmp[7] = '='; 801*9525b14bSRao Shoaib break; 802*9525b14bSRao Shoaib default: 803*9525b14bSRao Shoaib tmp[0] = base32hex[((rdata[0]>>3)&0x1f)]; 804*9525b14bSRao Shoaib tmp[1] = base32hex[((rdata[0]<<2)&0x1c)| 805*9525b14bSRao Shoaib ((rdata[1]>>6)&0x03)]; 806*9525b14bSRao Shoaib tmp[2] = base32hex[((rdata[1]>>1)&0x1f)]; 807*9525b14bSRao Shoaib tmp[3] = base32hex[((rdata[1]<<4)&0x10)| 808*9525b14bSRao Shoaib ((rdata[2]>>4)&0x0f)]; 809*9525b14bSRao Shoaib tmp[4] = base32hex[((rdata[2]<<1)&0x1e)| 810*9525b14bSRao Shoaib ((rdata[3]>>7)&0x01)]; 811*9525b14bSRao Shoaib tmp[5] = base32hex[((rdata[3]>>2)&0x1f)]; 812*9525b14bSRao Shoaib tmp[6] = base32hex[((rdata[3]<<3)&0x18)| 813*9525b14bSRao Shoaib ((rdata[4]>>5)&0x07)]; 814*9525b14bSRao Shoaib tmp[7] = base32hex[(rdata[4]&0x1f)]; 815*9525b14bSRao Shoaib break; 816*9525b14bSRao Shoaib } 817*9525b14bSRao Shoaib T(addstr(tmp, 8, &buf, &buflen)); 818*9525b14bSRao Shoaib if (t >= 5) { 819*9525b14bSRao Shoaib rdata += 5; 820*9525b14bSRao Shoaib t -= 5; 821*9525b14bSRao Shoaib } else { 822*9525b14bSRao Shoaib rdata += t; 823*9525b14bSRao Shoaib t -= t; 824*9525b14bSRao Shoaib } 825*9525b14bSRao Shoaib } 826*9525b14bSRao Shoaib 827*9525b14bSRao Shoaib while (rdata < edata) { 828*9525b14bSRao Shoaib w = *rdata++; 829*9525b14bSRao Shoaib l = *rdata++; 830*9525b14bSRao Shoaib for (j = 0; j < l; j++) { 831*9525b14bSRao Shoaib if (rdata[j] == 0) 832*9525b14bSRao Shoaib continue; 833*9525b14bSRao Shoaib for (k = 0; k < 8; k++) { 834*9525b14bSRao Shoaib if ((rdata[j] & (0x80 >> k)) == 0) 835*9525b14bSRao Shoaib continue; 836*9525b14bSRao Shoaib c = w * 256 + j * 8 + k; 837*9525b14bSRao Shoaib len = SPRINTF((tmp, " %s", p_type(c))); 838*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 839*9525b14bSRao Shoaib } 840*9525b14bSRao Shoaib } 841*9525b14bSRao Shoaib rdata += l; 842*9525b14bSRao Shoaib } 843*9525b14bSRao Shoaib break; 844*9525b14bSRao Shoaib } 845*9525b14bSRao Shoaib 846*9525b14bSRao Shoaib case ns_t_nsec: { 847*9525b14bSRao Shoaib u_int w, l, j, k, c; 848*9525b14bSRao Shoaib 849*9525b14bSRao Shoaib T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 850*9525b14bSRao Shoaib 851*9525b14bSRao Shoaib while (rdata < edata) { 852*9525b14bSRao Shoaib w = *rdata++; 853*9525b14bSRao Shoaib l = *rdata++; 854*9525b14bSRao Shoaib for (j = 0; j < l; j++) { 855*9525b14bSRao Shoaib if (rdata[j] == 0) 856*9525b14bSRao Shoaib continue; 857*9525b14bSRao Shoaib for (k = 0; k < 8; k++) { 858*9525b14bSRao Shoaib if ((rdata[j] & (0x80 >> k)) == 0) 859*9525b14bSRao Shoaib continue; 860*9525b14bSRao Shoaib c = w * 256 + j * 8 + k; 861*9525b14bSRao Shoaib len = SPRINTF((tmp, " %s", p_type(c))); 862*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 863*9525b14bSRao Shoaib } 864*9525b14bSRao Shoaib } 865*9525b14bSRao Shoaib rdata += l; 866*9525b14bSRao Shoaib } 867*9525b14bSRao Shoaib break; 868*9525b14bSRao Shoaib } 869*9525b14bSRao Shoaib 870*9525b14bSRao Shoaib case ns_t_dhcid: { 871*9525b14bSRao Shoaib int n; 872*9525b14bSRao Shoaib unsigned int siz; 873*9525b14bSRao Shoaib char base64_dhcid[8192]; 874*9525b14bSRao Shoaib const char *leader; 875*9525b14bSRao Shoaib 876*9525b14bSRao Shoaib siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ 877*9525b14bSRao Shoaib if (siz > sizeof(base64_dhcid) * 3/4) { 878*9525b14bSRao Shoaib const char *str = "record too long to print"; 879*9525b14bSRao Shoaib T(addstr(str, strlen(str), &buf, &buflen)); 880*9525b14bSRao Shoaib } else { 881*9525b14bSRao Shoaib len = b64_ntop(rdata, edata-rdata, base64_dhcid, siz); 882*9525b14bSRao Shoaib 883*9525b14bSRao Shoaib if (len < 0) 884*9525b14bSRao Shoaib goto formerr; 885*9525b14bSRao Shoaib 886*9525b14bSRao Shoaib else if (len > 15) { 887*9525b14bSRao Shoaib T(addstr(" (", 2, &buf, &buflen)); 888*9525b14bSRao Shoaib leader = "\n\t\t"; 889*9525b14bSRao Shoaib spaced = 0; 890*9525b14bSRao Shoaib } 891*9525b14bSRao Shoaib else 892*9525b14bSRao Shoaib leader = " "; 893*9525b14bSRao Shoaib 894*9525b14bSRao Shoaib for (n = 0; n < len; n += 48) { 895*9525b14bSRao Shoaib T(addstr(leader, strlen(leader), 896*9525b14bSRao Shoaib &buf, &buflen)); 897*9525b14bSRao Shoaib T(addstr(base64_dhcid + n, MIN(len - n, 48), 898*9525b14bSRao Shoaib &buf, &buflen)); 899*9525b14bSRao Shoaib } 900*9525b14bSRao Shoaib if (len > 15) 901*9525b14bSRao Shoaib T(addstr(" )", 2, &buf, &buflen)); 902*9525b14bSRao Shoaib } 903*9525b14bSRao Shoaib } 904*9525b14bSRao Shoaib 905*9525b14bSRao Shoaib case ns_t_ipseckey: { 906*9525b14bSRao Shoaib int n; 907*9525b14bSRao Shoaib unsigned int siz; 908*9525b14bSRao Shoaib char base64_key[8192]; 909*9525b14bSRao Shoaib const char *leader; 910*9525b14bSRao Shoaib 911*9525b14bSRao Shoaib if (rdlen < 2) 912*9525b14bSRao Shoaib goto formerr; 913*9525b14bSRao Shoaib 914*9525b14bSRao Shoaib switch (rdata[1]) { 915*9525b14bSRao Shoaib case 0: 916*9525b14bSRao Shoaib case 3: 917*9525b14bSRao Shoaib if (rdlen < 3) 918*9525b14bSRao Shoaib goto formerr; 919*9525b14bSRao Shoaib break; 920*9525b14bSRao Shoaib case 1: 921*9525b14bSRao Shoaib if (rdlen < 7) 922*9525b14bSRao Shoaib goto formerr; 923*9525b14bSRao Shoaib break; 924*9525b14bSRao Shoaib case 2: 925*9525b14bSRao Shoaib if (rdlen < 19) 926*9525b14bSRao Shoaib goto formerr; 927*9525b14bSRao Shoaib break; 928*9525b14bSRao Shoaib default: 929*9525b14bSRao Shoaib comment = "unknown IPSECKEY gateway type"; 930*9525b14bSRao Shoaib goto hexify; 931*9525b14bSRao Shoaib } 932*9525b14bSRao Shoaib 933*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 934*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 935*9525b14bSRao Shoaib rdata++; 936*9525b14bSRao Shoaib 937*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 938*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 939*9525b14bSRao Shoaib rdata++; 940*9525b14bSRao Shoaib 941*9525b14bSRao Shoaib len = SPRINTF((tmp, "%u ", *rdata)); 942*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 943*9525b14bSRao Shoaib rdata++; 944*9525b14bSRao Shoaib 945*9525b14bSRao Shoaib switch (rdata[-2]) { 946*9525b14bSRao Shoaib case 0: 947*9525b14bSRao Shoaib T(addstr(".", 1, &buf, &buflen)); 948*9525b14bSRao Shoaib break; 949*9525b14bSRao Shoaib case 1: 950*9525b14bSRao Shoaib (void) inet_ntop(AF_INET, rdata, buf, buflen); 951*9525b14bSRao Shoaib addlen(strlen(buf), &buf, &buflen); 952*9525b14bSRao Shoaib rdata += 4; 953*9525b14bSRao Shoaib break; 954*9525b14bSRao Shoaib case 2: 955*9525b14bSRao Shoaib (void) inet_ntop(AF_INET6, rdata, buf, buflen); 956*9525b14bSRao Shoaib addlen(strlen(buf), &buf, &buflen); 957*9525b14bSRao Shoaib rdata += 16; 958*9525b14bSRao Shoaib break; 959*9525b14bSRao Shoaib case 3: 960*9525b14bSRao Shoaib T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); 961*9525b14bSRao Shoaib break; 962*9525b14bSRao Shoaib } 963*9525b14bSRao Shoaib 964*9525b14bSRao Shoaib if (rdata >= edata) 965*9525b14bSRao Shoaib break; 966*9525b14bSRao Shoaib 967*9525b14bSRao Shoaib siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ 968*9525b14bSRao Shoaib if (siz > sizeof(base64_key) * 3/4) { 969*9525b14bSRao Shoaib const char *str = "record too long to print"; 970*9525b14bSRao Shoaib T(addstr(str, strlen(str), &buf, &buflen)); 971*9525b14bSRao Shoaib } else { 972*9525b14bSRao Shoaib len = b64_ntop(rdata, edata-rdata, base64_key, siz); 973*9525b14bSRao Shoaib 974*9525b14bSRao Shoaib if (len < 0) 975*9525b14bSRao Shoaib goto formerr; 976*9525b14bSRao Shoaib 977*9525b14bSRao Shoaib else if (len > 15) { 978*9525b14bSRao Shoaib T(addstr(" (", 2, &buf, &buflen)); 979*9525b14bSRao Shoaib leader = "\n\t\t"; 980*9525b14bSRao Shoaib spaced = 0; 981*9525b14bSRao Shoaib } 982*9525b14bSRao Shoaib else 983*9525b14bSRao Shoaib leader = " "; 984*9525b14bSRao Shoaib 985*9525b14bSRao Shoaib for (n = 0; n < len; n += 48) { 986*9525b14bSRao Shoaib T(addstr(leader, strlen(leader), 987*9525b14bSRao Shoaib &buf, &buflen)); 988*9525b14bSRao Shoaib T(addstr(base64_key + n, MIN(len - n, 48), 989*9525b14bSRao Shoaib &buf, &buflen)); 990*9525b14bSRao Shoaib } 991*9525b14bSRao Shoaib if (len > 15) 992*9525b14bSRao Shoaib T(addstr(" )", 2, &buf, &buflen)); 993*9525b14bSRao Shoaib } 994*9525b14bSRao Shoaib } 995*9525b14bSRao Shoaib 996*9525b14bSRao Shoaib case ns_t_hip: { 997*9525b14bSRao Shoaib unsigned int i, hip_len, algorithm, key_len; 998*9525b14bSRao Shoaib char base64_key[NS_MD5RSA_MAX_BASE64]; 999*9525b14bSRao Shoaib unsigned int siz; 1000*9525b14bSRao Shoaib const char *leader = "\n\t\t\t\t\t"; 1001*9525b14bSRao Shoaib 1002*9525b14bSRao Shoaib hip_len = *rdata++; 1003*9525b14bSRao Shoaib algorithm = *rdata++; 1004*9525b14bSRao Shoaib key_len = ns_get16(rdata); 1005*9525b14bSRao Shoaib rdata += NS_INT16SZ; 1006*9525b14bSRao Shoaib 1007*9525b14bSRao Shoaib siz = key_len*4/3 + 4; /* "+4" accounts for trailing \0 */ 1008*9525b14bSRao Shoaib if (siz > sizeof(base64_key) * 3/4) { 1009*9525b14bSRao Shoaib const char *str = "record too long to print"; 1010*9525b14bSRao Shoaib T(addstr(str, strlen(str), &buf, &buflen)); 1011*9525b14bSRao Shoaib } else { 1012*9525b14bSRao Shoaib len = sprintf(tmp, "( %u ", algorithm); 1013*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 1014*9525b14bSRao Shoaib 1015*9525b14bSRao Shoaib for (i = 0; i < hip_len; i++) { 1016*9525b14bSRao Shoaib len = sprintf(tmp, "%02X", *rdata); 1017*9525b14bSRao Shoaib T(addstr(tmp, len, &buf, &buflen)); 1018*9525b14bSRao Shoaib rdata++; 1019*9525b14bSRao Shoaib } 1020*9525b14bSRao Shoaib T(addstr(leader, strlen(leader), &buf, &buflen)); 1021*9525b14bSRao Shoaib 1022*9525b14bSRao Shoaib len = b64_ntop(rdata, key_len, base64_key, siz); 1023*9525b14bSRao Shoaib if (len < 0) 1024*9525b14bSRao Shoaib goto formerr; 1025*9525b14bSRao Shoaib 1026*9525b14bSRao Shoaib T(addstr(base64_key, len, &buf, &buflen)); 1027*9525b14bSRao Shoaib 1028*9525b14bSRao Shoaib rdata += key_len; 1029*9525b14bSRao Shoaib while (rdata < edata) { 1030*9525b14bSRao Shoaib T(addstr(leader, strlen(leader), &buf, &buflen)); 1031*9525b14bSRao Shoaib T(addname(msg, msglen, &rdata, origin, 1032*9525b14bSRao Shoaib &buf, &buflen)); 1033*9525b14bSRao Shoaib } 1034*9525b14bSRao Shoaib T(addstr(" )", 2, &buf, &buflen)); 1035*9525b14bSRao Shoaib } 1036*9525b14bSRao Shoaib break; 10377c478bd9Sstevel@tonic-gate } 10387c478bd9Sstevel@tonic-gate 10397c478bd9Sstevel@tonic-gate default: 10407c478bd9Sstevel@tonic-gate comment = "unknown RR type"; 10417c478bd9Sstevel@tonic-gate goto hexify; 10427c478bd9Sstevel@tonic-gate } 10437c478bd9Sstevel@tonic-gate return (buf - obuf); 10447c478bd9Sstevel@tonic-gate formerr: 10457c478bd9Sstevel@tonic-gate comment = "RR format error"; 10467c478bd9Sstevel@tonic-gate hexify: { 10477c478bd9Sstevel@tonic-gate int n, m; 10487c478bd9Sstevel@tonic-gate char *p; 10497c478bd9Sstevel@tonic-gate 1050*9525b14bSRao Shoaib len = SPRINTF((tmp, "\\# %u%s\t; %s", (unsigned)(edata - rdata), 1051*9525b14bSRao Shoaib rdlen != 0U ? " (" : "", comment)); 10527c478bd9Sstevel@tonic-gate T(addstr(tmp, len, &buf, &buflen)); 10537c478bd9Sstevel@tonic-gate while (rdata < edata) { 10547c478bd9Sstevel@tonic-gate p = tmp; 10557c478bd9Sstevel@tonic-gate p += SPRINTF((p, "\n\t")); 10567c478bd9Sstevel@tonic-gate spaced = 0; 10577c478bd9Sstevel@tonic-gate n = MIN(16, edata - rdata); 10587c478bd9Sstevel@tonic-gate for (m = 0; m < n; m++) 10597c478bd9Sstevel@tonic-gate p += SPRINTF((p, "%02x ", rdata[m])); 10607c478bd9Sstevel@tonic-gate T(addstr(tmp, p - tmp, &buf, &buflen)); 10617c478bd9Sstevel@tonic-gate if (n < 16) { 10627c478bd9Sstevel@tonic-gate T(addstr(")", 1, &buf, &buflen)); 10637c478bd9Sstevel@tonic-gate T(addtab(p - tmp + 1, 48, spaced, &buf, &buflen)); 10647c478bd9Sstevel@tonic-gate } 10657c478bd9Sstevel@tonic-gate p = tmp; 10667c478bd9Sstevel@tonic-gate p += SPRINTF((p, "; ")); 10677c478bd9Sstevel@tonic-gate for (m = 0; m < n; m++) 10687c478bd9Sstevel@tonic-gate *p++ = (isascii(rdata[m]) && isprint(rdata[m])) 10697c478bd9Sstevel@tonic-gate ? rdata[m] 10707c478bd9Sstevel@tonic-gate : '.'; 10717c478bd9Sstevel@tonic-gate T(addstr(tmp, p - tmp, &buf, &buflen)); 10727c478bd9Sstevel@tonic-gate rdata += n; 10737c478bd9Sstevel@tonic-gate } 10747c478bd9Sstevel@tonic-gate return (buf - obuf); 10757c478bd9Sstevel@tonic-gate } 10767c478bd9Sstevel@tonic-gate } 10777c478bd9Sstevel@tonic-gate 10787c478bd9Sstevel@tonic-gate /* Private. */ 10797c478bd9Sstevel@tonic-gate 1080*9525b14bSRao Shoaib /*% 10817c478bd9Sstevel@tonic-gate * size_t 10827c478bd9Sstevel@tonic-gate * prune_origin(name, origin) 10837c478bd9Sstevel@tonic-gate * Find out if the name is at or under the current origin. 10847c478bd9Sstevel@tonic-gate * return: 10857c478bd9Sstevel@tonic-gate * Number of characters in name before start of origin, 10867c478bd9Sstevel@tonic-gate * or length of name if origin does not match. 10877c478bd9Sstevel@tonic-gate * notes: 10887c478bd9Sstevel@tonic-gate * This function should share code with samedomain(). 10897c478bd9Sstevel@tonic-gate */ 10907c478bd9Sstevel@tonic-gate static size_t 10917c478bd9Sstevel@tonic-gate prune_origin(const char *name, const char *origin) { 10927c478bd9Sstevel@tonic-gate const char *oname = name; 10937c478bd9Sstevel@tonic-gate 10947c478bd9Sstevel@tonic-gate while (*name != '\0') { 10957c478bd9Sstevel@tonic-gate if (origin != NULL && ns_samename(name, origin) == 1) 10967c478bd9Sstevel@tonic-gate return (name - oname - (name > oname)); 10977c478bd9Sstevel@tonic-gate while (*name != '\0') { 10987c478bd9Sstevel@tonic-gate if (*name == '\\') { 10997c478bd9Sstevel@tonic-gate name++; 11007c478bd9Sstevel@tonic-gate /* XXX need to handle \nnn form. */ 11017c478bd9Sstevel@tonic-gate if (*name == '\0') 11027c478bd9Sstevel@tonic-gate break; 11037c478bd9Sstevel@tonic-gate } else if (*name == '.') { 11047c478bd9Sstevel@tonic-gate name++; 11057c478bd9Sstevel@tonic-gate break; 11067c478bd9Sstevel@tonic-gate } 11077c478bd9Sstevel@tonic-gate name++; 11087c478bd9Sstevel@tonic-gate } 11097c478bd9Sstevel@tonic-gate } 11107c478bd9Sstevel@tonic-gate return (name - oname); 11117c478bd9Sstevel@tonic-gate } 11127c478bd9Sstevel@tonic-gate 1113*9525b14bSRao Shoaib /*% 11147c478bd9Sstevel@tonic-gate * int 11157c478bd9Sstevel@tonic-gate * charstr(rdata, edata, buf, buflen) 11167c478bd9Sstevel@tonic-gate * Format a <character-string> into the presentation buffer. 11177c478bd9Sstevel@tonic-gate * return: 11187c478bd9Sstevel@tonic-gate * Number of rdata octets consumed 11197c478bd9Sstevel@tonic-gate * 0 for protocol format error 11207c478bd9Sstevel@tonic-gate * -1 for output buffer error 11217c478bd9Sstevel@tonic-gate * side effects: 11227c478bd9Sstevel@tonic-gate * buffer is advanced on success. 11237c478bd9Sstevel@tonic-gate */ 11247c478bd9Sstevel@tonic-gate static int 11257c478bd9Sstevel@tonic-gate charstr(const u_char *rdata, const u_char *edata, char **buf, size_t *buflen) { 11267c478bd9Sstevel@tonic-gate const u_char *odata = rdata; 11277c478bd9Sstevel@tonic-gate size_t save_buflen = *buflen; 11287c478bd9Sstevel@tonic-gate char *save_buf = *buf; 11297c478bd9Sstevel@tonic-gate 11307c478bd9Sstevel@tonic-gate if (addstr("\"", 1, buf, buflen) < 0) 11317c478bd9Sstevel@tonic-gate goto enospc; 11327c478bd9Sstevel@tonic-gate if (rdata < edata) { 11337c478bd9Sstevel@tonic-gate int n = *rdata; 11347c478bd9Sstevel@tonic-gate 11357c478bd9Sstevel@tonic-gate if (rdata + 1 + n <= edata) { 11367c478bd9Sstevel@tonic-gate rdata++; 11377c478bd9Sstevel@tonic-gate while (n-- > 0) { 11387c478bd9Sstevel@tonic-gate if (strchr("\n\"\\", *rdata) != NULL) 11397c478bd9Sstevel@tonic-gate if (addstr("\\", 1, buf, buflen) < 0) 11407c478bd9Sstevel@tonic-gate goto enospc; 11417c478bd9Sstevel@tonic-gate if (addstr((const char *)rdata, 1, 11427c478bd9Sstevel@tonic-gate buf, buflen) < 0) 11437c478bd9Sstevel@tonic-gate goto enospc; 11447c478bd9Sstevel@tonic-gate rdata++; 11457c478bd9Sstevel@tonic-gate } 11467c478bd9Sstevel@tonic-gate } 11477c478bd9Sstevel@tonic-gate } 11487c478bd9Sstevel@tonic-gate if (addstr("\"", 1, buf, buflen) < 0) 11497c478bd9Sstevel@tonic-gate goto enospc; 11507c478bd9Sstevel@tonic-gate return (rdata - odata); 11517c478bd9Sstevel@tonic-gate enospc: 11527c478bd9Sstevel@tonic-gate errno = ENOSPC; 11537c478bd9Sstevel@tonic-gate *buf = save_buf; 11547c478bd9Sstevel@tonic-gate *buflen = save_buflen; 11557c478bd9Sstevel@tonic-gate return (-1); 11567c478bd9Sstevel@tonic-gate } 11577c478bd9Sstevel@tonic-gate 11587c478bd9Sstevel@tonic-gate static int 11597c478bd9Sstevel@tonic-gate addname(const u_char *msg, size_t msglen, 11607c478bd9Sstevel@tonic-gate const u_char **pp, const char *origin, 11617c478bd9Sstevel@tonic-gate char **buf, size_t *buflen) 11627c478bd9Sstevel@tonic-gate { 11637c478bd9Sstevel@tonic-gate size_t newlen, save_buflen = *buflen; 11647c478bd9Sstevel@tonic-gate char *save_buf = *buf; 11657c478bd9Sstevel@tonic-gate int n; 11667c478bd9Sstevel@tonic-gate 11677c478bd9Sstevel@tonic-gate n = dn_expand(msg, msg + msglen, *pp, *buf, *buflen); 11687c478bd9Sstevel@tonic-gate if (n < 0) 1169*9525b14bSRao Shoaib goto enospc; /*%< Guess. */ 11707c478bd9Sstevel@tonic-gate newlen = prune_origin(*buf, origin); 11717c478bd9Sstevel@tonic-gate if (**buf == '\0') { 11727c478bd9Sstevel@tonic-gate goto root; 1173*9525b14bSRao Shoaib } else if (newlen == 0U) { 11747c478bd9Sstevel@tonic-gate /* Use "@" instead of name. */ 11757c478bd9Sstevel@tonic-gate if (newlen + 2 > *buflen) 11767c478bd9Sstevel@tonic-gate goto enospc; /* No room for "@\0". */ 11777c478bd9Sstevel@tonic-gate (*buf)[newlen++] = '@'; 11787c478bd9Sstevel@tonic-gate (*buf)[newlen] = '\0'; 11797c478bd9Sstevel@tonic-gate } else { 11807c478bd9Sstevel@tonic-gate if (((origin == NULL || origin[0] == '\0') || 11817c478bd9Sstevel@tonic-gate (origin[0] != '.' && origin[1] != '\0' && 11827c478bd9Sstevel@tonic-gate (*buf)[newlen] == '\0')) && (*buf)[newlen - 1] != '.') { 11837c478bd9Sstevel@tonic-gate /* No trailing dot. */ 11847c478bd9Sstevel@tonic-gate root: 11857c478bd9Sstevel@tonic-gate if (newlen + 2 > *buflen) 11867c478bd9Sstevel@tonic-gate goto enospc; /* No room for ".\0". */ 11877c478bd9Sstevel@tonic-gate (*buf)[newlen++] = '.'; 11887c478bd9Sstevel@tonic-gate (*buf)[newlen] = '\0'; 11897c478bd9Sstevel@tonic-gate } 11907c478bd9Sstevel@tonic-gate } 11917c478bd9Sstevel@tonic-gate *pp += n; 11927c478bd9Sstevel@tonic-gate addlen(newlen, buf, buflen); 11937c478bd9Sstevel@tonic-gate **buf = '\0'; 11947c478bd9Sstevel@tonic-gate return (newlen); 11957c478bd9Sstevel@tonic-gate enospc: 11967c478bd9Sstevel@tonic-gate errno = ENOSPC; 11977c478bd9Sstevel@tonic-gate *buf = save_buf; 11987c478bd9Sstevel@tonic-gate *buflen = save_buflen; 11997c478bd9Sstevel@tonic-gate return (-1); 12007c478bd9Sstevel@tonic-gate } 12017c478bd9Sstevel@tonic-gate 12027c478bd9Sstevel@tonic-gate static void 12037c478bd9Sstevel@tonic-gate addlen(size_t len, char **buf, size_t *buflen) { 12047c478bd9Sstevel@tonic-gate INSIST(len <= *buflen); 12057c478bd9Sstevel@tonic-gate *buf += len; 12067c478bd9Sstevel@tonic-gate *buflen -= len; 12077c478bd9Sstevel@tonic-gate } 12087c478bd9Sstevel@tonic-gate 12097c478bd9Sstevel@tonic-gate static int 12107c478bd9Sstevel@tonic-gate addstr(const char *src, size_t len, char **buf, size_t *buflen) { 12117c478bd9Sstevel@tonic-gate if (len >= *buflen) { 12127c478bd9Sstevel@tonic-gate errno = ENOSPC; 12137c478bd9Sstevel@tonic-gate return (-1); 12147c478bd9Sstevel@tonic-gate } 12157c478bd9Sstevel@tonic-gate memcpy(*buf, src, len); 12167c478bd9Sstevel@tonic-gate addlen(len, buf, buflen); 12177c478bd9Sstevel@tonic-gate **buf = '\0'; 12187c478bd9Sstevel@tonic-gate return (0); 12197c478bd9Sstevel@tonic-gate } 12207c478bd9Sstevel@tonic-gate 12217c478bd9Sstevel@tonic-gate static int 12227c478bd9Sstevel@tonic-gate addtab(size_t len, size_t target, int spaced, char **buf, size_t *buflen) { 12237c478bd9Sstevel@tonic-gate size_t save_buflen = *buflen; 12247c478bd9Sstevel@tonic-gate char *save_buf = *buf; 12257c478bd9Sstevel@tonic-gate int t; 12267c478bd9Sstevel@tonic-gate 12277c478bd9Sstevel@tonic-gate if (spaced || len >= target - 1) { 12287c478bd9Sstevel@tonic-gate T(addstr(" ", 2, buf, buflen)); 12297c478bd9Sstevel@tonic-gate spaced = 1; 12307c478bd9Sstevel@tonic-gate } else { 12317c478bd9Sstevel@tonic-gate for (t = (target - len - 1) / 8; t >= 0; t--) 12327c478bd9Sstevel@tonic-gate if (addstr("\t", 1, buf, buflen) < 0) { 12337c478bd9Sstevel@tonic-gate *buflen = save_buflen; 12347c478bd9Sstevel@tonic-gate *buf = save_buf; 12357c478bd9Sstevel@tonic-gate return (-1); 12367c478bd9Sstevel@tonic-gate } 12377c478bd9Sstevel@tonic-gate spaced = 0; 12387c478bd9Sstevel@tonic-gate } 12397c478bd9Sstevel@tonic-gate return (spaced); 12407c478bd9Sstevel@tonic-gate } 1241*9525b14bSRao Shoaib 1242*9525b14bSRao Shoaib /*! \file */ 1243