diff options
Diffstat (limited to 'src/libknot/util/descriptor.c')
-rw-r--r-- | src/libknot/util/descriptor.c | 601 |
1 files changed, 0 insertions, 601 deletions
diff --git a/src/libknot/util/descriptor.c b/src/libknot/util/descriptor.c deleted file mode 100644 index 8cab6b4..0000000 --- a/src/libknot/util/descriptor.c +++ /dev/null @@ -1,601 +0,0 @@ -/*! - * \file descriptor.c - * - * \author Modifications by Jan Kadlec <jan.kadlec@nic.cz>, - * most of the work by NLnet labs. - * Copyright (c) 2001-2011, NLnet Labs. All rights reserved. - * - * \note Most of the constants and functions were taken from NSD's dns.c. - * - * \addtogroup libknot - * @{ - */ - -/* - * Copyright (c) 2001-2011, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include <config.h> -#include <stdlib.h> -#include <string.h> -#include <stdio.h> -#include <ctype.h> -#include <assert.h> -#include <string.h> -#include <sys/types.h> - -#include "libknot.h" - -enum desclen { KNOT_RRTYPE_DESCRIPTORS_LENGTH = 32770 }; // used to be 101 - -/*! - * \brief Table for linking RR class constants to their textual representation. - */ -static knot_lookup_table_t dns_rrclasses[] = { - { KNOT_CLASS_IN, "IN" }, /* the Internet */ - { KNOT_CLASS_CS, "CS" }, /* the CSNET class (Obsolete) */ - { KNOT_CLASS_CH, "CH" }, /* the CHAOS class */ - { KNOT_CLASS_HS, "HS" }, /* Hesiod */ - { 0, NULL } -}; - -/*! \brief DS digest lengths. */ -enum knot_ds_algorithm_len -{ - KNOT_DS_DIGEST_LEN_SHA1 = 20, /* 20B - RFC 3658 */ - KNOT_DS_DIGEST_LEN_SHA256 = 32, /* 32B - RFC 4509 */ - KNOT_DS_DIGEST_LEN_GOST = 32, /* 32B - RFC 5933 */ - KNOT_DS_DIGEST_LEN_SHA384 = 48 /* 48B - RFC 6605 */ -}; - -/*! \brief RR type descriptors. */ -static knot_rrtype_descriptor_t - knot_rrtype_descriptors[KNOT_RRTYPE_DESCRIPTORS_LENGTH] = { - /* 0 */ - { 0, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 1 */ - { KNOT_RRTYPE_A, "A", 1, { KNOT_RDATA_WF_A }, { KNOT_RDATA_ZF_A }, true }, - /* 2 */ - { KNOT_RRTYPE_NS, "NS", 1, - { KNOT_RDATA_WF_COMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 3 */ - { KNOT_RRTYPE_MD, "MD", 1, - { KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 4 */ - { KNOT_RRTYPE_MF, "MF", 1, - { KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 5 */ - { KNOT_RRTYPE_CNAME, "CNAME", 1, - { KNOT_RDATA_WF_COMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 6 */ - { KNOT_RRTYPE_SOA, "SOA", 7, - { KNOT_RDATA_WF_COMPRESSED_DNAME, KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_LONG, KNOT_RDATA_WF_LONG, KNOT_RDATA_WF_LONG, - KNOT_RDATA_WF_LONG, KNOT_RDATA_WF_LONG }, - { KNOT_RDATA_ZF_DNAME, KNOT_RDATA_ZF_DNAME, KNOT_RDATA_ZF_PERIOD, KNOT_RDATA_ZF_PERIOD, - KNOT_RDATA_ZF_PERIOD, KNOT_RDATA_ZF_PERIOD, KNOT_RDATA_ZF_PERIOD }, - true }, - /* 7 */ - { KNOT_RRTYPE_MB, "MB", 1, - { KNOT_RDATA_WF_COMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 8 */ - { KNOT_RRTYPE_MG, "MG", 1, - { KNOT_RDATA_WF_COMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 9 */ - { KNOT_RRTYPE_MR, "MR", 1, - { KNOT_RDATA_WF_COMPRESSED_DNAME }, { KNOT_RDATA_ZF_DNAME }, true }, - /* 10 */ - { KNOT_RRTYPE_NULL, NULL, 1, - { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 11 */ - { KNOT_RRTYPE_WKS, "WKS", 2, - { KNOT_RDATA_WF_A, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_A, KNOT_RDATA_ZF_SERVICES }, true }, - /* 12 */ - { KNOT_RRTYPE_PTR, "PTR", 1, - { KNOT_RDATA_WF_COMPRESSED_DNAME }, - { KNOT_RDATA_ZF_DNAME }, true }, - /* 13 */ - { KNOT_RRTYPE_HINFO, "HINFO", 2, - { KNOT_RDATA_WF_TEXT_SINGLE, KNOT_RDATA_WF_TEXT_SINGLE }, - { KNOT_RDATA_ZF_TEXT_SINGLE, KNOT_RDATA_ZF_TEXT_SINGLE }, true }, - /* 14 */ - { KNOT_RRTYPE_MINFO, "MINFO", 2, - { KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_COMPRESSED_DNAME }, - { KNOT_RDATA_ZF_DNAME, KNOT_RDATA_ZF_DNAME }, true }, - /* 15 */ - { KNOT_RRTYPE_MX, "MX", 2, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_COMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME }, true }, - /* 16 */ /* This is obscure, but I guess there's no other way */ - { KNOT_RRTYPE_TXT, "TXT", 1, - { KNOT_RDATA_WF_TEXT }, - { KNOT_RDATA_ZF_TEXT }, - false }, - /* 17 */ - { KNOT_RRTYPE_RP, "RP", 2, - { KNOT_RDATA_WF_COMPRESSED_DNAME, - KNOT_RDATA_WF_COMPRESSED_DNAME }, - { KNOT_RDATA_ZF_DNAME, KNOT_RDATA_ZF_DNAME }, true }, - /* 18 */ - { KNOT_RRTYPE_AFSDB, "AFSDB", 2, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_COMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME }, true }, - /* 19 */ - { KNOT_RRTYPE_X25, "X25", 1, - { KNOT_RDATA_WF_TEXT_SINGLE }, - { KNOT_RDATA_ZF_TEXT_SINGLE }, true }, - /* 20 */ - { KNOT_RRTYPE_ISDN, "ISDN", 2, - { KNOT_RDATA_WF_TEXT_SINGLE, KNOT_RDATA_WF_TEXT_SINGLE }, - { KNOT_RDATA_ZF_TEXT_SINGLE, KNOT_RDATA_ZF_TEXT_SINGLE }, false }, - /* 21 */ - { KNOT_RRTYPE_RT, "RT", 2, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_COMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME }, true }, - /* 22 */ - { KNOT_RRTYPE_NSAP, "NSAP", 1, - { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_NSAP }, true }, - /* 23 */ - { 23, NULL, 1, { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 24 */ - { KNOT_RRTYPE_SIG, "SIG", 9, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_LONG, KNOT_RDATA_WF_LONG, KNOT_RDATA_WF_LONG, - KNOT_RDATA_WF_SHORT,KNOT_RDATA_WF_UNCOMPRESSED_DNAME, - KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_RRTYPE, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_PERIOD, - KNOT_RDATA_ZF_TIME, KNOT_RDATA_ZF_TIME, KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME, - KNOT_RDATA_ZF_BASE64 }, - true }, - /* 25 */ - { KNOT_RRTYPE_KEY, "KEY", 4, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_ALGORITHM, - KNOT_RDATA_ZF_BASE64 }, true }, - /* 26 */ - { KNOT_RRTYPE_PX, "PX", 3, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_UNCOMPRESSED_DNAME, - KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME, KNOT_RDATA_ZF_DNAME }, true }, - /* 27 */ - { 27, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 28 */ - { KNOT_RRTYPE_AAAA, "AAAA", 1, - { KNOT_RDATA_WF_AAAA }, - { KNOT_RDATA_ZF_AAAA }, true }, - /* 29 */ - { KNOT_RRTYPE_LOC, "LOC", 1, - { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_LOC }, true }, - /* 30 */ - { KNOT_RRTYPE_NXT, "NXT", 2, - { KNOT_RDATA_WF_UNCOMPRESSED_DNAME, - KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_DNAME, KNOT_RDATA_ZF_NXT }, true }, - /* 31 */ - { 31, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 32 */ - { 32, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 33 */ - { KNOT_RRTYPE_SRV, "SRV", 4, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_SHORT, - KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME }, - true }, - /* 34 */ - { 34, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 35 */ - { KNOT_RRTYPE_NAPTR, "NAPTR", 6, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_TEXT_SINGLE, - KNOT_RDATA_WF_TEXT_SINGLE, KNOT_RDATA_WF_TEXT_SINGLE, - KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_TEXT_SINGLE, - KNOT_RDATA_ZF_TEXT_SINGLE, KNOT_RDATA_ZF_TEXT_SINGLE, - KNOT_RDATA_ZF_DNAME }, true }, - /* 36 */ - { KNOT_RRTYPE_KX, "KX", 2, - { KNOT_RDATA_WF_SHORT, - KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_DNAME }, true }, - /* 37 */ - { KNOT_RRTYPE_CERT, "CERT", 4, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_SHORT, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_CERTIFICATE_TYPE, KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_ALGORITHM, - KNOT_RDATA_ZF_BASE64 }, true }, - /* 38 */ - { KNOT_RRTYPE_A6, NULL, 1, { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 39 */ - { KNOT_RRTYPE_DNAME, "DNAME", 1, - { KNOT_RDATA_WF_UNCOMPRESSED_DNAME }, - { KNOT_RDATA_ZF_DNAME }, true }, - /* 40 */ - { 40, NULL, 1, { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 41 */ - /* OPT has its parser token, but should never be in zone file... */ - { KNOT_RRTYPE_OPT, "OPT", 1, - { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 42 */ - { KNOT_RRTYPE_APL, "APL", 64, - { KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL, - KNOT_RDATA_WF_APL, KNOT_RDATA_WF_APL }, - { KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL, - KNOT_RDATA_ZF_APL, KNOT_RDATA_ZF_APL }, - false }, - /* 43 */ - { KNOT_RRTYPE_DS, "DS", 4, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_ALGORITHM, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_HEX }, true }, - /* 44 */ - { KNOT_RRTYPE_SSHFP, "SSHFP", 3, - { KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_HEX }, - true }, - /* 45 */ - { KNOT_RRTYPE_IPSECKEY, "IPSECKEY", 5, - { KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_IPSECGATEWAY, - KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_IPSECGATEWAY, - KNOT_RDATA_ZF_BASE64 }, false }, - /* 46 */ - { KNOT_RRTYPE_RRSIG, "RRSIG", 9, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_LONG, - KNOT_RDATA_WF_LONG, KNOT_RDATA_WF_LONG, - KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_LITERAL_DNAME, - KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_RRTYPE, KNOT_RDATA_ZF_ALGORITHM, - KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_PERIOD, - KNOT_RDATA_ZF_TIME, KNOT_RDATA_ZF_TIME, - KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_LITERAL_DNAME, - KNOT_RDATA_ZF_BASE64 }, true }, - /* 47 */ - { KNOT_RRTYPE_NSEC, "NSEC", 2, - { KNOT_RDATA_WF_LITERAL_DNAME, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_LITERAL_DNAME, KNOT_RDATA_ZF_NSEC }, - true }, - /* 48 */ - { KNOT_RRTYPE_DNSKEY, "DNSKEY", 4, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_BYTE, - KNOT_RDATA_ZF_ALGORITHM, KNOT_RDATA_ZF_BASE64 }, true }, - /* 49 */ - { KNOT_RRTYPE_DHCID, "DHCID", 1, { KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_BASE64 }, true }, - /* 50 */ - { KNOT_RRTYPE_NSEC3, "NSEC3", 6, - { KNOT_RDATA_WF_BYTE, /* hash type */ - KNOT_RDATA_WF_BYTE, /* flags */ - KNOT_RDATA_WF_SHORT, /* iterations */ - KNOT_RDATA_WF_BINARYWITHLENGTH, /* salt */ - KNOT_RDATA_WF_BINARYWITHLENGTH, /* next hashed name */ - KNOT_RDATA_WF_BINARY /* type bitmap */ }, - { KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_HEX_LEN, - KNOT_RDATA_ZF_BASE32, KNOT_RDATA_ZF_NSEC }, - true }, - /* 51 */ - { KNOT_RRTYPE_NSEC3PARAM, "NSEC3PARAM", 4, - { KNOT_RDATA_WF_BYTE, /* hash type */ - KNOT_RDATA_WF_BYTE, /* flags */ - KNOT_RDATA_WF_SHORT, /* iterations */ - KNOT_RDATA_WF_BINARYWITHLENGTH /* salt */ }, - { KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, - KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_HEX_LEN }, true }, - /* 52 */ - { KNOT_RRTYPE_TLSA, "TLSA", 4, - { KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_BYTE, - KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_HEX }, true }, - - - /* In NSD they have indices between 52 and 99 filled with - unknown types. TODO add here if it's really needed? */ - /* it is indeed needed, in rrtype_from_string */ - - /* There's a GNU extension that works like this: [first ... last] = value */ - - [53 ... 98] = { 0, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - /* 99 */ - [99] = { KNOT_RRTYPE_SPF, "SPF", 1, - { KNOT_RDATA_WF_TEXT }, - { KNOT_RDATA_ZF_TEXT }, false }, - /* TSIG pseudo RR. */ - [100 ... 249] = { 0, NULL, 1, { KNOT_RDATA_WF_BINARY }, { KNOT_RDATA_ZF_UNKNOWN }, true }, - [250] = { KNOT_RRTYPE_TSIG, "TSIG", 7, - { KNOT_RDATA_WF_UNCOMPRESSED_DNAME, KNOT_RDATA_WF_UINT48, - KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BINARYWITHSHORT, - KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_SHORT, - KNOT_RDATA_WF_BINARYWITHSHORT }, - /* Zoneformat not needed. */ - {0, 0, 0, 0, 0}, true }, - /* 32769 */ - [32769] = { KNOT_RRTYPE_DLV, "DLV", 4, - { KNOT_RDATA_WF_SHORT, KNOT_RDATA_WF_BYTE, - KNOT_RDATA_WF_BYTE, KNOT_RDATA_WF_BINARY }, - { KNOT_RDATA_ZF_SHORT, KNOT_RDATA_ZF_ALGORITHM, KNOT_RDATA_ZF_BYTE, KNOT_RDATA_ZF_HEX }, - true }, -}; - -knot_rrtype_descriptor_t *knot_rrtype_descriptor_by_type(uint16_t type) -{ - if (type < KNOT_RRTYPE_LAST + 1) { - return &knot_rrtype_descriptors[type]; - } else if (type == KNOT_RRTYPE_DLV) { - return &knot_rrtype_descriptors[KNOT_RRTYPE_DLV]; - } - return &knot_rrtype_descriptors[0]; -} - -/* I see a lot of potential here to speed up zone parsing - this is O(n) * - * could be better */ -knot_rrtype_descriptor_t *knot_rrtype_descriptor_by_name(const char *name) -{ - int i; - - for (i = 0; i < KNOT_RRTYPE_DLV + 1; ++i) { - if (knot_rrtype_descriptors[i].name && - strcasecmp(knot_rrtype_descriptors[i].name, name) == 0) { - return &knot_rrtype_descriptors[i]; - } - } - - if (knot_rrtype_descriptors[KNOT_RRTYPE_DLV].name && - strcasecmp(knot_rrtype_descriptors[KNOT_RRTYPE_DLV].name, - name) == 0) { - return &knot_rrtype_descriptors[KNOT_RRTYPE_DLV]; - } - - return NULL; -} - -const char *knot_rrtype_to_string(uint16_t rrtype) -{ - static char buf[20]; - knot_rrtype_descriptor_t *descriptor = - knot_rrtype_descriptor_by_type(rrtype); - if (descriptor->name) { - return descriptor->name; - } else { - snprintf(buf, sizeof(buf), "TYPE%d", (int) rrtype); - return buf; - } -} - -uint16_t knot_rrtype_from_string(const char *name) -{ - char *end; - long rrtype; - knot_rrtype_descriptor_t *entry; - - entry = knot_rrtype_descriptor_by_name(name); - if (entry) { - return entry->type; - } - - if (strlen(name) < 5) { - return 0; - } - - if (strncasecmp(name, "TYPE", 4) != 0) { - return 0; - } - - if (!isdigit((int)name[4])) { - return 0; - } - - /* The rest from the string must be a number. */ - rrtype = strtol(name + 4, &end, 10); - if (*end != '\0') { - return 0; - } - if (rrtype < 0 || rrtype > 65535L) { - return 0; - } - - return (uint16_t) rrtype; -} - -const char *knot_rrclass_to_string(uint16_t rrclass) -{ - static char buf[20]; - knot_lookup_table_t *entry = knot_lookup_by_id(dns_rrclasses, - rrclass); - if (entry) { - assert(strlen(entry->name) < sizeof(buf)); - knot_strlcpy(buf, entry->name, sizeof(buf)); - } else { - snprintf(buf, sizeof(buf), "CLASS%d", (int) rrclass); - } - return buf; -} - -uint16_t knot_rrclass_from_string(const char *name) -{ - char *end; - long rrclass; - knot_lookup_table_t *entry; - - entry = knot_lookup_by_name(dns_rrclasses, name); - if (entry) { - return (uint16_t) entry->id; - } - - if (strlen(name) < 6) { - return 0; - } - - if (strncasecmp(name, "CLASS", 5) != 0) { - return 0; - } - - if (!isdigit((int)name[5])) { - return 0; - } - - // The rest from the string must be a number. - rrclass = strtol(name + 5, &end, 10); - if (*end != '\0') { - return 0; - } - if (rrclass < 0 || rrclass > 65535L) { - return 0; - } - - return (uint16_t) rrclass; -} - -size_t knot_wireformat_size(unsigned int wire_type) -{ - switch(wire_type) { - case KNOT_RDATA_WF_BYTE: - return 1; - break; - case KNOT_RDATA_WF_SHORT: - return 2; - break; - case KNOT_RDATA_WF_LONG: - return 4; - break; - case KNOT_RDATA_WF_A: - return 4; - break; - default: /* unknown size */ - return 0; - break; - } /* switch */ -} - -int knot_rrtype_is_metatype(uint16_t type) -{ - /*! \todo Check if there are some other metatypes. */ - return (type == KNOT_RRTYPE_ANY - || type == KNOT_RRTYPE_AXFR - || type == KNOT_RRTYPE_IXFR - || type == KNOT_RRTYPE_MAILA - || type == KNOT_RRTYPE_MAILB - || type == KNOT_RRTYPE_OPT); -} - -size_t knot_ds_digest_length(uint8_t algorithm) -{ - switch (algorithm) { - case KNOT_DS_ALG_SHA1: - return KNOT_DS_DIGEST_LEN_SHA1; - case KNOT_DS_ALG_SHA256: - return KNOT_DS_DIGEST_LEN_SHA256; - case KNOT_DS_ALG_GOST: - return KNOT_DS_DIGEST_LEN_GOST; - case KNOT_DS_ALG_SHA384: - return KNOT_DS_DIGEST_LEN_SHA384; - default: - return 0; - } -} - -/*! @} */ - |