version 1.8, 2008/06/21 20:41:48 |
version 1.8.4.1, 2011/01/06 21:42:48 |
|
|
#include <sys/cdefs.h> |
#include <sys/cdefs.h> |
#ifndef lint |
#ifndef lint |
#ifdef notdef |
#ifdef notdef |
static const char rcsid[] = "Id: ns_print.c,v 1.10 2005/04/27 04:56:40 sra Exp"; |
static const char rcsid[] = "Id: ns_print.c,v 1.12 2009/03/03 05:29:58 each Exp"; |
#else |
#else |
__RCSID("$NetBSD$"); |
__RCSID("$NetBSD$"); |
#endif |
#endif |
Line 74 static int addtab(size_t len, size_t tar |
|
Line 74 static int addtab(size_t len, size_t tar |
|
return (-1); \ |
return (-1); \ |
} while (/*CONSTCOND*/0) |
} while (/*CONSTCOND*/0) |
|
|
|
static const char base32hex[] = |
|
"0123456789ABCDEFGHIJKLMNOPQRSTUV=0123456789abcdefghijklmnopqrstuv"; |
|
|
/* Public. */ |
/* Public. */ |
|
|
/*% |
/*% |
Line 257 ns_sprintrrf(const u_char *msg, size_t m |
|
Line 260 ns_sprintrrf(const u_char *msg, size_t m |
|
|
|
case ns_t_mx: |
case ns_t_mx: |
case ns_t_afsdb: |
case ns_t_afsdb: |
case ns_t_rt: { |
case ns_t_rt: |
|
case ns_t_kx: { |
u_int t; |
u_int t; |
|
|
if (rdlen < (size_t)NS_INT16SZ) |
if (rdlen < (size_t)NS_INT16SZ) |
Line 305 ns_sprintrrf(const u_char *msg, size_t m |
|
Line 309 ns_sprintrrf(const u_char *msg, size_t m |
|
break; |
break; |
|
|
case ns_t_txt: |
case ns_t_txt: |
|
case ns_t_spf: |
while (rdata < edata) { |
while (rdata < edata) { |
T(len = charstr(rdata, edata, &buf, &buflen)); |
T(len = charstr(rdata, edata, &buf, &buflen)); |
if (len == 0) |
if (len == 0) |
Line 451 ns_sprintrrf(const u_char *msg, size_t m |
|
Line 456 ns_sprintrrf(const u_char *msg, size_t m |
|
break; |
break; |
} |
} |
|
|
case ns_t_key: { |
case ns_t_key: |
|
case ns_t_dnskey: { |
char base64_key[NS_MD5RSA_MAX_BASE64]; |
char base64_key[NS_MD5RSA_MAX_BASE64]; |
u_int keyflags, protocol, algorithm, key_id; |
u_int keyflags, protocol, algorithm, key_id; |
const char *leader; |
const char *leader; |
Line 497 ns_sprintrrf(const u_char *msg, size_t m |
|
Line 503 ns_sprintrrf(const u_char *msg, size_t m |
|
break; |
break; |
} |
} |
|
|
case ns_t_sig: { |
case ns_t_sig: |
|
case ns_t_rrsig: { |
char base64_key[NS_MD5RSA_MAX_BASE64]; |
char base64_key[NS_MD5RSA_MAX_BASE64]; |
u_int typ, algorithm, labels, footprint; |
u_int typ, algorithm, labels, footprint; |
const char *leader; |
const char *leader; |
Line 703 ns_sprintrrf(const u_char *msg, size_t m |
|
Line 710 ns_sprintrrf(const u_char *msg, size_t m |
|
break; |
break; |
} |
} |
|
|
|
case ns_t_ds: |
|
case ns_t_dlv: |
|
case ns_t_sshfp: { |
|
u_int t; |
|
|
|
if (type == ns_t_ds || type == ns_t_dlv) { |
|
if (rdlen < 4U) goto formerr; |
|
t = ns_get16(rdata); |
|
rdata += NS_INT16SZ; |
|
len = SPRINTF((tmp, "%u ", t)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
} else |
|
if (rdlen < 2U) goto formerr; |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
while (rdata < edata) { |
|
len = SPRINTF((tmp, "%02X", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
} |
|
break; |
|
} |
|
|
|
case ns_t_nsec3: |
|
case ns_t_nsec3param: { |
|
u_int t, w, l, j, k, c; |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
t = ns_get16(rdata); |
|
rdata += NS_INT16SZ; |
|
len = SPRINTF((tmp, "%u ", t)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
|
|
t = *rdata++; |
|
if (t == 0) { |
|
T(addstr("-", 1, &buf, &buflen)); |
|
} else { |
|
while (t-- > 0) { |
|
len = SPRINTF((tmp, "%02X", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
} |
|
} |
|
if (type == ns_t_nsec3param) |
|
break; |
|
T(addstr(" ", 1, &buf, &buflen)); |
|
|
|
t = *rdata++; |
|
while (t > 0) { |
|
switch (t) { |
|
case 1: |
|
tmp[0] = base32hex[(((uint32_t)rdata[0]>>3)&0x1f)]; |
|
tmp[1] = base32hex[(((uint32_t)rdata[0]<<2)&0x1c)]; |
|
tmp[2] = tmp[3] = tmp[4] = '='; |
|
tmp[5] = tmp[6] = tmp[7] = '='; |
|
break; |
|
case 2: |
|
tmp[0] = base32hex[(((uint32_t)rdata[0]>>3)&0x1f)]; |
|
tmp[1] = base32hex[(((uint32_t)rdata[0]<<2)&0x1c)| |
|
(((uint32_t)rdata[1]>>6)&0x03)]; |
|
tmp[2] = base32hex[(((uint32_t)rdata[1]>>1)&0x1f)]; |
|
tmp[3] = base32hex[(((uint32_t)rdata[1]<<4)&0x10)]; |
|
tmp[4] = tmp[5] = tmp[6] = tmp[7] = '='; |
|
break; |
|
case 3: |
|
tmp[0] = base32hex[(((uint32_t)rdata[0]>>3)&0x1f)]; |
|
tmp[1] = base32hex[(((uint32_t)rdata[0]<<2)&0x1c)| |
|
(((uint32_t)rdata[1]>>6)&0x03)]; |
|
tmp[2] = base32hex[(((uint32_t)rdata[1]>>1)&0x1f)]; |
|
tmp[3] = base32hex[(((uint32_t)rdata[1]<<4)&0x10)| |
|
(((uint32_t)rdata[2]>>4)&0x0f)]; |
|
tmp[4] = base32hex[(((uint32_t)rdata[2]<<1)&0x1e)]; |
|
tmp[5] = tmp[6] = tmp[7] = '='; |
|
break; |
|
case 4: |
|
tmp[0] = base32hex[(((uint32_t)rdata[0]>>3)&0x1f)]; |
|
tmp[1] = base32hex[(((uint32_t)rdata[0]<<2)&0x1c)| |
|
(((uint32_t)rdata[1]>>6)&0x03)]; |
|
tmp[2] = base32hex[(((uint32_t)rdata[1]>>1)&0x1f)]; |
|
tmp[3] = base32hex[(((uint32_t)rdata[1]<<4)&0x10)| |
|
(((uint32_t)rdata[2]>>4)&0x0f)]; |
|
tmp[4] = base32hex[(((uint32_t)rdata[2]<<1)&0x1e)| |
|
(((uint32_t)rdata[3]>>7)&0x01)]; |
|
tmp[5] = base32hex[(((uint32_t)rdata[3]>>2)&0x1f)]; |
|
tmp[6] = base32hex[((uint32_t)rdata[3]<<3)&0x18]; |
|
tmp[7] = '='; |
|
break; |
|
default: |
|
tmp[0] = base32hex[(((uint32_t)rdata[0]>>3)&0x1f)]; |
|
tmp[1] = base32hex[(((uint32_t)rdata[0]<<2)&0x1c)| |
|
(((uint32_t)rdata[1]>>6)&0x03)]; |
|
tmp[2] = base32hex[(((uint32_t)rdata[1]>>1)&0x1f)]; |
|
tmp[3] = base32hex[(((uint32_t)rdata[1]<<4)&0x10)| |
|
(((uint32_t)rdata[2]>>4)&0x0f)]; |
|
tmp[4] = base32hex[(((uint32_t)rdata[2]<<1)&0x1e)| |
|
(((uint32_t)rdata[3]>>7)&0x01)]; |
|
tmp[5] = base32hex[(((uint32_t)rdata[3]>>2)&0x1f)]; |
|
tmp[6] = base32hex[(((uint32_t)rdata[3]<<3)&0x18)| |
|
(((uint32_t)rdata[4]>>5)&0x07)]; |
|
tmp[7] = base32hex[(rdata[4]&0x1f)]; |
|
break; |
|
} |
|
T(addstr(tmp, 8, &buf, &buflen)); |
|
if (t >= 5) { |
|
rdata += 5; |
|
t -= 5; |
|
} else { |
|
rdata += t; |
|
t -= t; |
|
} |
|
} |
|
|
|
while (rdata < edata) { |
|
w = *rdata++; |
|
l = *rdata++; |
|
for (j = 0; j < l; j++) { |
|
if (rdata[j] == 0) |
|
continue; |
|
for (k = 0; k < 8; k++) { |
|
if ((rdata[j] & (0x80 >> k)) == 0) |
|
continue; |
|
c = w * 256 + j * 8 + k; |
|
len = SPRINTF((tmp, " %s", p_type((ns_type)c))); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
} |
|
} |
|
rdata += l; |
|
} |
|
break; |
|
} |
|
|
|
case ns_t_nsec: { |
|
u_int w, l, j, k, c; |
|
|
|
T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); |
|
|
|
while (rdata < edata) { |
|
w = *rdata++; |
|
l = *rdata++; |
|
for (j = 0; j < l; j++) { |
|
if (rdata[j] == 0) |
|
continue; |
|
for (k = 0; k < 8; k++) { |
|
if ((rdata[j] & (0x80 >> k)) == 0) |
|
continue; |
|
c = w * 256 + j * 8 + k; |
|
len = SPRINTF((tmp, " %s", p_type((ns_type)c))); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
} |
|
} |
|
rdata += l; |
|
} |
|
break; |
|
} |
|
|
|
case ns_t_dhcid: { |
|
int n; |
|
unsigned int siz; |
|
char base64_dhcid[8192]; |
|
const char *leader; |
|
|
|
siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ |
|
if (siz > sizeof(base64_dhcid) * 3/4) { |
|
const char *str = "record too long to print"; |
|
T(addstr(str, strlen(str), &buf, &buflen)); |
|
} else { |
|
len = b64_ntop(rdata, (size_t)(edata-rdata), |
|
base64_dhcid, siz); |
|
|
|
if (len < 0) |
|
goto formerr; |
|
|
|
else if (len > 15) { |
|
T(addstr(" (", 2, &buf, &buflen)); |
|
leader = "\n\t\t"; |
|
spaced = 0; |
|
} |
|
else |
|
leader = " "; |
|
|
|
for (n = 0; n < len; n += 48) { |
|
T(addstr(leader, strlen(leader), |
|
&buf, &buflen)); |
|
T(addstr(base64_dhcid + n, |
|
(size_t)MIN(len - n, 48), &buf, &buflen)); |
|
} |
|
if (len > 15) |
|
T(addstr(" )", 2, &buf, &buflen)); |
|
} |
|
break; |
|
} |
|
|
|
case ns_t_ipseckey: { |
|
int n; |
|
unsigned int siz; |
|
char base64_key[8192]; |
|
const char *leader; |
|
|
|
if (rdlen < 2) |
|
goto formerr; |
|
|
|
switch (rdata[1]) { |
|
case 0: |
|
case 3: |
|
if (rdlen < 3) |
|
goto formerr; |
|
break; |
|
case 1: |
|
if (rdlen < 7) |
|
goto formerr; |
|
break; |
|
case 2: |
|
if (rdlen < 19) |
|
goto formerr; |
|
break; |
|
default: |
|
comment = "unknown IPSECKEY gateway type"; |
|
goto hexify; |
|
} |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
len = SPRINTF((tmp, "%u ", *rdata)); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
|
|
switch (rdata[-2]) { |
|
case 0: |
|
T(addstr(".", 1, &buf, &buflen)); |
|
break; |
|
case 1: |
|
(void) inet_ntop(AF_INET, rdata, buf, buflen); |
|
addlen(strlen(buf), &buf, &buflen); |
|
rdata += 4; |
|
break; |
|
case 2: |
|
(void) inet_ntop(AF_INET6, rdata, buf, buflen); |
|
addlen(strlen(buf), &buf, &buflen); |
|
rdata += 16; |
|
break; |
|
case 3: |
|
T(addname(msg, msglen, &rdata, origin, &buf, &buflen)); |
|
break; |
|
} |
|
|
|
if (rdata >= edata) |
|
break; |
|
|
|
siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */ |
|
if (siz > sizeof(base64_key) * 3/4) { |
|
const char *str = "record too long to print"; |
|
T(addstr(str, strlen(str), &buf, &buflen)); |
|
} else { |
|
len = b64_ntop(rdata, (size_t)(edata-rdata), |
|
base64_key, siz); |
|
|
|
if (len < 0) |
|
goto formerr; |
|
|
|
else if (len > 15) { |
|
T(addstr(" (", 2, &buf, &buflen)); |
|
leader = "\n\t\t"; |
|
spaced = 0; |
|
} |
|
else |
|
leader = " "; |
|
|
|
for (n = 0; n < len; n += 48) { |
|
T(addstr(leader, strlen(leader), |
|
&buf, &buflen)); |
|
T(addstr(base64_key + n, |
|
(size_t)MIN(len - n, 48), &buf, &buflen)); |
|
} |
|
if (len > 15) |
|
T(addstr(" )", 2, &buf, &buflen)); |
|
} |
|
break; |
|
} |
|
|
|
case ns_t_hip: { |
|
unsigned int i, hip_len, algorithm, key_len; |
|
char base64_key[NS_MD5RSA_MAX_BASE64]; |
|
unsigned int siz; |
|
const char *leader = "\n\t\t\t\t\t"; |
|
|
|
hip_len = *rdata++; |
|
algorithm = *rdata++; |
|
key_len = ns_get16(rdata); |
|
rdata += NS_INT16SZ; |
|
|
|
siz = key_len*4/3 + 4; /* "+4" accounts for trailing \0 */ |
|
if (siz > sizeof(base64_key) * 3/4) { |
|
const char *str = "record too long to print"; |
|
T(addstr(str, strlen(str), &buf, &buflen)); |
|
} else { |
|
len = sprintf(tmp, "( %u ", algorithm); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
|
|
for (i = 0; i < hip_len; i++) { |
|
len = sprintf(tmp, "%02X", *rdata); |
|
T(addstr(tmp, (size_t)len, &buf, &buflen)); |
|
rdata++; |
|
} |
|
T(addstr(leader, strlen(leader), &buf, &buflen)); |
|
|
|
len = b64_ntop(rdata, key_len, base64_key, siz); |
|
if (len < 0) |
|
goto formerr; |
|
|
|
T(addstr(base64_key, (size_t)len, &buf, &buflen)); |
|
|
|
rdata += key_len; |
|
while (rdata < edata) { |
|
T(addstr(leader, strlen(leader), &buf, &buflen)); |
|
T(addname(msg, msglen, &rdata, origin, |
|
&buf, &buflen)); |
|
} |
|
T(addstr(" )", 2, &buf, &buflen)); |
|
} |
|
break; |
|
} |
|
|
default: |
default: |
comment = "unknown RR type"; |
comment = "unknown RR type"; |
goto hexify; |
goto hexify; |