rcode.c revision ce67023ae3ad39a77da5361d0187ab6f3f0219cb
ca41b452ede6feaa9d8739ec3cae19389a7b0d03Bob Halley * Copyright (C) 2004-2014 Internet Systems Consortium, Inc. ("ISC")
615eff12e0e3565c52758292e10080a25d872941William King * Copyright (C) 1998-2003 Internet Software Consortium.
615eff12e0e3565c52758292e10080a25d872941William King * Permission to use, copy, modify, and/or distribute this software for any
615eff12e0e3565c52758292e10080a25d872941William King * purpose with or without fee is hereby granted, provided that the above
615eff12e0e3565c52758292e10080a25d872941William King * copyright notice and this permission notice appear in all copies.
615eff12e0e3565c52758292e10080a25d872941William King * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
615eff12e0e3565c52758292e10080a25d872941William King * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
615eff12e0e3565c52758292e10080a25d872941William King * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
615eff12e0e3565c52758292e10080a25d872941William King * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
615eff12e0e3565c52758292e10080a25d872941William King * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
615eff12e0e3565c52758292e10080a25d872941William King * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
615eff12e0e3565c52758292e10080a25d872941William King * PERFORMANCE OF THIS SOFTWARE.
615eff12e0e3565c52758292e10080a25d872941William King#define NUMBERSIZE sizeof("037777777777") /* 2^32-1 octal + NUL */
615eff12e0e3565c52758292e10080a25d872941William King /* standard rcodes */ \
615eff12e0e3565c52758292e10080a25d872941William King /* extended rcodes */ \
615eff12e0e3565c52758292e10080a25d872941William King /* extended rcodes */ \
615eff12e0e3565c52758292e10080a25d872941William King/* RFC4398 section 2.1 */
615eff12e0e3565c52758292e10080a25d872941William King/* RFC2535 section 7, RFC3110 */
615eff12e0e3565c52758292e10080a25d872941William King { DNS_KEYALG_NSEC3RSASHA1, "NSEC3RSASHA1", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { DNS_KEYALG_RSASHA256, "RSASHA256", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { DNS_KEYALG_RSASHA512, "RSASHA512", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { DNS_KEYALG_ECDSA256, "ECDSAP256SHA256", 0 }, \
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington { DNS_KEYALG_ECDSA384, "ECDSAP384SHA384", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { DNS_KEYALG_PRIVATEDNS, "PRIVATEDNS", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { DNS_KEYALG_PRIVATEOID, "PRIVATEOID", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington/* RFC2535 section 7.1 */
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { 0, "NONE", 0 }, \
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington/* RFC3658, RFC4509, RFC5933, RFC6605 */
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct tbl rcodes[] = { RCODENAMES ERCODENAMES };
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct tbl tsigrcodes[] = { RCODENAMES TSIGRCODENAMES };
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct tbl secalgs[] = { SECALGNAMES };
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct tbl secprotos[] = { SECPROTONAMES };
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct tbl hashalgs[] = { HASHALGNAMES };
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct tbl dsdigests[] = { DSDIGESTNAMES };
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic struct keyflag {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington unsigned int mask;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington { "KSK", DNS_KEYFLAG_KSK, DNS_KEYFLAG_KSK },
81ab85fd39c3f6c781ecac725d830364a311479dBrian Wellingtonstr_totext(const char *source, isc_buffer_t *target) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington unsigned int l;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_buffer_availableregion(target, ®ion);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonmaybe_numeric(unsigned int *valuep, isc_textregion_t *source,
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington * We have a potential number. Try to parse it with
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington * isc_parse_uint32(). isc_parse_uint32() requires
615eff12e0e3565c52758292e10080a25d872941William King * null termination, so we must make a copy.
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence strncpy(buffer, source->base, sizeof(buffer));
a7d792804f564aa0889a94f64913b11bffd9738cBrian Wellingtondns_mnemonic_fromtext(unsigned int *valuep, isc_textregion_t *source,
615eff12e0e3565c52758292e10080a25d872941William King result = maybe_numeric(valuep, source, max, ISC_FALSE);
615eff12e0e3565c52758292e10080a25d872941William King unsigned int n;
615eff12e0e3565c52758292e10080a25d872941William King strncasecmp(source->base, table[i].name, n) == 0) {
615eff12e0e3565c52758292e10080a25d872941William Kingdns_mnemonic_totext(unsigned int value, isc_buffer_t *target,
615eff12e0e3565c52758292e10080a25d872941William Kingdns_rcode_fromtext(dns_rcode_t *rcodep, isc_textregion_t *source) {
615eff12e0e3565c52758292e10080a25d872941William King unsigned int value;
615eff12e0e3565c52758292e10080a25d872941William King RETERR(dns_mnemonic_fromtext(&value, source, rcodes, 0xffff));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_rcode_totext(dns_rcode_t rcode, isc_buffer_t *target) {
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington return (dns_mnemonic_totext(rcode, target, rcodes));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtondns_tsigrcode_fromtext(dns_rcode_t *rcodep, isc_textregion_t *source) {
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington RETERR(dns_mnemonic_fromtext(&value, source, tsigrcodes, 0xffff));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_tsigrcode_totext(dns_rcode_t rcode, isc_buffer_t *target) {
615eff12e0e3565c52758292e10080a25d872941William King return (dns_mnemonic_totext(rcode, target, tsigrcodes));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtondns_cert_fromtext(dns_cert_t *certp, isc_textregion_t *source) {
615eff12e0e3565c52758292e10080a25d872941William King RETERR(dns_mnemonic_fromtext(&value, source, certs, 0xffff));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_cert_totext(dns_cert_t cert, isc_buffer_t *target) {
615eff12e0e3565c52758292e10080a25d872941William King return (dns_mnemonic_totext(cert, target, certs));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_secalg_fromtext(dns_secalg_t *secalgp, isc_textregion_t *source) {
615eff12e0e3565c52758292e10080a25d872941William King unsigned int value;
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence RETERR(dns_mnemonic_fromtext(&value, source, secalgs, 0xff));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_secalg_totext(dns_secalg_t secalg, isc_buffer_t *target) {
615eff12e0e3565c52758292e10080a25d872941William King return (dns_mnemonic_totext(secalg, target, secalgs));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_secalg_format(dns_secalg_t alg, char *cp, unsigned int size) {
615eff12e0e3565c52758292e10080a25d872941William Kingdns_secproto_fromtext(dns_secproto_t *secprotop, isc_textregion_t *source) {
615eff12e0e3565c52758292e10080a25d872941William King unsigned int value;
615eff12e0e3565c52758292e10080a25d872941William King RETERR(dns_mnemonic_fromtext(&value, source, secprotos, 0xff));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtondns_secproto_totext(dns_secproto_t secproto, isc_buffer_t *target) {
615eff12e0e3565c52758292e10080a25d872941William King return (dns_mnemonic_totext(secproto, target, secprotos));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_hashalg_fromtext(unsigned char *hashalg, isc_textregion_t *source) {
615eff12e0e3565c52758292e10080a25d872941William King unsigned int value;
615eff12e0e3565c52758292e10080a25d872941William King RETERR(dns_mnemonic_fromtext(&value, source, hashalgs, 0xff));
615eff12e0e3565c52758292e10080a25d872941William Kingdns_keyflags_fromtext(dns_keyflags_t *flagsp, isc_textregion_t *source)
615eff12e0e3565c52758292e10080a25d872941William King result = maybe_numeric(&value, source, 0xffff, ISC_TRUE);
0942b8e0d660895ae96ffbd447fd0290fe60539cMichael Graff unsigned int len;
615eff12e0e3565c52758292e10080a25d872941William Kingdns_dsdigest_fromtext(dns_dsdigest_t *dsdigestp, isc_textregion_t *source) {
615eff12e0e3565c52758292e10080a25d872941William King unsigned int value;
615eff12e0e3565c52758292e10080a25d872941William King RETERR(dns_mnemonic_fromtext(&value, source, dsdigests, 0xff));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William Kingdns_dsdigest_totext(dns_dsdigest_t dsdigest, isc_buffer_t *target) {
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence return (dns_mnemonic_totext(dsdigest, target, dsdigests));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William Kingdns_dsdigest_format(dns_dsdigest_t typ, char *cp, unsigned int size) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * This uses lots of hard coded values, but how often do we actually
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * add classes?
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William Kingdns_rdataclass_fromtext(dns_rdataclass_t *classp, isc_textregion_t *source) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King && (strncasecmp(source->base, string, source->length) == 0)) { \
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King switch (tolower((unsigned char)source->base[0])) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * RFC1035 says the mnemonic for the CHAOS class is CH,
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * but historical BIND practice is to call it CHAOS.
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * We will accept both forms, but only generate CH.
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King unsigned int val;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King strncpy(buf, source->base + 5, source->length - 5);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King COMPARE("reserved0", dns_rdataclass_reserved0);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William Kingdns_rdataclass_totext(dns_rdataclass_t rdclass, isc_buffer_t *target) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King snprintf(buf, sizeof(buf), "CLASS%u", rdclass);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Null terminate.