diff options
Diffstat (limited to 'external/unbound/sldns')
-rw-r--r-- | external/unbound/sldns/keyraw.c | 408 | ||||
-rw-r--r-- | external/unbound/sldns/keyraw.h | 112 | ||||
-rw-r--r-- | external/unbound/sldns/parse.c | 470 | ||||
-rw-r--r-- | external/unbound/sldns/parse.h | 184 | ||||
-rw-r--r-- | external/unbound/sldns/parseutil.c | 726 | ||||
-rw-r--r-- | external/unbound/sldns/parseutil.h | 148 | ||||
-rw-r--r-- | external/unbound/sldns/pkthdr.h | 158 | ||||
-rw-r--r-- | external/unbound/sldns/rrdef.c | 736 | ||||
-rw-r--r-- | external/unbound/sldns/rrdef.h | 510 | ||||
-rw-r--r-- | external/unbound/sldns/sbuffer.c | 191 | ||||
-rw-r--r-- | external/unbound/sldns/sbuffer.h | 804 | ||||
-rw-r--r-- | external/unbound/sldns/str2wire.c | 2023 | ||||
-rw-r--r-- | external/unbound/sldns/str2wire.h | 541 | ||||
-rw-r--r-- | external/unbound/sldns/wire2str.c | 2006 | ||||
-rw-r--r-- | external/unbound/sldns/wire2str.h | 995 |
15 files changed, 0 insertions, 10012 deletions
diff --git a/external/unbound/sldns/keyraw.c b/external/unbound/sldns/keyraw.c deleted file mode 100644 index e8f2da089..000000000 --- a/external/unbound/sldns/keyraw.c +++ /dev/null @@ -1,408 +0,0 @@ -/* - * keyraw.c - raw key operations and conversions - * - * (c) NLnet Labs, 2004-2008 - * - * See the file LICENSE for the license - */ -/** - * \file - * Implementation of raw DNSKEY functions (work on wire rdata). - */ - -#include "config.h" -#include "sldns/keyraw.h" -#include "sldns/rrdef.h" - -#ifdef HAVE_SSL -#include <openssl/ssl.h> -#include <openssl/evp.h> -#include <openssl/rand.h> -#include <openssl/err.h> -#include <openssl/md5.h> -#ifdef HAVE_OPENSSL_ENGINE_H -# include <openssl/engine.h> -#endif -#ifdef HAVE_OPENSSL_BN_H -#include <openssl/bn.h> -#endif -#ifdef HAVE_OPENSSL_RSA_H -#include <openssl/rsa.h> -#endif -#ifdef HAVE_OPENSSL_DSA_H -#include <openssl/dsa.h> -#endif -#endif /* HAVE_SSL */ - -size_t -sldns_rr_dnskey_key_size_raw(const unsigned char* keydata, - const size_t len, int alg) -{ - /* for DSA keys */ - uint8_t t; - - /* for RSA keys */ - uint16_t exp; - uint16_t int16; - - switch ((sldns_algorithm)alg) { - case LDNS_DSA: - case LDNS_DSA_NSEC3: - if (len > 0) { - t = keydata[0]; - return (64 + t*8)*8; - } else { - return 0; - } - break; - case LDNS_RSAMD5: - case LDNS_RSASHA1: - case LDNS_RSASHA1_NSEC3: -#ifdef USE_SHA2 - case LDNS_RSASHA256: - case LDNS_RSASHA512: -#endif - if (len > 0) { - if (keydata[0] == 0) { - /* big exponent */ - if (len > 3) { - memmove(&int16, keydata + 1, 2); - exp = ntohs(int16); - return (len - exp - 3)*8; - } else { - return 0; - } - } else { - exp = keydata[0]; - return (len-exp-1)*8; - } - } else { - return 0; - } - break; -#ifdef USE_GOST - case LDNS_ECC_GOST: - return 512; -#endif -#ifdef USE_ECDSA - case LDNS_ECDSAP256SHA256: - return 256; - case LDNS_ECDSAP384SHA384: - return 384; -#endif - default: - return 0; - } -} - -uint16_t sldns_calc_keytag_raw(uint8_t* key, size_t keysize) -{ - if(keysize < 4) { - return 0; - } - /* look at the algorithm field, copied from 2535bis */ - if (key[3] == LDNS_RSAMD5) { - uint16_t ac16 = 0; - if (keysize > 4) { - memmove(&ac16, key + keysize - 3, 2); - } - ac16 = ntohs(ac16); - return (uint16_t) ac16; - } else { - size_t i; - uint32_t ac32 = 0; - for (i = 0; i < keysize; ++i) { - ac32 += (i & 1) ? key[i] : key[i] << 8; - } - ac32 += (ac32 >> 16) & 0xFFFF; - return (uint16_t) (ac32 & 0xFFFF); - } -} - -#ifdef HAVE_SSL -#ifdef USE_GOST -/** store GOST engine reference loaded into OpenSSL library */ -ENGINE* sldns_gost_engine = NULL; - -int -sldns_key_EVP_load_gost_id(void) -{ - static int gost_id = 0; - const EVP_PKEY_ASN1_METHOD* meth; - ENGINE* e; - - if(gost_id) return gost_id; - - /* see if configuration loaded gost implementation from other engine*/ - meth = EVP_PKEY_asn1_find_str(NULL, "gost2001", -1); - if(meth) { - EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth); - return gost_id; - } - - /* see if engine can be loaded already */ - e = ENGINE_by_id("gost"); - if(!e) { - /* load it ourself, in case statically linked */ - ENGINE_load_builtin_engines(); - ENGINE_load_dynamic(); - e = ENGINE_by_id("gost"); - } - if(!e) { - /* no gost engine in openssl */ - return 0; - } - if(!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { - ENGINE_finish(e); - ENGINE_free(e); - return 0; - } - - meth = EVP_PKEY_asn1_find_str(&e, "gost2001", -1); - if(!meth) { - /* algo not found */ - ENGINE_finish(e); - ENGINE_free(e); - return 0; - } - /* Note: do not ENGINE_finish and ENGINE_free the acquired engine - * on some platforms this frees up the meth and unloads gost stuff */ - sldns_gost_engine = e; - - EVP_PKEY_asn1_get0_info(&gost_id, NULL, NULL, NULL, NULL, meth); - return gost_id; -} - -void sldns_key_EVP_unload_gost(void) -{ - if(sldns_gost_engine) { - ENGINE_finish(sldns_gost_engine); - ENGINE_free(sldns_gost_engine); - sldns_gost_engine = NULL; - } -} -#endif /* USE_GOST */ - -DSA * -sldns_key_buf2dsa_raw(unsigned char* key, size_t len) -{ - uint8_t T; - uint16_t length; - uint16_t offset; - DSA *dsa; - BIGNUM *Q; BIGNUM *P; - BIGNUM *G; BIGNUM *Y; - - if(len == 0) - return NULL; - T = (uint8_t)key[0]; - length = (64 + T * 8); - offset = 1; - - if (T > 8) { - return NULL; - } - if(len < (size_t)1 + SHA_DIGEST_LENGTH + 3*length) - return NULL; - - Q = BN_bin2bn(key+offset, SHA_DIGEST_LENGTH, NULL); - offset += SHA_DIGEST_LENGTH; - - P = BN_bin2bn(key+offset, (int)length, NULL); - offset += length; - - G = BN_bin2bn(key+offset, (int)length, NULL); - offset += length; - - Y = BN_bin2bn(key+offset, (int)length, NULL); - - /* create the key and set its properties */ - if(!Q || !P || !G || !Y || !(dsa = DSA_new())) { - BN_free(Q); - BN_free(P); - BN_free(G); - BN_free(Y); - return NULL; - } -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -#ifndef S_SPLINT_S - dsa->p = P; - dsa->q = Q; - dsa->g = G; - dsa->pub_key = Y; -#endif /* splint */ - -#else /* OPENSSL_VERSION_NUMBER */ - if (!DSA_set0_pqg(dsa, P, Q, G)) { - /* QPG not yet attached, need to free */ - BN_free(Q); - BN_free(P); - BN_free(G); - - DSA_free(dsa); - BN_free(Y); - return NULL; - } - if (!DSA_set0_key(dsa, Y, NULL)) { - /* QPG attached, cleaned up by DSA_fre() */ - DSA_free(dsa); - BN_free(Y); - return NULL; - } -#endif - - return dsa; -} - -RSA * -sldns_key_buf2rsa_raw(unsigned char* key, size_t len) -{ - uint16_t offset; - uint16_t exp; - uint16_t int16; - RSA *rsa; - BIGNUM *modulus; - BIGNUM *exponent; - - if (len == 0) - return NULL; - if (key[0] == 0) { - if(len < 3) - return NULL; - memmove(&int16, key+1, 2); - exp = ntohs(int16); - offset = 3; - } else { - exp = key[0]; - offset = 1; - } - - /* key length at least one */ - if(len < (size_t)offset + exp + 1) - return NULL; - - /* Exponent */ - exponent = BN_new(); - if(!exponent) return NULL; - (void) BN_bin2bn(key+offset, (int)exp, exponent); - offset += exp; - - /* Modulus */ - modulus = BN_new(); - if(!modulus) { - BN_free(exponent); - return NULL; - } - /* length of the buffer must match the key length! */ - (void) BN_bin2bn(key+offset, (int)(len - offset), modulus); - - rsa = RSA_new(); - if(!rsa) { - BN_free(exponent); - BN_free(modulus); - return NULL; - } -#if OPENSSL_VERSION_NUMBER < 0x10100000 || defined(HAVE_LIBRESSL) -#ifndef S_SPLINT_S - rsa->n = modulus; - rsa->e = exponent; -#endif /* splint */ - -#else /* OPENSSL_VERSION_NUMBER */ - if (!RSA_set0_key(rsa, modulus, exponent, NULL)) { - BN_free(exponent); - BN_free(modulus); - RSA_free(rsa); - return NULL; - } -#endif - - return rsa; -} - -#ifdef USE_GOST -EVP_PKEY* -sldns_gost2pkey_raw(unsigned char* key, size_t keylen) -{ - /* prefix header for X509 encoding */ - uint8_t asn[37] = { 0x30, 0x63, 0x30, 0x1c, 0x06, 0x06, 0x2a, 0x85, - 0x03, 0x02, 0x02, 0x13, 0x30, 0x12, 0x06, 0x07, 0x2a, 0x85, - 0x03, 0x02, 0x02, 0x23, 0x01, 0x06, 0x07, 0x2a, 0x85, 0x03, - 0x02, 0x02, 0x1e, 0x01, 0x03, 0x43, 0x00, 0x04, 0x40}; - unsigned char encoded[37+64]; - const unsigned char* pp; - if(keylen != 64) { - /* key wrong size */ - return NULL; - } - - /* create evp_key */ - memmove(encoded, asn, 37); - memmove(encoded+37, key, 64); - pp = (unsigned char*)&encoded[0]; - - return d2i_PUBKEY(NULL, &pp, (int)sizeof(encoded)); -} -#endif /* USE_GOST */ - -#ifdef USE_ECDSA -EVP_PKEY* -sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo) -{ - unsigned char buf[256+2]; /* sufficient for 2*384/8+1 */ - const unsigned char* pp = buf; - EVP_PKEY *evp_key; - EC_KEY *ec; - /* check length, which uncompressed must be 2 bignums */ - if(algo == LDNS_ECDSAP256SHA256) { - if(keylen != 2*256/8) return NULL; - ec = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - } else if(algo == LDNS_ECDSAP384SHA384) { - if(keylen != 2*384/8) return NULL; - ec = EC_KEY_new_by_curve_name(NID_secp384r1); - } else ec = NULL; - if(!ec) return NULL; - if(keylen+1 > sizeof(buf)) { /* sanity check */ - EC_KEY_free(ec); - return NULL; - } - /* prepend the 0x02 (from docs) (or actually 0x04 from implementation - * of openssl) for uncompressed data */ - buf[0] = POINT_CONVERSION_UNCOMPRESSED; - memmove(buf+1, key, keylen); - if(!o2i_ECPublicKey(&ec, &pp, (int)keylen+1)) { - EC_KEY_free(ec); - return NULL; - } - evp_key = EVP_PKEY_new(); - if(!evp_key) { - EC_KEY_free(ec); - return NULL; - } - if (!EVP_PKEY_assign_EC_KEY(evp_key, ec)) { - EVP_PKEY_free(evp_key); - EC_KEY_free(ec); - return NULL; - } - return evp_key; -} -#endif /* USE_ECDSA */ - -int -sldns_digest_evp(unsigned char* data, unsigned int len, unsigned char* dest, - const EVP_MD* md) -{ - EVP_MD_CTX* ctx; - ctx = EVP_MD_CTX_create(); - if(!ctx) - return 0; - if(!EVP_DigestInit_ex(ctx, md, NULL) || - !EVP_DigestUpdate(ctx, data, len) || - !EVP_DigestFinal_ex(ctx, dest, NULL)) { - EVP_MD_CTX_destroy(ctx); - return 0; - } - EVP_MD_CTX_destroy(ctx); - return 1; -} -#endif /* HAVE_SSL */ diff --git a/external/unbound/sldns/keyraw.h b/external/unbound/sldns/keyraw.h deleted file mode 100644 index 8abe23509..000000000 --- a/external/unbound/sldns/keyraw.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * keyraw.h -- raw key and signature access and conversion - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - */ - -/** - * \file - * - * raw key and signature access and conversion - * - * Since those functions heavily rely op cryptographic operations, - * this module is dependent on openssl. - * - */ - -#ifndef LDNS_KEYRAW_H -#define LDNS_KEYRAW_H - -#ifdef __cplusplus -extern "C" { -#endif -#if LDNS_BUILD_CONFIG_HAVE_SSL -# include <openssl/ssl.h> -# include <openssl/evp.h> -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -/** - * get the length of the keydata in bits - * \param[in] keydata the raw key data - * \param[in] len the length of the keydata - * \param[in] alg the cryptographic algorithm this is a key for - * \return the keysize in bits, or 0 on error - */ -size_t sldns_rr_dnskey_key_size_raw(const unsigned char *keydata, - const size_t len, int alg); - -/** - * Calculates keytag of DNSSEC key, operates on wireformat rdata. - * \param[in] key the key as uncompressed wireformat rdata. - * \param[in] keysize length of key data. - * \return the keytag - */ -uint16_t sldns_calc_keytag_raw(uint8_t* key, size_t keysize); - -#if LDNS_BUILD_CONFIG_HAVE_SSL -/** - * Get the PKEY id for GOST, loads GOST into openssl as a side effect. - * Only available if GOST is compiled into the library and openssl. - * \return the gost id for EVP_CTX creation. - */ -int sldns_key_EVP_load_gost_id(void); - -/** Release the engine reference held for the GOST engine. */ -void sldns_key_EVP_unload_gost(void); - -/** - * Like sldns_key_buf2dsa, but uses raw buffer. - * \param[in] key the uncompressed wireformat of the key. - * \param[in] len length of key data - * \return a DSA * structure with the key material - */ -DSA *sldns_key_buf2dsa_raw(unsigned char* key, size_t len); - -/** - * Converts a holding buffer with key material to EVP PKEY in openssl. - * Only available if ldns was compiled with GOST. - * \param[in] key data to convert - * \param[in] keylen length of the key data - * \return the key or NULL on error. - */ -EVP_PKEY* sldns_gost2pkey_raw(unsigned char* key, size_t keylen); - -/** - * Converts a holding buffer with key material to EVP PKEY in openssl. - * Only available if ldns was compiled with ECDSA. - * \param[in] key data to convert - * \param[in] keylen length of the key data - * \param[in] algo precise algorithm to initialize ECC group values. - * \return the key or NULL on error. - */ -EVP_PKEY* sldns_ecdsa2pkey_raw(unsigned char* key, size_t keylen, uint8_t algo); - -/** - * Like sldns_key_buf2rsa, but uses raw buffer. - * \param[in] key the uncompressed wireformat of the key. - * \param[in] len length of key data - * \return a RSA * structure with the key material - */ -RSA *sldns_key_buf2rsa_raw(unsigned char* key, size_t len); - -/** - * Utility function to calculate hash using generic EVP_MD pointer. - * \param[in] data the data to hash. - * \param[in] len length of data. - * \param[out] dest the destination of the hash, must be large enough. - * \param[in] md the message digest to use. - * \return true if worked, false on failure. - */ -int sldns_digest_evp(unsigned char* data, unsigned int len, - unsigned char* dest, const EVP_MD* md); - -#endif /* LDNS_BUILD_CONFIG_HAVE_SSL */ - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_KEYRAW_H */ diff --git a/external/unbound/sldns/parse.c b/external/unbound/sldns/parse.c deleted file mode 100644 index 35dee7196..000000000 --- a/external/unbound/sldns/parse.c +++ /dev/null @@ -1,470 +0,0 @@ -/* - * a generic (simple) parser. Use to parse rr's, private key - * information and /etc/resolv.conf files - * - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * (c) NLnet Labs, 2005-2006 - * See the file LICENSE for the license - */ -#include "config.h" -#include "sldns/parse.h" -#include "sldns/parseutil.h" -#include "sldns/sbuffer.h" - -#include <limits.h> -#include <strings.h> - -sldns_lookup_table sldns_directive_types[] = { - { LDNS_DIR_TTL, "$TTL" }, - { LDNS_DIR_ORIGIN, "$ORIGIN" }, - { LDNS_DIR_INCLUDE, "$INCLUDE" }, - { 0, NULL } -}; - -/* add max_limit here? */ -ssize_t -sldns_fget_token(FILE *f, char *token, const char *delim, size_t limit) -{ - return sldns_fget_token_l(f, token, delim, limit, NULL); -} - -ssize_t -sldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr) -{ - int c, prev_c; - int p; /* 0 -> no parenthese seen, >0 nr of ( seen */ - int com, quoted; - char *t; - size_t i; - const char *d; - const char *del; - - /* standard delimeters */ - if (!delim) { - /* from isspace(3) */ - del = LDNS_PARSE_NORMAL; - } else { - del = delim; - } - - p = 0; - i = 0; - com = 0; - quoted = 0; - prev_c = 0; - t = token; - if (del[0] == '"') { - quoted = 1; - } - while ((c = getc(f)) != EOF) { - if (c == '\r') /* carriage return */ - c = ' '; - if (c == '(' && prev_c != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - p++; - } - prev_c = c; - continue; - } - - if (c == ')' && prev_c != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - p--; - } - prev_c = c; - continue; - } - - if (p < 0) { - /* more ) then ( - close off the string */ - *t = '\0'; - return 0; - } - - /* do something with comments ; */ - if (c == ';' && quoted == 0) { - if (prev_c != '\\') { - com = 1; - } - } - if (c == '\"' && com == 0 && prev_c != '\\') { - quoted = 1 - quoted; - } - - if (c == '\n' && com != 0) { - /* comments */ - com = 0; - *t = ' '; - if (line_nr) { - *line_nr = *line_nr + 1; - } - if (p == 0 && i > 0) { - goto tokenread; - } else { - prev_c = c; - continue; - } - } - - if (com == 1) { - *t = ' '; - prev_c = c; - continue; - } - - if (c == '\n' && p != 0 && t > token) { - /* in parentheses */ - if (line_nr) { - *line_nr = *line_nr + 1; - } - *t++ = ' '; - prev_c = c; - continue; - } - - /* check if we hit the delim */ - for (d = del; *d; d++) { - if (c == *d && i > 0 && prev_c != '\\' && p == 0) { - if (c == '\n' && line_nr) { - *line_nr = *line_nr + 1; - } - goto tokenread; - } - } - if (c != '\0' && c != '\n') { - i++; - } - if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) { - *t = '\0'; - return -1; - } - if (c != '\0' && c != '\n') { - *t++ = c; - } - if (c == '\\' && prev_c == '\\') - prev_c = 0; - else prev_c = c; - } - *t = '\0'; - if (c == EOF) { - return (ssize_t)i; - } - - if (i == 0) { - /* nothing read */ - return -1; - } - if (p != 0) { - return -1; - } - return (ssize_t)i; - -tokenread: - if(*del == '"') - /* do not skip over quotes after the string, they are part - * of the next string. But skip over whitespace (if needed)*/ - sldns_fskipcs_l(f, del+1, line_nr); - else sldns_fskipcs_l(f, del, line_nr); - *t = '\0'; - if (p != 0) { - return -1; - } - - return (ssize_t)i; -} - -ssize_t -sldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, - const char *d_del, size_t data_limit) -{ - return sldns_fget_keyword_data_l(f, keyword, k_del, data, d_del, - data_limit, NULL); -} - -ssize_t -sldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_del, char *data, - const char *d_del, size_t data_limit, int *line_nr) -{ - /* we assume: keyword|sep|data */ - char *fkeyword; - ssize_t i; - - if(strlen(keyword) >= LDNS_MAX_KEYWORDLEN) - return -1; - fkeyword = (char*)malloc(LDNS_MAX_KEYWORDLEN); - if(!fkeyword) - return -1; - - i = sldns_fget_token(f, fkeyword, k_del, LDNS_MAX_KEYWORDLEN); - if(i==0 || i==-1) { - free(fkeyword); - return -1; - } - - /* case??? i instead of strlen? */ - if (strncmp(fkeyword, keyword, LDNS_MAX_KEYWORDLEN - 1) == 0) { - /* whee! */ - /* printf("%s\n%s\n", "Matching keyword", fkeyword); */ - i = sldns_fget_token_l(f, data, d_del, data_limit, line_nr); - free(fkeyword); - return i; - } else { - /*printf("no match for %s (read: %s)\n", keyword, fkeyword);*/ - free(fkeyword); - return -1; - } -} - -int -sldns_bgetc(sldns_buffer *buffer) -{ - if (!sldns_buffer_available_at(buffer, buffer->_position, sizeof(uint8_t))) { - sldns_buffer_set_position(buffer, sldns_buffer_limit(buffer)); - /* sldns_buffer_rewind(buffer);*/ - return EOF; - } - return (int)sldns_buffer_read_u8(buffer); -} - -ssize_t -sldns_bget_token(sldns_buffer *b, char *token, const char *delim, size_t limit) -{ - return sldns_bget_token_par(b, token, delim, limit, NULL, NULL); -} - -ssize_t -sldns_bget_token_par(sldns_buffer *b, char *token, const char *delim, - size_t limit, int* par, const char* skipw) -{ - int c, lc; - int p; /* 0 -> no parenthese seen, >0 nr of ( seen */ - int com, quoted; - char *t; - size_t i; - const char *d; - const char *del; - - /* standard delimiters */ - if (!delim) { - /* from isspace(3) */ - del = LDNS_PARSE_NORMAL; - } else { - del = delim; - } - - p = (par?*par:0); - i = 0; - com = 0; - quoted = 0; - t = token; - lc = 0; - if (del[0] == '"') { - quoted = 1; - } - - while ((c = sldns_bgetc(b)) != EOF) { - if (c == '\r') /* carriage return */ - c = ' '; - if (c == '(' && lc != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - if(par) (*par)++; - p++; - } - lc = c; - continue; - } - - if (c == ')' && lc != '\\' && !quoted) { - /* this only counts for non-comments */ - if (com == 0) { - if(par) (*par)--; - p--; - } - lc = c; - continue; - } - - if (p < 0) { - /* more ) then ( */ - *t = '\0'; - return 0; - } - - /* do something with comments ; */ - if (c == ';' && quoted == 0) { - if (lc != '\\') { - com = 1; - } - } - if (c == '"' && com == 0 && lc != '\\') { - quoted = 1 - quoted; - } - - if (c == '\n' && com != 0) { - /* comments */ - com = 0; - *t = ' '; - lc = c; - continue; - } - - if (com == 1) { - *t = ' '; - lc = c; - continue; - } - - if (c == '\n' && p != 0) { - /* in parentheses */ - /* do not write ' ' if we want to skip spaces */ - if(!(skipw && (strchr(skipw, c)||strchr(skipw, ' ')))) - *t++ = ' '; - lc = c; - continue; - } - - /* check to skip whitespace at start, but also after ( */ - if(skipw && i==0 && !com && !quoted && lc != '\\') { - if(strchr(skipw, c)) { - lc = c; - continue; - } - } - - /* check if we hit the delim */ - for (d = del; *d; d++) { - /* we can only exit if no parens or user tracks them */ - if (c == *d && lc != '\\' && (p == 0 || par)) { - goto tokenread; - } - } - - i++; - if (limit > 0 && (i >= limit || (size_t)(t-token) >= limit)) { - *t = '\0'; - return -1; - } - *t++ = c; - - if (c == '\\' && lc == '\\') { - lc = 0; - } else { - lc = c; - } - } - *t = '\0'; - if (i == 0) { - /* nothing read */ - return -1; - } - if (!par && p != 0) { - return -1; - } - return (ssize_t)i; - -tokenread: - if(*del == '"') - /* do not skip over quotes after the string, they are part - * of the next string. But skip over whitespace (if needed)*/ - sldns_bskipcs(b, del+1); - else sldns_bskipcs(b, del); - *t = '\0'; - - if (!par && p != 0) { - return -1; - } - return (ssize_t)i; -} - - -void -sldns_bskipcs(sldns_buffer *buffer, const char *s) -{ - int found; - char c; - const char *d; - - while(sldns_buffer_available_at(buffer, buffer->_position, sizeof(char))) { - c = (char) sldns_buffer_read_u8_at(buffer, buffer->_position); - found = 0; - for (d = s; *d; d++) { - if (*d == c) { - found = 1; - } - } - if (found && buffer->_limit > buffer->_position) { - buffer->_position += sizeof(char); - } else { - return; - } - } -} - -void -sldns_fskipcs(FILE *fp, const char *s) -{ - sldns_fskipcs_l(fp, s, NULL); -} - -void -sldns_fskipcs_l(FILE *fp, const char *s, int *line_nr) -{ - int found; - int c; - const char *d; - - while ((c = fgetc(fp)) != EOF) { - if (line_nr && c == '\n') { - *line_nr = *line_nr + 1; - } - found = 0; - for (d = s; *d; d++) { - if (*d == c) { - found = 1; - } - } - if (!found) { - /* with getc, we've read too far */ - ungetc(c, fp); - return; - } - } -} - -ssize_t -sldns_bget_keyword_data(sldns_buffer *b, const char *keyword, const char *k_del, char -*data, const char *d_del, size_t data_limit) -{ - /* we assume: keyword|sep|data */ - char *fkeyword; - ssize_t i; - - if(strlen(keyword) >= LDNS_MAX_KEYWORDLEN) - return -1; - fkeyword = (char*)malloc(LDNS_MAX_KEYWORDLEN); - if(!fkeyword) - return -1; /* out of memory */ - - i = sldns_bget_token(b, fkeyword, k_del, data_limit); - if(i==0 || i==-1) { - free(fkeyword); - return -1; /* nothing read */ - } - - /* case??? */ - if (strncmp(fkeyword, keyword, strlen(keyword)) == 0) { - free(fkeyword); - /* whee, the match! */ - /* retrieve it's data */ - i = sldns_bget_token(b, data, d_del, 0); - return i; - } else { - free(fkeyword); - return -1; - } -} - diff --git a/external/unbound/sldns/parse.h b/external/unbound/sldns/parse.h deleted file mode 100644 index 7b7456dd2..000000000 --- a/external/unbound/sldns/parse.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * parse.h - * - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * (c) NLnet Labs, 2005-2006 - * See the file LICENSE for the license - */ - -#ifndef LDNS_PARSE_H -#define LDNS_PARSE_H - -struct sldns_buffer; - -#ifdef __cplusplus -extern "C" { -#endif - -#define LDNS_PARSE_SKIP_SPACE "\f\n\r\v" -#define LDNS_PARSE_NORMAL " \f\n\r\t\v" -#define LDNS_PARSE_NO_NL " \t" -#define LDNS_MAX_LINELEN 10230 -#define LDNS_MAX_KEYWORDLEN 32 - - -/** - * \file - * - * Contains some low-level parsing functions, mostly used in the _frm_str - * family of functions. - */ - -/** - * different type of directives in zone files - * We now deal with $TTL, $ORIGIN and $INCLUDE. - * The latter is not implemented in ldns (yet) - */ -enum sldns_enum_directive -{ - LDNS_DIR_TTL, - LDNS_DIR_ORIGIN, - LDNS_DIR_INCLUDE -}; -typedef enum sldns_enum_directive sldns_directive; - -/** - * returns a token/char from the stream F. - * This function deals with ( and ) in the stream, - * and ignores them when encountered - * \param[in] *f the file to read from - * \param[out] *token the read token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 the builtin maximum is used - * \return 0 on error of EOF of the stream F. Otherwise return the length of what is read - */ -ssize_t sldns_fget_token(FILE *f, char *token, const char *delim, size_t limit); - -/** - * returns a token/char from the stream F. - * This function deals with ( and ) in the stream, - * and ignores when it finds them. - * \param[in] *f the file to read from - * \param[out] *token the token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 use builtin maximum - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return 0 on error of EOF of F otherwise return the length of what is read - */ -ssize_t sldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr); - -/** - * returns a token/char from the buffer b. - * This function deals with ( and ) in the buffer, - * and ignores when it finds them. - * \param[in] *b the buffer to read from - * \param[out] *token the token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 the builtin maximum is used - * \param[in] *par if you pass nonNULL, set to 0 on first call, the parenthesis - * state is stored in it, for use on next call. User must check it is back - * to zero after last bget in string (for parse error). If you pass NULL, - * the entire parenthesized string is read in. - * \param[in] skipw string with whitespace to skip before the start of the - * token, like " ", or " \t", or NULL for none. - * \returns 0 on error of EOF of b. Otherwise return the length of what is read - */ -ssize_t sldns_bget_token_par(struct sldns_buffer *b, char *token, const char *delim, size_t limit, int* par, const char* skipw); - -/** - * returns a token/char from the buffer b. - * This function deals with ( and ) in the buffer, - * and ignores when it finds them. - * \param[in] *b the buffer to read from - * \param[out] *token the token is put here - * \param[in] *delim chars at which the parsing should stop - * \param[in] *limit how much to read. If 0 the builtin maximum is used - * \returns 0 on error of EOF of b. Otherwise return the length of what is read - */ -ssize_t sldns_bget_token(struct sldns_buffer *b, char *token, const char *delim, size_t limit); - -/* - * searches for keyword and delim in a file. Gives everything back - * after the keyword + k_del until we hit d_del - * \param[in] f file pointer to read from - * \param[in] keyword keyword to look for - * \param[in] k_del keyword delimeter - * \param[out] data the data found - * \param[in] d_del the data delimeter - * \param[in] data_limit maximum size the the data buffer - * \return the number of character read - */ -ssize_t sldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit); - -/* - * searches for keyword and delim. Gives everything back - * after the keyword + k_del until we hit d_del - * \param[in] f file pointer to read from - * \param[in] keyword keyword to look for - * \param[in] k_del keyword delimeter - * \param[out] data the data found - * \param[in] d_del the data delimeter - * \param[in] data_limit maximum size the the data buffer - * \param[in] line_nr pointer to an integer containing the current line number (for -debugging purposes) - * \return the number of character read - */ -ssize_t sldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit, int *line_nr); - -/* - * searches for keyword and delim in a buffer. Gives everything back - * after the keyword + k_del until we hit d_del - * \param[in] b buffer pointer to read from - * \param[in] keyword keyword to look for - * \param[in] k_del keyword delimeter - * \param[out] data the data found - * \param[in] d_del the data delimeter - * \param[in] data_limit maximum size the the data buffer - * \return the number of character read - */ -ssize_t sldns_bget_keyword_data(struct sldns_buffer *b, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit); - -/** - * returns the next character from a buffer. Advances the position pointer with 1. - * When end of buffer is reached returns EOF. This is the buffer's equivalent - * for getc(). - * \param[in] *buffer buffer to read from - * \return EOF on failure otherwise return the character - */ -int sldns_bgetc(struct sldns_buffer *buffer); - -/** - * skips all of the characters in the given string in the buffer, moving - * the position to the first character that is not in *s. - * \param[in] *buffer buffer to use - * \param[in] *s characters to skip - * \return void - */ -void sldns_bskipcs(struct sldns_buffer *buffer, const char *s); - -/** - * skips all of the characters in the given string in the fp, moving - * the position to the first character that is not in *s. - * \param[in] *fp file to use - * \param[in] *s characters to skip - * \return void - */ -void sldns_fskipcs(FILE *fp, const char *s); - - -/** - * skips all of the characters in the given string in the fp, moving - * the position to the first character that is not in *s. - * \param[in] *fp file to use - * \param[in] *s characters to skip - * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) - * \return void - */ -void sldns_fskipcs_l(FILE *fp, const char *s, int *line_nr); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_PARSE_H */ diff --git a/external/unbound/sldns/parseutil.c b/external/unbound/sldns/parseutil.c deleted file mode 100644 index 32717616a..000000000 --- a/external/unbound/sldns/parseutil.c +++ /dev/null @@ -1,726 +0,0 @@ -/* - * parseutil.c - parse utilities for string and wire conversion - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ -/** - * \file - * - * Utility functions for parsing, base32(DNS variant) and base64 encoding - * and decoding, Hex, Time units, Escape codes. - */ - -#include "config.h" -#include "sldns/parseutil.h" -#include <sys/time.h> -#include <time.h> -#include <ctype.h> - -sldns_lookup_table * -sldns_lookup_by_name(sldns_lookup_table *table, const char *name) -{ - while (table->name != NULL) { - if (strcasecmp(name, table->name) == 0) - return table; - table++; - } - return NULL; -} - -sldns_lookup_table * -sldns_lookup_by_id(sldns_lookup_table *table, int id) -{ - while (table->name != NULL) { - if (table->id == id) - return table; - table++; - } - return NULL; -} - -/* Number of days per month (except for February in leap years). */ -static const int mdays[] = { - 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 -}; - -#define LDNS_MOD(x,y) (((x) % (y) < 0) ? ((x) % (y) + (y)) : ((x) % (y))) -#define LDNS_DIV(x,y) (((x) % (y) < 0) ? ((x) / (y) - 1 ) : ((x) / (y))) - -static int -is_leap_year(int year) -{ - return LDNS_MOD(year, 4) == 0 && (LDNS_MOD(year, 100) != 0 - || LDNS_MOD(year, 400) == 0); -} - -static int -leap_days(int y1, int y2) -{ - --y1; - --y2; - return (LDNS_DIV(y2, 4) - LDNS_DIV(y1, 4)) - - (LDNS_DIV(y2, 100) - LDNS_DIV(y1, 100)) + - (LDNS_DIV(y2, 400) - LDNS_DIV(y1, 400)); -} - -/* - * Code adapted from Python 2.4.1 sources (Lib/calendar.py). - */ -time_t -sldns_mktime_from_utc(const struct tm *tm) -{ - int year = 1900 + tm->tm_year; - time_t days = 365 * ((time_t) year - 1970) + leap_days(1970, year); - time_t hours; - time_t minutes; - time_t seconds; - int i; - - for (i = 0; i < tm->tm_mon; ++i) { - days += mdays[i]; - } - if (tm->tm_mon > 1 && is_leap_year(year)) { - ++days; - } - days += tm->tm_mday - 1; - - hours = days * 24 + tm->tm_hour; - minutes = hours * 60 + tm->tm_min; - seconds = minutes * 60 + tm->tm_sec; - - return seconds; -} - -#if SIZEOF_TIME_T <= 4 - -static void -sldns_year_and_yday_from_days_since_epoch(int64_t days, struct tm *result) -{ - int year = 1970; - int new_year; - - while (days < 0 || days >= (int64_t) (is_leap_year(year) ? 366 : 365)) { - new_year = year + (int) LDNS_DIV(days, 365); - days -= (new_year - year) * 365; - days -= leap_days(year, new_year); - year = new_year; - } - result->tm_year = year; - result->tm_yday = (int) days; -} - -/* Number of days per month in a leap year. */ -static const int leap_year_mdays[] = { - 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 -}; - -static void -sldns_mon_and_mday_from_year_and_yday(struct tm *result) -{ - int idays = result->tm_yday; - const int *mon_lengths = is_leap_year(result->tm_year) ? - leap_year_mdays : mdays; - - result->tm_mon = 0; - while (idays >= mon_lengths[result->tm_mon]) { - idays -= mon_lengths[result->tm_mon++]; - } - result->tm_mday = idays + 1; -} - -static void -sldns_wday_from_year_and_yday(struct tm *result) -{ - result->tm_wday = 4 /* 1-1-1970 was a thursday */ - + LDNS_MOD((result->tm_year - 1970), 7) * LDNS_MOD(365, 7) - + leap_days(1970, result->tm_year) - + result->tm_yday; - result->tm_wday = LDNS_MOD(result->tm_wday, 7); - if (result->tm_wday < 0) { - result->tm_wday += 7; - } -} - -static struct tm * -sldns_gmtime64_r(int64_t clock, struct tm *result) -{ - result->tm_isdst = 0; - result->tm_sec = (int) LDNS_MOD(clock, 60); - clock = LDNS_DIV(clock, 60); - result->tm_min = (int) LDNS_MOD(clock, 60); - clock = LDNS_DIV(clock, 60); - result->tm_hour = (int) LDNS_MOD(clock, 24); - clock = LDNS_DIV(clock, 24); - - sldns_year_and_yday_from_days_since_epoch(clock, result); - sldns_mon_and_mday_from_year_and_yday(result); - sldns_wday_from_year_and_yday(result); - result->tm_year -= 1900; - - return result; -} - -#endif /* SIZEOF_TIME_T <= 4 */ - -static int64_t -sldns_serial_arithmitics_time(int32_t time, time_t now) -{ - int32_t offset = time - (int32_t) now; - return (int64_t) now + offset; -} - -struct tm * -sldns_serial_arithmitics_gmtime_r(int32_t time, time_t now, struct tm *result) -{ -#if SIZEOF_TIME_T <= 4 - int64_t secs_since_epoch = sldns_serial_arithmitics_time(time, now); - return sldns_gmtime64_r(secs_since_epoch, result); -#else - time_t secs_since_epoch = sldns_serial_arithmitics_time(time, now); - return gmtime_r(&secs_since_epoch, result); -#endif -} - -int -sldns_hexdigit_to_int(char ch) -{ - switch (ch) { - case '0': return 0; - case '1': return 1; - case '2': return 2; - case '3': return 3; - case '4': return 4; - case '5': return 5; - case '6': return 6; - case '7': return 7; - case '8': return 8; - case '9': return 9; - case 'a': case 'A': return 10; - case 'b': case 'B': return 11; - case 'c': case 'C': return 12; - case 'd': case 'D': return 13; - case 'e': case 'E': return 14; - case 'f': case 'F': return 15; - default: - return -1; - } -} - -uint32_t -sldns_str2period(const char *nptr, const char **endptr) -{ - int sign = 0; - uint32_t i = 0; - uint32_t seconds = 0; - - for(*endptr = nptr; **endptr; (*endptr)++) { - switch (**endptr) { - case ' ': - case '\t': - break; - case '-': - if(sign == 0) { - sign = -1; - } else { - return seconds; - } - break; - case '+': - if(sign == 0) { - sign = 1; - } else { - return seconds; - } - break; - case 's': - case 'S': - seconds += i; - i = 0; - break; - case 'm': - case 'M': - seconds += i * 60; - i = 0; - break; - case 'h': - case 'H': - seconds += i * 60 * 60; - i = 0; - break; - case 'd': - case 'D': - seconds += i * 60 * 60 * 24; - i = 0; - break; - case 'w': - case 'W': - seconds += i * 60 * 60 * 24 * 7; - i = 0; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - i *= 10; - i += (**endptr - '0'); - break; - default: - seconds += i; - /* disregard signedness */ - return seconds; - } - } - seconds += i; - /* disregard signedness */ - return seconds; -} - -int -sldns_parse_escape(uint8_t *ch_p, const char** str_p) -{ - uint16_t val; - - if ((*str_p)[0] && isdigit((unsigned char)(*str_p)[0]) && - (*str_p)[1] && isdigit((unsigned char)(*str_p)[1]) && - (*str_p)[2] && isdigit((unsigned char)(*str_p)[2])) { - - val = (uint16_t)(((*str_p)[0] - '0') * 100 + - ((*str_p)[1] - '0') * 10 + - ((*str_p)[2] - '0')); - - if (val > 255) { - goto error; - } - *ch_p = (uint8_t)val; - *str_p += 3; - return 1; - - } else if ((*str_p)[0] && !isdigit((unsigned char)(*str_p)[0])) { - - *ch_p = (uint8_t)*(*str_p)++; - return 1; - } -error: - *str_p = NULL; - return 0; /* LDNS_WIREPARSE_ERR_SYNTAX_BAD_ESCAPE */ -} - -/** parse one character, with escape codes */ -int -sldns_parse_char(uint8_t *ch_p, const char** str_p) -{ - switch (**str_p) { - - case '\0': return 0; - - case '\\': *str_p += 1; - return sldns_parse_escape(ch_p, str_p); - - default: *ch_p = (uint8_t)*(*str_p)++; - return 1; - } -} - -size_t sldns_b32_ntop_calculate_size(size_t src_data_length) -{ - return src_data_length == 0 ? 0 : ((src_data_length - 1) / 5 + 1) * 8; -} - -size_t sldns_b32_ntop_calculate_size_no_padding(size_t src_data_length) -{ - return ((src_data_length + 3) * 8 / 5) - 4; -} - -static int -sldns_b32_ntop_base(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz, - int extended_hex, int add_padding) -{ - size_t ret_sz; - const char* b32 = extended_hex ? "0123456789abcdefghijklmnopqrstuv" - : "abcdefghijklmnopqrstuvwxyz234567"; - - size_t c = 0; /* c is used to carry partial base32 character over - * byte boundaries for sizes with a remainder. - * (i.e. src_sz % 5 != 0) - */ - - ret_sz = add_padding ? sldns_b32_ntop_calculate_size(src_sz) - : sldns_b32_ntop_calculate_size_no_padding(src_sz); - - /* Do we have enough space? */ - if (dst_sz < ret_sz + 1) - return -1; - - /* We know the size; terminate the string */ - dst[ret_sz] = '\0'; - - /* First process all chunks of five */ - while (src_sz >= 5) { - /* 00000... ........ ........ ........ ........ */ - dst[0] = b32[(src[0] ) >> 3]; - - /* .....111 11...... ........ ........ ........ */ - dst[1] = b32[(src[0] & 0x07) << 2 | src[1] >> 6]; - - /* ........ ..22222. ........ ........ ........ */ - dst[2] = b32[(src[1] & 0x3e) >> 1]; - - /* ........ .......3 3333.... ........ ........ */ - dst[3] = b32[(src[1] & 0x01) << 4 | src[2] >> 4]; - - /* ........ ........ ....4444 4....... ........ */ - dst[4] = b32[(src[2] & 0x0f) << 1 | src[3] >> 7]; - - /* ........ ........ ........ .55555.. ........ */ - dst[5] = b32[(src[3] & 0x7c) >> 2]; - - /* ........ ........ ........ ......66 666..... */ - dst[6] = b32[(src[3] & 0x03) << 3 | src[4] >> 5]; - - /* ........ ........ ........ ........ ...77777 */ - dst[7] = b32[(src[4] & 0x1f) ]; - - src_sz -= 5; - src += 5; - dst += 8; - } - /* Process what remains */ - switch (src_sz) { - case 4: /* ........ ........ ........ ......66 666..... */ - dst[6] = b32[(src[3] & 0x03) << 3]; - - /* ........ ........ ........ .55555.. ........ */ - dst[5] = b32[(src[3] & 0x7c) >> 2]; - - /* ........ ........ ....4444 4....... ........ */ - c = src[3] >> 7 ; - case 3: dst[4] = b32[(src[2] & 0x0f) << 1 | c]; - - /* ........ .......3 3333.... ........ ........ */ - c = src[2] >> 4 ; - case 2: dst[3] = b32[(src[1] & 0x01) << 4 | c]; - - /* ........ ..22222. ........ ........ ........ */ - dst[2] = b32[(src[1] & 0x3e) >> 1]; - - /* .....111 11...... ........ ........ ........ */ - c = src[1] >> 6 ; - case 1: dst[1] = b32[(src[0] & 0x07) << 2 | c]; - - /* 00000... ........ ........ ........ ........ */ - dst[0] = b32[ src[0] >> 3]; - } - /* Add padding */ - if (add_padding) { - switch (src_sz) { - case 1: dst[2] = '='; - dst[3] = '='; - case 2: dst[4] = '='; - case 3: dst[5] = '='; - dst[6] = '='; - case 4: dst[7] = '='; - } - } - return (int)ret_sz; -} - -int -sldns_b32_ntop(const uint8_t* src, size_t src_sz, char* dst, size_t dst_sz) -{ - return sldns_b32_ntop_base(src, src_sz, dst, dst_sz, 0, 1); -} - -int -sldns_b32_ntop_extended_hex(const uint8_t* src, size_t src_sz, - char* dst, size_t dst_sz) -{ - return sldns_b32_ntop_base(src, src_sz, dst, dst_sz, 1, 1); -} - -size_t sldns_b32_pton_calculate_size(size_t src_text_length) -{ - return src_text_length * 5 / 8; -} - -static int -sldns_b32_pton_base(const char* src, size_t src_sz, uint8_t* dst, size_t dst_sz, - int extended_hex, int check_padding) -{ - size_t i = 0; - char ch = '\0'; - uint8_t buf[8]; - uint8_t* start = dst; - - while (src_sz) { - /* Collect 8 characters in buf (if possible) */ - for (i = 0; i < 8; i++) { - - do { - ch = *src++; - --src_sz; - - } while (isspace((unsigned char)ch) && src_sz > 0); - - if (ch == '=' || ch == '\0') - break; - - else if (extended_hex) - - if (ch >= '0' && ch <= '9') - buf[i] = (uint8_t)ch - '0'; - else if (ch >= 'a' && ch <= 'v') - buf[i] = (uint8_t)ch - 'a' + 10; - else if (ch >= 'A' && ch <= 'V') - buf[i] = (uint8_t)ch - 'A' + 10; - else - return -1; - - else if (ch >= 'a' && ch <= 'z') - buf[i] = (uint8_t)ch - 'a'; - else if (ch >= 'A' && ch <= 'Z') - buf[i] = (uint8_t)ch - 'A'; - else if (ch >= '2' && ch <= '7') - buf[i] = (uint8_t)ch - '2' + 26; - else - return -1; - } - /* Less that 8 characters. We're done. */ - if (i < 8) - break; - - /* Enough space available at the destination? */ - if (dst_sz < 5) - return -1; - - /* 00000... ........ ........ ........ ........ */ - /* .....111 11...... ........ ........ ........ */ - dst[0] = buf[0] << 3 | buf[1] >> 2; - - /* .....111 11...... ........ ........ ........ */ - /* ........ ..22222. ........ ........ ........ */ - /* ........ .......3 3333.... ........ ........ */ - dst[1] = buf[1] << 6 | buf[2] << 1 | buf[3] >> 4; - - /* ........ .......3 3333.... ........ ........ */ - /* ........ ........ ....4444 4....... ........ */ - dst[2] = buf[3] << 4 | buf[4] >> 1; - - /* ........ ........ ....4444 4....... ........ */ - /* ........ ........ ........ .55555.. ........ */ - /* ........ ........ ........ ......66 666..... */ - dst[3] = buf[4] << 7 | buf[5] << 2 | buf[6] >> 3; - - /* ........ ........ ........ ......66 666..... */ - /* ........ ........ ........ ........ ...77777 */ - dst[4] = buf[6] << 5 | buf[7]; - - dst += 5; - dst_sz -= 5; - } - /* Not ending on a eight byte boundary? */ - if (i > 0 && i < 8) { - - /* Enough space available at the destination? */ - if (dst_sz < (i + 1) / 2) - return -1; - - switch (i) { - case 7: /* ........ ........ ........ ......66 666..... */ - /* ........ ........ ........ .55555.. ........ */ - /* ........ ........ ....4444 4....... ........ */ - dst[3] = buf[4] << 7 | buf[5] << 2 | buf[6] >> 3; - - case 5: /* ........ ........ ....4444 4....... ........ */ - /* ........ .......3 3333.... ........ ........ */ - dst[2] = buf[3] << 4 | buf[4] >> 1; - - case 4: /* ........ .......3 3333.... ........ ........ */ - /* ........ ..22222. ........ ........ ........ */ - /* .....111 11...... ........ ........ ........ */ - dst[1] = buf[1] << 6 | buf[2] << 1 | buf[3] >> 4; - - case 2: /* .....111 11...... ........ ........ ........ */ - /* 00000... ........ ........ ........ ........ */ - dst[0] = buf[0] << 3 | buf[1] >> 2; - - break; - - default: - return -1; - } - dst += (i + 1) / 2; - - if (check_padding) { - /* Check remaining padding characters */ - if (ch != '=') - return -1; - - /* One down, 8 - i - 1 more to come... */ - for (i = 8 - i - 1; i > 0; i--) { - - do { - if (src_sz == 0) - return -1; - ch = *src++; - src_sz--; - - } while (isspace((unsigned char)ch)); - - if (ch != '=') - return -1; - } - } - } - return dst - start; -} - -int -sldns_b32_pton(const char* src, size_t src_sz, uint8_t* dst, size_t dst_sz) -{ - return sldns_b32_pton_base(src, src_sz, dst, dst_sz, 0, 1); -} - -int -sldns_b32_pton_extended_hex(const char* src, size_t src_sz, - uint8_t* dst, size_t dst_sz) -{ - return sldns_b32_pton_base(src, src_sz, dst, dst_sz, 1, 1); -} - -size_t sldns_b64_ntop_calculate_size(size_t srcsize) -{ - return ((((srcsize + 2) / 3) * 4) + 1); -} - -/* RFC 1521, section 5.2. - * - * The encoding process represents 24-bit groups of input bits as output - * strings of 4 encoded characters. Proceeding from left to right, a - * 24-bit input group is formed by concatenating 3 8-bit input groups. - * These 24 bits are then treated as 4 concatenated 6-bit groups, each - * of which is translated into a single digit in the base64 alphabet. - * - * This routine does not insert spaces or linebreaks after 76 characters. - */ -int sldns_b64_ntop(uint8_t const *src, size_t srclength, - char *target, size_t targsize) -{ - const char* b64 = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - const char pad64 = '='; - size_t i = 0, o = 0; - if(targsize < sldns_b64_ntop_calculate_size(srclength)) - return -1; - /* whole chunks: xxxxxxyy yyyyzzzz zzwwwwww */ - while(i+3 <= srclength) { - if(o+4 > targsize) return -1; - target[o] = b64[src[i] >> 2]; - target[o+1] = b64[ ((src[i]&0x03)<<4) | (src[i+1]>>4) ]; - target[o+2] = b64[ ((src[i+1]&0x0f)<<2) | (src[i+2]>>6) ]; - target[o+3] = b64[ (src[i+2]&0x3f) ]; - i += 3; - o += 4; - } - /* remainder */ - switch(srclength - i) { - case 2: - /* two at end, converted into A B C = */ - target[o] = b64[src[i] >> 2]; - target[o+1] = b64[ ((src[i]&0x03)<<4) | (src[i+1]>>4) ]; - target[o+2] = b64[ ((src[i+1]&0x0f)<<2) ]; - target[o+3] = pad64; - /* i += 2; */ - o += 4; - break; - case 1: - /* one at end, converted into A B = = */ - target[o] = b64[src[i] >> 2]; - target[o+1] = b64[ ((src[i]&0x03)<<4) ]; - target[o+2] = pad64; - target[o+3] = pad64; - /* i += 1; */ - o += 4; - break; - case 0: - default: - /* nothing */ - break; - } - /* assert: i == srclength */ - if(o+1 > targsize) return -1; - target[o] = 0; - return (int)o; -} - -size_t sldns_b64_pton_calculate_size(size_t srcsize) -{ - return (((((srcsize + 3) / 4) * 3)) + 1); -} - -int sldns_b64_pton(char const *src, uint8_t *target, size_t targsize) -{ - const uint8_t pad64 = 64; /* is 64th in the b64 array */ - const char* s = src; - uint8_t in[4]; - size_t o = 0, incount = 0; - - while(*s) { - /* skip any character that is not base64 */ - /* conceptually we do: - const char* b64 = pad'=' is appended to array - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - const char* d = strchr(b64, *s++); - and use d-b64; - */ - char d = *s++; - if(d <= 'Z' && d >= 'A') - d -= 'A'; - else if(d <= 'z' && d >= 'a') - d = d - 'a' + 26; - else if(d <= '9' && d >= '0') - d = d - '0' + 52; - else if(d == '+') - d = 62; - else if(d == '/') - d = 63; - else if(d == '=') - d = 64; - else continue; - in[incount++] = (uint8_t)d; - if(incount != 4) - continue; - /* process whole block of 4 characters into 3 output bytes */ - if(in[3] == pad64 && in[2] == pad64) { /* A B = = */ - if(o+1 > targsize) - return -1; - target[o] = (in[0]<<2) | ((in[1]&0x30)>>4); - o += 1; - break; /* we are done */ - } else if(in[3] == pad64) { /* A B C = */ - if(o+2 > targsize) - return -1; - target[o] = (in[0]<<2) | ((in[1]&0x30)>>4); - target[o+1]= ((in[1]&0x0f)<<4) | ((in[2]&0x3c)>>2); - o += 2; - break; /* we are done */ - } else { - if(o+3 > targsize) - return -1; - /* write xxxxxxyy yyyyzzzz zzwwwwww */ - target[o] = (in[0]<<2) | ((in[1]&0x30)>>4); - target[o+1]= ((in[1]&0x0f)<<4) | ((in[2]&0x3c)>>2); - target[o+2]= ((in[2]&0x03)<<6) | in[3]; - o += 3; - } - incount = 0; - } - return (int)o; -} diff --git a/external/unbound/sldns/parseutil.h b/external/unbound/sldns/parseutil.h deleted file mode 100644 index c5238bc10..000000000 --- a/external/unbound/sldns/parseutil.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * parseutil.h - parse utilities for string and wire conversion - * - * (c) NLnet Labs, 2004 - * - * See the file LICENSE for the license - */ -/** - * \file - * - * Utility functions for parsing, base32(DNS variant) and base64 encoding - * and decoding, Hex, Time units, Escape codes. - */ - -#ifndef LDNS_PARSEUTIL_H -#define LDNS_PARSEUTIL_H -struct tm; - -/** - * A general purpose lookup table - * - * Lookup tables are arrays of (id, name) pairs, - * So you can for instance lookup the RCODE 3, which is "NXDOMAIN", - * and vice versa. The lookup tables themselves are defined wherever needed, - * for instance in host2str.c - */ -struct sldns_struct_lookup_table { - int id; - const char *name; -}; -typedef struct sldns_struct_lookup_table sldns_lookup_table; - -/** - * Looks up the table entry by name, returns NULL if not found. - * \param[in] table the lookup table to search in - * \param[in] name what to search for - * \return the item found - */ -sldns_lookup_table *sldns_lookup_by_name(sldns_lookup_table table[], - const char *name); -/** - * Looks up the table entry by id, returns NULL if not found. - * \param[in] table the lookup table to search in - * \param[in] id what to search for - * \return the item found - */ -sldns_lookup_table *sldns_lookup_by_id(sldns_lookup_table table[], int id); - -/** - * Convert TM to seconds since epoch (midnight, January 1st, 1970). - * Like timegm(3), which is not always available. - * \param[in] tm a struct tm* with the date - * \return the seconds since epoch - */ -time_t sldns_mktime_from_utc(const struct tm *tm); - -/** - * The function interprets time as the number of seconds since epoch - * with respect to now using serial arithmetics (rfc1982). - * That number of seconds is then converted to broken-out time information. - * This is especially usefull when converting the inception and expiration - * fields of RRSIG records. - * - * \param[in] time number of seconds since epoch (midnight, January 1st, 1970) - * to be intepreted as a serial arithmetics number relative to now. - * \param[in] now number of seconds since epoch (midnight, January 1st, 1970) - * to which the time value is compared to determine the final value. - * \param[out] result the struct with the broken-out time information - * \return result on success or NULL on error - */ -struct tm * sldns_serial_arithmitics_gmtime_r(int32_t time, time_t now, struct tm *result); - -/** - * converts a ttl value (like 5d2h) to a long. - * \param[in] nptr the start of the string - * \param[out] endptr points to the last char in case of error - * \return the convert duration value - */ -uint32_t sldns_str2period(const char *nptr, const char **endptr); - -/** - * Returns the int value of the given (hex) digit - * \param[in] ch the hex char to convert - * \return the converted decimal value - */ -int sldns_hexdigit_to_int(char ch); - -/** - * calculates the size needed to store the result of b64_ntop - */ -size_t sldns_b64_ntop_calculate_size(size_t srcsize); - -int sldns_b64_ntop(uint8_t const *src, size_t srclength, - char *target, size_t targsize); - -/** - * calculates the size needed to store the result of sldns_b64_pton - */ -size_t sldns_b64_pton_calculate_size(size_t srcsize); - -int sldns_b64_pton(char const *src, uint8_t *target, size_t targsize); - -/** - * calculates the size needed to store the result of b32_ntop - */ -size_t sldns_b32_ntop_calculate_size(size_t src_data_length); - -size_t sldns_b32_ntop_calculate_size_no_padding(size_t src_data_length); - -int sldns_b32_ntop(const uint8_t* src_data, size_t src_data_length, - char* target_text_buffer, size_t target_text_buffer_size); - -int sldns_b32_ntop_extended_hex(const uint8_t* src_data, size_t src_data_length, - char* target_text_buffer, size_t target_text_buffer_size); - -/** - * calculates the size needed to store the result of b32_pton - */ -size_t sldns_b32_pton_calculate_size(size_t src_text_length); - -int sldns_b32_pton(const char* src_text, size_t src_text_length, - uint8_t* target_data_buffer, size_t target_data_buffer_size); - -int sldns_b32_pton_extended_hex(const char* src_text, size_t src_text_length, - uint8_t* target_data_buffer, size_t target_data_buffer_size); - -/* - * Checks whether the escaped value at **s is an octal value or - * a 'normally' escaped character (and not eos) - * - * @param ch_p: the parsed character - * @param str_p: the string. moved along for characters read. - * The string pointer at *s is increased by either 0 (on error), 1 (on - * normal escapes), or 3 (on octals) - * - * @return 0 on error - */ -int sldns_parse_escape(uint8_t *ch_p, const char** str_p); - -/** - * Parse one character, with escape codes, - * @param ch_p: the parsed character - * @param str_p: the string. moved along for characters read. - * @return 0 on error - */ -int sldns_parse_char(uint8_t *ch_p, const char** str_p); - -#endif /* LDNS_PARSEUTIL_H */ diff --git a/external/unbound/sldns/pkthdr.h b/external/unbound/sldns/pkthdr.h deleted file mode 100644 index de9952ea7..000000000 --- a/external/unbound/sldns/pkthdr.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * pkthdr.h - packet header from wire conversion routines - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains functions that translate dns data from the wire format (as sent - * by servers and clients) to the internal structures for the packet header. - */ - -#ifndef LDNS_PKTHDR_H -#define LDNS_PKTHDR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* The length of the header */ -#define LDNS_HEADER_SIZE 12 - -/* First octet of flags */ -#define LDNS_RD_MASK 0x01U -#define LDNS_RD_SHIFT 0 -#define LDNS_RD_WIRE(wirebuf) (*(wirebuf+2) & LDNS_RD_MASK) -#define LDNS_RD_SET(wirebuf) (*(wirebuf+2) |= LDNS_RD_MASK) -#define LDNS_RD_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_RD_MASK) - -#define LDNS_TC_MASK 0x02U -#define LDNS_TC_SHIFT 1 -#define LDNS_TC_WIRE(wirebuf) (*(wirebuf+2) & LDNS_TC_MASK) -#define LDNS_TC_SET(wirebuf) (*(wirebuf+2) |= LDNS_TC_MASK) -#define LDNS_TC_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_TC_MASK) - -#define LDNS_AA_MASK 0x04U -#define LDNS_AA_SHIFT 2 -#define LDNS_AA_WIRE(wirebuf) (*(wirebuf+2) & LDNS_AA_MASK) -#define LDNS_AA_SET(wirebuf) (*(wirebuf+2) |= LDNS_AA_MASK) -#define LDNS_AA_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_AA_MASK) - -#define LDNS_OPCODE_MASK 0x78U -#define LDNS_OPCODE_SHIFT 3 -#define LDNS_OPCODE_WIRE(wirebuf) ((*(wirebuf+2) & LDNS_OPCODE_MASK) >> LDNS_OPCODE_SHIFT) -#define LDNS_OPCODE_SET(wirebuf, opcode) \ - (*(wirebuf+2) = ((*(wirebuf+2)) & ~LDNS_OPCODE_MASK) | ((opcode) << LDNS_OPCODE_SHIFT)) - -#define LDNS_QR_MASK 0x80U -#define LDNS_QR_SHIFT 7 -#define LDNS_QR_WIRE(wirebuf) (*(wirebuf+2) & LDNS_QR_MASK) -#define LDNS_QR_SET(wirebuf) (*(wirebuf+2) |= LDNS_QR_MASK) -#define LDNS_QR_CLR(wirebuf) (*(wirebuf+2) &= ~LDNS_QR_MASK) - -/* Second octet of flags */ -#define LDNS_RCODE_MASK 0x0fU -#define LDNS_RCODE_SHIFT 0 -#define LDNS_RCODE_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RCODE_MASK) -#define LDNS_RCODE_SET(wirebuf, rcode) \ - (*(wirebuf+3) = ((*(wirebuf+3)) & ~LDNS_RCODE_MASK) | (rcode)) - -#define LDNS_CD_MASK 0x10U -#define LDNS_CD_SHIFT 4 -#define LDNS_CD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_CD_MASK) -#define LDNS_CD_SET(wirebuf) (*(wirebuf+3) |= LDNS_CD_MASK) -#define LDNS_CD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_CD_MASK) - -#define LDNS_AD_MASK 0x20U -#define LDNS_AD_SHIFT 5 -#define LDNS_AD_WIRE(wirebuf) (*(wirebuf+3) & LDNS_AD_MASK) -#define LDNS_AD_SET(wirebuf) (*(wirebuf+3) |= LDNS_AD_MASK) -#define LDNS_AD_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_AD_MASK) - -#define LDNS_Z_MASK 0x40U -#define LDNS_Z_SHIFT 6 -#define LDNS_Z_WIRE(wirebuf) (*(wirebuf+3) & LDNS_Z_MASK) -#define LDNS_Z_SET(wirebuf) (*(wirebuf+3) |= LDNS_Z_MASK) -#define LDNS_Z_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_Z_MASK) - -#define LDNS_RA_MASK 0x80U -#define LDNS_RA_SHIFT 7 -#define LDNS_RA_WIRE(wirebuf) (*(wirebuf+3) & LDNS_RA_MASK) -#define LDNS_RA_SET(wirebuf) (*(wirebuf+3) |= LDNS_RA_MASK) -#define LDNS_RA_CLR(wirebuf) (*(wirebuf+3) &= ~LDNS_RA_MASK) - -/* Query ID */ -#define LDNS_ID_WIRE(wirebuf) (sldns_read_uint16(wirebuf)) -#define LDNS_ID_SET(wirebuf, id) (sldns_write_uint16(wirebuf, id)) - -/* Counter of the question section */ -#define LDNS_QDCOUNT_OFF 4 -/* -#define QDCOUNT(wirebuf) (ntohs(*(uint16_t *)(wirebuf+QDCOUNT_OFF))) -*/ -#define LDNS_QDCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_QDCOUNT_OFF)) - -/* Counter of the answer section */ -#define LDNS_ANCOUNT_OFF 6 -#define LDNS_ANCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_ANCOUNT_OFF)) - -/* Counter of the authority section */ -#define LDNS_NSCOUNT_OFF 8 -#define LDNS_NSCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_NSCOUNT_OFF)) - -/* Counter of the additional section */ -#define LDNS_ARCOUNT_OFF 10 -#define LDNS_ARCOUNT(wirebuf) (sldns_read_uint16(wirebuf+LDNS_ARCOUNT_OFF)) - -/** - * The sections of a packet - */ -enum sldns_enum_pkt_section { - LDNS_SECTION_QUESTION = 0, - LDNS_SECTION_ANSWER = 1, - LDNS_SECTION_AUTHORITY = 2, - LDNS_SECTION_ADDITIONAL = 3, - /** bogus section, if not interested */ - LDNS_SECTION_ANY = 4, - /** used to get all non-question rrs from a packet */ - LDNS_SECTION_ANY_NOQUESTION = 5 -}; -typedef enum sldns_enum_pkt_section sldns_pkt_section; - -/* opcodes for pkt's */ -enum sldns_enum_pkt_opcode { - LDNS_PACKET_QUERY = 0, - LDNS_PACKET_IQUERY = 1, - LDNS_PACKET_STATUS = 2, /* there is no 3?? DNS is weird */ - LDNS_PACKET_NOTIFY = 4, - LDNS_PACKET_UPDATE = 5 -}; -typedef enum sldns_enum_pkt_opcode sldns_pkt_opcode; - -/* rcodes for pkts */ -enum sldns_enum_pkt_rcode { - LDNS_RCODE_NOERROR = 0, - LDNS_RCODE_FORMERR = 1, - LDNS_RCODE_SERVFAIL = 2, - LDNS_RCODE_NXDOMAIN = 3, - LDNS_RCODE_NOTIMPL = 4, - LDNS_RCODE_REFUSED = 5, - LDNS_RCODE_YXDOMAIN = 6, - LDNS_RCODE_YXRRSET = 7, - LDNS_RCODE_NXRRSET = 8, - LDNS_RCODE_NOTAUTH = 9, - LDNS_RCODE_NOTZONE = 10 -}; -typedef enum sldns_enum_pkt_rcode sldns_pkt_rcode; - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_PKTHDR_H */ diff --git a/external/unbound/sldns/rrdef.c b/external/unbound/sldns/rrdef.c deleted file mode 100644 index 80b47da16..000000000 --- a/external/unbound/sldns/rrdef.c +++ /dev/null @@ -1,736 +0,0 @@ -/* rrdef.c - * - * access functions to rr definitions list. - * a Net::DNS like library for C - * LibDNS Team @ NLnet Labs - * - * (c) NLnet Labs, 2004-2006 - * See the file LICENSE for the license - */ -/** - * \file - * - * Defines resource record types and constants. - */ -#include "config.h" -#include "sldns/rrdef.h" -#include "sldns/parseutil.h" - -/* classes */ -static sldns_lookup_table sldns_rr_classes_data[] = { - { LDNS_RR_CLASS_IN, "IN" }, - { LDNS_RR_CLASS_CH, "CH" }, - { LDNS_RR_CLASS_HS, "HS" }, - { LDNS_RR_CLASS_NONE, "NONE" }, - { LDNS_RR_CLASS_ANY, "ANY" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_rr_classes = sldns_rr_classes_data; - -/* types */ -static const sldns_rdf_type type_0_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; -static const sldns_rdf_type type_a_wireformat[] = { LDNS_RDF_TYPE_A }; -static const sldns_rdf_type type_ns_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_md_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_mf_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_cname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_soa_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, LDNS_RDF_TYPE_PERIOD, - LDNS_RDF_TYPE_PERIOD -}; -static const sldns_rdf_type type_mb_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_mg_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_mr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_wks_wireformat[] = { - LDNS_RDF_TYPE_A, LDNS_RDF_TYPE_WKS -}; -static const sldns_rdf_type type_ptr_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_hinfo_wireformat[] = { - LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR -}; -static const sldns_rdf_type type_minfo_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_mx_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_rp_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_afsdb_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_x25_wireformat[] = { LDNS_RDF_TYPE_STR }; -static const sldns_rdf_type type_isdn_wireformat[] = { - LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR -}; -static const sldns_rdf_type type_rt_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_nsap_wireformat[] = { - LDNS_RDF_TYPE_NSAP -}; -static const sldns_rdf_type type_nsap_ptr_wireformat[] = { - LDNS_RDF_TYPE_STR -}; -static const sldns_rdf_type type_sig_wireformat[] = { - LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_key_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_px_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_gpos_wireformat[] = { - LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR -}; -static const sldns_rdf_type type_aaaa_wireformat[] = { LDNS_RDF_TYPE_AAAA }; -static const sldns_rdf_type type_loc_wireformat[] = { LDNS_RDF_TYPE_LOC }; -static const sldns_rdf_type type_nxt_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_UNKNOWN -}; -static const sldns_rdf_type type_eid_wireformat[] = { - LDNS_RDF_TYPE_HEX -}; -static const sldns_rdf_type type_nimloc_wireformat[] = { - LDNS_RDF_TYPE_HEX -}; -static const sldns_rdf_type type_srv_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_atma_wireformat[] = { - LDNS_RDF_TYPE_ATMA -}; -static const sldns_rdf_type type_naptr_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_STR, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_kx_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_cert_wireformat[] = { - LDNS_RDF_TYPE_CERT_ALG, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_a6_wireformat[] = { LDNS_RDF_TYPE_UNKNOWN }; -static const sldns_rdf_type type_dname_wireformat[] = { LDNS_RDF_TYPE_DNAME }; -static const sldns_rdf_type type_sink_wireformat[] = { LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_apl_wireformat[] = { - LDNS_RDF_TYPE_APL -}; -static const sldns_rdf_type type_ds_wireformat[] = { - LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX -}; -static const sldns_rdf_type type_sshfp_wireformat[] = { - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_HEX -}; -static const sldns_rdf_type type_ipseckey_wireformat[] = { - LDNS_RDF_TYPE_IPSECKEY -}; -static const sldns_rdf_type type_rrsig_wireformat[] = { - LDNS_RDF_TYPE_TYPE, LDNS_RDF_TYPE_ALG, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT32, - LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_TIME, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_nsec_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_NSEC -}; -static const sldns_rdf_type type_dhcid_wireformat[] = { - LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_talink_wireformat[] = { - LDNS_RDF_TYPE_DNAME, LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_openpgpkey_wireformat[] = { - LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_csync_wireformat[] = { - LDNS_RDF_TYPE_INT32, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC -}; -/* nsec3 is some vars, followed by same type of data of nsec */ -static const sldns_rdf_type type_nsec3_wireformat[] = { -/* LDNS_RDF_TYPE_NSEC3_VARS, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC*/ - LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT8, LDNS_RDF_TYPE_INT16, LDNS_RDF_TYPE_NSEC3_SALT, LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, LDNS_RDF_TYPE_NSEC -}; - -static const sldns_rdf_type type_nsec3param_wireformat[] = { -/* LDNS_RDF_TYPE_NSEC3_PARAMS_VARS*/ - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_NSEC3_SALT -}; - -static const sldns_rdf_type type_dnskey_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_ALG, - LDNS_RDF_TYPE_B64 -}; -static const sldns_rdf_type type_tkey_wireformat[] = { - LDNS_RDF_TYPE_DNAME, - LDNS_RDF_TYPE_TIME, - LDNS_RDF_TYPE_TIME, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16_DATA, - LDNS_RDF_TYPE_INT16_DATA, -}; -static const sldns_rdf_type type_tsig_wireformat[] = { - LDNS_RDF_TYPE_DNAME, - LDNS_RDF_TYPE_TSIGTIME, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16_DATA, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16_DATA -}; -static const sldns_rdf_type type_tlsa_wireformat[] = { - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_HEX -}; -static const sldns_rdf_type type_hip_wireformat[] = { - LDNS_RDF_TYPE_HIP -}; -static const sldns_rdf_type type_nid_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_ILNP64 -}; -static const sldns_rdf_type type_l32_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_A -}; -static const sldns_rdf_type type_l64_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_ILNP64 -}; -static const sldns_rdf_type type_lp_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_DNAME -}; -static const sldns_rdf_type type_eui48_wireformat[] = { - LDNS_RDF_TYPE_EUI48 -}; -static const sldns_rdf_type type_eui64_wireformat[] = { - LDNS_RDF_TYPE_EUI64 -}; -static const sldns_rdf_type type_uri_wireformat[] = { - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_INT16, - LDNS_RDF_TYPE_LONG_STR -}; -static const sldns_rdf_type type_caa_wireformat[] = { - LDNS_RDF_TYPE_INT8, - LDNS_RDF_TYPE_TAG, - LDNS_RDF_TYPE_LONG_STR -}; - -/* All RR's defined in 1035 are well known and can thus - * be compressed. See RFC3597. These RR's are: - * CNAME HINFO MB MD MF MG MINFO MR MX NULL NS PTR SOA TXT - */ -static sldns_rr_descriptor rdata_field_descriptors[] = { - /* 0 */ - { 0, NULL, 0, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 1 */ - {LDNS_RR_TYPE_A, "A", 1, 1, type_a_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 2 */ - {LDNS_RR_TYPE_NS, "NS", 1, 1, type_ns_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 3 */ - {LDNS_RR_TYPE_MD, "MD", 1, 1, type_md_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 4 */ - {LDNS_RR_TYPE_MF, "MF", 1, 1, type_mf_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 5 */ - {LDNS_RR_TYPE_CNAME, "CNAME", 1, 1, type_cname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 6 */ - {LDNS_RR_TYPE_SOA, "SOA", 7, 7, type_soa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, - /* 7 */ - {LDNS_RR_TYPE_MB, "MB", 1, 1, type_mb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 8 */ - {LDNS_RR_TYPE_MG, "MG", 1, 1, type_mg_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 9 */ - {LDNS_RR_TYPE_MR, "MR", 1, 1, type_mr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 10 */ - {LDNS_RR_TYPE_NULL, "NULL", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 11 */ - {LDNS_RR_TYPE_WKS, "WKS", 2, 2, type_wks_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 12 */ - {LDNS_RR_TYPE_PTR, "PTR", 1, 1, type_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 13 */ - {LDNS_RR_TYPE_HINFO, "HINFO", 2, 2, type_hinfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 14 */ - {LDNS_RR_TYPE_MINFO, "MINFO", 2, 2, type_minfo_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 2 }, - /* 15 */ - {LDNS_RR_TYPE_MX, "MX", 2, 2, type_mx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_COMPRESS, 1 }, - /* 16 */ - {LDNS_RR_TYPE_TXT, "TXT", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, - /* 17 */ - {LDNS_RR_TYPE_RP, "RP", 2, 2, type_rp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, - /* 18 */ - {LDNS_RR_TYPE_AFSDB, "AFSDB", 2, 2, type_afsdb_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 19 */ - {LDNS_RR_TYPE_X25, "X25", 1, 1, type_x25_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 20 */ - {LDNS_RR_TYPE_ISDN, "ISDN", 1, 2, type_isdn_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 21 */ - {LDNS_RR_TYPE_RT, "RT", 2, 2, type_rt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 22 */ - {LDNS_RR_TYPE_NSAP, "NSAP", 1, 1, type_nsap_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 23 */ - {LDNS_RR_TYPE_NSAP_PTR, "NSAP-PTR", 1, 1, type_nsap_ptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 24 */ - {LDNS_RR_TYPE_SIG, "SIG", 9, 9, type_sig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 25 */ - {LDNS_RR_TYPE_KEY, "KEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 26 */ - {LDNS_RR_TYPE_PX, "PX", 3, 3, type_px_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, - /* 27 */ - {LDNS_RR_TYPE_GPOS, "GPOS", 3, 3, type_gpos_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 28 */ - {LDNS_RR_TYPE_AAAA, "AAAA", 1, 1, type_aaaa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 29 */ - {LDNS_RR_TYPE_LOC, "LOC", 1, 1, type_loc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 30 */ - {LDNS_RR_TYPE_NXT, "NXT", 2, 2, type_nxt_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 31 */ - {LDNS_RR_TYPE_EID, "EID", 1, 1, type_eid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 32 */ - {LDNS_RR_TYPE_NIMLOC, "NIMLOC", 1, 1, type_nimloc_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 33 */ - {LDNS_RR_TYPE_SRV, "SRV", 4, 4, type_srv_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 34 */ - {LDNS_RR_TYPE_ATMA, "ATMA", 1, 1, type_atma_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 35 */ - {LDNS_RR_TYPE_NAPTR, "NAPTR", 6, 6, type_naptr_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 36 */ - {LDNS_RR_TYPE_KX, "KX", 2, 2, type_kx_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 37 */ - {LDNS_RR_TYPE_CERT, "CERT", 4, 4, type_cert_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 38 */ - {LDNS_RR_TYPE_A6, "A6", 1, 1, type_a6_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 39 */ - {LDNS_RR_TYPE_DNAME, "DNAME", 1, 1, type_dname_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 40 */ - {LDNS_RR_TYPE_SINK, "SINK", 1, 1, type_sink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 41 */ - {LDNS_RR_TYPE_OPT, "OPT", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 42 */ - {LDNS_RR_TYPE_APL, "APL", 0, 0, type_apl_wireformat, LDNS_RDF_TYPE_APL, LDNS_RR_NO_COMPRESS, 0 }, - /* 43 */ - {LDNS_RR_TYPE_DS, "DS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 44 */ - {LDNS_RR_TYPE_SSHFP, "SSHFP", 3, 3, type_sshfp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 45 */ - {LDNS_RR_TYPE_IPSECKEY, "IPSECKEY", 1, 1, type_ipseckey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 46 */ - {LDNS_RR_TYPE_RRSIG, "RRSIG", 9, 9, type_rrsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 47 */ - {LDNS_RR_TYPE_NSEC, "NSEC", 1, 2, type_nsec_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* 48 */ - {LDNS_RR_TYPE_DNSKEY, "DNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 49 */ - {LDNS_RR_TYPE_DHCID, "DHCID", 1, 1, type_dhcid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 50 */ - {LDNS_RR_TYPE_NSEC3, "NSEC3", 5, 6, type_nsec3_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 51 */ - {LDNS_RR_TYPE_NSEC3PARAM, "NSEC3PARAM", 4, 4, type_nsec3param_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 52 */ - {LDNS_RR_TYPE_TLSA, "TLSA", 4, 4, type_tlsa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - -{LDNS_RR_TYPE_NULL, "TYPE53", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE54", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 55 - * Hip ends with 0 or more Rendezvous Servers represented as dname's. - * Hence the LDNS_RDF_TYPE_DNAME _variable field and the _maximum field - * set to 0. - */ - {LDNS_RR_TYPE_HIP, "HIP", 1, 1, type_hip_wireformat, LDNS_RDF_TYPE_DNAME, LDNS_RR_NO_COMPRESS, 0 }, - -#ifdef DRAFT_RRTYPES - /* 56 */ - {LDNS_RR_TYPE_NINFO, "NINFO", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, - /* 57 */ - {LDNS_RR_TYPE_RKEY, "RKEY", 4, 4, type_key_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE56", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE57", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif - /* 58 */ - {LDNS_RR_TYPE_TALINK, "TALINK", 2, 2, type_talink_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 2 }, - - /* 59 */ - {LDNS_RR_TYPE_CDS, "CDS", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 60 */ - {LDNS_RR_TYPE_CDNSKEY, "CDNSKEY", 4, 4, type_dnskey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 61 */ -{LDNS_RR_TYPE_OPENPGPKEY, "OPENPGPKEY", 1, 1, type_openpgpkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 62 */ - {LDNS_RR_TYPE_CSYNC, "CSYNC", 3, 3, type_csync_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE63", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE64", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE65", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE66", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE67", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE68", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE69", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE70", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE71", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE72", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE73", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE74", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE75", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE76", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE77", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE78", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE79", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE80", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE81", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE82", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE83", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE84", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE85", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE86", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE87", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE88", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE89", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE90", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE91", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE92", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE93", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE94", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE95", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE96", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE97", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE98", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 99 */ - {LDNS_RR_TYPE_SPF, "SPF", 1, 0, NULL, LDNS_RDF_TYPE_STR, LDNS_RR_NO_COMPRESS, 0 }, - - /* UINFO [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE100", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* UID [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE101", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* GID [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE102", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* UNSPEC [IANA-Reserved] */ -{LDNS_RR_TYPE_NULL, "TYPE103", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 104 */ - {LDNS_RR_TYPE_NID, "NID", 2, 2, type_nid_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 105 */ - {LDNS_RR_TYPE_L32, "L32", 2, 2, type_l32_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 106 */ - {LDNS_RR_TYPE_L64, "L64", 2, 2, type_l64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 107 */ - {LDNS_RR_TYPE_LP, "LP", 2, 2, type_lp_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - - /* 108 */ - {LDNS_RR_TYPE_EUI48, "EUI48", 1, 1, type_eui48_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 109 */ - {LDNS_RR_TYPE_EUI64, "EUI64", 1, 1, type_eui64_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - -{LDNS_RR_TYPE_NULL, "TYPE110", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE111", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE112", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE113", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE114", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE115", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE116", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE117", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE118", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE119", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE120", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE121", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE122", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE123", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE124", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE125", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE126", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE127", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE128", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE129", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE130", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE131", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE132", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE133", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE134", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE135", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE136", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE137", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE138", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE139", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE140", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE141", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE142", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE143", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE144", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE145", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE146", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE147", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE148", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE149", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE150", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE151", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE152", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE153", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE154", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE155", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE156", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE157", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE158", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE159", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE160", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE161", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE162", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE163", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE164", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE165", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE166", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE167", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE168", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE169", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE170", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE171", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE172", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE173", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE174", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE175", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE176", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE177", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE178", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE179", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE180", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE181", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE182", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE183", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE184", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE185", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE186", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE187", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE188", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE189", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE190", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE191", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE192", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE193", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE194", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE195", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE196", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE197", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE198", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE199", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE200", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE201", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE202", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE203", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE204", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE205", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE206", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE207", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE208", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE209", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE210", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE211", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE212", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE213", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE214", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE215", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE216", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE217", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE218", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE219", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE220", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE221", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE222", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE223", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE224", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE225", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE226", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE227", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE228", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE229", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE230", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE231", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE232", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE233", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE234", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE235", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE236", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE237", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE238", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE239", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE240", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE241", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE242", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE243", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE244", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE245", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE246", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE247", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -{LDNS_RR_TYPE_NULL, "TYPE248", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one. - * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9. - */ - /* 249 */ - {LDNS_RR_TYPE_TKEY, "TKEY", 7, 7, type_tkey_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - /* LDNS_RDF_TYPE_INT16_DATA takes two fields (length and data) as one. - * So, unlike RFC 2930 spec, we have 7 min/max rdf's i.s.o. 8/9. - */ - /* 250 */ - {LDNS_RR_TYPE_TSIG, "TSIG", 7, 7, type_tsig_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 1 }, - - /* IXFR: A request for a transfer of an incremental zone transfer */ -{LDNS_RR_TYPE_IXFR, "IXFR", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* AXFR: A request for a transfer of an entire zone */ -{LDNS_RR_TYPE_AXFR, "AXFR", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* MAILB: A request for mailbox-related records (MB, MG or MR) */ -{LDNS_RR_TYPE_MAILB, "MAILB", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* MAILA: A request for mail agent RRs (Obsolete - see MX) */ -{LDNS_RR_TYPE_MAILA, "MAILA", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* ANY: A request for all (available) records */ -{LDNS_RR_TYPE_ANY, "ANY", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - - /* 256 */ - {LDNS_RR_TYPE_URI, "URI", 3, 3, type_uri_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - /* 257 */ - {LDNS_RR_TYPE_CAA, "CAA", 3, 3, type_caa_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, - -/* split in array, no longer contiguous */ - -#ifdef DRAFT_RRTYPES - /* 32768 */ - {LDNS_RR_TYPE_TA, "TA", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#else -{LDNS_RR_TYPE_NULL, "TYPE32768", 1, 1, type_0_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 }, -#endif - /* 32769 */ - {LDNS_RR_TYPE_DLV, "DLV", 4, 4, type_ds_wireformat, LDNS_RDF_TYPE_NONE, LDNS_RR_NO_COMPRESS, 0 } -}; - -/** - * \def LDNS_RDATA_FIELD_DESCRIPTORS_COUNT - * computes the number of rdata fields - */ -#define LDNS_RDATA_FIELD_DESCRIPTORS_COUNT \ - (sizeof(rdata_field_descriptors)/sizeof(rdata_field_descriptors[0])) - -const sldns_rr_descriptor * -sldns_rr_descript(uint16_t type) -{ - size_t i; - if (type < LDNS_RDATA_FIELD_DESCRIPTORS_COMMON) { - return &rdata_field_descriptors[type]; - } else { - /* because not all array index equals type code */ - for (i = LDNS_RDATA_FIELD_DESCRIPTORS_COMMON; - i < LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; - i++) { - if (rdata_field_descriptors[i]._type == type) { - return &rdata_field_descriptors[i]; - } - } - return &rdata_field_descriptors[0]; - } -} - -size_t -sldns_rr_descriptor_minimum(const sldns_rr_descriptor *descriptor) -{ - if (descriptor) { - return descriptor->_minimum; - } else { - return 0; - } -} - -size_t -sldns_rr_descriptor_maximum(const sldns_rr_descriptor *descriptor) -{ - if (descriptor) { - if (descriptor->_variable != LDNS_RDF_TYPE_NONE) { - return 65535; /* cannot be more than 64k */ - } else { - return descriptor->_maximum; - } - } else { - return 0; - } -} - -sldns_rdf_type -sldns_rr_descriptor_field_type(const sldns_rr_descriptor *descriptor, - size_t index) -{ - assert(descriptor != NULL); - assert(index < descriptor->_maximum - || descriptor->_variable != LDNS_RDF_TYPE_NONE); - if (index < descriptor->_maximum) { - return descriptor->_wireformat[index]; - } else { - return descriptor->_variable; - } -} - -sldns_rr_type -sldns_get_rr_type_by_name(const char *name) -{ - unsigned int i; - const char *desc_name; - const sldns_rr_descriptor *desc; - - /* TYPEXX representation */ - if (strlen(name) > 4 && strncasecmp(name, "TYPE", 4) == 0) { - return atoi(name + 4); - } - - /* Normal types */ - for (i = 0; i < (unsigned int) LDNS_RDATA_FIELD_DESCRIPTORS_COUNT; i++) { - desc = &rdata_field_descriptors[i]; - desc_name = desc->_name; - if(desc_name && - strlen(name) == strlen(desc_name) && - strncasecmp(name, desc_name, strlen(desc_name)) == 0) { - /* because not all array index equals type code */ - return desc->_type; - } - } - - /* special cases for query types */ - if (strlen(name) == 4 && strncasecmp(name, "IXFR", 4) == 0) { - return 251; - } else if (strlen(name) == 4 && strncasecmp(name, "AXFR", 4) == 0) { - return 252; - } else if (strlen(name) == 5 && strncasecmp(name, "MAILB", 5) == 0) { - return 253; - } else if (strlen(name) == 5 && strncasecmp(name, "MAILA", 5) == 0) { - return 254; - } else if (strlen(name) == 3 && strncasecmp(name, "ANY", 3) == 0) { - return 255; - } - - return 0; -} - -sldns_rr_class -sldns_get_rr_class_by_name(const char *name) -{ - sldns_lookup_table *lt; - - /* CLASSXX representation */ - if (strlen(name) > 5 && strncasecmp(name, "CLASS", 5) == 0) { - return atoi(name + 5); - } - - /* Normal types */ - lt = sldns_lookup_by_name(sldns_rr_classes, name); - if (lt) { - return lt->id; - } - return 0; -} diff --git a/external/unbound/sldns/rrdef.h b/external/unbound/sldns/rrdef.h deleted file mode 100644 index af7bca1d2..000000000 --- a/external/unbound/sldns/rrdef.h +++ /dev/null @@ -1,510 +0,0 @@ -/* - * rrdef.h - * - * RR definitions - * - * a Net::DNS like library for C - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Defines resource record types and constants. - */ - -#ifndef LDNS_RRDEF_H -#define LDNS_RRDEF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** Maximum length of a dname label */ -#define LDNS_MAX_LABELLEN 63 -/** Maximum length of a complete dname */ -#define LDNS_MAX_DOMAINLEN 255 -/** Maximum number of pointers in 1 dname */ -#define LDNS_MAX_POINTERS 65535 -/** The bytes TTL, CLASS and length use up in an rr */ -#define LDNS_RR_OVERHEAD 10 - -#define LDNS_DNSSEC_KEYPROTO 3 -#define LDNS_KEY_ZONE_KEY 0x0100 /* set for ZSK&KSK, rfc 4034 */ -#define LDNS_KEY_SEP_KEY 0x0001 /* set for KSK, rfc 4034 */ -#define LDNS_KEY_REVOKE_KEY 0x0080 /* used to revoke KSK, rfc 5011 */ - -/* The first fields are contiguous and can be referenced instantly */ -#define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON 258 - -/** lookuptable for rr classes */ -extern struct sldns_struct_lookup_table* sldns_rr_classes; - -/** - * The different RR classes. - */ -enum sldns_enum_rr_class -{ - /** the Internet */ - LDNS_RR_CLASS_IN = 1, - /** Chaos class */ - LDNS_RR_CLASS_CH = 3, - /** Hesiod (Dyer 87) */ - LDNS_RR_CLASS_HS = 4, - /** None class, dynamic update */ - LDNS_RR_CLASS_NONE = 254, - /** Any class */ - LDNS_RR_CLASS_ANY = 255, - - LDNS_RR_CLASS_FIRST = 0, - LDNS_RR_CLASS_LAST = 65535, - LDNS_RR_CLASS_COUNT = LDNS_RR_CLASS_LAST - LDNS_RR_CLASS_FIRST + 1 -}; -typedef enum sldns_enum_rr_class sldns_rr_class; - -/** - * Used to specify whether compression is allowed. - */ -enum sldns_enum_rr_compress -{ - /** compression is allowed */ - LDNS_RR_COMPRESS, - LDNS_RR_NO_COMPRESS -}; -typedef enum sldns_enum_rr_compress sldns_rr_compress; - -/** - * The different RR types. - */ -enum sldns_enum_rr_type -{ - /** a host address */ - LDNS_RR_TYPE_A = 1, - /** an authoritative name server */ - LDNS_RR_TYPE_NS = 2, - /** a mail destination (Obsolete - use MX) */ - LDNS_RR_TYPE_MD = 3, - /** a mail forwarder (Obsolete - use MX) */ - LDNS_RR_TYPE_MF = 4, - /** the canonical name for an alias */ - LDNS_RR_TYPE_CNAME = 5, - /** marks the start of a zone of authority */ - LDNS_RR_TYPE_SOA = 6, - /** a mailbox domain name (EXPERIMENTAL) */ - LDNS_RR_TYPE_MB = 7, - /** a mail group member (EXPERIMENTAL) */ - LDNS_RR_TYPE_MG = 8, - /** a mail rename domain name (EXPERIMENTAL) */ - LDNS_RR_TYPE_MR = 9, - /** a null RR (EXPERIMENTAL) */ - LDNS_RR_TYPE_NULL = 10, - /** a well known service description */ - LDNS_RR_TYPE_WKS = 11, - /** a domain name pointer */ - LDNS_RR_TYPE_PTR = 12, - /** host information */ - LDNS_RR_TYPE_HINFO = 13, - /** mailbox or mail list information */ - LDNS_RR_TYPE_MINFO = 14, - /** mail exchange */ - LDNS_RR_TYPE_MX = 15, - /** text strings */ - LDNS_RR_TYPE_TXT = 16, - /** RFC1183 */ - LDNS_RR_TYPE_RP = 17, - /** RFC1183 */ - LDNS_RR_TYPE_AFSDB = 18, - /** RFC1183 */ - LDNS_RR_TYPE_X25 = 19, - /** RFC1183 */ - LDNS_RR_TYPE_ISDN = 20, - /** RFC1183 */ - LDNS_RR_TYPE_RT = 21, - /** RFC1706 */ - LDNS_RR_TYPE_NSAP = 22, - /** RFC1348 */ - LDNS_RR_TYPE_NSAP_PTR = 23, - /** 2535typecode */ - LDNS_RR_TYPE_SIG = 24, - /** 2535typecode */ - LDNS_RR_TYPE_KEY = 25, - /** RFC2163 */ - LDNS_RR_TYPE_PX = 26, - /** RFC1712 */ - LDNS_RR_TYPE_GPOS = 27, - /** ipv6 address */ - LDNS_RR_TYPE_AAAA = 28, - /** LOC record RFC1876 */ - LDNS_RR_TYPE_LOC = 29, - /** 2535typecode */ - LDNS_RR_TYPE_NXT = 30, - /** draft-ietf-nimrod-dns-01.txt */ - LDNS_RR_TYPE_EID = 31, - /** draft-ietf-nimrod-dns-01.txt */ - LDNS_RR_TYPE_NIMLOC = 32, - /** SRV record RFC2782 */ - LDNS_RR_TYPE_SRV = 33, - /** http://www.jhsoft.com/rfc/af-saa-0069.000.rtf */ - LDNS_RR_TYPE_ATMA = 34, - /** RFC2915 */ - LDNS_RR_TYPE_NAPTR = 35, - /** RFC2230 */ - LDNS_RR_TYPE_KX = 36, - /** RFC2538 */ - LDNS_RR_TYPE_CERT = 37, - /** RFC2874 */ - LDNS_RR_TYPE_A6 = 38, - /** RFC2672 */ - LDNS_RR_TYPE_DNAME = 39, - /** dnsind-kitchen-sink-02.txt */ - LDNS_RR_TYPE_SINK = 40, - /** Pseudo OPT record... */ - LDNS_RR_TYPE_OPT = 41, - /** RFC3123 */ - LDNS_RR_TYPE_APL = 42, - /** RFC4034, RFC3658 */ - LDNS_RR_TYPE_DS = 43, - /** SSH Key Fingerprint */ - LDNS_RR_TYPE_SSHFP = 44, /* RFC 4255 */ - /** IPsec Key */ - LDNS_RR_TYPE_IPSECKEY = 45, /* RFC 4025 */ - /** DNSSEC */ - LDNS_RR_TYPE_RRSIG = 46, /* RFC 4034 */ - LDNS_RR_TYPE_NSEC = 47, /* RFC 4034 */ - LDNS_RR_TYPE_DNSKEY = 48, /* RFC 4034 */ - - LDNS_RR_TYPE_DHCID = 49, /* RFC 4701 */ - /* NSEC3 */ - LDNS_RR_TYPE_NSEC3 = 50, /* RFC 5155 */ - LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */ - LDNS_RR_TYPE_NSEC3PARAMS = 51, - LDNS_RR_TYPE_TLSA = 52, /* RFC 6698 */ - LDNS_RR_TYPE_SMIMEA = 53, /* draft-ietf-dane-smime, TLSA-like but may - be extended */ - - LDNS_RR_TYPE_HIP = 55, /* RFC 5205 */ - - /** draft-reid-dnsext-zs */ - LDNS_RR_TYPE_NINFO = 56, - /** draft-reid-dnsext-rkey */ - LDNS_RR_TYPE_RKEY = 57, - /** draft-ietf-dnsop-trust-history */ - LDNS_RR_TYPE_TALINK = 58, - LDNS_RR_TYPE_CDS = 59, /** RFC 7344 */ - LDNS_RR_TYPE_CDNSKEY = 60, /** RFC 7344 */ - LDNS_RR_TYPE_OPENPGPKEY = 61, /* RFC 7929 */ - LDNS_RR_TYPE_CSYNC = 62, /* RFC 7477 */ - - LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */ - - LDNS_RR_TYPE_UINFO = 100, - LDNS_RR_TYPE_UID = 101, - LDNS_RR_TYPE_GID = 102, - LDNS_RR_TYPE_UNSPEC = 103, - - LDNS_RR_TYPE_NID = 104, /* RFC 6742 */ - LDNS_RR_TYPE_L32 = 105, /* RFC 6742 */ - LDNS_RR_TYPE_L64 = 106, /* RFC 6742 */ - LDNS_RR_TYPE_LP = 107, /* RFC 6742 */ - - /** draft-jabley-dnsext-eui48-eui64-rrtypes */ - LDNS_RR_TYPE_EUI48 = 108, - LDNS_RR_TYPE_EUI64 = 109, - - LDNS_RR_TYPE_TKEY = 249, /* RFC 2930 */ - LDNS_RR_TYPE_TSIG = 250, - LDNS_RR_TYPE_IXFR = 251, - LDNS_RR_TYPE_AXFR = 252, - /** A request for mailbox-related records (MB, MG or MR) */ - LDNS_RR_TYPE_MAILB = 253, - /** A request for mail agent RRs (Obsolete - see MX) */ - LDNS_RR_TYPE_MAILA = 254, - /** any type (wildcard) */ - LDNS_RR_TYPE_ANY = 255, - LDNS_RR_TYPE_URI = 256, /* RFC 7553 */ - LDNS_RR_TYPE_CAA = 257, /* RFC 6844 */ - - /** DNSSEC Trust Authorities */ - LDNS_RR_TYPE_TA = 32768, - /* RFC 4431, 5074, DNSSEC Lookaside Validation */ - LDNS_RR_TYPE_DLV = 32769, - - /* type codes from nsec3 experimental phase - LDNS_RR_TYPE_NSEC3 = 65324, - LDNS_RR_TYPE_NSEC3PARAMS = 65325, */ - LDNS_RR_TYPE_FIRST = 0, - LDNS_RR_TYPE_LAST = 65535, - LDNS_RR_TYPE_COUNT = LDNS_RR_TYPE_LAST - LDNS_RR_TYPE_FIRST + 1 -}; -typedef enum sldns_enum_rr_type sldns_rr_type; - -/* RDATA */ -#define LDNS_MAX_RDFLEN 65535 - -#define LDNS_RDF_SIZE_BYTE 1 -#define LDNS_RDF_SIZE_WORD 2 -#define LDNS_RDF_SIZE_DOUBLEWORD 4 -#define LDNS_RDF_SIZE_6BYTES 6 -#define LDNS_RDF_SIZE_8BYTES 8 -#define LDNS_RDF_SIZE_16BYTES 16 - -#define LDNS_NSEC3_VARS_OPTOUT_MASK 0x01 - -#define LDNS_APL_IP4 1 -#define LDNS_APL_IP6 2 -#define LDNS_APL_MASK 0x7f -#define LDNS_APL_NEGATION 0x80 - -/** - * The different types of RDATA fields. - */ -enum sldns_enum_rdf_type -{ - /** none */ - LDNS_RDF_TYPE_NONE, - /** domain name */ - LDNS_RDF_TYPE_DNAME, - /** 8 bits */ - LDNS_RDF_TYPE_INT8, - /** 16 bits */ - LDNS_RDF_TYPE_INT16, - /** 32 bits */ - LDNS_RDF_TYPE_INT32, - /** A record */ - LDNS_RDF_TYPE_A, - /** AAAA record */ - LDNS_RDF_TYPE_AAAA, - /** txt string */ - LDNS_RDF_TYPE_STR, - /** apl data */ - LDNS_RDF_TYPE_APL, - /** b32 string */ - LDNS_RDF_TYPE_B32_EXT, - /** b64 string */ - LDNS_RDF_TYPE_B64, - /** hex string */ - LDNS_RDF_TYPE_HEX, - /** nsec type codes */ - LDNS_RDF_TYPE_NSEC, - /** a RR type */ - LDNS_RDF_TYPE_TYPE, - /** a class */ - LDNS_RDF_TYPE_CLASS, - /** certificate algorithm */ - LDNS_RDF_TYPE_CERT_ALG, - /** a key algorithm */ - LDNS_RDF_TYPE_ALG, - /** unknown types */ - LDNS_RDF_TYPE_UNKNOWN, - /** time (32 bits) */ - LDNS_RDF_TYPE_TIME, - /** period */ - LDNS_RDF_TYPE_PERIOD, - /** tsig time 48 bits */ - LDNS_RDF_TYPE_TSIGTIME, - /** Represents the Public Key Algorithm, HIT and Public Key fields - for the HIP RR types. A HIP specific rdf type is used because of - the unusual layout in wireformat (see RFC 5205 Section 5) */ - LDNS_RDF_TYPE_HIP, - /** variable length any type rdata where the length - is specified by the first 2 bytes */ - LDNS_RDF_TYPE_INT16_DATA, - /** protocol and port bitmaps */ - LDNS_RDF_TYPE_SERVICE, - /** location data */ - LDNS_RDF_TYPE_LOC, - /** well known services */ - LDNS_RDF_TYPE_WKS, - /** NSAP */ - LDNS_RDF_TYPE_NSAP, - /** ATMA */ - LDNS_RDF_TYPE_ATMA, - /** IPSECKEY */ - LDNS_RDF_TYPE_IPSECKEY, - /** nsec3 hash salt */ - LDNS_RDF_TYPE_NSEC3_SALT, - /** nsec3 base32 string (with length byte on wire */ - LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, - - /** 4 shorts represented as 4 * 16 bit hex numbers - * seperated by colons. For NID and L64. - */ - LDNS_RDF_TYPE_ILNP64, - - /** 6 * 8 bit hex numbers seperated by dashes. For EUI48. */ - LDNS_RDF_TYPE_EUI48, - /** 8 * 8 bit hex numbers seperated by dashes. For EUI64. */ - LDNS_RDF_TYPE_EUI64, - - /** A non-zero sequence of US-ASCII letters and numbers in lower case. - * For CAA. - */ - LDNS_RDF_TYPE_TAG, - - /** A <character-string> encoding of the value field as specified - * [RFC1035], Section 5.1., encoded as remaining rdata. - * For CAA, URI. - */ - LDNS_RDF_TYPE_LONG_STR, - - /* Aliases */ - LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC -}; -typedef enum sldns_enum_rdf_type sldns_rdf_type; - -/** - * Algorithms used in dns - */ -enum sldns_enum_algorithm -{ - LDNS_RSAMD5 = 1, /* RFC 4034,4035 */ - LDNS_DH = 2, - LDNS_DSA = 3, - LDNS_ECC = 4, - LDNS_RSASHA1 = 5, - LDNS_DSA_NSEC3 = 6, - LDNS_RSASHA1_NSEC3 = 7, - LDNS_RSASHA256 = 8, /* RFC 5702 */ - LDNS_RSASHA512 = 10, /* RFC 5702 */ - LDNS_ECC_GOST = 12, /* RFC 5933 */ - LDNS_ECDSAP256SHA256 = 13, /* RFC 6605 */ - LDNS_ECDSAP384SHA384 = 14, /* RFC 6605 */ - LDNS_ED25519 = 15, /* RFC 8080 */ - LDNS_ED448 = 16, /* RFC 8080 */ - LDNS_INDIRECT = 252, - LDNS_PRIVATEDNS = 253, - LDNS_PRIVATEOID = 254 -}; -typedef enum sldns_enum_algorithm sldns_algorithm; - -/** - * Hashing algorithms used in the DS record - */ -enum sldns_enum_hash -{ - LDNS_SHA1 = 1, /* RFC 4034 */ - LDNS_SHA256 = 2, /* RFC 4509 */ - LDNS_HASH_GOST = 3, /* RFC 5933 */ - LDNS_SHA384 = 4 /* RFC 6605 */ -}; -typedef enum sldns_enum_hash sldns_hash; - -/** - * algorithms used in CERT rrs - */ -enum sldns_enum_cert_algorithm -{ - LDNS_CERT_PKIX = 1, - LDNS_CERT_SPKI = 2, - LDNS_CERT_PGP = 3, - LDNS_CERT_IPKIX = 4, - LDNS_CERT_ISPKI = 5, - LDNS_CERT_IPGP = 6, - LDNS_CERT_ACPKIX = 7, - LDNS_CERT_IACPKIX = 8, - LDNS_CERT_URI = 253, - LDNS_CERT_OID = 254 -}; -typedef enum sldns_enum_cert_algorithm sldns_cert_algorithm; - -/** - * EDNS option codes - */ -enum sldns_enum_edns_option -{ - LDNS_EDNS_LLQ = 1, /* http://files.dns-sd.org/draft-sekar-dns-llq.txt */ - LDNS_EDNS_UL = 2, /* http://files.dns-sd.org/draft-sekar-dns-ul.txt */ - LDNS_EDNS_NSID = 3, /* RFC5001 */ - /* 4 draft-cheshire-edns0-owner-option */ - LDNS_EDNS_DAU = 5, /* RFC6975 */ - LDNS_EDNS_DHU = 6, /* RFC6975 */ - LDNS_EDNS_N3U = 7, /* RFC6975 */ - LDNS_EDNS_CLIENT_SUBNET = 8, /* RFC7871 */ - LDNS_EDNS_KEEPALIVE = 11, /* draft-ietf-dnsop-edns-tcp-keepalive*/ - LDNS_EDNS_PADDING = 12 /* RFC7830 */ -}; -typedef enum sldns_enum_edns_option sldns_edns_option; - -#define LDNS_EDNS_MASK_DO_BIT 0x8000 - -/** - * Contains all information about resource record types. - * - * This structure contains, for all rr types, the rdata fields that are defined. - */ -struct sldns_struct_rr_descriptor -{ - /** Type of the RR that is described here */ - sldns_rr_type _type; - /** Textual name of the RR type. */ - const char *_name; - /** Minimum number of rdata fields in the RRs of this type. */ - uint8_t _minimum; - /** Maximum number of rdata fields in the RRs of this type. */ - uint8_t _maximum; - /** Wireformat specification for the rr, i.e. the types of rdata fields in their respective order. */ - const sldns_rdf_type *_wireformat; - /** Special rdf types */ - sldns_rdf_type _variable; - /** Specifies whether compression can be used for dnames in this RR type. */ - sldns_rr_compress _compress; - /** The number of DNAMEs in the _wireformat string, for parsing. */ - uint8_t _dname_count; -}; -typedef struct sldns_struct_rr_descriptor sldns_rr_descriptor; - -/** - * returns the resource record descriptor for the given rr type. - * - * \param[in] type the type value of the rr type - *\return the sldns_rr_descriptor for this type - */ -const sldns_rr_descriptor *sldns_rr_descript(uint16_t type); - -/** - * returns the minimum number of rdata fields of the rr type this descriptor describes. - * - * \param[in] descriptor for an rr type - * \return the minimum number of rdata fields - */ -size_t sldns_rr_descriptor_minimum(const sldns_rr_descriptor *descriptor); - -/** - * returns the maximum number of rdata fields of the rr type this descriptor describes. - * - * \param[in] descriptor for an rr type - * \return the maximum number of rdata fields - */ -size_t sldns_rr_descriptor_maximum(const sldns_rr_descriptor *descriptor); - -/** - * returns the rdf type for the given rdata field number of the rr type for the given descriptor. - * - * \param[in] descriptor for an rr type - * \param[in] field the field number - * \return the rdf type for the field - */ -sldns_rdf_type sldns_rr_descriptor_field_type(const sldns_rr_descriptor *descriptor, size_t field); - -/** - * retrieves a rrtype by looking up its name. - * \param[in] name a string with the name - * \return the type which corresponds with the name - */ -sldns_rr_type sldns_get_rr_type_by_name(const char *name); - -/** - * retrieves a class by looking up its name. - * \param[in] name string with the name - * \return the cass which corresponds with the name - */ -sldns_rr_class sldns_get_rr_class_by_name(const char *name); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_RRDEF_H */ diff --git a/external/unbound/sldns/sbuffer.c b/external/unbound/sldns/sbuffer.c deleted file mode 100644 index a04b9b655..000000000 --- a/external/unbound/sldns/sbuffer.c +++ /dev/null @@ -1,191 +0,0 @@ -/* - * buffer.c -- generic memory buffer . - * - * Copyright (c) 2001-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - */ -/** - * \file - * - * This file contains the definition of sldns_buffer, and functions to manipulate those. - */ -#include "config.h" -#include "sldns/sbuffer.h" -#include <stdarg.h> - -sldns_buffer * -sldns_buffer_new(size_t capacity) -{ - sldns_buffer *buffer = (sldns_buffer*)malloc(sizeof(sldns_buffer)); - - if (!buffer) { - return NULL; - } - - buffer->_data = (uint8_t *) malloc(capacity); - if (!buffer->_data) { - free(buffer); - return NULL; - } - - buffer->_position = 0; - buffer->_limit = buffer->_capacity = capacity; - buffer->_fixed = 0; - buffer->_vfixed = 0; - buffer->_status_err = 0; - - sldns_buffer_invariant(buffer); - - return buffer; -} - -void -sldns_buffer_new_frm_data(sldns_buffer *buffer, void *data, size_t size) -{ - assert(data != NULL); - - buffer->_position = 0; - buffer->_limit = buffer->_capacity = size; - buffer->_fixed = 0; - buffer->_vfixed = 0; - buffer->_data = malloc(size); - if(!buffer->_data) { - buffer->_status_err = 1; - return; - } - memcpy(buffer->_data, data, size); - buffer->_status_err = 0; - - sldns_buffer_invariant(buffer); -} - -void -sldns_buffer_init_frm_data(sldns_buffer *buffer, void *data, size_t size) -{ - memset(buffer, 0, sizeof(*buffer)); - buffer->_data = data; - buffer->_capacity = buffer->_limit = size; - buffer->_fixed = 1; - buffer->_vfixed = 0; -} - -void -sldns_buffer_init_vfixed_frm_data(sldns_buffer *buffer, void *data, size_t size) -{ - memset(buffer, 0, sizeof(*buffer)); - buffer->_data = data; - buffer->_capacity = buffer->_limit = size; - buffer->_fixed = 1; - buffer->_vfixed = 1; -} - -int -sldns_buffer_set_capacity(sldns_buffer *buffer, size_t capacity) -{ - void *data; - - sldns_buffer_invariant(buffer); - assert(buffer->_position <= capacity && !buffer->_fixed); - - data = (uint8_t *) realloc(buffer->_data, capacity); - if (!data) { - buffer->_status_err = 1; - return 0; - } else { - buffer->_data = data; - buffer->_limit = buffer->_capacity = capacity; - return 1; - } -} - -int -sldns_buffer_reserve(sldns_buffer *buffer, size_t amount) -{ - sldns_buffer_invariant(buffer); - assert(!buffer->_fixed); - if (buffer->_capacity < buffer->_position + amount) { - size_t new_capacity = buffer->_capacity * 3 / 2; - - if (new_capacity < buffer->_position + amount) { - new_capacity = buffer->_position + amount; - } - if (!sldns_buffer_set_capacity(buffer, new_capacity)) { - buffer->_status_err = 1; - return 0; - } - } - buffer->_limit = buffer->_capacity; - return 1; -} - -int -sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...) -{ - va_list args; - int written = 0; - size_t remaining; - - if (sldns_buffer_status_ok(buffer)) { - sldns_buffer_invariant(buffer); - assert(buffer->_limit == buffer->_capacity); - - remaining = sldns_buffer_remaining(buffer); - va_start(args, format); - written = vsnprintf((char *) sldns_buffer_current(buffer), remaining, - format, args); - va_end(args); - if (written == -1) { - buffer->_status_err = 1; - return -1; - } else if (!buffer->_vfixed && (size_t) written >= remaining) { - if (!sldns_buffer_reserve(buffer, (size_t) written + 1)) { - buffer->_status_err = 1; - return -1; - } - va_start(args, format); - written = vsnprintf((char *) sldns_buffer_current(buffer), - sldns_buffer_remaining(buffer), format, args); - va_end(args); - if (written == -1) { - buffer->_status_err = 1; - return -1; - } - } - buffer->_position += written; - } - return written; -} - -void -sldns_buffer_free(sldns_buffer *buffer) -{ - if (!buffer) { - return; - } - - if (!buffer->_fixed) - free(buffer->_data); - - free(buffer); -} - -void * -sldns_buffer_export(sldns_buffer *buffer) -{ - buffer->_fixed = 1; - return buffer->_data; -} - -void -sldns_buffer_copy(sldns_buffer* result, sldns_buffer* from) -{ - size_t tocopy = sldns_buffer_limit(from); - - if(tocopy > sldns_buffer_capacity(result)) - tocopy = sldns_buffer_capacity(result); - sldns_buffer_clear(result); - sldns_buffer_write(result, sldns_buffer_begin(from), tocopy); - sldns_buffer_flip(result); -} diff --git a/external/unbound/sldns/sbuffer.h b/external/unbound/sldns/sbuffer.h deleted file mode 100644 index d1aadf8a1..000000000 --- a/external/unbound/sldns/sbuffer.h +++ /dev/null @@ -1,804 +0,0 @@ -/* - * buffer.h -- generic memory buffer. - * - * Copyright (c) 2005-2008, NLnet Labs. All rights reserved. - * - * See LICENSE for the license. - * - * - * The buffer module implements a generic buffer. The API is based on - * the java.nio.Buffer interface. - */ - -#ifndef LDNS_SBUFFER_H -#define LDNS_SBUFFER_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef S_SPLINT_S -# define INLINE -#else -# ifdef SWIG -# define INLINE static -# else -# define INLINE static inline -# endif -#endif - -/* - * Copy data allowing for unaligned accesses in network byte order - * (big endian). - */ -INLINE uint16_t -sldns_read_uint16(const void *src) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - return ntohs(*(const uint16_t *) src); -#else - const uint8_t *p = (const uint8_t *) src; - return ((uint16_t) p[0] << 8) | (uint16_t) p[1]; -#endif -} - -INLINE uint32_t -sldns_read_uint32(const void *src) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - return ntohl(*(const uint32_t *) src); -#else - const uint8_t *p = (const uint8_t *) src; - return ( ((uint32_t) p[0] << 24) - | ((uint32_t) p[1] << 16) - | ((uint32_t) p[2] << 8) - | (uint32_t) p[3]); -#endif -} - -/* - * Copy data allowing for unaligned accesses in network byte order - * (big endian). - */ -INLINE void -sldns_write_uint16(void *dst, uint16_t data) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - * (uint16_t *) dst = htons(data); -#else - uint8_t *p = (uint8_t *) dst; - p[0] = (uint8_t) ((data >> 8) & 0xff); - p[1] = (uint8_t) (data & 0xff); -#endif -} - -INLINE void -sldns_write_uint32(void *dst, uint32_t data) -{ -#ifdef ALLOW_UNALIGNED_ACCESSES - * (uint32_t *) dst = htonl(data); -#else - uint8_t *p = (uint8_t *) dst; - p[0] = (uint8_t) ((data >> 24) & 0xff); - p[1] = (uint8_t) ((data >> 16) & 0xff); - p[2] = (uint8_t) ((data >> 8) & 0xff); - p[3] = (uint8_t) (data & 0xff); -#endif -} - - -INLINE void -sldns_write_uint48(void *dst, uint64_t data) -{ - uint8_t *p = (uint8_t *) dst; - p[0] = (uint8_t) ((data >> 40) & 0xff); - p[1] = (uint8_t) ((data >> 32) & 0xff); - p[2] = (uint8_t) ((data >> 24) & 0xff); - p[3] = (uint8_t) ((data >> 16) & 0xff); - p[4] = (uint8_t) ((data >> 8) & 0xff); - p[5] = (uint8_t) (data & 0xff); -} - - -/** - * \file sbuffer.h - * - * This file contains the definition of sldns_buffer, and functions to manipulate those. - */ - -/** - * implementation of buffers to ease operations - * - * sldns_buffers can contain arbitrary information, per octet. You can write - * to the current end of a buffer, read from the current position, and - * access any data within it. - */ -struct sldns_buffer -{ - /** The current position used for reading/writing */ - size_t _position; - - /** The read/write limit */ - size_t _limit; - - /** The amount of data the buffer can contain */ - size_t _capacity; - - /** The data contained in the buffer */ - uint8_t *_data; - - /** If the buffer is fixed it cannot be resized */ - unsigned _fixed : 1; - - /** If the buffer is vfixed, no more than capacity bytes willl be - * written to _data, however the _position counter will be updated - * with the amount that would have been written in consecutive - * writes. This allows for a modus operandi in which a sequence is - * written on a fixed capacity buffer (perhaps with _data on stack). - * When everything could be written, then the _data is immediately - * usable, if not, then a buffer could be allocated sized precisely - * to fit the data for a second attempt. - */ - unsigned _vfixed : 1; - - /** The current state of the buffer. If writing to the buffer fails - * for any reason, this value is changed. This way, you can perform - * multiple writes in sequence and check for success afterwards. */ - unsigned _status_err : 1; -}; -typedef struct sldns_buffer sldns_buffer; - -#ifdef NDEBUG -INLINE void -sldns_buffer_invariant(sldns_buffer *ATTR_UNUSED(buffer)) -{ -} -#else -INLINE void -sldns_buffer_invariant(sldns_buffer *buffer) -{ - assert(buffer != NULL); - assert(buffer->_position <= buffer->_limit || buffer->_vfixed); - assert(buffer->_limit <= buffer->_capacity); - assert(buffer->_data != NULL || (buffer->_vfixed && buffer->_capacity == 0)); -} -#endif - -/** - * creates a new buffer with the specified capacity. - * - * \param[in] capacity the size (in bytes) to allocate for the buffer - * \return the created buffer - */ -sldns_buffer *sldns_buffer_new(size_t capacity); - -/** - * creates a buffer with the specified data. The data IS copied - * and MEMORY allocations are done. The buffer is not fixed and can - * be resized using buffer_reserve(). - * - * \param[in] buffer pointer to the buffer to put the data in - * \param[in] data the data to encapsulate in the buffer - * \param[in] size the size of the data - */ -void sldns_buffer_new_frm_data(sldns_buffer *buffer, void *data, size_t size); - -/** - * Setup a buffer with the data pointed to. No data copied, no memory allocs. - * The buffer is fixed. - * \param[in] buffer pointer to the buffer to put the data in - * \param[in] data the data to encapsulate in the buffer - * \param[in] size the size of the data - */ -void sldns_buffer_init_frm_data(sldns_buffer *buffer, void *data, size_t size); - -/** - * Setup a buffer with the data pointed to. No data copied, no memory allocs. - * The buffer is "virtually" fixed. Writes beyond size (the capacity) will - * only update position, but no data will be written beyond capacity. This - * allows to determine how big the buffer should have been to contain all the - * written data, by looking at the position with sldns_buffer_position(), - * similarly to the return value of POSIX's snprintf. - * \param[in] buffer pointer to the buffer to put the data in - * \param[in] data the data to encapsulate in the buffer - * \param[in] size the size of the data - */ -void sldns_buffer_init_vfixed_frm_data(sldns_buffer *buffer, void *data, size_t size); - -/** - * clears the buffer and make it ready for writing. The buffer's limit - * is set to the capacity and the position is set to 0. - * \param[in] buffer the buffer to clear - */ -INLINE void sldns_buffer_clear(sldns_buffer *buffer) -{ - sldns_buffer_invariant(buffer); - - /* reset status here? */ - - buffer->_position = 0; - buffer->_limit = buffer->_capacity; -} - -/** - * makes the buffer ready for reading the data that has been written to - * the buffer. The buffer's limit is set to the current position and - * the position is set to 0. - * - * \param[in] buffer the buffer to flip - * \return void - */ -INLINE void sldns_buffer_flip(sldns_buffer *buffer) -{ - sldns_buffer_invariant(buffer); - - buffer->_limit = buffer->_position; - buffer->_position = 0; -} - -/** - * make the buffer ready for re-reading the data. The buffer's - * position is reset to 0. - * \param[in] buffer the buffer to rewind - */ -INLINE void sldns_buffer_rewind(sldns_buffer *buffer) -{ - sldns_buffer_invariant(buffer); - - buffer->_position = 0; -} - -/** - * returns the current position in the buffer (as a number of bytes) - * \param[in] buffer the buffer - * \return the current position - */ -INLINE size_t -sldns_buffer_position(sldns_buffer *buffer) -{ - return buffer->_position; -} - -/** - * sets the buffer's position to MARK. The position must be less than - * or equal to the buffer's limit. - * \param[in] buffer the buffer - * \param[in] mark the mark to use - */ -INLINE void -sldns_buffer_set_position(sldns_buffer *buffer, size_t mark) -{ - assert(mark <= buffer->_limit || buffer->_vfixed); - buffer->_position = mark; -} - -/** - * changes the buffer's position by COUNT bytes. The position must not - * be moved behind the buffer's limit or before the beginning of the - * buffer. - * \param[in] buffer the buffer - * \param[in] count the count to use - */ -INLINE void -sldns_buffer_skip(sldns_buffer *buffer, ssize_t count) -{ - assert(buffer->_position + count <= buffer->_limit || buffer->_vfixed); - buffer->_position += count; -} - -/** - * returns the maximum size of the buffer - * \param[in] buffer - * \return the size - */ -INLINE size_t -sldns_buffer_limit(sldns_buffer *buffer) -{ - return buffer->_limit; -} - -/** - * changes the buffer's limit. If the buffer's position is greater - * than the new limit the position is set to the limit. - * \param[in] buffer the buffer - * \param[in] limit the new limit - */ -INLINE void -sldns_buffer_set_limit(sldns_buffer *buffer, size_t limit) -{ - assert(limit <= buffer->_capacity); - buffer->_limit = limit; - if (buffer->_position > buffer->_limit) - buffer->_position = buffer->_limit; -} - -/** - * returns the number of bytes the buffer can hold. - * \param[in] buffer the buffer - * \return the number of bytes - */ -INLINE size_t -sldns_buffer_capacity(sldns_buffer *buffer) -{ - return buffer->_capacity; -} - -/** - * changes the buffer's capacity. The data is reallocated so any - * pointers to the data may become invalid. The buffer's limit is set - * to the buffer's new capacity. - * \param[in] buffer the buffer - * \param[in] capacity the capacity to use - * \return whether this failed or succeeded - */ -int sldns_buffer_set_capacity(sldns_buffer *buffer, size_t capacity); - -/** - * ensures BUFFER can contain at least AMOUNT more bytes. The buffer's - * capacity is increased if necessary using buffer_set_capacity(). - * - * The buffer's limit is always set to the (possibly increased) - * capacity. - * \param[in] buffer the buffer - * \param[in] amount amount to use - * \return whether this failed or succeeded - */ -int sldns_buffer_reserve(sldns_buffer *buffer, size_t amount); - -/** - * returns a pointer to the data at the indicated position. - * \param[in] buffer the buffer - * \param[in] at position - * \return the pointer to the data - */ -INLINE uint8_t * -sldns_buffer_at(const sldns_buffer *buffer, size_t at) -{ - assert(at <= buffer->_limit || buffer->_vfixed); - return buffer->_data + at; -} - -/** - * returns a pointer to the beginning of the buffer (the data at - * position 0). - * \param[in] buffer the buffer - * \return the pointer - */ -INLINE uint8_t * -sldns_buffer_begin(const sldns_buffer *buffer) -{ - return sldns_buffer_at(buffer, 0); -} - -/** - * returns a pointer to the end of the buffer (the data at the buffer's - * limit). - * \param[in] buffer the buffer - * \return the pointer - */ -INLINE uint8_t * -sldns_buffer_end(sldns_buffer *buffer) -{ - return sldns_buffer_at(buffer, buffer->_limit); -} - -/** - * returns a pointer to the data at the buffer's current position. - * \param[in] buffer the buffer - * \return the pointer - */ -INLINE uint8_t * -sldns_buffer_current(sldns_buffer *buffer) -{ - return sldns_buffer_at(buffer, buffer->_position); -} - -/** - * returns the number of bytes remaining between the indicated position and - * the limit. - * \param[in] buffer the buffer - * \param[in] at indicated position - * \return number of bytes - */ -INLINE size_t -sldns_buffer_remaining_at(sldns_buffer *buffer, size_t at) -{ - sldns_buffer_invariant(buffer); - assert(at <= buffer->_limit || buffer->_vfixed); - return at < buffer->_limit ? buffer->_limit - at : 0; -} - -/** - * returns the number of bytes remaining between the buffer's position and - * limit. - * \param[in] buffer the buffer - * \return the number of bytes - */ -INLINE size_t -sldns_buffer_remaining(sldns_buffer *buffer) -{ - return sldns_buffer_remaining_at(buffer, buffer->_position); -} - -/** - * checks if the buffer has at least COUNT more bytes available. - * Before reading or writing the caller needs to ensure enough space - * is available! - * \param[in] buffer the buffer - * \param[in] at indicated position - * \param[in] count how much is available - * \return true or false (as int?) - */ -INLINE int -sldns_buffer_available_at(sldns_buffer *buffer, size_t at, size_t count) -{ - return count <= sldns_buffer_remaining_at(buffer, at); -} - -/** - * checks if the buffer has count bytes available at the current position - * \param[in] buffer the buffer - * \param[in] count how much is available - * \return true or false (as int?) - */ -INLINE int -sldns_buffer_available(sldns_buffer *buffer, size_t count) -{ - return sldns_buffer_available_at(buffer, buffer->_position, count); -} - -/** - * writes the given data to the buffer at the specified position - * \param[in] buffer the buffer - * \param[in] at the position (in number of bytes) to write the data at - * \param[in] data pointer to the data to write to the buffer - * \param[in] count the number of bytes of data to write - */ -INLINE void -sldns_buffer_write_at(sldns_buffer *buffer, size_t at, const void *data, size_t count) -{ - if (!buffer->_vfixed) - assert(sldns_buffer_available_at(buffer, at, count)); - else if (sldns_buffer_remaining_at(buffer, at) == 0) - return; - else if (count > sldns_buffer_remaining_at(buffer, at)) { - memcpy(buffer->_data + at, data, - sldns_buffer_remaining_at(buffer, at)); - return; - } - memcpy(buffer->_data + at, data, count); -} - -/** - * set the given byte to the buffer at the specified position - * \param[in] buffer the buffer - * \param[in] at the position (in number of bytes) to write the data at - * \param[in] c the byte to set to the buffer - * \param[in] count the number of bytes of bytes to write - */ - -INLINE void -sldns_buffer_set_at(sldns_buffer *buffer, size_t at, int c, size_t count) -{ - if (!buffer->_vfixed) - assert(sldns_buffer_available_at(buffer, at, count)); - else if (sldns_buffer_remaining_at(buffer, at) == 0) - return; - else if (count > sldns_buffer_remaining_at(buffer, at)) { - memset(buffer->_data + at, c, - sldns_buffer_remaining_at(buffer, at)); - return; - } - memset(buffer->_data + at, c, count); -} - - -/** - * writes count bytes of data to the current position of the buffer - * \param[in] buffer the buffer - * \param[in] data the data to write - * \param[in] count the lenght of the data to write - */ -INLINE void -sldns_buffer_write(sldns_buffer *buffer, const void *data, size_t count) -{ - sldns_buffer_write_at(buffer, buffer->_position, data, count); - buffer->_position += count; -} - -/** - * copies the given (null-delimited) string to the specified position at the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] str the string to write - */ -INLINE void -sldns_buffer_write_string_at(sldns_buffer *buffer, size_t at, const char *str) -{ - sldns_buffer_write_at(buffer, at, str, strlen(str)); -} - -/** - * copies the given (null-delimited) string to the current position at the buffer - * \param[in] buffer the buffer - * \param[in] str the string to write - */ -INLINE void -sldns_buffer_write_string(sldns_buffer *buffer, const char *str) -{ - sldns_buffer_write(buffer, str, strlen(str)); -} - -/** - * writes the given byte of data at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the 8 bits to write - */ -INLINE void -sldns_buffer_write_u8_at(sldns_buffer *buffer, size_t at, uint8_t data) -{ - if (buffer->_vfixed && at + sizeof(data) > buffer->_limit) return; - assert(sldns_buffer_available_at(buffer, at, sizeof(data))); - buffer->_data[at] = data; -} - -/** - * writes the given byte of data at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 8 bits to write - */ -INLINE void -sldns_buffer_write_u8(sldns_buffer *buffer, uint8_t data) -{ - sldns_buffer_write_u8_at(buffer, buffer->_position, data); - buffer->_position += sizeof(data); -} - -/** - * writes the given 2 byte integer at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the 16 bits to write - */ -INLINE void -sldns_buffer_write_u16_at(sldns_buffer *buffer, size_t at, uint16_t data) -{ - if (buffer->_vfixed && at + sizeof(data) > buffer->_limit) return; - assert(sldns_buffer_available_at(buffer, at, sizeof(data))); - sldns_write_uint16(buffer->_data + at, data); -} - -/** - * writes the given 2 byte integer at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 16 bits to write - */ -INLINE void -sldns_buffer_write_u16(sldns_buffer *buffer, uint16_t data) -{ - sldns_buffer_write_u16_at(buffer, buffer->_position, data); - buffer->_position += sizeof(data); -} - -/** - * writes the given 4 byte integer at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the 32 bits to write - */ -INLINE void -sldns_buffer_write_u32_at(sldns_buffer *buffer, size_t at, uint32_t data) -{ - if (buffer->_vfixed && at + sizeof(data) > buffer->_limit) return; - assert(sldns_buffer_available_at(buffer, at, sizeof(data))); - sldns_write_uint32(buffer->_data + at, data); -} - -/** - * writes the given 6 byte integer at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \param[in] data the (lower) 48 bits to write - */ -INLINE void -sldns_buffer_write_u48_at(sldns_buffer *buffer, size_t at, uint64_t data) -{ - if (buffer->_vfixed && at + 6 > buffer->_limit) return; - assert(sldns_buffer_available_at(buffer, at, 6)); - sldns_write_uint48(buffer->_data + at, data); -} - -/** - * writes the given 4 byte integer at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 32 bits to write - */ -INLINE void -sldns_buffer_write_u32(sldns_buffer *buffer, uint32_t data) -{ - sldns_buffer_write_u32_at(buffer, buffer->_position, data); - buffer->_position += sizeof(data); -} - -/** - * writes the given 6 byte integer at the current position in the buffer - * \param[in] buffer the buffer - * \param[in] data the 48 bits to write - */ -INLINE void -sldns_buffer_write_u48(sldns_buffer *buffer, uint64_t data) -{ - sldns_buffer_write_u48_at(buffer, buffer->_position, data); - buffer->_position += 6; -} - -/** - * copies count bytes of data at the given position to the given data-array - * \param[in] buffer the buffer - * \param[in] at the position in the buffer to start - * \param[out] data buffer to copy to - * \param[in] count the length of the data to copy - */ -INLINE void -sldns_buffer_read_at(sldns_buffer *buffer, size_t at, void *data, size_t count) -{ - assert(sldns_buffer_available_at(buffer, at, count)); - memcpy(data, buffer->_data + at, count); -} - -/** - * copies count bytes of data at the current position to the given data-array - * \param[in] buffer the buffer - * \param[out] data buffer to copy to - * \param[in] count the length of the data to copy - */ -INLINE void -sldns_buffer_read(sldns_buffer *buffer, void *data, size_t count) -{ - sldns_buffer_read_at(buffer, buffer->_position, data, count); - buffer->_position += count; -} - -/** - * returns the byte value at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at the position in the buffer - * \return 1 byte integer - */ -INLINE uint8_t -sldns_buffer_read_u8_at(sldns_buffer *buffer, size_t at) -{ - assert(sldns_buffer_available_at(buffer, at, sizeof(uint8_t))); - return buffer->_data[at]; -} - -/** - * returns the byte value at the current position in the buffer - * \param[in] buffer the buffer - * \return 1 byte integer - */ -INLINE uint8_t -sldns_buffer_read_u8(sldns_buffer *buffer) -{ - uint8_t result = sldns_buffer_read_u8_at(buffer, buffer->_position); - buffer->_position += sizeof(uint8_t); - return result; -} - -/** - * returns the 2-byte integer value at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at position in the buffer - * \return 2 byte integer - */ -INLINE uint16_t -sldns_buffer_read_u16_at(sldns_buffer *buffer, size_t at) -{ - assert(sldns_buffer_available_at(buffer, at, sizeof(uint16_t))); - return sldns_read_uint16(buffer->_data + at); -} - -/** - * returns the 2-byte integer value at the current position in the buffer - * \param[in] buffer the buffer - * \return 2 byte integer - */ -INLINE uint16_t -sldns_buffer_read_u16(sldns_buffer *buffer) -{ - uint16_t result = sldns_buffer_read_u16_at(buffer, buffer->_position); - buffer->_position += sizeof(uint16_t); - return result; -} - -/** - * returns the 4-byte integer value at the given position in the buffer - * \param[in] buffer the buffer - * \param[in] at position in the buffer - * \return 4 byte integer - */ -INLINE uint32_t -sldns_buffer_read_u32_at(sldns_buffer *buffer, size_t at) -{ - assert(sldns_buffer_available_at(buffer, at, sizeof(uint32_t))); - return sldns_read_uint32(buffer->_data + at); -} - -/** - * returns the 4-byte integer value at the current position in the buffer - * \param[in] buffer the buffer - * \return 4 byte integer - */ -INLINE uint32_t -sldns_buffer_read_u32(sldns_buffer *buffer) -{ - uint32_t result = sldns_buffer_read_u32_at(buffer, buffer->_position); - buffer->_position += sizeof(uint32_t); - return result; -} - -/** - * returns the status of the buffer - * \param[in] buffer - * \return the status - */ -INLINE int -sldns_buffer_status(sldns_buffer *buffer) -{ - return (int)buffer->_status_err; -} - -/** - * returns true if the status of the buffer is LDNS_STATUS_OK, false otherwise - * \param[in] buffer the buffer - * \return true or false - */ -INLINE int -sldns_buffer_status_ok(sldns_buffer *buffer) -{ - if (buffer) { - return sldns_buffer_status(buffer) == 0; - } else { - return 0; - } -} - -/** - * prints to the buffer, increasing the capacity if required using - * buffer_reserve(). The buffer's position is set to the terminating '\\0' - * Returns the number of characters written (not including the - * terminating '\\0') or -1 on failure. - */ -int sldns_buffer_printf(sldns_buffer *buffer, const char *format, ...) - ATTR_FORMAT(printf, 2, 3); - -/** - * frees the buffer. - * \param[in] *buffer the buffer to be freed - * \return void - */ -void sldns_buffer_free(sldns_buffer *buffer); - -/** - * Makes the buffer fixed and returns a pointer to the data. The - * caller is responsible for free'ing the result. - * \param[in] *buffer the buffer to be exported - * \return void - */ -void *sldns_buffer_export(sldns_buffer *buffer); - -/** - * Copy contents of the from buffer to the result buffer and then flips - * the result buffer. Data will be silently truncated if the result buffer is - * too small. - * \param[out] *result resulting buffer which is copied to. - * \param[in] *from what to copy to result. - */ -void sldns_buffer_copy(sldns_buffer* result, sldns_buffer* from); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_SBUFFER_H */ diff --git a/external/unbound/sldns/str2wire.c b/external/unbound/sldns/str2wire.c deleted file mode 100644 index 75c5d71b1..000000000 --- a/external/unbound/sldns/str2wire.c +++ /dev/null @@ -1,2023 +0,0 @@ -/** - * str2wire.c - read txt presentation of RRs - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Parses text to wireformat. - */ -#include "config.h" -#include "sldns/str2wire.h" -#include "sldns/wire2str.h" -#include "sldns/sbuffer.h" -#include "sldns/parse.h" -#include "sldns/parseutil.h" -#include <ctype.h> -#ifdef HAVE_TIME_H -#include <time.h> -#endif -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif - -/** return an error */ -#define RET_ERR(e, off) ((int)((e)|((off)<<LDNS_WIREPARSE_SHIFT))) -/** Move parse error but keep its ID */ -#define RET_ERR_SHIFT(e, move) RET_ERR(LDNS_WIREPARSE_ERROR(e), LDNS_WIREPARSE_OFFSET(e)+(move)); -#define LDNS_IP6ADDRLEN (128/8) - -/* - * No special care is taken, all dots are translated into - * label separators. - * @param rel: true if the domain is not absolute (not terminated in .). - * The output is then still terminated with a '0' rootlabel. - */ -static int sldns_str2wire_dname_buf_rel(const char* str, uint8_t* buf, - size_t* olen, int* rel) -{ - size_t len; - - const char *s; - uint8_t *q, *pq, label_len; - - if(rel) *rel = 0; - len = strlen((char*)str); - /* octet representation can make strings a lot longer than actual length */ - if (len > LDNS_MAX_DOMAINLEN * 4) { - return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, 0); - } - if (0 == len) { - return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_UNDERFLOW, 0); - } - - /* root label */ - if (1 == len && *str == '.') { - if(*olen < 1) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, 0); - buf[0] = 0; - *olen = 1; - return LDNS_WIREPARSE_ERR_OK; - } - - /* get on with the rest */ - - /* s is on the current character in the string - * pq points to where the labellength is going to go - * label_len keeps track of the current label's length - * q builds the dname inside the buf array - */ - len = 0; - if(*olen < 1) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, 0); - q = buf+1; - pq = buf; - label_len = 0; - for (s = str; *s; s++, q++) { - if (q >= buf + *olen) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, q-buf); - if (q > buf + LDNS_MAX_DOMAINLEN) - return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, q-buf); - switch (*s) { - case '.': - if (label_len > LDNS_MAX_LABELLEN) { - return RET_ERR(LDNS_WIREPARSE_ERR_LABEL_OVERFLOW, q-buf); - } - if (label_len == 0) { - return RET_ERR(LDNS_WIREPARSE_ERR_EMPTY_LABEL, q-buf); - } - len += label_len + 1; - *q = 0; - *pq = label_len; - label_len = 0; - pq = q; - break; - case '\\': - /* octet value or literal char */ - s += 1; - if (!sldns_parse_escape(q, &s)) { - *q = 0; - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_BAD_ESCAPE, q-buf); - } - s -= 1; - label_len++; - break; - default: - *q = (uint8_t)*s; - label_len++; - } - } - - /* add root label if last char was not '.' */ - if(label_len != 0) { - if(rel) *rel = 1; - if (q >= buf + *olen) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, q-buf); - if (q > buf + LDNS_MAX_DOMAINLEN) { - return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, q-buf); - } - if (label_len > LDNS_MAX_LABELLEN) { - return RET_ERR(LDNS_WIREPARSE_ERR_LABEL_OVERFLOW, q-buf); - } - if (label_len == 0) { /* label_len 0 but not . at end? */ - return RET_ERR(LDNS_WIREPARSE_ERR_EMPTY_LABEL, q-buf); - } - len += label_len + 1; - *pq = label_len; - *q = 0; - } - len++; - *olen = len; - - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_dname_buf(const char* str, uint8_t* buf, size_t* len) -{ - return sldns_str2wire_dname_buf_rel(str, buf, len, NULL); -} - -int sldns_str2wire_dname_buf_origin(const char* str, uint8_t* buf, size_t* len, - uint8_t* origin, size_t origin_len) -{ - size_t dlen = *len; - int rel = 0; - int s = sldns_str2wire_dname_buf_rel(str, buf, &dlen, &rel); - if(s) return s; - - if(rel && origin && dlen > 0) { - if(dlen + origin_len - 1 > LDNS_MAX_DOMAINLEN) - return RET_ERR(LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, - LDNS_MAX_DOMAINLEN); - if(dlen + origin_len - 1 > *len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - *len); - memmove(buf+dlen-1, origin, origin_len); - *len = dlen + origin_len - 1; - } else - *len = dlen; - return LDNS_WIREPARSE_ERR_OK; -} - -uint8_t* sldns_str2wire_dname(const char* str, size_t* len) -{ - uint8_t dname[LDNS_MAX_DOMAINLEN+1]; - *len = sizeof(dname); - if(sldns_str2wire_dname_buf(str, dname, len) == 0) { - uint8_t* r = (uint8_t*)malloc(*len); - if(r) return memcpy(r, dname, *len); - } - *len = 0; - return NULL; -} - -/** read owner name */ -static int -rrinternal_get_owner(sldns_buffer* strbuf, uint8_t* rr, size_t* len, - size_t* dname_len, uint8_t* origin, size_t origin_len, uint8_t* prev, - size_t prev_len, char* token, size_t token_len) -{ - /* split the rr in its parts -1 signals trouble */ - if(sldns_bget_token(strbuf, token, "\t\n ", token_len) == -1) { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX, - sldns_buffer_position(strbuf)); - } - - if(strcmp(token, "@") == 0) { - uint8_t* tocopy; - if (origin) { - *dname_len = origin_len; - tocopy = origin; - } else if (prev) { - *dname_len = prev_len; - tocopy = prev; - } else { - /* default to root */ - *dname_len = 1; - tocopy = (uint8_t*)"\0"; - } - if(*len < *dname_len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - memmove(rr, tocopy, *dname_len); - } else if(*token == '\0') { - /* no ownername was given, try prev, if that fails - * origin, else default to root */ - uint8_t* tocopy; - if(prev) { - *dname_len = prev_len; - tocopy = prev; - } else if(origin) { - *dname_len = origin_len; - tocopy = origin; - } else { - *dname_len = 1; - tocopy = (uint8_t*)"\0"; - } - if(*len < *dname_len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - memmove(rr, tocopy, *dname_len); - } else { - size_t dlen = *len; - int s = sldns_str2wire_dname_buf_origin(token, rr, &dlen, - origin, origin_len); - if(s) return RET_ERR_SHIFT(s, - sldns_buffer_position(strbuf)-strlen(token)); - *dname_len = dlen; - } - return LDNS_WIREPARSE_ERR_OK; -} - -/** read ttl */ -static int -rrinternal_get_ttl(sldns_buffer* strbuf, char* token, size_t token_len, - int* not_there, uint32_t* ttl, uint32_t default_ttl) -{ - const char* endptr; - if(sldns_bget_token(strbuf, token, "\t\n ", token_len) == -1) { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TTL, - sldns_buffer_position(strbuf)); - } - *ttl = (uint32_t) sldns_str2period(token, &endptr); - - if (strlen(token) > 0 && !isdigit((unsigned char)token[0])) { - *not_there = 1; - /* ah, it's not there or something */ - if (default_ttl == 0) { - *ttl = LDNS_DEFAULT_TTL; - } else { - *ttl = default_ttl; - } - } - return LDNS_WIREPARSE_ERR_OK; -} - -/** read class */ -static int -rrinternal_get_class(sldns_buffer* strbuf, char* token, size_t token_len, - int* not_there, uint16_t* cl) -{ - /* if 'not_there' then we got token from previous parse routine */ - if(!*not_there) { - /* parse new token for class */ - if(sldns_bget_token(strbuf, token, "\t\n ", token_len) == -1) { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_CLASS, - sldns_buffer_position(strbuf)); - } - } else *not_there = 0; - *cl = sldns_get_rr_class_by_name(token); - /* class can be left out too, assume IN, current token must be type */ - if(*cl == 0 && strcmp(token, "CLASS0") != 0) { - *not_there = 1; - *cl = LDNS_RR_CLASS_IN; - } - return LDNS_WIREPARSE_ERR_OK; -} - -/** read type */ -static int -rrinternal_get_type(sldns_buffer* strbuf, char* token, size_t token_len, - int* not_there, uint16_t* tp) -{ - /* if 'not_there' then we got token from previous parse routine */ - if(!*not_there) { - /* parse new token for type */ - if(sldns_bget_token(strbuf, token, "\t\n ", token_len) == -1) { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TYPE, - sldns_buffer_position(strbuf)); - } - } - *tp = sldns_get_rr_type_by_name(token); - if(*tp == 0 && strcmp(token, "TYPE0") != 0) { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TYPE, - sldns_buffer_position(strbuf)); - } - return LDNS_WIREPARSE_ERR_OK; -} - -/** put type, class, ttl into rr buffer */ -static int -rrinternal_write_typeclassttl(sldns_buffer* strbuf, uint8_t* rr, size_t len, - size_t dname_len, uint16_t tp, uint16_t cl, uint32_t ttl, int question) -{ - if(question) { - /* question is : name, type, class */ - if(dname_len + 4 > len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - sldns_write_uint16(rr+dname_len, tp); - sldns_write_uint16(rr+dname_len+2, cl); - return LDNS_WIREPARSE_ERR_OK; - } - - /* type(2), class(2), ttl(4), rdatalen(2 (later)) = 10 */ - if(dname_len + 10 > len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - sldns_write_uint16(rr+dname_len, tp); - sldns_write_uint16(rr+dname_len+2, cl); - sldns_write_uint32(rr+dname_len+4, ttl); - sldns_write_uint16(rr+dname_len+8, 0); /* rdatalen placeholder */ - return LDNS_WIREPARSE_ERR_OK; -} - -/** find delimiters for type */ -static const char* -rrinternal_get_delims(sldns_rdf_type rdftype, size_t r_cnt, size_t r_max) -{ - switch(rdftype) { - case LDNS_RDF_TYPE_B64 : - case LDNS_RDF_TYPE_HEX : /* These rdf types may con- */ - case LDNS_RDF_TYPE_LOC : /* tain whitespace, only if */ - case LDNS_RDF_TYPE_WKS : /* it is the last rd field. */ - case LDNS_RDF_TYPE_IPSECKEY : - case LDNS_RDF_TYPE_NSEC : if (r_cnt == r_max - 1) { - return "\n"; - } - break; - default : break; - } - return "\n\t "; -} - -/* Syntactic sugar for sldns_rr_new_frm_str_internal */ -static int -sldns_rdf_type_maybe_quoted(sldns_rdf_type rdf_type) -{ - return rdf_type == LDNS_RDF_TYPE_STR || - rdf_type == LDNS_RDF_TYPE_LONG_STR; -} - -/** see if rdata is quoted */ -static int -rrinternal_get_quoted(sldns_buffer* strbuf, const char** delimiters, - sldns_rdf_type rdftype) -{ - if(sldns_rdf_type_maybe_quoted(rdftype) && - sldns_buffer_remaining(strbuf) > 0) { - - /* skip spaces */ - while(sldns_buffer_remaining(strbuf) > 0 && - *(sldns_buffer_current(strbuf)) == ' ') { - sldns_buffer_skip(strbuf, 1); - } - - if(sldns_buffer_remaining(strbuf) > 0 && - *(sldns_buffer_current(strbuf)) == '\"') { - *delimiters = "\"\0"; - sldns_buffer_skip(strbuf, 1); - return 1; - } - } - return 0; -} - -/** spool hex data into rdata */ -static int -rrinternal_spool_hex(char* token, uint8_t* rr, size_t rr_len, - size_t rr_cur_len, size_t* cur_hex_data_size, size_t hex_data_size) -{ - char* p = token; - while(*p) { - if(isspace((unsigned char)*p)) { - p++; - continue; - } - if(!isxdigit((unsigned char)*p)) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_RDATA, - p-token); - if(*cur_hex_data_size >= hex_data_size) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_RDATA, - p-token); - /* extra robust check */ - if(rr_cur_len+(*cur_hex_data_size)/2 >= rr_len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - p-token); - /* see if 16s or 1s */ - if( ((*cur_hex_data_size)&1) == 0) { - rr[rr_cur_len+(*cur_hex_data_size)/2] = - (uint8_t)sldns_hexdigit_to_int(*p)*16; - } else { - rr[rr_cur_len+(*cur_hex_data_size)/2] += - (uint8_t)sldns_hexdigit_to_int(*p); - } - p++; - (*cur_hex_data_size)++; - } - return LDNS_WIREPARSE_ERR_OK; -} - -/** read unknown rr type format */ -static int -rrinternal_parse_unknown(sldns_buffer* strbuf, char* token, size_t token_len, - uint8_t* rr, size_t* rr_len, size_t* rr_cur_len, size_t pre_data_pos) -{ - const char* delim = "\n\t "; - size_t hex_data_size, cur_hex_data_size; - /* go back to before \# - * and skip it while setting delimiters better - */ - sldns_buffer_set_position(strbuf, pre_data_pos); - if(sldns_bget_token(strbuf, token, delim, token_len) == -1) - return LDNS_WIREPARSE_ERR_GENERAL; /* should not fail */ - /* read rdata octet length */ - if(sldns_bget_token(strbuf, token, delim, token_len) == -1) { - /* something goes very wrong here */ - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_RDATA, - sldns_buffer_position(strbuf)); - } - hex_data_size = (size_t)atoi(token); - if(hex_data_size > LDNS_MAX_RDFLEN || - *rr_cur_len + hex_data_size > *rr_len) { - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - } - /* copy hex chars into hex str (2 chars per byte) */ - hex_data_size *= 2; - cur_hex_data_size = 0; - while(cur_hex_data_size < hex_data_size) { - int status; - ssize_t c = sldns_bget_token(strbuf, token, delim, token_len); - if((status = rrinternal_spool_hex(token, rr, *rr_len, - *rr_cur_len, &cur_hex_data_size, hex_data_size)) != 0) - return RET_ERR_SHIFT(status, - sldns_buffer_position(strbuf)-strlen(token)); - if(c == -1) { - if(cur_hex_data_size != hex_data_size) - return RET_ERR( - LDNS_WIREPARSE_ERR_SYNTAX_RDATA, - sldns_buffer_position(strbuf)); - break; - } - } - *rr_cur_len += hex_data_size/2; - return LDNS_WIREPARSE_ERR_OK; -} - -/** parse normal RR rdata element */ -static int -rrinternal_parse_rdf(sldns_buffer* strbuf, char* token, size_t token_len, - uint8_t* rr, size_t rr_len, size_t* rr_cur_len, sldns_rdf_type rdftype, - uint16_t rr_type, size_t r_cnt, size_t r_max, size_t dname_len, - uint8_t* origin, size_t origin_len) -{ - size_t len; - int status; - - switch(rdftype) { - case LDNS_RDF_TYPE_DNAME: - /* check if the origin should be used or concatenated */ - if(strcmp(token, "@") == 0) { - uint8_t* tocopy; - size_t copylen; - if(origin) { - copylen = origin_len; - tocopy = origin; - } else if(rr_type == LDNS_RR_TYPE_SOA) { - copylen = dname_len; - tocopy = rr; /* copy rr owner name */ - } else { - copylen = 1; - tocopy = (uint8_t*)"\0"; - } - if((*rr_cur_len) + copylen > rr_len) - return RET_ERR( - LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - memmove(rr+*rr_cur_len, tocopy, copylen); - (*rr_cur_len) += copylen; - } else { - size_t dlen = rr_len - (*rr_cur_len); - int s = sldns_str2wire_dname_buf_origin(token, - rr+*rr_cur_len, &dlen, origin, origin_len); - if(s) return RET_ERR_SHIFT(s, - sldns_buffer_position(strbuf)-strlen(token)); - (*rr_cur_len) += dlen; - } - return LDNS_WIREPARSE_ERR_OK; - - case LDNS_RDF_TYPE_HEX: - case LDNS_RDF_TYPE_B64: - /* When this is the last rdata field, then the - * rest should be read in (cause then these - * rdf types may contain spaces). */ - if(r_cnt == r_max - 1) { - size_t tlen = strlen(token); - (void)sldns_bget_token(strbuf, token+tlen, "\n", - token_len - tlen); - } - break; - default: - break; - } - - len = rr_len - (*rr_cur_len); - if((status=sldns_str2wire_rdf_buf(token, rr+(*rr_cur_len), &len, - rdftype)) != 0) - return RET_ERR_SHIFT(status, - sldns_buffer_position(strbuf)-strlen(token)); - *rr_cur_len += len; - return LDNS_WIREPARSE_ERR_OK; -} - -/** - * Parse one rdf token. Takes care of quotes and parenthesis. - */ -static int -sldns_parse_rdf_token(sldns_buffer* strbuf, char* token, size_t token_len, - int* quoted, int* parens, size_t* pre_data_pos, - const char* delimiters, sldns_rdf_type rdftype, size_t* token_strlen) -{ - size_t slen; - - /* skip spaces */ - while(sldns_buffer_remaining(strbuf) > 0 && !*quoted && - *(sldns_buffer_current(strbuf)) == ' ') { - sldns_buffer_skip(strbuf, 1); - } - - *pre_data_pos = sldns_buffer_position(strbuf); - if(sldns_bget_token_par(strbuf, token, (*quoted)?"\"":delimiters, - token_len, parens, (*quoted)?NULL:" \t") == -1) { - return 0; - } - slen = strlen(token); - /* check if not quoted yet, and we have encountered quotes */ - if(!*quoted && sldns_rdf_type_maybe_quoted(rdftype) && - slen >= 2 && - (token[0] == '"' || token[0] == '\'') && - (token[slen-1] == '"' || token[slen-1] == '\'')) { - /* move token two smaller (quotes) with endnull */ - memmove(token, token+1, slen-2); - token[slen-2] = 0; - slen -= 2; - *quoted = 1; - } else if(!*quoted && sldns_rdf_type_maybe_quoted(rdftype) && - slen >= 2 && - (token[0] == '"' || token[0] == '\'')) { - /* got the start quote (remove it) but read remainder - * of quoted string as well into remainder of token */ - memmove(token, token+1, slen-1); - token[slen-1] = 0; - slen -= 1; - *quoted = 1; - /* rewind buffer over skipped whitespace */ - while(sldns_buffer_position(strbuf) > 0 && - (sldns_buffer_current(strbuf)[-1] == ' ' || - sldns_buffer_current(strbuf)[-1] == '\t')) { - sldns_buffer_skip(strbuf, -1); - } - if(sldns_bget_token_par(strbuf, token+slen, - "\"", token_len-slen, - parens, NULL) == -1) { - return 0; - } - slen = strlen(token); - } - *token_strlen = slen; - return 1; -} - -/** Add space and one more rdf token onto the existing token string. */ -static int -sldns_affix_token(sldns_buffer* strbuf, char* token, size_t* token_len, - int* quoted, int* parens, size_t* pre_data_pos, - const char* delimiters, sldns_rdf_type rdftype, size_t* token_strlen) -{ - size_t addlen = *token_len - *token_strlen; - size_t addstrlen = 0; - - /* add space */ - if(addlen < 1) return 0; - token[*token_strlen] = ' '; - token[++(*token_strlen)] = 0; - - /* read another token */ - addlen = *token_len - *token_strlen; - if(!sldns_parse_rdf_token(strbuf, token+*token_strlen, addlen, quoted, - parens, pre_data_pos, delimiters, rdftype, &addstrlen)) - return 0; - (*token_strlen) += addstrlen; - return 1; -} - -/** parse rdata from string into rr buffer(-remainder after dname). */ -static int -rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, - uint8_t* rr, size_t* rr_len, size_t dname_len, uint16_t rr_type, - uint8_t* origin, size_t origin_len) -{ - const sldns_rr_descriptor *desc = sldns_rr_descript((uint16_t)rr_type); - size_t r_cnt, r_min, r_max; - size_t rr_cur_len = dname_len + 10, pre_data_pos, token_strlen; - int was_unknown_rr_format = 0, parens = 0, status, quoted; - const char* delimiters; - sldns_rdf_type rdftype; - /* a desc is always returned */ - if(!desc) return LDNS_WIREPARSE_ERR_GENERAL; - r_max = sldns_rr_descriptor_maximum(desc); - r_min = sldns_rr_descriptor_minimum(desc); - /* robust check */ - if(rr_cur_len > *rr_len) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(strbuf)); - - /* because number of fields can be variable, we can't rely on - * _maximum() only */ - for(r_cnt=0; r_cnt < r_max; r_cnt++) { - rdftype = sldns_rr_descriptor_field_type(desc, r_cnt); - delimiters = rrinternal_get_delims(rdftype, r_cnt, r_max); - quoted = rrinternal_get_quoted(strbuf, &delimiters, rdftype); - - if(!sldns_parse_rdf_token(strbuf, token, token_len, "ed, - &parens, &pre_data_pos, delimiters, rdftype, - &token_strlen)) - break; - - /* rfc3597 specifies that any type can be represented - * with \# method, which can contain spaces... - * it does specify size though... */ - - /* unknown RR data */ - if(token_strlen>=2 && strncmp(token, "\\#", 2) == 0 && - !quoted && (token_strlen == 2 || token[2]==' ')) { - was_unknown_rr_format = 1; - if((status=rrinternal_parse_unknown(strbuf, token, - token_len, rr, rr_len, &rr_cur_len, - pre_data_pos)) != 0) - return status; - } else if(token_strlen > 0 || quoted) { - if(rdftype == LDNS_RDF_TYPE_HIP) { - /* affix the HIT and PK fields, with a space */ - if(!sldns_affix_token(strbuf, token, - &token_len, "ed, &parens, - &pre_data_pos, delimiters, - rdftype, &token_strlen)) - break; - if(!sldns_affix_token(strbuf, token, - &token_len, "ed, &parens, - &pre_data_pos, delimiters, - rdftype, &token_strlen)) - break; - } - - /* normal RR */ - if((status=rrinternal_parse_rdf(strbuf, token, - token_len, rr, *rr_len, &rr_cur_len, rdftype, - rr_type, r_cnt, r_max, dname_len, origin, - origin_len)) != 0) { - return status; - } - } - } - if(!was_unknown_rr_format && r_cnt+1 < r_min) { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_MISSING_VALUE, - sldns_buffer_position(strbuf)); - } - while(parens != 0) { - /* read remainder, must be "" */ - if(sldns_bget_token_par(strbuf, token, "\n", token_len, - &parens, " \t") == -1) { - if(parens != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_PARENTHESIS, - sldns_buffer_position(strbuf)); - break; - } - if(strcmp(token, "") != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_PARENTHESIS, - sldns_buffer_position(strbuf)); - } - /* write rdata length */ - sldns_write_uint16(rr+dname_len+8, (uint16_t)(rr_cur_len-dname_len-10)); - *rr_len = rr_cur_len; - return LDNS_WIREPARSE_ERR_OK; -} - -/* - * trailing spaces are allowed - * leading spaces are not allowed - * allow ttl to be optional - * class is optional too - * if ttl is missing, and default_ttl is 0, use DEF_TTL - * allow ttl to be written as 1d3h - * So the RR should look like. e.g. - * miek.nl. 3600 IN MX 10 elektron.atoom.net - * or - * miek.nl. 1h IN MX 10 elektron.atoom.net - * or - * miek.nl. IN MX 10 elektron.atoom.net - */ -static int -sldns_str2wire_rr_buf_internal(const char* str, uint8_t* rr, size_t* len, - size_t* dname_len, uint32_t default_ttl, uint8_t* origin, - size_t origin_len, uint8_t* prev, size_t prev_len, int question) -{ - int status; - int not_there = 0; - char token[LDNS_MAX_RDFLEN+1]; - uint32_t ttl = 0; - uint16_t tp = 0, cl = 0; - size_t ddlen = 0; - - /* string in buffer */ - sldns_buffer strbuf; - sldns_buffer_init_frm_data(&strbuf, (uint8_t*)str, strlen(str)); - if(!dname_len) dname_len = &ddlen; - - /* parse the owner */ - if((status=rrinternal_get_owner(&strbuf, rr, len, dname_len, origin, - origin_len, prev, prev_len, token, sizeof(token))) != 0) - return status; - - /* parse the [ttl] [class] <type> */ - if((status=rrinternal_get_ttl(&strbuf, token, sizeof(token), - ¬_there, &ttl, default_ttl)) != 0) - return status; - if((status=rrinternal_get_class(&strbuf, token, sizeof(token), - ¬_there, &cl)) != 0) - return status; - if((status=rrinternal_get_type(&strbuf, token, sizeof(token), - ¬_there, &tp)) != 0) - return status; - /* put ttl, class, type into the rr result */ - if((status=rrinternal_write_typeclassttl(&strbuf, rr, *len, *dname_len, tp, cl, - ttl, question)) != 0) - return status; - /* for a question-RR we are done, no rdata */ - if(question) { - *len = *dname_len + 4; - return LDNS_WIREPARSE_ERR_OK; - } - - /* rdata */ - if((status=rrinternal_parse_rdata(&strbuf, token, sizeof(token), - rr, len, *dname_len, tp, origin, origin_len)) != 0) - return status; - - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_rr_buf(const char* str, uint8_t* rr, size_t* len, - size_t* dname_len, uint32_t default_ttl, uint8_t* origin, - size_t origin_len, uint8_t* prev, size_t prev_len) -{ - return sldns_str2wire_rr_buf_internal(str, rr, len, dname_len, - default_ttl, origin, origin_len, prev, prev_len, 0); -} - -int sldns_str2wire_rr_question_buf(const char* str, uint8_t* rr, size_t* len, - size_t* dname_len, uint8_t* origin, size_t origin_len, uint8_t* prev, - size_t prev_len) -{ - return sldns_str2wire_rr_buf_internal(str, rr, len, dname_len, - 0, origin, origin_len, prev, prev_len, 1); -} - -uint16_t sldns_wirerr_get_type(uint8_t* rr, size_t len, size_t dname_len) -{ - if(len < dname_len+2) - return 0; - return sldns_read_uint16(rr+dname_len); -} - -uint16_t sldns_wirerr_get_class(uint8_t* rr, size_t len, size_t dname_len) -{ - if(len < dname_len+4) - return 0; - return sldns_read_uint16(rr+dname_len+2); -} - -uint32_t sldns_wirerr_get_ttl(uint8_t* rr, size_t len, size_t dname_len) -{ - if(len < dname_len+8) - return 0; - return sldns_read_uint32(rr+dname_len+4); -} - -uint16_t sldns_wirerr_get_rdatalen(uint8_t* rr, size_t len, size_t dname_len) -{ - if(len < dname_len+10) - return 0; - return sldns_read_uint16(rr+dname_len+8); -} - -uint8_t* sldns_wirerr_get_rdata(uint8_t* rr, size_t len, size_t dname_len) -{ - if(len < dname_len+10) - return NULL; - return rr+dname_len+10; -} - -uint8_t* sldns_wirerr_get_rdatawl(uint8_t* rr, size_t len, size_t dname_len) -{ - if(len < dname_len+10) - return NULL; - return rr+dname_len+8; -} - -const char* sldns_get_errorstr_parse(int e) -{ - sldns_lookup_table *lt; - lt = sldns_lookup_by_id(sldns_wireparse_errors, LDNS_WIREPARSE_ERROR(e)); - return lt?lt->name:"unknown error"; -} - -/* Strip whitespace from the start and the end of <line>. */ -static char * -sldns_strip_ws(char *line) -{ - char *s = line, *e; - - for (s = line; *s && isspace((unsigned char)*s); s++) - ; - for (e = strchr(s, 0); e > s+2 && isspace((unsigned char)e[-1]) && e[-2] != '\\'; e--) - ; - *e = 0; - return s; -} - -int sldns_fp2wire_rr_buf(FILE* in, uint8_t* rr, size_t* len, size_t* dname_len, - struct sldns_file_parse_state* parse_state) -{ - char line[LDNS_RR_BUF_SIZE+1]; - ssize_t size; - - /* read an entire line in from the file */ - if((size = sldns_fget_token_l(in, line, LDNS_PARSE_SKIP_SPACE, - LDNS_RR_BUF_SIZE, parse_state?&parse_state->lineno:NULL)) - == -1) { - /* if last line was empty, we are now at feof, which is not - * always a parse error (happens when for instance last line - * was a comment) - */ - return LDNS_WIREPARSE_ERR_SYNTAX; - } - - /* we can have the situation, where we've read ok, but still got - * no bytes to play with, in this case size is 0 */ - if(size == 0) { - *len = 0; - *dname_len = 0; - return LDNS_WIREPARSE_ERR_OK; - } - - if(strncmp(line, "$ORIGIN", 7) == 0 && isspace((unsigned char)line[7])) { - int s; - *len = 0; - *dname_len = 0; - if(!parse_state) return LDNS_WIREPARSE_ERR_OK; - parse_state->origin_len = sizeof(parse_state->origin); - s = sldns_str2wire_dname_buf(sldns_strip_ws(line+8), - parse_state->origin, &parse_state->origin_len); - if(s) parse_state->origin_len = 0; - return s; - } else if(strncmp(line, "$TTL", 4) == 0 && isspace((unsigned char)line[4])) { - const char* end = NULL; - *len = 0; - *dname_len = 0; - if(!parse_state) return LDNS_WIREPARSE_ERR_OK; - parse_state->default_ttl = sldns_str2period( - sldns_strip_ws(line+5), &end); - } else if (strncmp(line, "$INCLUDE", 8) == 0) { - *len = 0; - *dname_len = 0; - return LDNS_WIREPARSE_ERR_INCLUDE; - } else { - return sldns_str2wire_rr_buf(line, rr, len, dname_len, - parse_state?parse_state->default_ttl:0, - (parse_state&&parse_state->origin_len)? - parse_state->origin:NULL, - parse_state?parse_state->origin_len:0, - (parse_state&&parse_state->prev_rr_len)? - parse_state->prev_rr:NULL, - parse_state?parse_state->prev_rr_len:0); - } - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len, - sldns_rdf_type rdftype) -{ - switch (rdftype) { - case LDNS_RDF_TYPE_DNAME: - return sldns_str2wire_dname_buf(str, rd, len); - case LDNS_RDF_TYPE_INT8: - return sldns_str2wire_int8_buf(str, rd, len); - case LDNS_RDF_TYPE_INT16: - return sldns_str2wire_int16_buf(str, rd, len); - case LDNS_RDF_TYPE_INT32: - return sldns_str2wire_int32_buf(str, rd, len); - case LDNS_RDF_TYPE_A: - return sldns_str2wire_a_buf(str, rd, len); - case LDNS_RDF_TYPE_AAAA: - return sldns_str2wire_aaaa_buf(str, rd, len); - case LDNS_RDF_TYPE_STR: - return sldns_str2wire_str_buf(str, rd, len); - case LDNS_RDF_TYPE_APL: - return sldns_str2wire_apl_buf(str, rd, len); - case LDNS_RDF_TYPE_B64: - return sldns_str2wire_b64_buf(str, rd, len); - case LDNS_RDF_TYPE_B32_EXT: - return sldns_str2wire_b32_ext_buf(str, rd, len); - case LDNS_RDF_TYPE_HEX: - return sldns_str2wire_hex_buf(str, rd, len); - case LDNS_RDF_TYPE_NSEC: - return sldns_str2wire_nsec_buf(str, rd, len); - case LDNS_RDF_TYPE_TYPE: - return sldns_str2wire_type_buf(str, rd, len); - case LDNS_RDF_TYPE_CLASS: - return sldns_str2wire_class_buf(str, rd, len); - case LDNS_RDF_TYPE_CERT_ALG: - return sldns_str2wire_cert_alg_buf(str, rd, len); - case LDNS_RDF_TYPE_ALG: - return sldns_str2wire_alg_buf(str, rd, len); - case LDNS_RDF_TYPE_TIME: - return sldns_str2wire_time_buf(str, rd, len); - case LDNS_RDF_TYPE_PERIOD: - return sldns_str2wire_period_buf(str, rd, len); - case LDNS_RDF_TYPE_LOC: - return sldns_str2wire_loc_buf(str, rd, len); - case LDNS_RDF_TYPE_WKS: - return sldns_str2wire_wks_buf(str, rd, len); - case LDNS_RDF_TYPE_NSAP: - return sldns_str2wire_nsap_buf(str, rd, len); - case LDNS_RDF_TYPE_ATMA: - return sldns_str2wire_atma_buf(str, rd, len); - case LDNS_RDF_TYPE_IPSECKEY: - return sldns_str2wire_ipseckey_buf(str, rd, len); - case LDNS_RDF_TYPE_NSEC3_SALT: - return sldns_str2wire_nsec3_salt_buf(str, rd, len); - case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER: - return sldns_str2wire_b32_ext_buf(str, rd, len); - case LDNS_RDF_TYPE_ILNP64: - return sldns_str2wire_ilnp64_buf(str, rd, len); - case LDNS_RDF_TYPE_EUI48: - return sldns_str2wire_eui48_buf(str, rd, len); - case LDNS_RDF_TYPE_EUI64: - return sldns_str2wire_eui64_buf(str, rd, len); - case LDNS_RDF_TYPE_TAG: - return sldns_str2wire_tag_buf(str, rd, len); - case LDNS_RDF_TYPE_LONG_STR: - return sldns_str2wire_long_str_buf(str, rd, len); - case LDNS_RDF_TYPE_HIP: - return sldns_str2wire_hip_buf(str, rd, len); - case LDNS_RDF_TYPE_INT16_DATA: - return sldns_str2wire_int16_data_buf(str, rd, len); - case LDNS_RDF_TYPE_UNKNOWN: - case LDNS_RDF_TYPE_SERVICE: - return LDNS_WIREPARSE_ERR_NOT_IMPL; - case LDNS_RDF_TYPE_NONE: - default: - break; - } - return LDNS_WIREPARSE_ERR_GENERAL; -} - -int sldns_str2wire_int8_buf(const char* str, uint8_t* rd, size_t* len) -{ - char* end; - uint8_t r = (uint8_t)strtol((char*)str, &end, 10); - if(*end != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_INT, end-(char*)str); - if(*len < 1) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - rd[0] = r; - *len = 1; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_int16_buf(const char* str, uint8_t* rd, size_t* len) -{ - char* end; - uint16_t r = (uint16_t)strtol((char*)str, &end, 10); - if(*end != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_INT, end-(char*)str); - if(*len < 2) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - sldns_write_uint16(rd, r); - *len = 2; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_int32_buf(const char* str, uint8_t* rd, size_t* len) -{ - char* end; - uint32_t r; - errno = 0; /* must set to zero before call, - note race condition on errno */ - if(*str == '-') - r = (uint32_t)strtol((char*)str, &end, 10); - else r = (uint32_t)strtoul((char*)str, &end, 10); - if(*end != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_INT, end-(char*)str); - if(errno == ERANGE) - return LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW; - if(*len < 4) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - sldns_write_uint32(rd, r); - *len = 4; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_a_buf(const char* str, uint8_t* rd, size_t* len) -{ - struct in_addr address; - if(inet_pton(AF_INET, (char*)str, &address) != 1) - return LDNS_WIREPARSE_ERR_SYNTAX_IP4; - if(*len < sizeof(address)) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - memmove(rd, &address, sizeof(address)); - *len = sizeof(address); - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_aaaa_buf(const char* str, uint8_t* rd, size_t* len) -{ -#ifdef AF_INET6 - uint8_t address[LDNS_IP6ADDRLEN + 1]; - if(inet_pton(AF_INET6, (char*)str, address) != 1) - return LDNS_WIREPARSE_ERR_SYNTAX_IP6; - if(*len < LDNS_IP6ADDRLEN) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - memmove(rd, address, LDNS_IP6ADDRLEN); - *len = LDNS_IP6ADDRLEN; - return LDNS_WIREPARSE_ERR_OK; -#else - return LDNS_WIREPARSE_ERR_NOT_IMPL; -#endif -} - -int sldns_str2wire_str_buf(const char* str, uint8_t* rd, size_t* len) -{ - uint8_t ch = 0; - size_t sl = 0; - const char* s = str; - /* skip length byte */ - if(*len < 1) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - - /* read characters */ - while(sldns_parse_char(&ch, &s)) { - if(sl >= 255) - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, s-str); - if(*len < sl+1) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - s-str); - rd[++sl] = ch; - } - if(!s) - return LDNS_WIREPARSE_ERR_SYNTAX_BAD_ESCAPE; - rd[0] = (uint8_t)sl; - *len = sl+1; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_apl_buf(const char* str, uint8_t* rd, size_t* len) -{ - const char *my_str = str; - - char my_ip_str[64]; - size_t ip_str_len; - - uint16_t family; - int negation; - size_t adflength = 0; - uint8_t data[16+4]; - uint8_t prefix; - size_t i; - - if(*my_str == '\0') { - /* empty APL element, no data, no string */ - *len = 0; - return LDNS_WIREPARSE_ERR_OK; - } - - /* [!]afi:address/prefix */ - if (strlen(my_str) < 2 - || strchr(my_str, ':') == NULL - || strchr(my_str, '/') == NULL - || strchr(my_str, ':') > strchr(my_str, '/')) { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - if (my_str[0] == '!') { - negation = 1; - my_str += 1; - } else { - negation = 0; - } - - family = (uint16_t) atoi(my_str); - - my_str = strchr(my_str, ':') + 1; - - /* need ip addr and only ip addr for inet_pton */ - ip_str_len = (size_t) (strchr(my_str, '/') - my_str); - if(ip_str_len+1 > sizeof(my_ip_str)) - return LDNS_WIREPARSE_ERR_INVALID_STR; - (void)strlcpy(my_ip_str, my_str, sizeof(my_ip_str)); - my_ip_str[ip_str_len] = 0; - - if (family == 1) { - /* ipv4 */ - if(inet_pton(AF_INET, my_ip_str, data+4) == 0) - return LDNS_WIREPARSE_ERR_INVALID_STR; - for (i = 0; i < 4; i++) { - if (data[i+4] != 0) { - adflength = i + 1; - } - } - } else if (family == 2) { - /* ipv6 */ - if (inet_pton(AF_INET6, my_ip_str, data+4) == 0) - return LDNS_WIREPARSE_ERR_INVALID_STR; - for (i = 0; i < 16; i++) { - if (data[i+4] != 0) { - adflength = i + 1; - } - } - } else { - /* unknown family */ - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - my_str = strchr(my_str, '/') + 1; - prefix = (uint8_t) atoi(my_str); - - sldns_write_uint16(data, family); - data[2] = prefix; - data[3] = (uint8_t)adflength; - if (negation) { - /* set bit 1 of byte 3 */ - data[3] = data[3] | 0x80; - } - - if(*len < 4+adflength) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - memmove(rd, data, 4+adflength); - *len = 4+adflength; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_b64_buf(const char* str, uint8_t* rd, size_t* len) -{ - size_t sz = sldns_b64_pton_calculate_size(strlen(str)); - int n; - if(*len < sz) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - n = sldns_b64_pton(str, rd, *len); - if(n < 0) - return LDNS_WIREPARSE_ERR_SYNTAX_B64; - *len = (size_t)n; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_b32_ext_buf(const char* str, uint8_t* rd, size_t* len) -{ - size_t slen = strlen(str); - size_t sz = sldns_b32_pton_calculate_size(slen); - int n; - if(*len < 1+sz) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - rd[0] = (uint8_t)sz; - n = sldns_b32_pton_extended_hex(str, slen, rd+1, *len-1); - if(n < 0) - return LDNS_WIREPARSE_ERR_SYNTAX_B32_EXT; - *len = (size_t)n+1; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_hex_buf(const char* str, uint8_t* rd, size_t* len) -{ - const char* s = str; - size_t dlen = 0; /* number of hexdigits parsed */ - while(*s) { - if(isspace((unsigned char)*s)) { - s++; - continue; - } - if(!isxdigit((unsigned char)*s)) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str); - if(*len < dlen/2 + 1) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - s-str); - if((dlen&1)==0) - rd[dlen/2] = (uint8_t)sldns_hexdigit_to_int(*s++) * 16; - else rd[dlen/2] += (uint8_t)sldns_hexdigit_to_int(*s++); - dlen++; - } - if((dlen&1)!=0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str); - *len = dlen/2; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_nsec_buf(const char* str, uint8_t* rd, size_t* len) -{ - const char *delim = "\n\t "; - char token[64]; /* for a type name */ - size_t type_count = 0; - int block; - size_t used = 0; - uint16_t maxtype = 0; - uint8_t typebits[8192]; /* 65536 bits */ - uint8_t window_in_use[256]; - - /* string in buffer */ - sldns_buffer strbuf; - sldns_buffer_init_frm_data(&strbuf, (uint8_t*)str, strlen(str)); - - /* parse the types */ - memset(typebits, 0, sizeof(typebits)); - memset(window_in_use, 0, sizeof(window_in_use)); - while(sldns_buffer_remaining(&strbuf) > 0 && - sldns_bget_token(&strbuf, token, delim, sizeof(token)) != -1) { - uint16_t t = sldns_get_rr_type_by_name(token); - if(token[0] == 0) - continue; - if(t == 0 && strcmp(token, "TYPE0") != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TYPE, - sldns_buffer_position(&strbuf)); - typebits[t/8] |= (0x80>>(t%8)); - window_in_use[t/256] = 1; - type_count++; - if(t > maxtype) maxtype = t; - } - - /* empty NSEC bitmap */ - if(type_count == 0) { - *len = 0; - return LDNS_WIREPARSE_ERR_OK; - } - - /* encode windows {u8 windowblock, u8 bitmaplength, 0-32u8 bitmap}, - * block is 0-255 upper octet of types, length if 0-32. */ - for(block = 0; block <= (int)maxtype/256; block++) { - int i, blocklen = 0; - if(!window_in_use[block]) - continue; - for(i=0; i<32; i++) { - if(typebits[block*32+i] != 0) - blocklen = i+1; - } - if(blocklen == 0) - continue; /* empty window should have been !in_use */ - if(used+blocklen+2 > *len) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - rd[used+0] = (uint8_t)block; - rd[used+1] = (uint8_t)blocklen; - for(i=0; i<blocklen; i++) { - rd[used+2+i] = typebits[block*32+i]; - } - used += blocklen+2; - } - *len = used; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_type_buf(const char* str, uint8_t* rd, size_t* len) -{ - uint16_t t = sldns_get_rr_type_by_name(str); - if(t == 0 && strcmp(str, "TYPE0") != 0) - return LDNS_WIREPARSE_ERR_SYNTAX_TYPE; - if(*len < 2) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - sldns_write_uint16(rd, t); - *len = 2; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_class_buf(const char* str, uint8_t* rd, size_t* len) -{ - uint16_t c = sldns_get_rr_class_by_name(str); - if(c == 0 && strcmp(str, "CLASS0") != 0) - return LDNS_WIREPARSE_ERR_SYNTAX_CLASS; - if(*len < 2) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - sldns_write_uint16(rd, c); - *len = 2; - return LDNS_WIREPARSE_ERR_OK; -} - -/* An certificate alg field can either be specified as a 8 bits number - * or by its symbolic name. Handle both */ -int sldns_str2wire_cert_alg_buf(const char* str, uint8_t* rd, size_t* len) -{ - sldns_lookup_table *lt = sldns_lookup_by_name(sldns_cert_algorithms, - str); - if(*len < 2) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - if(lt) { - sldns_write_uint16(rd, (uint16_t)lt->id); - } else { - int s = sldns_str2wire_int16_buf(str, rd, len); - if(s) return s; - if(sldns_read_uint16(rd) == 0) - return LDNS_WIREPARSE_ERR_CERT_BAD_ALGORITHM; - } - *len = 2; - return LDNS_WIREPARSE_ERR_OK; -} - -/* An alg field can either be specified as a 8 bits number - * or by its symbolic name. Handle both */ -int sldns_str2wire_alg_buf(const char* str, uint8_t* rd, size_t* len) -{ - sldns_lookup_table *lt = sldns_lookup_by_name(sldns_algorithms, str); - if(*len < 1) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - if(lt) { - rd[0] = (uint8_t)lt->id; - *len = 1; - } else { - /* try as-is (a number) */ - return sldns_str2wire_int8_buf(str, rd, len); - } - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_time_buf(const char* str, uint8_t* rd, size_t* len) -{ - /* convert a time YYYYDDMMHHMMSS to wireformat */ - struct tm tm; - if(*len < 4) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - - /* Try to scan the time... */ - memset(&tm, 0, sizeof(tm)); - if (strlen(str) == 14 && sscanf(str, "%4d%2d%2d%2d%2d%2d", - &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, - &tm.tm_min, &tm.tm_sec) == 6) { - tm.tm_year -= 1900; - tm.tm_mon--; - /* Check values */ - if (tm.tm_year < 70) - return LDNS_WIREPARSE_ERR_SYNTAX_TIME; - if (tm.tm_mon < 0 || tm.tm_mon > 11) - return LDNS_WIREPARSE_ERR_SYNTAX_TIME; - if (tm.tm_mday < 1 || tm.tm_mday > 31) - return LDNS_WIREPARSE_ERR_SYNTAX_TIME; - if (tm.tm_hour < 0 || tm.tm_hour > 23) - return LDNS_WIREPARSE_ERR_SYNTAX_TIME; - if (tm.tm_min < 0 || tm.tm_min > 59) - return LDNS_WIREPARSE_ERR_SYNTAX_TIME; - if (tm.tm_sec < 0 || tm.tm_sec > 59) - return LDNS_WIREPARSE_ERR_SYNTAX_TIME; - - sldns_write_uint32(rd, (uint32_t)sldns_mktime_from_utc(&tm)); - } else { - /* handle it as 32 bits timestamp */ - char *end; - uint32_t l = (uint32_t)strtol((char*)str, &end, 10); - if(*end != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TIME, - end-(char*)str); - sldns_write_uint32(rd, l); - } - *len = 4; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_period_buf(const char* str, uint8_t* rd, size_t* len) -{ - const char* end; - uint32_t p = sldns_str2period(str, &end); - if(*end != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_PERIOD, end-str); - if(*len < 4) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - sldns_write_uint32(rd, p); - *len = 4; - return LDNS_WIREPARSE_ERR_OK; -} - -/** read "<digits>[.<digits>][mM]" into mantissa exponent format for LOC type */ -static int -loc_parse_cm(char* my_str, char** endstr, uint8_t* m, uint8_t* e) -{ - uint32_t meters = 0, cm = 0, val; - while (isblank((unsigned char)*my_str)) { - my_str++; - } - meters = (uint32_t)strtol(my_str, &my_str, 10); - if (*my_str == '.') { - my_str++; - cm = (uint32_t)strtol(my_str, &my_str, 10); - } - if (meters >= 1) { - *e = 2; - val = meters; - } else { - *e = 0; - val = cm; - } - while(val >= 10) { - (*e)++; - val /= 10; - } - *m = (uint8_t)val; - - if (*e > 9) - return 0; - if (*my_str == 'm' || *my_str == 'M') { - my_str++; - } - *endstr = my_str; - return 1; -} - -int sldns_str2wire_loc_buf(const char* str, uint8_t* rd, size_t* len) -{ - uint32_t latitude = 0; - uint32_t longitude = 0; - uint32_t altitude = 0; - - uint32_t equator = (uint32_t)1<<31; /* 2**31 */ - - /* only support version 0 */ - uint32_t h = 0; - uint32_t m = 0; - uint8_t size_b = 1, size_e = 2; - uint8_t horiz_pre_b = 1, horiz_pre_e = 6; - uint8_t vert_pre_b = 1, vert_pre_e = 3; - - double s = 0.0; - int northerness; - int easterness; - - char *my_str = (char *) str; - - if (isdigit((unsigned char) *my_str)) { - h = (uint32_t) strtol(my_str, &my_str, 10); - } else { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - while (isblank((unsigned char) *my_str)) { - my_str++; - } - - if (isdigit((unsigned char) *my_str)) { - m = (uint32_t) strtol(my_str, &my_str, 10); - } else if (*my_str == 'N' || *my_str == 'S') { - goto north; - } else { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - while (isblank((unsigned char) *my_str)) { - my_str++; - } - - if (isdigit((unsigned char) *my_str)) { - s = strtod(my_str, &my_str); - } - - /* skip blanks before norterness */ - while (isblank((unsigned char) *my_str)) { - my_str++; - } - -north: - if (*my_str == 'N') { - northerness = 1; - } else if (*my_str == 'S') { - northerness = 0; - } else { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - my_str++; - - /* store number */ - s = 1000.0 * s; - /* add a little to make floor in conversion a round */ - s += 0.0005; - latitude = (uint32_t) s; - latitude += 1000 * 60 * m; - latitude += 1000 * 60 * 60 * h; - if (northerness) { - latitude = equator + latitude; - } else { - latitude = equator - latitude; - } - while (isblank((unsigned char)*my_str)) { - my_str++; - } - - if (isdigit((unsigned char) *my_str)) { - h = (uint32_t) strtol(my_str, &my_str, 10); - } else { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - while (isblank((unsigned char) *my_str)) { - my_str++; - } - - if (isdigit((unsigned char) *my_str)) { - m = (uint32_t) strtol(my_str, &my_str, 10); - } else if (*my_str == 'E' || *my_str == 'W') { - goto east; - } else { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - while (isblank((unsigned char)*my_str)) { - my_str++; - } - - if (isdigit((unsigned char) *my_str)) { - s = strtod(my_str, &my_str); - } - - /* skip blanks before easterness */ - while (isblank((unsigned char)*my_str)) { - my_str++; - } - -east: - if (*my_str == 'E') { - easterness = 1; - } else if (*my_str == 'W') { - easterness = 0; - } else { - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - my_str++; - - /* store number */ - s *= 1000.0; - /* add a little to make floor in conversion a round */ - s += 0.0005; - longitude = (uint32_t) s; - longitude += 1000 * 60 * m; - longitude += 1000 * 60 * 60 * h; - - if (easterness) { - longitude += equator; - } else { - longitude = equator - longitude; - } - - altitude = (uint32_t)(strtod(my_str, &my_str)*100.0 + - 10000000.0 + 0.5); - if (*my_str == 'm' || *my_str == 'M') { - my_str++; - } - - if (strlen(my_str) > 0) { - if(!loc_parse_cm(my_str, &my_str, &size_b, &size_e)) - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - if (strlen(my_str) > 0) { - if(!loc_parse_cm(my_str, &my_str, &horiz_pre_b, &horiz_pre_e)) - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - if (strlen(my_str) > 0) { - if(!loc_parse_cm(my_str, &my_str, &vert_pre_b, &vert_pre_e)) - return LDNS_WIREPARSE_ERR_INVALID_STR; - } - - if(*len < 16) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - rd[0] = 0; - rd[1] = ((size_b << 4) & 0xf0) | (size_e & 0x0f); - rd[2] = ((horiz_pre_b << 4) & 0xf0) | (horiz_pre_e & 0x0f); - rd[3] = ((vert_pre_b << 4) & 0xf0) | (vert_pre_e & 0x0f); - sldns_write_uint32(rd + 4, latitude); - sldns_write_uint32(rd + 8, longitude); - sldns_write_uint32(rd + 12, altitude); - *len = 16; - return LDNS_WIREPARSE_ERR_OK; -} - -static void -ldns_tolower_str(char* s) -{ - if(s) { - while(*s) { - *s = (char)tolower((unsigned char)*s); - s++; - } - } -} - -int sldns_str2wire_wks_buf(const char* str, uint8_t* rd, size_t* len) -{ - int rd_len = 1; - int have_proto = 0; - char token[50], proto_str[50]; - sldns_buffer strbuf; - sldns_buffer_init_frm_data(&strbuf, (uint8_t*)str, strlen(str)); - proto_str[0]=0; - - /* check we have one byte for proto */ - if(*len < 1) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - - while(sldns_bget_token(&strbuf, token, "\t\n ", sizeof(token)) > 0) { - ldns_tolower_str(token); - if(!have_proto) { - struct protoent *p = getprotobyname(token); - have_proto = 1; - if(p) rd[0] = (uint8_t)p->p_proto; - else rd[0] = (uint8_t)atoi(token); - (void)strlcpy(proto_str, token, sizeof(proto_str)); - } else { - int serv_port; - struct servent *serv = getservbyname(token, proto_str); - if(serv) serv_port=(int)ntohs((uint16_t)serv->s_port); - else { - serv_port = atoi(token); - if(serv_port == 0 && strcmp(token, "0") != 0) { -#ifdef HAVE_ENDSERVENT - endservent(); -#endif -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX, - sldns_buffer_position(&strbuf)); - } - if(serv_port < 0 || serv_port > 65535) { -#ifdef HAVE_ENDSERVENT - endservent(); -#endif -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX, - sldns_buffer_position(&strbuf)); - } - } - if(rd_len < 1+serv_port/8+1) { - /* bitmap is larger, init new bytes at 0 */ - if(*len < 1+(size_t)serv_port/8+1) { -#ifdef HAVE_ENDSERVENT - endservent(); -#endif -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - return RET_ERR( - LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(&strbuf)); - } - memset(rd+rd_len, 0, 1+(size_t)serv_port/8+1-rd_len); - rd_len = 1+serv_port/8+1; - } - rd[1+ serv_port/8] |= (1 << (7 - serv_port % 8)); - } - } - *len = (size_t)rd_len; - -#ifdef HAVE_ENDSERVENT - endservent(); -#endif -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_nsap_buf(const char* str, uint8_t* rd, size_t* len) -{ - const char* s = str; - size_t slen; - size_t dlen = 0; /* number of hexdigits parsed */ - - /* just a hex string with optional dots? */ - if (s[0] != '0' || s[1] != 'x') - return LDNS_WIREPARSE_ERR_INVALID_STR; - s += 2; - slen = strlen(s); - if(slen > LDNS_MAX_RDFLEN*2) - return LDNS_WIREPARSE_ERR_LABEL_OVERFLOW; - while(*s) { - if(isspace((unsigned char)*s) || *s == '.') { - s++; - continue; - } - if(!isxdigit((unsigned char)*s)) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str); - if(*len < dlen/2 + 1) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - s-str); - if((dlen&1)==0) - rd[dlen/2] = (uint8_t)sldns_hexdigit_to_int(*s++) * 16; - else rd[dlen/2] += sldns_hexdigit_to_int(*s++); - dlen++; - } - if((dlen&1)!=0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str); - *len = dlen/2; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_atma_buf(const char* str, uint8_t* rd, size_t* len) -{ - const char* s = str; - size_t slen = strlen(str); - size_t dlen = 0; /* number of hexdigits parsed */ - - /* just a hex string with optional dots? */ - /* notimpl e.164 format */ - if(slen > LDNS_MAX_RDFLEN*2) - return LDNS_WIREPARSE_ERR_LABEL_OVERFLOW; - while(*s) { - if(isspace((unsigned char)*s) || *s == '.') { - s++; - continue; - } - if(!isxdigit((unsigned char)*s)) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str); - if(*len < dlen/2 + 1) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - s-str); - if((dlen&1)==0) - rd[dlen/2] = (uint8_t)sldns_hexdigit_to_int(*s++) * 16; - else rd[dlen/2] += sldns_hexdigit_to_int(*s++); - dlen++; - } - if((dlen&1)!=0) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, s-str); - *len = dlen/2; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_ipseckey_buf(const char* str, uint8_t* rd, size_t* len) -{ - size_t gwlen = 0, keylen = 0; - int s; - uint8_t gwtype; - char token[512]; - sldns_buffer strbuf; - sldns_buffer_init_frm_data(&strbuf, (uint8_t*)str, strlen(str)); - - if(*len < 3) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - /* precedence */ - if(sldns_bget_token(&strbuf, token, "\t\n ", sizeof(token)) <= 0) - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, - sldns_buffer_position(&strbuf)); - rd[0] = (uint8_t)atoi(token); - /* gateway_type */ - if(sldns_bget_token(&strbuf, token, "\t\n ", sizeof(token)) <= 0) - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, - sldns_buffer_position(&strbuf)); - rd[1] = (uint8_t)atoi(token); - gwtype = rd[1]; - /* algorithm */ - if(sldns_bget_token(&strbuf, token, "\t\n ", sizeof(token)) <= 0) - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, - sldns_buffer_position(&strbuf)); - rd[2] = (uint8_t)atoi(token); - - /* gateway */ - if(sldns_bget_token(&strbuf, token, "\t\n ", sizeof(token)) <= 0) - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, - sldns_buffer_position(&strbuf)); - if(gwtype == 0) { - /* NOGATEWAY */ - if(strcmp(token, ".") != 0) - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, - sldns_buffer_position(&strbuf)); - gwlen = 0; - } else if(gwtype == 1) { - /* IP4 */ - gwlen = *len - 3; - s = sldns_str2wire_a_buf(token, rd+3, &gwlen); - if(s) return RET_ERR_SHIFT(s, sldns_buffer_position(&strbuf)); - } else if(gwtype == 2) { - /* IP6 */ - gwlen = *len - 3; - s = sldns_str2wire_aaaa_buf(token, rd+3, &gwlen); - if(s) return RET_ERR_SHIFT(s, sldns_buffer_position(&strbuf)); - } else if(gwtype == 3) { - /* DNAME */ - gwlen = *len - 3; - s = sldns_str2wire_dname_buf(token, rd+3, &gwlen); - if(s) return RET_ERR_SHIFT(s, sldns_buffer_position(&strbuf)); - } else { - /* unknown gateway type */ - return RET_ERR(LDNS_WIREPARSE_ERR_INVALID_STR, - sldns_buffer_position(&strbuf)); - } - /* double check for size */ - if(*len < 3 + gwlen) - return RET_ERR(LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, - sldns_buffer_position(&strbuf)); - - /* publickey in remainder of strbuf */ - keylen = *len - 3 - gwlen; - s = sldns_str2wire_b64_buf((const char*)sldns_buffer_current(&strbuf), - rd+3+gwlen, &keylen); - if(s) return RET_ERR_SHIFT(s, sldns_buffer_position(&strbuf)); - - *len = 3 + gwlen + keylen; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_nsec3_salt_buf(const char* str, uint8_t* rd, size_t* len) -{ - int i, salt_length_str = (int)strlen(str); - if (salt_length_str == 1 && str[0] == '-') { - salt_length_str = 0; - } else if (salt_length_str % 2 != 0) { - return LDNS_WIREPARSE_ERR_SYNTAX_HEX; - } - if (salt_length_str > 512) - return LDNS_WIREPARSE_ERR_SYNTAX_HEX; - if(*len < 1+(size_t)salt_length_str / 2) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - rd[0] = (uint8_t) (salt_length_str / 2); - for (i = 0; i < salt_length_str; i += 2) { - if (isxdigit((unsigned char)str[i]) && - isxdigit((unsigned char)str[i+1])) { - rd[1+i/2] = (uint8_t)(sldns_hexdigit_to_int(str[i])*16 - + sldns_hexdigit_to_int(str[i+1])); - } else { - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_HEX, i); - } - } - *len = 1 + (size_t)rd[0]; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_ilnp64_buf(const char* str, uint8_t* rd, size_t* len) -{ - unsigned int a, b, c, d; - uint16_t shorts[4]; - int l; - if(*len < sizeof(shorts)) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - - if (sscanf(str, "%4x:%4x:%4x:%4x%n", &a, &b, &c, &d, &l) != 4 || - l != (int)strlen(str) || /* more data to read */ - strpbrk(str, "+-") /* signed hexes */ - ) - return LDNS_WIREPARSE_ERR_SYNTAX_ILNP64; - shorts[0] = htons(a); - shorts[1] = htons(b); - shorts[2] = htons(c); - shorts[3] = htons(d); - memmove(rd, &shorts, sizeof(shorts)); - *len = sizeof(shorts); - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_eui48_buf(const char* str, uint8_t* rd, size_t* len) -{ - unsigned int a, b, c, d, e, f; - int l; - - if(*len < 6) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - if (sscanf(str, "%2x-%2x-%2x-%2x-%2x-%2x%n", - &a, &b, &c, &d, &e, &f, &l) != 6 || - l != (int)strlen(str)) - return LDNS_WIREPARSE_ERR_SYNTAX_EUI48; - rd[0] = a; - rd[1] = b; - rd[2] = c; - rd[3] = d; - rd[4] = e; - rd[5] = f; - *len = 6; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_eui64_buf(const char* str, uint8_t* rd, size_t* len) -{ - unsigned int a, b, c, d, e, f, g, h; - int l; - - if(*len < 8) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - if (sscanf(str, "%2x-%2x-%2x-%2x-%2x-%2x-%2x-%2x%n", - &a, &b, &c, &d, &e, &f, &g, &h, &l) != 8 || - l != (int)strlen(str)) - return LDNS_WIREPARSE_ERR_SYNTAX_EUI64; - rd[0] = a; - rd[1] = b; - rd[2] = c; - rd[3] = d; - rd[4] = e; - rd[5] = f; - rd[6] = g; - rd[7] = h; - *len = 8; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_tag_buf(const char* str, uint8_t* rd, size_t* len) -{ - size_t slen = strlen(str); - const char* ptr; - - if (slen > 255) - return LDNS_WIREPARSE_ERR_SYNTAX_TAG; - if(*len < slen+1) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - for (ptr = str; *ptr; ptr++) { - if(!isalnum((unsigned char)*ptr)) - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_TAG, ptr-str); - } - rd[0] = (uint8_t)slen; - memmove(rd+1, str, slen); - *len = slen+1; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_long_str_buf(const char* str, uint8_t* rd, size_t* len) -{ - uint8_t ch = 0; - const char* pstr = str; - size_t length = 0; - - /* Fill data with parsed bytes */ - while (sldns_parse_char(&ch, &pstr)) { - if(*len < length+1) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - rd[length++] = ch; - } - if(!pstr) - return LDNS_WIREPARSE_ERR_SYNTAX_BAD_ESCAPE; - *len = length; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_hip_buf(const char* str, uint8_t* rd, size_t* len) -{ - char* s, *end; - int e; - size_t hitlen, pklen = 0; - /* presentation format: - * pk-algo HIThex pubkeybase64 - * wireformat: - * hitlen[1byte] pkalgo[1byte] pubkeylen[2byte] [hit] [pubkey] */ - if(*len < 4) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - - /* read PK algorithm */ - rd[1] = (uint8_t)strtol((char*)str, &s, 10); - if(*s != ' ') - return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_INT, s-(char*)str); - s++; - while(*s == ' ') - s++; - - /* read HIT hex tag */ - /* zero terminate the tag (replace later) */ - end = strchr(s, ' '); - if(!end) return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX, s-(char*)str); - *end = 0; - hitlen = *len - 4; - if((e = sldns_str2wire_hex_buf(s, rd+4, &hitlen)) != 0) { - *end = ' '; - return RET_ERR_SHIFT(e, s-(char*)str); - } - if(hitlen > 255) { - *end = ' '; - return RET_ERR(LDNS_WIREPARSE_ERR_LABEL_OVERFLOW, s-(char*)str+255*2); - } - rd[0] = (uint8_t)hitlen; - *end = ' '; - s = end+1; - - /* read pubkey base64 sequence */ - pklen = *len - 4 - hitlen; - if((e = sldns_str2wire_b64_buf(s, rd+4+hitlen, &pklen)) != 0) - return RET_ERR_SHIFT(e, s-(char*)str); - if(pklen > 65535) - return RET_ERR(LDNS_WIREPARSE_ERR_LABEL_OVERFLOW, s-(char*)str+65535); - sldns_write_uint16(rd+2, (uint16_t)pklen); - - *len = 4 + hitlen + pklen; - return LDNS_WIREPARSE_ERR_OK; -} - -int sldns_str2wire_int16_data_buf(const char* str, uint8_t* rd, size_t* len) -{ - size_t sz = sldns_b64_pton_calculate_size(strlen(str)); - int n; - if(*len < sz+2) - return LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL; - if(sz > 65535) - return LDNS_WIREPARSE_ERR_LABEL_OVERFLOW; - n = sldns_b64_pton(str, rd+2, (*len)-2); - if(n < 0) - return LDNS_WIREPARSE_ERR_SYNTAX_B64; - sldns_write_uint16(rd, (uint16_t)n); - *len = (size_t)n; - return LDNS_WIREPARSE_ERR_OK; -} diff --git a/external/unbound/sldns/str2wire.h b/external/unbound/sldns/str2wire.h deleted file mode 100644 index 527074a15..000000000 --- a/external/unbound/sldns/str2wire.h +++ /dev/null @@ -1,541 +0,0 @@ -/** - * str2wire.h - read txt presentation of RRs - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Parses text to wireformat. - */ - -#ifndef LDNS_STR2WIRE_H -#define LDNS_STR2WIRE_H - -/* include rrdef for MAX_DOMAINLEN constant */ -#include <sldns/rrdef.h> - -#ifdef __cplusplus -extern "C" { -#endif -struct sldns_struct_lookup_table; - -/** buffer to read an RR, cannot be larger than 64K because of packet size */ -#define LDNS_RR_BUF_SIZE 65535 /* bytes */ -#define LDNS_DEFAULT_TTL 3600 - -/* - * To convert class and type to string see - * sldns_get_rr_class_by_name(str) - * sldns_get_rr_type_by_name(str) - * from rrdef.h - */ - -/** - * Convert text string into dname wireformat, mallocless, with user buffer. - * @param str: the text string with the domain name. - * @param buf: the result buffer, suggested size LDNS_MAX_DOMAINLEN+1 - * @param len: length of the buffer on input, length of the result on output. - * @return 0 on success, otherwise an error. - */ -int sldns_str2wire_dname_buf(const char* str, uint8_t* buf, size_t* len); - -/** - * Same as sldns_str2wire_dname_buf, but concatenates origin if the domain - * name is relative (does not end in '.'). - * @param str: the text string with the domain name. - * @param buf: the result buffer, suggested size LDNS_MAX_DOMAINLEN+1 - * @param len: length of the buffer on input, length of the result on output. - * @param origin: the origin to append or NULL (nothing is appended). - * @param origin_len: length of origin. - * @return 0 on success, otherwise an error. - */ -int sldns_str2wire_dname_buf_origin(const char* str, uint8_t* buf, size_t* len, - uint8_t* origin, size_t origin_len); - -/** - * Convert text string into dname wireformat - * @param str: the text string with the domain name. - * @param len: returned length of wireformat. - * @return wireformat dname (malloced) or NULL on failure. - */ -uint8_t* sldns_str2wire_dname(const char* str, size_t* len); - -/** - * Convert text RR to wireformat, with user buffer. - * @param str: the RR data in text presentation format. - * @param rr: the buffer where the result is stored into. This buffer has - * the wire-dname(uncompressed), type, class, ttl, rdatalen, rdata. - * These values are probably not aligned, and in network format. - * Use the sldns_wirerr_get_xxx functions to access them safely. - * buffer size LDNS_RR_BUF_SIZE is suggested. - * @param len: on input the length of the buffer, on output the amount of - * the buffer used for the rr. - * @param dname_len: if non-NULL, filled with the dname length as result. - * Because after the dname you find the type, class, ttl, rdatalen, rdata. - * @param default_ttl: TTL used if no TTL available. - * @param origin: used for origin dname (if not NULL) - * @param origin_len: length of origin. - * @param prev: used for prev_rr dname (if not NULL) - * @param prev_len: length of prev. - * @return 0 on success, an error on failure. - */ -int sldns_str2wire_rr_buf(const char* str, uint8_t* rr, size_t* len, - size_t* dname_len, uint32_t default_ttl, uint8_t* origin, - size_t origin_len, uint8_t* prev, size_t prev_len); - -/** - * Same as sldns_str2wire_rr_buf, but there is no rdata, it returns an RR - * with zero rdata and no ttl. It has name, type, class. - * You can access those with the sldns_wirerr_get_type and class functions. - * @param str: the RR data in text presentation format. - * @param rr: the buffer where the result is stored into. - * @param len: on input the length of the buffer, on output the amount of - * the buffer used for the rr. - * @param dname_len: if non-NULL, filled with the dname length as result. - * Because after the dname you find the type, class, ttl, rdatalen, rdata. - * @param origin: used for origin dname (if not NULL) - * @param origin_len: length of origin. - * @param prev: used for prev_rr dname (if not NULL) - * @param prev_len: length of prev. - * @return 0 on success, an error on failure. - */ -int sldns_str2wire_rr_question_buf(const char* str, uint8_t* rr, size_t* len, - size_t* dname_len, uint8_t* origin, size_t origin_len, uint8_t* prev, - size_t prev_len); - -/** - * Get the type of the RR. - * @param rr: the RR in wire format. - * @param len: rr length. - * @param dname_len: dname length to skip. - * @return type in host byteorder - */ -uint16_t sldns_wirerr_get_type(uint8_t* rr, size_t len, size_t dname_len); - -/** - * Get the class of the RR. - * @param rr: the RR in wire format. - * @param len: rr length. - * @param dname_len: dname length to skip. - * @return class in host byteorder - */ -uint16_t sldns_wirerr_get_class(uint8_t* rr, size_t len, size_t dname_len); - -/** - * Get the ttl of the RR. - * @param rr: the RR in wire format. - * @param len: rr length. - * @param dname_len: dname length to skip. - * @return ttl in host byteorder - */ -uint32_t sldns_wirerr_get_ttl(uint8_t* rr, size_t len, size_t dname_len); - -/** - * Get the rdata length of the RR. - * @param rr: the RR in wire format. - * @param len: rr length. - * @param dname_len: dname length to skip. - * @return rdata length in host byteorder - * If the rdata length is larger than the rr-len allows, it is truncated. - * So, that it is safe to read the data length returned - * from this function from the rdata pointer of sldns_wirerr_get_rdata. - */ -uint16_t sldns_wirerr_get_rdatalen(uint8_t* rr, size_t len, size_t dname_len); - -/** - * Get the rdata pointer of the RR. - * @param rr: the RR in wire format. - * @param len: rr length. - * @param dname_len: dname length to skip. - * @return rdata pointer - */ -uint8_t* sldns_wirerr_get_rdata(uint8_t* rr, size_t len, size_t dname_len); - -/** - * Get the rdata pointer of the RR. prefixed with rdata length. - * @param rr: the RR in wire format. - * @param len: rr length. - * @param dname_len: dname length to skip. - * @return pointer to rdatalength, followed by the rdata. - */ -uint8_t* sldns_wirerr_get_rdatawl(uint8_t* rr, size_t len, size_t dname_len); - -/** - * Parse result codes - */ -#define LDNS_WIREPARSE_MASK 0x0fff -#define LDNS_WIREPARSE_SHIFT 12 -#define LDNS_WIREPARSE_ERROR(e) ((e)&LDNS_WIREPARSE_MASK) -#define LDNS_WIREPARSE_OFFSET(e) (((e)&~LDNS_WIREPARSE_MASK)>>LDNS_WIREPARSE_SHIFT) -/* use lookuptable to get error string, sldns_wireparse_errors */ -#define LDNS_WIREPARSE_ERR_OK 0 -#define LDNS_WIREPARSE_ERR_GENERAL 342 -#define LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW 343 -#define LDNS_WIREPARSE_ERR_DOMAINNAME_UNDERFLOW 344 -#define LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL 345 -#define LDNS_WIREPARSE_ERR_LABEL_OVERFLOW 346 -#define LDNS_WIREPARSE_ERR_EMPTY_LABEL 347 -#define LDNS_WIREPARSE_ERR_SYNTAX_BAD_ESCAPE 348 -#define LDNS_WIREPARSE_ERR_SYNTAX 349 -#define LDNS_WIREPARSE_ERR_SYNTAX_TTL 350 -#define LDNS_WIREPARSE_ERR_SYNTAX_TYPE 351 -#define LDNS_WIREPARSE_ERR_SYNTAX_CLASS 352 -#define LDNS_WIREPARSE_ERR_SYNTAX_RDATA 353 -#define LDNS_WIREPARSE_ERR_SYNTAX_MISSING_VALUE 354 -#define LDNS_WIREPARSE_ERR_INVALID_STR 355 -#define LDNS_WIREPARSE_ERR_SYNTAX_B64 356 -#define LDNS_WIREPARSE_ERR_SYNTAX_B32_EXT 357 -#define LDNS_WIREPARSE_ERR_SYNTAX_HEX 358 -#define LDNS_WIREPARSE_ERR_CERT_BAD_ALGORITHM 359 -#define LDNS_WIREPARSE_ERR_SYNTAX_TIME 360 -#define LDNS_WIREPARSE_ERR_SYNTAX_PERIOD 361 -#define LDNS_WIREPARSE_ERR_SYNTAX_ILNP64 362 -#define LDNS_WIREPARSE_ERR_SYNTAX_EUI48 363 -#define LDNS_WIREPARSE_ERR_SYNTAX_EUI64 364 -#define LDNS_WIREPARSE_ERR_SYNTAX_TAG 365 -#define LDNS_WIREPARSE_ERR_NOT_IMPL 366 -#define LDNS_WIREPARSE_ERR_SYNTAX_INT 367 -#define LDNS_WIREPARSE_ERR_SYNTAX_IP4 368 -#define LDNS_WIREPARSE_ERR_SYNTAX_IP6 369 -#define LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW 370 -#define LDNS_WIREPARSE_ERR_INCLUDE 371 -#define LDNS_WIREPARSE_ERR_PARENTHESIS 372 - -/** - * Get reference to a constant string for the (parse) error. - * @param e: error return value - * @return string. - */ -const char* sldns_get_errorstr_parse(int e); - -/** - * wire parse state for parsing files - */ -struct sldns_file_parse_state { - /** the origin domain name, if len!=0. uncompressed wireformat */ - uint8_t origin[LDNS_MAX_DOMAINLEN+1]; - /** length of origin domain name, in bytes. 0 if not set. */ - size_t origin_len; - /** the previous domain name, if len!=0. uncompressed wireformat*/ - uint8_t prev_rr[LDNS_MAX_DOMAINLEN+1]; - /** length of the previous domain name, in bytes. 0 if not set. */ - size_t prev_rr_len; - /** default TTL, this is used if the text does not specify a TTL, - * host byteorder */ - uint32_t default_ttl; - /** line number information */ - int lineno; -}; - -/** - * Read one RR from zonefile with buffer for the data. - * @param in: file that is read from (one RR, multiple lines if it spans them). - * @param rr: this is malloced by the user and the result is stored here, - * if an RR is read. If no RR is read this is signalled with the - * return len set to 0 (for ORIGIN, TTL directives). - * @param len: on input, the length of the rr buffer. on output the rr len. - * Buffer size of 64k should be enough. - * @param dname_len: returns the length of the dname initial part of the rr. - * @param parse_state: pass a pointer to user-allocated struct. - * Contents are maintained by this function. - * If you pass NULL then ORIGIN and TTL directives are not honored. - * You can start out with a particular origin by pre-filling it. - * otherwise, zero the structure before passing it. - * lineno is incremented when a newline is passed by the parser, - * you should initialize it at 1 at the start of the file. - * @return 0 on success, error on failure. - */ -int sldns_fp2wire_rr_buf(FILE* in, uint8_t* rr, size_t* len, size_t* dname_len, - struct sldns_file_parse_state* parse_state); - -/** - * Convert one rdf in rdata to wireformat and parse from string. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @param rdftype: the type of the rdf. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_rdf_buf(const char* str, uint8_t* rd, size_t* len, - sldns_rdf_type rdftype); - -/** - * Convert rdf of type LDNS_RDF_TYPE_INT8 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_int8_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_INT16 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_int16_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_INT32 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_int32_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_A from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_a_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_AAAA from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_aaaa_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_STR from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_str_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_APL from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_apl_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_B64 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_b64_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_B32_EXT from string to wireformat. - * And also LDNS_RDF_TYPE_NSEC3_NEXT_OWNER. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_b32_ext_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_HEX from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_hex_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_NSEC from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_nsec_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_TYPE from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_type_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_CLASS from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_class_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_CERT_ALG from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_cert_alg_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_ALG from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_alg_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_TIME from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_time_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_PERIOD from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_period_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_LOC from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_loc_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_WKS from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_wks_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_NSAP from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_nsap_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_ATMA from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_atma_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_IPSECKEY from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_ipseckey_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_NSEC3_SALT from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_nsec3_salt_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_ILNP64 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_ilnp64_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_EUI48 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_eui48_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_EUI64 from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_eui64_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_TAG from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_tag_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_LONG_STR from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_long_str_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_HIP from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_hip_buf(const char* str, uint8_t* rd, size_t* len); - -/** - * Convert rdf of type LDNS_RDF_TYPE_INT16_DATA from string to wireformat. - * @param str: the text to convert for this rdata element. - * @param rd: rdata buffer for the wireformat. - * @param len: length of rd buffer on input, used length on output. - * @return 0 on success, error on failure. - */ -int sldns_str2wire_int16_data_buf(const char* str, uint8_t* rd, size_t* len); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_STR2WIRE_H */ diff --git a/external/unbound/sldns/wire2str.c b/external/unbound/sldns/wire2str.c deleted file mode 100644 index b2ca6192c..000000000 --- a/external/unbound/sldns/wire2str.c +++ /dev/null @@ -1,2006 +0,0 @@ -/* - * wire2str.c - * - * conversion routines from the wire format - * to the presentation format (strings) - * - * (c) NLnet Labs, 2004-2006 - * - * See the file LICENSE for the license - */ -/** - * \file - * - * Contains functions to translate the wireformat to text - * representation, as well as functions to print them. - */ -#include "config.h" -#include "sldns/wire2str.h" -#include "sldns/str2wire.h" -#include "sldns/rrdef.h" -#include "sldns/pkthdr.h" -#include "sldns/parseutil.h" -#include "sldns/sbuffer.h" -#include "sldns/keyraw.h" -#ifdef HAVE_TIME_H -#include <time.h> -#endif -#include <sys/time.h> -#include <stdarg.h> -#include <ctype.h> -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif - -/* lookup tables for standard DNS stuff */ -/* Taken from RFC 2535, section 7. */ -static sldns_lookup_table sldns_algorithms_data[] = { - { LDNS_RSAMD5, "RSAMD5" }, - { LDNS_DH, "DH" }, - { LDNS_DSA, "DSA" }, - { LDNS_ECC, "ECC" }, - { LDNS_RSASHA1, "RSASHA1" }, - { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" }, - { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" }, - { LDNS_RSASHA256, "RSASHA256"}, - { LDNS_RSASHA512, "RSASHA512"}, - { LDNS_ECC_GOST, "ECC-GOST"}, - { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"}, - { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"}, - { LDNS_ED25519, "ED25519"}, - { LDNS_ED448, "ED448"}, - { LDNS_INDIRECT, "INDIRECT" }, - { LDNS_PRIVATEDNS, "PRIVATEDNS" }, - { LDNS_PRIVATEOID, "PRIVATEOID" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_algorithms = sldns_algorithms_data; - -/* hash algorithms in DS record */ -static sldns_lookup_table sldns_hashes_data[] = { - { LDNS_SHA1, "SHA1" }, - { LDNS_SHA256, "SHA256" }, - { LDNS_HASH_GOST, "HASH-GOST" }, - { LDNS_SHA384, "SHA384" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_hashes = sldns_hashes_data; - -/* Taken from RFC 4398 */ -static sldns_lookup_table sldns_cert_algorithms_data[] = { - { LDNS_CERT_PKIX, "PKIX" }, - { LDNS_CERT_SPKI, "SPKI" }, - { LDNS_CERT_PGP, "PGP" }, - { LDNS_CERT_IPKIX, "IPKIX" }, - { LDNS_CERT_ISPKI, "ISPKI" }, - { LDNS_CERT_IPGP, "IPGP" }, - { LDNS_CERT_ACPKIX, "ACPKIX" }, - { LDNS_CERT_IACPKIX, "IACPKIX" }, - { LDNS_CERT_URI, "URI" }, - { LDNS_CERT_OID, "OID" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_cert_algorithms = sldns_cert_algorithms_data; - -/* if these are used elsewhere */ -static sldns_lookup_table sldns_rcodes_data[] = { - { LDNS_RCODE_NOERROR, "NOERROR" }, - { LDNS_RCODE_FORMERR, "FORMERR" }, - { LDNS_RCODE_SERVFAIL, "SERVFAIL" }, - { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" }, - { LDNS_RCODE_NOTIMPL, "NOTIMPL" }, - { LDNS_RCODE_REFUSED, "REFUSED" }, - { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" }, - { LDNS_RCODE_YXRRSET, "YXRRSET" }, - { LDNS_RCODE_NXRRSET, "NXRRSET" }, - { LDNS_RCODE_NOTAUTH, "NOTAUTH" }, - { LDNS_RCODE_NOTZONE, "NOTZONE" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_rcodes = sldns_rcodes_data; - -static sldns_lookup_table sldns_opcodes_data[] = { - { LDNS_PACKET_QUERY, "QUERY" }, - { LDNS_PACKET_IQUERY, "IQUERY" }, - { LDNS_PACKET_STATUS, "STATUS" }, - { LDNS_PACKET_NOTIFY, "NOTIFY" }, - { LDNS_PACKET_UPDATE, "UPDATE" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_opcodes = sldns_opcodes_data; - -static sldns_lookup_table sldns_wireparse_errors_data[] = { - { LDNS_WIREPARSE_ERR_OK, "no parse error" }, - { LDNS_WIREPARSE_ERR_GENERAL, "parse error" }, - { LDNS_WIREPARSE_ERR_DOMAINNAME_OVERFLOW, "Domainname length overflow" }, - { LDNS_WIREPARSE_ERR_DOMAINNAME_UNDERFLOW, "Domainname length underflow (zero length)" }, - { LDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL, "buffer too small" }, - { LDNS_WIREPARSE_ERR_LABEL_OVERFLOW, "Label length overflow" }, - { LDNS_WIREPARSE_ERR_EMPTY_LABEL, "Empty label" }, - { LDNS_WIREPARSE_ERR_SYNTAX_BAD_ESCAPE, "Syntax error, bad escape sequence" }, - { LDNS_WIREPARSE_ERR_SYNTAX, "Syntax error, could not parse the RR" }, - { LDNS_WIREPARSE_ERR_SYNTAX_TTL, "Syntax error, could not parse the RR's TTL" }, - { LDNS_WIREPARSE_ERR_SYNTAX_TYPE, "Syntax error, could not parse the RR's type" }, - { LDNS_WIREPARSE_ERR_SYNTAX_CLASS, "Syntax error, could not parse the RR's class" }, - { LDNS_WIREPARSE_ERR_SYNTAX_RDATA, "Syntax error, could not parse the RR's rdata" }, - { LDNS_WIREPARSE_ERR_SYNTAX_MISSING_VALUE, "Syntax error, value expected" }, - { LDNS_WIREPARSE_ERR_INVALID_STR, "Conversion error, string expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_B64, "Conversion error, b64 encoding expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_B32_EXT, "Conversion error, b32 ext encoding expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_HEX, "Conversion error, hex encoding expected" }, - { LDNS_WIREPARSE_ERR_CERT_BAD_ALGORITHM, "Bad algorithm type for CERT record" }, - { LDNS_WIREPARSE_ERR_SYNTAX_TIME, "Conversion error, time encoding expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_PERIOD, "Conversion error, time period encoding expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_ILNP64, "Conversion error, 4 colon separated hex numbers expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_EUI48, - "Conversion error, 6 two character hex numbers " - "separated by dashes expected (i.e. xx-xx-xx-xx-xx-xx" }, - { LDNS_WIREPARSE_ERR_SYNTAX_EUI64, - "Conversion error, 8 two character hex numbers " - "separated by dashes expected (i.e. xx-xx-xx-xx-xx-xx-xx-xx" }, - { LDNS_WIREPARSE_ERR_SYNTAX_TAG, - "Conversion error, a non-zero sequence of US-ASCII letters " - "and numbers in lower case expected" }, - { LDNS_WIREPARSE_ERR_NOT_IMPL, "not implemented" }, - { LDNS_WIREPARSE_ERR_SYNTAX_INT, "Conversion error, integer expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_IP4, "Conversion error, ip4 addr expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_IP6, "Conversion error, ip6 addr expected" }, - { LDNS_WIREPARSE_ERR_SYNTAX_INTEGER_OVERFLOW, "Syntax error, integer overflow" }, - { LDNS_WIREPARSE_ERR_INCLUDE, "$INCLUDE directive was seen in the zone" }, - { LDNS_WIREPARSE_ERR_PARENTHESIS, "Parse error, parenthesis mismatch" }, - { 0, NULL } -}; -sldns_lookup_table* sldns_wireparse_errors = sldns_wireparse_errors_data; - -static sldns_lookup_table sldns_edns_flags_data[] = { - { 3600, "do"}, - { 0, NULL} -}; -sldns_lookup_table* sldns_edns_flags = sldns_edns_flags_data; - -static sldns_lookup_table sldns_edns_options_data[] = { - { 1, "LLQ" }, - { 2, "UL" }, - { 3, "NSID" }, - /* 4 draft-cheshire-edns0-owner-option */ - { 5, "DAU" }, - { 6, "DHU" }, - { 7, "N3U" }, - { 8, "edns-client-subnet" }, - { 11, "edns-tcp-keepalive"}, - { 12, "Padding" }, - { 0, NULL} -}; -sldns_lookup_table* sldns_edns_options = sldns_edns_options_data; - -char* sldns_wire2str_pkt(uint8_t* data, size_t len) -{ - size_t slen = (size_t)sldns_wire2str_pkt_buf(data, len, NULL, 0); - char* result = (char*)malloc(slen+1); - if(!result) return NULL; - sldns_wire2str_pkt_buf(data, len, result, slen+1); - return result; -} - -char* sldns_wire2str_rr(uint8_t* rr, size_t len) -{ - size_t slen = (size_t)sldns_wire2str_rr_buf(rr, len, NULL, 0); - char* result = (char*)malloc(slen+1); - if(!result) return NULL; - sldns_wire2str_rr_buf(rr, len, result, slen+1); - return result; -} - -char* sldns_wire2str_type(uint16_t rrtype) -{ - char buf[16]; - sldns_wire2str_type_buf(rrtype, buf, sizeof(buf)); - return strdup(buf); -} - -char* sldns_wire2str_class(uint16_t rrclass) -{ - char buf[16]; - sldns_wire2str_class_buf(rrclass, buf, sizeof(buf)); - return strdup(buf); -} - -char* sldns_wire2str_dname(uint8_t* dname, size_t dname_len) -{ - size_t slen=(size_t)sldns_wire2str_dname_buf(dname, dname_len, NULL, 0); - char* result = (char*)malloc(slen+1); - if(!result) return NULL; - sldns_wire2str_dname_buf(dname, dname_len, result, slen+1); - return result; -} - -char* sldns_wire2str_rcode(int rcode) -{ - char buf[16]; - sldns_wire2str_rcode_buf(rcode, buf, sizeof(buf)); - return strdup(buf); -} - -int sldns_wire2str_pkt_buf(uint8_t* d, size_t dlen, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_pkt_scan(&d, &dlen, &s, &slen); -} - -int sldns_wire2str_rr_buf(uint8_t* d, size_t dlen, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_rr_scan(&d, &dlen, &s, &slen, NULL, 0); -} - -int sldns_wire2str_rdata_buf(uint8_t* rdata, size_t rdata_len, char* str, - size_t str_len, uint16_t rrtype) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_rdata_scan(&rdata, &rdata_len, &str, &str_len, - rrtype, NULL, 0); -} - -int sldns_wire2str_rr_unknown_buf(uint8_t* d, size_t dlen, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_rr_unknown_scan(&d, &dlen, &s, &slen, NULL, 0); -} - -int sldns_wire2str_rr_comment_buf(uint8_t* rr, size_t rrlen, size_t dname_len, - char* s, size_t slen) -{ - uint16_t rrtype = sldns_wirerr_get_type(rr, rrlen, dname_len); - return sldns_wire2str_rr_comment_print(&s, &slen, rr, rrlen, dname_len, - rrtype); -} - -int sldns_wire2str_type_buf(uint16_t rrtype, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_type_print(&s, &slen, rrtype); -} - -int sldns_wire2str_class_buf(uint16_t rrclass, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_class_print(&s, &slen, rrclass); -} - -int sldns_wire2str_rcode_buf(int rcode, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_rcode_print(&s, &slen, rcode); -} - -int sldns_wire2str_opcode_buf(int opcode, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_opcode_print(&s, &slen, opcode); -} - -int sldns_wire2str_dname_buf(uint8_t* d, size_t dlen, char* s, size_t slen) -{ - /* use arguments as temporary variables */ - return sldns_wire2str_dname_scan(&d, &dlen, &s, &slen, NULL, 0); -} - -int sldns_str_vprint(char** str, size_t* slen, const char* format, va_list args) -{ - int w = vsnprintf(*str, *slen, format, args); - if(w < 0) { - /* error in printout */ - return 0; - } else if((size_t)w >= *slen) { - *str = NULL; /* we do not want str to point outside of buffer*/ - *slen = 0; - } else { - *str += w; - *slen -= w; - } - return w; -} - -int sldns_str_print(char** str, size_t* slen, const char* format, ...) -{ - int w; - va_list args; - va_start(args, format); - w = sldns_str_vprint(str, slen, format, args); - va_end(args); - return w; -} - -/** print hex format into text buffer for specified length */ -static int print_hex_buf(char** s, size_t* slen, uint8_t* buf, size_t len) -{ - const char* hex = "0123456789ABCDEF"; - size_t i; - for(i=0; i<len; i++) { - (void)sldns_str_print(s, slen, "%c%c", hex[(buf[i]&0xf0)>>4], - hex[buf[i]&0x0f]); - } - return (int)len*2; -} - -/** print remainder of buffer in hex format with prefixed text */ -static int print_remainder_hex(const char* pref, uint8_t** d, size_t* dlen, - char** s, size_t* slen) -{ - int w = 0; - w += sldns_str_print(s, slen, "%s", pref); - w += print_hex_buf(s, slen, *d, *dlen); - *d += *dlen; - *dlen = 0; - return w; -} - -int sldns_wire2str_pkt_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen) -{ - int w = 0; - unsigned qdcount, ancount, nscount, arcount, i; - uint8_t* pkt = *d; - size_t pktlen = *dlen; - if(*dlen >= LDNS_HEADER_SIZE) { - qdcount = (unsigned)LDNS_QDCOUNT(*d); - ancount = (unsigned)LDNS_ANCOUNT(*d); - nscount = (unsigned)LDNS_NSCOUNT(*d); - arcount = (unsigned)LDNS_ARCOUNT(*d); - } else { - qdcount = ancount = nscount = arcount = 0; - } - w += sldns_wire2str_header_scan(d, dlen, s, slen); - w += sldns_str_print(s, slen, "\n"); - w += sldns_str_print(s, slen, ";; QUESTION SECTION:\n"); - for(i=0; i<qdcount; i++) { - w += sldns_wire2str_rrquestion_scan(d, dlen, s, slen, - pkt, pktlen); - if(!*dlen) break; - } - w += sldns_str_print(s, slen, "\n"); - w += sldns_str_print(s, slen, ";; ANSWER SECTION:\n"); - for(i=0; i<ancount; i++) { - w += sldns_wire2str_rr_scan(d, dlen, s, slen, pkt, pktlen); - if(!*dlen) break; - } - w += sldns_str_print(s, slen, "\n"); - w += sldns_str_print(s, slen, ";; AUTHORITY SECTION:\n"); - for(i=0; i<nscount; i++) { - w += sldns_wire2str_rr_scan(d, dlen, s, slen, pkt, pktlen); - if(!*dlen) break; - } - w += sldns_str_print(s, slen, "\n"); - w += sldns_str_print(s, slen, ";; ADDITIONAL SECTION:\n"); - for(i=0; i<arcount; i++) { - w += sldns_wire2str_rr_scan(d, dlen, s, slen, pkt, pktlen); - if(!*dlen) break; - } - /* other fields: WHEN(time), SERVER(IP) not available here. */ - w += sldns_str_print(s, slen, ";; MSG SIZE rcvd: %d\n", (int)pktlen); - if(*dlen > 0) { - w += print_remainder_hex(";; trailing garbage 0x", - d, dlen, s, slen); - w += sldns_str_print(s, slen, "\n"); - } - return w; -} - -/** scan type, class and ttl and printout, for rr */ -static int sldns_rr_tcttl_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w = 0; - uint16_t t, c; - uint32_t ttl; - if(*dl < 8) { - if(*dl < 4) - return w + print_remainder_hex("; Error malformed 0x", - d, dl, s, sl); - /* these print values or 0x.. if none left */ - t = sldns_read_uint16(*d); - c = sldns_read_uint16((*d)+2); - (*d)+=4; - (*dl)-=4; - w += sldns_wire2str_class_print(s, sl, c); - w += sldns_str_print(s, sl, "\t"); - w += sldns_wire2str_type_print(s, sl, t); - if(*dl == 0) - return w + sldns_str_print(s, sl, "; Error no ttl"); - return w + print_remainder_hex( - "; Error malformed ttl 0x", d, dl, s, sl); - } - t = sldns_read_uint16(*d); - c = sldns_read_uint16((*d)+2); - ttl = sldns_read_uint32((*d)+4); - (*d)+=8; - (*dl)-=8; - w += sldns_str_print(s, sl, "%lu\t", (unsigned long)ttl); - w += sldns_wire2str_class_print(s, sl, c); - w += sldns_str_print(s, sl, "\t"); - w += sldns_wire2str_type_print(s, sl, t); - return w; -} - -int sldns_wire2str_rr_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen, - uint8_t* pkt, size_t pktlen) -{ - int w = 0; - uint8_t* rr = *d; - size_t rrlen = *dlen, dname_off, rdlen, ordlen; - uint16_t rrtype = 0; - - if(*dlen >= 3 && (*d)[0]==0 && - sldns_read_uint16((*d)+1)==LDNS_RR_TYPE_OPT) { - /* perform EDNS OPT processing */ - return sldns_wire2str_edns_scan(d, dlen, s, slen, pkt, pktlen); - } - - /* try to scan the rdata with pretty-printing, but if that fails, then - * scan the rdata as an unknown RR type */ - w += sldns_wire2str_dname_scan(d, dlen, s, slen, pkt, pktlen); - w += sldns_str_print(s, slen, "\t"); - dname_off = rrlen-(*dlen); - if(*dlen == 4) { - /* like a question-RR */ - uint16_t t = sldns_read_uint16(*d); - uint16_t c = sldns_read_uint16((*d)+2); - (*d)+=4; - (*dlen)-=4; - w += sldns_wire2str_class_print(s, slen, c); - w += sldns_str_print(s, slen, "\t"); - w += sldns_wire2str_type_print(s, slen, t); - w += sldns_str_print(s, slen, " ; Error no ttl,rdata\n"); - return w; - } - if(*dlen < 8) { - if(*dlen == 0) - return w + sldns_str_print(s, slen, ";Error missing RR\n"); - w += print_remainder_hex(";Error partial RR 0x", d, dlen, s, slen); - return w + sldns_str_print(s, slen, "\n"); - } - rrtype = sldns_read_uint16(*d); - w += sldns_rr_tcttl_scan(d, dlen, s, slen); - w += sldns_str_print(s, slen, "\t"); - - /* rdata */ - if(*dlen < 2) { - if(*dlen == 0) - return w + sldns_str_print(s, slen, ";Error missing rdatalen\n"); - w += print_remainder_hex(";Error missing rdatalen 0x", - d, dlen, s, slen); - return w + sldns_str_print(s, slen, "\n"); - } - rdlen = sldns_read_uint16(*d); - ordlen = rdlen; - (*d)+=2; - (*dlen)-=2; - if(*dlen < rdlen) { - w += sldns_str_print(s, slen, "\\# %u ", (unsigned)rdlen); - if(*dlen == 0) - return w + sldns_str_print(s, slen, ";Error missing rdata\n"); - w += print_remainder_hex(";Error partial rdata 0x", d, dlen, s, slen); - return w + sldns_str_print(s, slen, "\n"); - } - w += sldns_wire2str_rdata_scan(d, &rdlen, s, slen, rrtype, pkt, pktlen); - (*dlen) -= (ordlen-rdlen); - - /* default comment */ - w += sldns_wire2str_rr_comment_print(s, slen, rr, rrlen, dname_off, - rrtype); - w += sldns_str_print(s, slen, "\n"); - return w; -} - -int sldns_wire2str_rrquestion_scan(uint8_t** d, size_t* dlen, char** s, - size_t* slen, uint8_t* pkt, size_t pktlen) -{ - int w = 0; - uint16_t t, c; - w += sldns_wire2str_dname_scan(d, dlen, s, slen, pkt, pktlen); - w += sldns_str_print(s, slen, "\t"); - if(*dlen < 4) { - if(*dlen == 0) - return w + sldns_str_print(s, slen, "Error malformed\n"); - w += print_remainder_hex("Error malformed 0x", d, dlen, s, slen); - return w + sldns_str_print(s, slen, "\n"); - } - t = sldns_read_uint16(*d); - c = sldns_read_uint16((*d)+2); - (*d)+=4; - (*dlen)-=4; - w += sldns_wire2str_class_print(s, slen, c); - w += sldns_str_print(s, slen, "\t"); - w += sldns_wire2str_type_print(s, slen, t); - w += sldns_str_print(s, slen, "\n"); - return w; -} - -int sldns_wire2str_rr_unknown_scan(uint8_t** d, size_t* dlen, char** s, - size_t* slen, uint8_t* pkt, size_t pktlen) -{ - size_t rdlen, ordlen; - int w = 0; - w += sldns_wire2str_dname_scan(d, dlen, s, slen, pkt, pktlen); - w += sldns_str_print(s, slen, "\t"); - w += sldns_rr_tcttl_scan(d, dlen, s, slen); - w += sldns_str_print(s, slen, "\t"); - if(*dlen < 2) { - if(*dlen == 0) - return w + sldns_str_print(s, slen, ";Error missing rdatalen\n"); - w += print_remainder_hex(";Error missing rdatalen 0x", - d, dlen, s, slen); - return w + sldns_str_print(s, slen, "\n"); - } - rdlen = sldns_read_uint16(*d); - ordlen = rdlen; - (*d) += 2; - (*dlen) -= 2; - if(*dlen < rdlen) { - w += sldns_str_print(s, slen, "\\# %u ", (unsigned)rdlen); - if(*dlen == 0) - return w + sldns_str_print(s, slen, ";Error missing rdata\n"); - w += print_remainder_hex(";Error partial rdata 0x", d, dlen, s, slen); - return w + sldns_str_print(s, slen, "\n"); - } - w += sldns_wire2str_rdata_unknown_scan(d, &rdlen, s, slen); - (*dlen) -= (ordlen-rdlen); - w += sldns_str_print(s, slen, "\n"); - return w; -} - -/** print rr comment for type DNSKEY */ -static int rr_comment_dnskey(char** s, size_t* slen, uint8_t* rr, - size_t rrlen, size_t dname_off) -{ - size_t rdlen; - uint8_t* rdata; - int flags, w = 0; - if(rrlen < dname_off + 10) return 0; - rdlen = sldns_read_uint16(rr+dname_off+8); - if(rrlen < dname_off + 10 + rdlen) return 0; - rdata = rr + dname_off + 10; - flags = (int)sldns_read_uint16(rdata); - w += sldns_str_print(s, slen, " ;{"); - - /* id */ - w += sldns_str_print(s, slen, "id = %u", - sldns_calc_keytag_raw(rdata, rdlen)); - - /* flags */ - if((flags&LDNS_KEY_ZONE_KEY)) { - if((flags&LDNS_KEY_SEP_KEY)) - w += sldns_str_print(s, slen, " (ksk)"); - else w += sldns_str_print(s, slen, " (zsk)"); - } - - /* keysize */ - if(rdlen > 4) { - w += sldns_str_print(s, slen, ", "); - w += sldns_str_print(s, slen, "size = %db", - (int)sldns_rr_dnskey_key_size_raw( - (unsigned char*)rdata+4, rdlen-4, (int)(rdata[3]))); - } - - w += sldns_str_print(s, slen, "}"); - return w; -} - -/** print rr comment for type RRSIG */ -static int rr_comment_rrsig(char** s, size_t* slen, uint8_t* rr, - size_t rrlen, size_t dname_off) -{ - size_t rdlen; - uint8_t* rdata; - if(rrlen < dname_off + 10) return 0; - rdlen = sldns_read_uint16(rr+dname_off+8); - if(rrlen < dname_off + 10 + rdlen) return 0; - rdata = rr + dname_off + 10; - if(rdlen < 18) return 0; - return sldns_str_print(s, slen, " ;{id = %d}", - (int)sldns_read_uint16(rdata+16)); -} - -/** print rr comment for type NSEC3 */ -static int rr_comment_nsec3(char** s, size_t* slen, uint8_t* rr, - size_t rrlen, size_t dname_off) -{ - size_t rdlen; - uint8_t* rdata; - int w = 0; - if(rrlen < dname_off + 10) return 0; - rdlen = sldns_read_uint16(rr+dname_off+8); - if(rrlen < dname_off + 10 + rdlen) return 0; - rdata = rr + dname_off + 10; - if(rdlen < 2) return 0; - if((rdata[1] & LDNS_NSEC3_VARS_OPTOUT_MASK)) - w += sldns_str_print(s, slen, " ;{flags: optout}"); - return w; -} - -int sldns_wire2str_rr_comment_print(char** s, size_t* slen, uint8_t* rr, - size_t rrlen, size_t dname_off, uint16_t rrtype) -{ - if(rrtype == LDNS_RR_TYPE_DNSKEY) { - return rr_comment_dnskey(s, slen, rr, rrlen, dname_off); - } else if(rrtype == LDNS_RR_TYPE_RRSIG) { - return rr_comment_rrsig(s, slen, rr, rrlen, dname_off); - } else if(rrtype == LDNS_RR_TYPE_NSEC3) { - return rr_comment_nsec3(s, slen, rr, rrlen, dname_off); - } - return 0; -} - -int sldns_wire2str_header_scan(uint8_t** d, size_t* dlen, char** s, - size_t* slen) -{ - int w = 0; - int opcode, rcode; - w += sldns_str_print(s, slen, ";; ->>HEADER<<- "); - if(*dlen == 0) - return w+sldns_str_print(s, slen, "Error empty packet"); - if(*dlen < 4) - return w+print_remainder_hex("Error header too short 0x", d, dlen, s, slen); - opcode = (int)LDNS_OPCODE_WIRE(*d); - rcode = (int)LDNS_RCODE_WIRE(*d); - w += sldns_str_print(s, slen, "opcode: "); - w += sldns_wire2str_opcode_print(s, slen, opcode); - w += sldns_str_print(s, slen, ", "); - w += sldns_str_print(s, slen, "rcode: "); - w += sldns_wire2str_rcode_print(s, slen, rcode); - w += sldns_str_print(s, slen, ", "); - w += sldns_str_print(s, slen, "id: %d\n", (int)LDNS_ID_WIRE(*d)); - w += sldns_str_print(s, slen, ";; flags:"); - if(LDNS_QR_WIRE(*d)) w += sldns_str_print(s, slen, " qr"); - if(LDNS_AA_WIRE(*d)) w += sldns_str_print(s, slen, " aa"); - if(LDNS_TC_WIRE(*d)) w += sldns_str_print(s, slen, " tc"); - if(LDNS_RD_WIRE(*d)) w += sldns_str_print(s, slen, " rd"); - if(LDNS_CD_WIRE(*d)) w += sldns_str_print(s, slen, " cd"); - if(LDNS_RA_WIRE(*d)) w += sldns_str_print(s, slen, " ra"); - if(LDNS_AD_WIRE(*d)) w += sldns_str_print(s, slen, " ad"); - if(LDNS_Z_WIRE(*d)) w += sldns_str_print(s, slen, " z"); - w += sldns_str_print(s, slen, " ; "); - if(*dlen < LDNS_HEADER_SIZE) - return w+print_remainder_hex("Error header too short 0x", d, dlen, s, slen); - w += sldns_str_print(s, slen, "QUERY: %d, ", (int)LDNS_QDCOUNT(*d)); - w += sldns_str_print(s, slen, "ANSWER: %d, ", (int)LDNS_ANCOUNT(*d)); - w += sldns_str_print(s, slen, "AUTHORITY: %d, ", (int)LDNS_NSCOUNT(*d)); - w += sldns_str_print(s, slen, "ADDITIONAL: %d ", (int)LDNS_ARCOUNT(*d)); - *d += LDNS_HEADER_SIZE; - *dlen -= LDNS_HEADER_SIZE; - return w; -} - -int sldns_wire2str_rdata_scan(uint8_t** d, size_t* dlen, char** s, - size_t* slen, uint16_t rrtype, uint8_t* pkt, size_t pktlen) -{ - /* try to prettyprint, but if that fails, use unknown format */ - uint8_t* origd = *d; - char* origs = *s; - size_t origdlen = *dlen, origslen = *slen; - size_t r_cnt, r_max; - sldns_rdf_type rdftype; - int w = 0, n; - - const sldns_rr_descriptor *desc = sldns_rr_descript(rrtype); - if(!desc) /* unknown format */ - return sldns_wire2str_rdata_unknown_scan(d, dlen, s, slen); - /* dlen equals the rdatalen for the rdata */ - - r_max = sldns_rr_descriptor_maximum(desc); - for(r_cnt=0; r_cnt < r_max; r_cnt++) { - if(*dlen == 0) { - if(r_cnt < sldns_rr_descriptor_minimum(desc)) - goto failed; - break; /* nothing more to print */ - } - rdftype = sldns_rr_descriptor_field_type(desc, r_cnt); - if(r_cnt != 0) - w += sldns_str_print(s, slen, " "); - n = sldns_wire2str_rdf_scan(d, dlen, s, slen, rdftype, - pkt, pktlen); - if(n == -1) { - failed: - /* failed, use unknown format */ - *d = origd; *s = origs; - *dlen = origdlen; *slen = origslen; - return sldns_wire2str_rdata_unknown_scan(d, dlen, - s, slen); - } - w += n; - } - if(*dlen != 0) { - goto failed; - } - return w; -} - -int sldns_wire2str_rdata_unknown_scan(uint8_t** d, size_t* dlen, char** s, - size_t* slen) -{ - int w = 0; - - /* print length */ - w += sldns_str_print(s, slen, "\\# %u", (unsigned)*dlen); - - /* print rdlen in hex */ - if(*dlen != 0) - w += sldns_str_print(s, slen, " "); - w += print_hex_buf(s, slen, *d, *dlen); - (*d) += *dlen; - (*dlen) = 0; - return w; -} - -/** print and escape one character for a domain dname */ -static int dname_char_print(char** s, size_t* slen, uint8_t c) -{ - if(c == '.' || c == ';' || c == '(' || c == ')' || c == '\\') - return sldns_str_print(s, slen, "\\%c", c); - else if(!(isascii((unsigned char)c) && isgraph((unsigned char)c))) - return sldns_str_print(s, slen, "\\%03u", (unsigned)c); - /* plain printout */ - if(*slen) { - **s = (char)c; - (*s)++; - (*slen)--; - } - return 1; -} - -int sldns_wire2str_dname_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen, - uint8_t* pkt, size_t pktlen) -{ - int w = 0; - /* spool labels onto the string, use compression if its there */ - uint8_t* pos = *d; - unsigned i, counter=0; - const unsigned maxcompr = 1000; /* loop detection, max compr ptrs */ - int in_buf = 1; - if(*dlen == 0) return sldns_str_print(s, slen, "ErrorMissingDname"); - if(*pos == 0) { - (*d)++; - (*dlen)--; - return sldns_str_print(s, slen, "."); - } - while(*pos) { - /* read label length */ - uint8_t labellen = *pos++; - if(in_buf) { (*d)++; (*dlen)--; } - - /* find out what sort of label we have */ - if((labellen&0xc0) == 0xc0) { - /* compressed */ - uint16_t target = 0; - if(in_buf && *dlen == 0) - return w + sldns_str_print(s, slen, - "ErrorPartialDname"); - else if(!in_buf && pos+1 > pkt+pktlen) - return w + sldns_str_print(s, slen, - "ErrorPartialDname"); - target = ((labellen&0x3f)<<8) | *pos; - if(in_buf) { (*d)++; (*dlen)--; } - /* move to target, if possible */ - if(!pkt || target >= pktlen) - return w + sldns_str_print(s, slen, - "ErrorComprPtrOutOfBounds"); - if(counter++ > maxcompr) - return w + sldns_str_print(s, slen, - "ErrorComprPtrLooped"); - in_buf = 0; - pos = pkt+target; - continue; - } else if((labellen&0xc0)) { - /* notimpl label type */ - w += sldns_str_print(s, slen, - "ErrorLABELTYPE%xIsUnknown", - (int)(labellen&0xc0)); - return w; - } - - /* spool label characters, end with '.' */ - if(in_buf && *dlen < (size_t)labellen) - labellen = (uint8_t)*dlen; - else if(!in_buf && pos+(size_t)labellen > pkt+pktlen) - labellen = (uint8_t)(pkt + pktlen - pos); - for(i=0; i<(unsigned)labellen; i++) { - w += dname_char_print(s, slen, *pos++); - } - if(in_buf) { - (*d) += labellen; - (*dlen) -= labellen; - if(*dlen == 0) break; - } - w += sldns_str_print(s, slen, "."); - } - /* skip over final root label */ - if(in_buf && *dlen > 0) { (*d)++; (*dlen)--; } - /* in case we printed no labels, terminate dname */ - if(w == 0) w += sldns_str_print(s, slen, "."); - return w; -} - -int sldns_wire2str_opcode_print(char** s, size_t* slen, int opcode) -{ - sldns_lookup_table *lt = sldns_lookup_by_id(sldns_opcodes, opcode); - if (lt && lt->name) { - return sldns_str_print(s, slen, "%s", lt->name); - } - return sldns_str_print(s, slen, "OPCODE%u", (unsigned)opcode); -} - -int sldns_wire2str_rcode_print(char** s, size_t* slen, int rcode) -{ - sldns_lookup_table *lt = sldns_lookup_by_id(sldns_rcodes, rcode); - if (lt && lt->name) { - return sldns_str_print(s, slen, "%s", lt->name); - } - return sldns_str_print(s, slen, "RCODE%u", (unsigned)rcode); -} - -int sldns_wire2str_class_print(char** s, size_t* slen, uint16_t rrclass) -{ - sldns_lookup_table *lt = sldns_lookup_by_id(sldns_rr_classes, - (int)rrclass); - if (lt && lt->name) { - return sldns_str_print(s, slen, "%s", lt->name); - } - return sldns_str_print(s, slen, "CLASS%u", (unsigned)rrclass); -} - -int sldns_wire2str_type_print(char** s, size_t* slen, uint16_t rrtype) -{ - const sldns_rr_descriptor *descriptor = sldns_rr_descript(rrtype); - if (descriptor && descriptor->_name) { - return sldns_str_print(s, slen, "%s", descriptor->_name); - } - return sldns_str_print(s, slen, "TYPE%u", (unsigned)rrtype); -} - -int sldns_wire2str_edns_option_code_print(char** s, size_t* slen, - uint16_t opcode) -{ - sldns_lookup_table *lt = sldns_lookup_by_id(sldns_edns_options, - (int)opcode); - if (lt && lt->name) { - return sldns_str_print(s, slen, "%s", lt->name); - } - return sldns_str_print(s, slen, "OPT%u", (unsigned)opcode); -} - -int sldns_wire2str_class_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen) -{ - uint16_t c; - if(*dlen == 0) return 0; - if(*dlen < 2) return print_remainder_hex("Error malformed 0x", d, dlen, s, slen); - c = sldns_read_uint16(*d); - (*d)+=2; - (*dlen)-=2; - return sldns_wire2str_class_print(s, slen, c); -} - -int sldns_wire2str_type_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen) -{ - uint16_t t; - if(*dlen == 0) return 0; - if(*dlen < 2) return print_remainder_hex("Error malformed 0x", d, dlen, s, slen); - t = sldns_read_uint16(*d); - (*d)+=2; - (*dlen)-=2; - return sldns_wire2str_type_print(s, slen, t); -} - -int sldns_wire2str_ttl_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen) -{ - uint32_t ttl; - if(*dlen == 0) return 0; - if(*dlen < 4) return print_remainder_hex("Error malformed 0x", d, dlen, s, slen); - ttl = sldns_read_uint32(*d); - (*d)+=4; - (*dlen)-=4; - return sldns_str_print(s, slen, "%u", (unsigned)ttl); -} - -int sldns_wire2str_rdf_scan(uint8_t** d, size_t* dlen, char** s, size_t* slen, - int rdftype, uint8_t* pkt, size_t pktlen) -{ - if(*dlen == 0) return 0; - switch(rdftype) { - case LDNS_RDF_TYPE_NONE: - return 0; - case LDNS_RDF_TYPE_DNAME: - return sldns_wire2str_dname_scan(d, dlen, s, slen, pkt, pktlen); - case LDNS_RDF_TYPE_INT8: - return sldns_wire2str_int8_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_INT16: - return sldns_wire2str_int16_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_INT32: - return sldns_wire2str_int32_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_PERIOD: - return sldns_wire2str_period_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_TSIGTIME: - return sldns_wire2str_tsigtime_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_A: - return sldns_wire2str_a_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_AAAA: - return sldns_wire2str_aaaa_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_STR: - return sldns_wire2str_str_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_APL: - return sldns_wire2str_apl_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_B32_EXT: - return sldns_wire2str_b32_ext_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_B64: - return sldns_wire2str_b64_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_HEX: - return sldns_wire2str_hex_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_NSEC: - return sldns_wire2str_nsec_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_NSEC3_SALT: - return sldns_wire2str_nsec3_salt_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_TYPE: - return sldns_wire2str_type_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_CLASS: - return sldns_wire2str_class_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_CERT_ALG: - return sldns_wire2str_cert_alg_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_ALG: - return sldns_wire2str_alg_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_UNKNOWN: - return sldns_wire2str_unknown_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_TIME: - return sldns_wire2str_time_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_LOC: - return sldns_wire2str_loc_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_WKS: - case LDNS_RDF_TYPE_SERVICE: - return sldns_wire2str_wks_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_NSAP: - return sldns_wire2str_nsap_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_ATMA: - return sldns_wire2str_atma_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_IPSECKEY: - return sldns_wire2str_ipseckey_scan(d, dlen, s, slen, pkt, - pktlen); - case LDNS_RDF_TYPE_HIP: - return sldns_wire2str_hip_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_INT16_DATA: - return sldns_wire2str_int16_data_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER: - return sldns_wire2str_b32_ext_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_ILNP64: - return sldns_wire2str_ilnp64_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_EUI48: - return sldns_wire2str_eui48_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_EUI64: - return sldns_wire2str_eui64_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_TAG: - return sldns_wire2str_tag_scan(d, dlen, s, slen); - case LDNS_RDF_TYPE_LONG_STR: - return sldns_wire2str_long_str_scan(d, dlen, s, slen); - } - /* unknown rdf type */ - return -1; -} - -int sldns_wire2str_int8_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 1) return -1; - w = sldns_str_print(s, sl, "%u", (unsigned)**d); - (*d)++; - (*dl)--; - return w; -} - -int sldns_wire2str_int16_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 2) return -1; - w = sldns_str_print(s, sl, "%lu", (unsigned long)sldns_read_uint16(*d)); - (*d)+=2; - (*dl)-=2; - return w; -} - -int sldns_wire2str_int32_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 4) return -1; - w = sldns_str_print(s, sl, "%lu", (unsigned long)sldns_read_uint32(*d)); - (*d)+=4; - (*dl)-=4; - return w; -} - -int sldns_wire2str_period_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 4) return -1; - w = sldns_str_print(s, sl, "%u", (unsigned)sldns_read_uint32(*d)); - (*d)+=4; - (*dl)-=4; - return w; -} - -int sldns_wire2str_tsigtime_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - /* tsigtime is 48 bits network order unsigned integer */ - int w; - uint64_t tsigtime = 0; - uint64_t d0, d1, d2, d3, d4, d5; - if(*dl < 6) return -1; - d0 = (*d)[0]; /* cast to uint64 for shift operations */ - d1 = (*d)[1]; - d2 = (*d)[2]; - d3 = (*d)[3]; - d4 = (*d)[4]; - d5 = (*d)[5]; - tsigtime = (d0<<40) | (d1<<32) | (d2<<24) | (d3<<16) | (d4<<8) | d5; -#ifndef USE_WINSOCK - w = sldns_str_print(s, sl, "%llu", (long long)tsigtime); -#else - w = sldns_str_print(s, sl, "%I64u", (long long)tsigtime); -#endif - (*d)+=6; - (*dl)-=6; - return w; -} - -int sldns_wire2str_a_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - char buf[32]; - int w; - if(*dl < 4) return -1; - if(!inet_ntop(AF_INET, *d, buf, (socklen_t)sizeof(buf))) - return -1; - w = sldns_str_print(s, sl, "%s", buf); - (*d)+=4; - (*dl)-=4; - return w; -} - -int sldns_wire2str_aaaa_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ -#ifdef AF_INET6 - char buf[64]; - int w; - if(*dl < 16) return -1; - if(!inet_ntop(AF_INET6, *d, buf, (socklen_t)sizeof(buf))) - return -1; - w = sldns_str_print(s, sl, "%s", buf); - (*d)+=16; - (*dl)-=16; - return w; -#else - return -1; -#endif -} - -/** printout escaped TYPE_STR character */ -static int str_char_print(char** s, size_t* sl, uint8_t c) -{ - if(isprint((unsigned char)c) || c == '\t') { - if(c == '\"' || c == '\\') - return sldns_str_print(s, sl, "\\%c", c); - if(*sl) { - **s = (char)c; - (*s)++; - (*sl)--; - } - return 1; - } - return sldns_str_print(s, sl, "\\%03u", (unsigned)c); -} - -int sldns_wire2str_str_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w = 0; - size_t i, len; - if(*dl < 1) return -1; - len = **d; - if(*dl < 1+len) return -1; - (*d)++; - (*dl)--; - w += sldns_str_print(s, sl, "\""); - for(i=0; i<len; i++) - w += str_char_print(s, sl, (*d)[i]); - w += sldns_str_print(s, sl, "\""); - (*d)+=len; - (*dl)-=len; - return w; -} - -int sldns_wire2str_apl_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int i, w = 0; - uint16_t family; - uint8_t negation, prefix, adflength; - if(*dl < 4) return -1; - family = sldns_read_uint16(*d); - prefix = (*d)[2]; - negation = ((*d)[3] & LDNS_APL_NEGATION); - adflength = ((*d)[3] & LDNS_APL_MASK); - if(*dl < 4+(size_t)adflength) return -1; - if(family != LDNS_APL_IP4 && family != LDNS_APL_IP6) - return -1; /* unknown address family */ - if(negation) - w += sldns_str_print(s, sl, "!"); - w += sldns_str_print(s, sl, "%u:", (unsigned)family); - if(family == LDNS_APL_IP4) { - /* check if prefix <32 ? */ - /* address is variable length 0 - 4 */ - for(i=0; i<4; i++) { - if(i > 0) - w += sldns_str_print(s, sl, "."); - if(i < (int)adflength) - w += sldns_str_print(s, sl, "%d", (*d)[4+i]); - else w += sldns_str_print(s, sl, "0"); - } - } else if(family == LDNS_APL_IP6) { - /* check if prefix <128 ? */ - /* address is variable length 0 - 16 */ - for(i=0; i<16; i++) { - if(i%2 == 0 && i>0) - w += sldns_str_print(s, sl, ":"); - if(i < (int)adflength) - w += sldns_str_print(s, sl, "%02x", (*d)[4+i]); - else w += sldns_str_print(s, sl, "00"); - } - } - w += sldns_str_print(s, sl, "/%u", (unsigned)prefix); - (*d) += 4+adflength; - (*dl) -= 4+adflength; - return w; -} - -int sldns_wire2str_b32_ext_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - size_t datalen; - size_t sz; - if(*dl < 1) return -1; - datalen = (*d)[0]; - if(*dl < 1+datalen) return -1; - sz = sldns_b32_ntop_calculate_size(datalen); - if(*sl < sz+1) { - (*d) += datalen+1; - (*dl) -= (datalen+1); - return (int)sz; /* out of space really, but would need buffer - in order to truncate the output */ - } - sldns_b32_ntop_extended_hex((*d)+1, datalen, *s, *sl); - (*d) += datalen+1; - (*dl) -= (datalen+1); - (*s) += sz; - (*sl) -= sz; - return (int)sz; -} - -/** scan number of bytes from wire into b64 presentation format */ -static int sldns_wire2str_b64_scan_num(uint8_t** d, size_t* dl, char** s, - size_t* sl, size_t num) -{ - /* b64_ntop_calculate size includes null at the end */ - size_t sz = sldns_b64_ntop_calculate_size(num)-1; - if(*sl < sz+1) { - (*d) += num; - (*dl) -= num; - return (int)sz; /* out of space really, but would need buffer - in order to truncate the output */ - } - sldns_b64_ntop(*d, num, *s, *sl); - (*d) += num; - (*dl) -= num; - (*s) += sz; - (*sl) -= sz; - return (int)sz; -} - -int sldns_wire2str_b64_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - return sldns_wire2str_b64_scan_num(d, dl, s, sl, *dl); -} - -int sldns_wire2str_hex_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - return print_remainder_hex("", d, dl, s, sl); -} - -int sldns_wire2str_nsec_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - uint8_t* p = *d; - size_t pl = *dl; - unsigned i, bit, window, block_len; - uint16_t t; - int w = 0; - - /* check for errors */ - while(pl) { - if(pl < 2) return -1; - block_len = (unsigned)p[1]; - if(pl < 2+block_len) return -1; - p += block_len+2; - pl -= block_len+2; - } - - /* do it */ - p = *d; - pl = *dl; - while(pl) { - if(pl < 2) return -1; /* cannot happen */ - window = (unsigned)p[0]; - block_len = (unsigned)p[1]; - if(pl < 2+block_len) return -1; /* cannot happen */ - p += 2; - for(i=0; i<block_len; i++) { - if(p[i] == 0) continue; - /* base type number for this octet */ - t = ((window)<<8) | (i << 3); - for(bit=0; bit<8; bit++) { - if((p[i]&(0x80>>bit))) { - if(w) w += sldns_str_print(s, sl, " "); - w += sldns_wire2str_type_print(s, sl, - t+bit); - } - } - } - p += block_len; - pl -= block_len+2; - } - (*d) += *dl; - (*dl) = 0; - return w; -} - -int sldns_wire2str_nsec3_salt_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - size_t salt_len; - int w; - if(*dl < 1) return -1; - salt_len = (size_t)(*d)[0]; - if(*dl < 1+salt_len) return -1; - (*d)++; - (*dl)--; - if(salt_len == 0) { - return sldns_str_print(s, sl, "-"); - } - w = print_hex_buf(s, sl, *d, salt_len); - (*dl)-=salt_len; - (*d)+=salt_len; - return w; -} - -int sldns_wire2str_cert_alg_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - sldns_lookup_table *lt; - int data, w; - if(*dl < 2) return -1; - data = (int)sldns_read_uint16(*d); - lt = sldns_lookup_by_id(sldns_cert_algorithms, data); - if(lt && lt->name) - w = sldns_str_print(s, sl, "%s", lt->name); - else w = sldns_str_print(s, sl, "%d", data); - (*dl)-=2; - (*d)+=2; - return w; -} - -int sldns_wire2str_alg_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - /* don't use algorithm mnemonics in the presentation format - * this kind of got sneaked into the rfc's */ - return sldns_wire2str_int8_scan(d, dl, s, sl); -} - -int sldns_wire2str_unknown_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - return sldns_wire2str_rdata_unknown_scan(d, dl, s, sl); -} - -int sldns_wire2str_time_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - /* create a YYYYMMDDHHMMSS string if possible */ - struct tm tm; - char date_buf[16]; - uint32_t t; - memset(&tm, 0, sizeof(tm)); - if(*dl < 4) return -1; - t = sldns_read_uint32(*d); - date_buf[15]=0; - if(sldns_serial_arithmitics_gmtime_r(t, time(NULL), &tm) && - strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) { - (*d) += 4; - (*dl) -= 4; - return sldns_str_print(s, sl, "%s", date_buf); - } - return -1; -} - -static int -loc_cm_print(char** str, size_t* sl, uint8_t mantissa, uint8_t exponent) -{ - int w = 0; - uint8_t i; - /* is it 0.<two digits> ? */ - if(exponent < 2) { - if(exponent == 1) - mantissa *= 10; - return sldns_str_print(str, sl, "0.%02ld", (long)mantissa); - } - /* always <digit><string of zeros> */ - w += sldns_str_print(str, sl, "%d", (int)mantissa); - for(i=0; i<exponent-2; i++) - w += sldns_str_print(str, sl, "0"); - return w; -} - -int sldns_wire2str_loc_scan(uint8_t** d, size_t* dl, char** str, size_t* sl) -{ - /* we could do checking (ie degrees < 90 etc)? */ - uint8_t version; - uint8_t size; - uint8_t horizontal_precision; - uint8_t vertical_precision; - uint32_t longitude; - uint32_t latitude; - uint32_t altitude; - char northerness; - char easterness; - uint32_t h; - uint32_t m; - double s; - uint32_t equator = (uint32_t)1 << 31; /* 2**31 */ - int w = 0; - - if(*dl < 16) return -1; - version = (*d)[0]; - if(version != 0) - return sldns_wire2str_hex_scan(d, dl, str, sl); - size = (*d)[1]; - horizontal_precision = (*d)[2]; - vertical_precision = (*d)[3]; - - latitude = sldns_read_uint32((*d)+4); - longitude = sldns_read_uint32((*d)+8); - altitude = sldns_read_uint32((*d)+12); - - if (latitude > equator) { - northerness = 'N'; - latitude = latitude - equator; - } else { - northerness = 'S'; - latitude = equator - latitude; - } - h = latitude / (1000 * 60 * 60); - latitude = latitude % (1000 * 60 * 60); - m = latitude / (1000 * 60); - latitude = latitude % (1000 * 60); - s = (double) latitude / 1000.0; - w += sldns_str_print(str, sl, "%02u %02u %06.3f %c ", - h, m, s, northerness); - - if (longitude > equator) { - easterness = 'E'; - longitude = longitude - equator; - } else { - easterness = 'W'; - longitude = equator - longitude; - } - h = longitude / (1000 * 60 * 60); - longitude = longitude % (1000 * 60 * 60); - m = longitude / (1000 * 60); - longitude = longitude % (1000 * 60); - s = (double) longitude / (1000.0); - w += sldns_str_print(str, sl, "%02u %02u %06.3f %c ", - h, m, s, easterness); - - s = ((double) altitude) / 100; - s -= 100000; - - if(altitude%100 != 0) - w += sldns_str_print(str, sl, "%.2f", s); - else - w += sldns_str_print(str, sl, "%.0f", s); - - w += sldns_str_print(str, sl, "m "); - - w += loc_cm_print(str, sl, (size & 0xf0) >> 4, size & 0x0f); - w += sldns_str_print(str, sl, "m "); - - w += loc_cm_print(str, sl, (horizontal_precision & 0xf0) >> 4, - horizontal_precision & 0x0f); - w += sldns_str_print(str, sl, "m "); - - w += loc_cm_print(str, sl, (vertical_precision & 0xf0) >> 4, - vertical_precision & 0x0f); - w += sldns_str_print(str, sl, "m"); - - (*d)+=16; - (*dl)-=16; - return w; -} - -int sldns_wire2str_wks_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - /* protocol, followed by bitmap of services */ - const char* proto_name = NULL; - struct protoent *protocol; - struct servent *service; - uint8_t protocol_nr; - int bit, port, w = 0; - size_t i; - /* we cannot print with strings because they - * are not portable, the presentation format may - * not be able to be read in on another computer. */ - int print_symbols = 0; - - /* protocol */ - if(*dl < 1) return -1; - protocol_nr = (*d)[0]; - (*d)++; - (*dl)--; - protocol = getprotobynumber((int)protocol_nr); - if(protocol && (protocol->p_name != NULL)) { - w += sldns_str_print(s, sl, "%s", protocol->p_name); - proto_name = protocol->p_name; - } else { - w += sldns_str_print(s, sl, "%u", (unsigned)protocol_nr); - } - - for(i=0; i<*dl; i++) { - if((*d)[i] == 0) - continue; - for(bit=0; bit<8; bit++) { - if(!(((*d)[i])&(0x80>>bit))) - continue; - port = (int)i*8 + bit; - - if(!print_symbols) - service = NULL; - else - service = getservbyport( - (int)htons((uint16_t)port), proto_name); - if(service && service->s_name) - w += sldns_str_print(s, sl, " %s", - service->s_name); - else w += sldns_str_print(s, sl, " %u", - (unsigned)port); - } - } - -#ifdef HAVE_ENDSERVENT - endservent(); -#endif -#ifdef HAVE_ENDPROTOENT - endprotoent(); -#endif - (*d) += *dl; - (*dl) = 0; - return w; -} - -int sldns_wire2str_nsap_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - return print_remainder_hex("0x", d, dl, s, sl); -} - -int sldns_wire2str_atma_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - return print_remainder_hex("", d, dl, s, sl); -} - -/* internal scan routine that can modify arguments on failure */ -static int sldns_wire2str_ipseckey_scan_internal(uint8_t** d, size_t* dl, - char** s, size_t* sl, uint8_t* pkt, size_t pktlen) -{ - /* http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt*/ - uint8_t precedence, gateway_type, algorithm; - int w = 0; - - if(*dl < 3) return -1; - precedence = (*d)[0]; - gateway_type = (*d)[1]; - algorithm = (*d)[2]; - if(gateway_type > 3) - return -1; /* unknown */ - (*d)+=3; - (*dl)-=3; - w += sldns_str_print(s, sl, "%d %d %d ", - (int)precedence, (int)gateway_type, (int)algorithm); - - switch(gateway_type) { - case 0: /* no gateway */ - w += sldns_str_print(s, sl, "."); - break; - case 1: /* ip4 */ - w += sldns_wire2str_a_scan(d, dl, s, sl); - break; - case 2: /* ip6 */ - w += sldns_wire2str_aaaa_scan(d, dl, s, sl); - break; - case 3: /* dname */ - w += sldns_wire2str_dname_scan(d, dl, s, sl, pkt, pktlen); - break; - default: /* unknown */ - return -1; - } - - if(*dl < 1) - return -1; - w += sldns_str_print(s, sl, " "); - w += sldns_wire2str_b64_scan_num(d, dl, s, sl, *dl); - return w; -} - -int sldns_wire2str_ipseckey_scan(uint8_t** d, size_t* dl, char** s, size_t* sl, - uint8_t* pkt, size_t pktlen) -{ - uint8_t* od = *d; - char* os = *s; - size_t odl = *dl, osl = *sl; - int w=sldns_wire2str_ipseckey_scan_internal(d, dl, s, sl, pkt, pktlen); - if(w == -1) { - *d = od; - *s = os; - *dl = odl; - *sl = osl; - return -1; - } - return w; -} - -int sldns_wire2str_hip_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - uint8_t algo, hitlen; - uint16_t pklen; - - /* read lengths */ - if(*dl < 4) - return -1; - hitlen = (*d)[0]; - algo = (*d)[1]; - pklen = sldns_read_uint16((*d)+2); - if(*dl < (size_t)4 + (size_t)hitlen + (size_t)pklen) - return -1; - - /* write: algo hit pubkey */ - w = sldns_str_print(s, sl, "%u ", (unsigned)algo); - w += print_hex_buf(s, sl, (*d)+4, hitlen); - w += sldns_str_print(s, sl, " "); - (*d)+=4+hitlen; - (*dl)-= (4+hitlen); - w += sldns_wire2str_b64_scan_num(d, dl, s, sl, pklen); - return w; -} - -int sldns_wire2str_int16_data_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - uint16_t n; - if(*dl < 2) - return -1; - n = sldns_read_uint16(*d); - if(*dl < 2+(size_t)n) - return -1; - (*d)+=2; - (*dl)-=2; - return sldns_wire2str_b64_scan_num(d, dl, s, sl, n); -} - -int sldns_wire2str_nsec3_next_owner_scan(uint8_t** d, size_t* dl, char** s, - size_t* sl) -{ - return sldns_wire2str_b32_ext_scan(d, dl, s, sl); -} - -int sldns_wire2str_ilnp64_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 8) - return -1; - w = sldns_str_print(s, sl, "%.4x:%.4x:%.4x:%.4x", - sldns_read_uint16(*d), sldns_read_uint16((*d)+2), - sldns_read_uint16((*d)+4), sldns_read_uint16((*d)+6)); - (*d)+=8; - (*dl)-=8; - return w; -} - -int sldns_wire2str_eui48_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 6) - return -1; - w = sldns_str_print(s, sl, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", - (*d)[0], (*d)[1], (*d)[2], (*d)[3], (*d)[4], (*d)[5]); - (*d)+=6; - (*dl)-=6; - return w; -} - -int sldns_wire2str_eui64_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - int w; - if(*dl < 8) - return -1; - w = sldns_str_print(s, sl, "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x", - (*d)[0], (*d)[1], (*d)[2], (*d)[3], (*d)[4], (*d)[5], - (*d)[6], (*d)[7]); - (*d)+=8; - (*dl)-=8; - return w; -} - -int sldns_wire2str_tag_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - size_t i, n; - int w = 0; - if(*dl < 1) - return -1; - n = (size_t)((*d)[0]); - if(*dl < 1+n) - return -1; - for(i=0; i<n; i++) - if(!isalnum((unsigned char)(*d)[i])) - return -1; - for(i=0; i<n; i++) - w += sldns_str_print(s, sl, "%c", (char)(*d)[i]); - (*d)+=n+1; - (*dl)-=(n+1); - return w; -} - -int sldns_wire2str_long_str_scan(uint8_t** d, size_t* dl, char** s, size_t* sl) -{ - size_t i; - int w = 0; - w += sldns_str_print(s, sl, "\""); - for(i=0; i<*dl; i++) - w += str_char_print(s, sl, (*d)[i]); - w += sldns_str_print(s, sl, "\""); - (*d)+=*dl; - (*dl)=0; - return w; -} - -int sldns_wire2str_edns_llq_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - /* LLQ constants */ - const char* llq_errors[] = {"NO-ERROR", "SERV-FULL", "STATIC", - "FORMAT-ERR", "NO-SUCH-LLQ", "BAD-VERS", "UNKNOWN_ERR"}; - const unsigned int llq_errors_num = 7; - const char* llq_opcodes[] = {"LLQ-SETUP", "LLQ-REFRESH", "LLQ-EVENT"}; - const unsigned int llq_opcodes_num = 3; - uint16_t version, llq_opcode, error_code; - uint64_t llq_id; - uint32_t lease_life; /* Requested or granted life of LLQ, in seconds */ - int w = 0; - - /* read the record */ - if(len != 18) { - w += sldns_str_print(s, sl, "malformed LLQ "); - w += print_hex_buf(s, sl, data, len); - return w; - } - version = sldns_read_uint16(data); - llq_opcode = sldns_read_uint16(data+2); - error_code = sldns_read_uint16(data+4); - memmove(&llq_id, data+6, sizeof(llq_id)); - lease_life = sldns_read_uint32(data+14); - - /* print it */ - w += sldns_str_print(s, sl, "v%d ", (int)version); - if(llq_opcode < llq_opcodes_num) - w += sldns_str_print(s, sl, "%s", llq_opcodes[llq_opcode]); - else w += sldns_str_print(s, sl, "opcode %d", (int)llq_opcode); - if(error_code < llq_errors_num) - w += sldns_str_print(s, sl, " %s", llq_errors[error_code]); - else w += sldns_str_print(s, sl, " error %d", (int)error_code); -#ifndef USE_WINSOCK - w += sldns_str_print(s, sl, " id %llx lease-life %lu", - (unsigned long long)llq_id, (unsigned long)lease_life); -#else - w += sldns_str_print(s, sl, " id %I64x lease-life %lu", - (unsigned long long)llq_id, (unsigned long)lease_life); -#endif - return w; -} - -int sldns_wire2str_edns_ul_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - uint32_t lease; - int w = 0; - if(len != 4) { - w += sldns_str_print(s, sl, "malformed UL "); - w += print_hex_buf(s, sl, data, len); - return w; - } - lease = sldns_read_uint32(data); - w += sldns_str_print(s, sl, "lease %lu", (unsigned long)lease); - return w; -} - -int sldns_wire2str_edns_nsid_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - int w = 0; - size_t i, printed=0; - w += print_hex_buf(s, sl, data, len); - for(i=0; i<len; i++) { - if(isprint((unsigned char)data[i]) || data[i] == '\t') { - if(!printed) { - w += sldns_str_print(s, sl, " ("); - printed = 1; - } - w += sldns_str_print(s, sl, "%c", (char)data[i]); - } - } - if(printed) - w += sldns_str_print(s, sl, ")"); - return w; -} - -int sldns_wire2str_edns_dau_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - sldns_lookup_table *lt; - size_t i; - int w = 0; - for(i=0; i<len; i++) { - lt = sldns_lookup_by_id(sldns_algorithms, (int)data[i]); - if(lt && lt->name) - w += sldns_str_print(s, sl, " %s", lt->name); - else w += sldns_str_print(s, sl, " %d", (int)data[i]); - } - return w; -} - -int sldns_wire2str_edns_dhu_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - sldns_lookup_table *lt; - size_t i; - int w = 0; - for(i=0; i<len; i++) { - lt = sldns_lookup_by_id(sldns_hashes, (int)data[i]); - if(lt && lt->name) - w += sldns_str_print(s, sl, " %s", lt->name); - else w += sldns_str_print(s, sl, " %d", (int)data[i]); - } - return w; -} - -int sldns_wire2str_edns_n3u_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - size_t i; - int w = 0; - for(i=0; i<len; i++) { - if(data[i] == 1) - w += sldns_str_print(s, sl, " SHA1"); - else w += sldns_str_print(s, sl, " %d", (int)data[i]); - } - return w; -} - -int sldns_wire2str_edns_subnet_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - int w = 0; - uint16_t family; - uint8_t source, scope; - if(len < 4) { - w += sldns_str_print(s, sl, "malformed subnet "); - w += print_hex_buf(s, sl, data, len); - return w; - } - family = sldns_read_uint16(data); - source = data[2]; - scope = data[3]; - if(family == 1) { - /* IP4 */ - char buf[64]; - uint8_t ip4[4]; - memset(ip4, 0, sizeof(ip4)); - if(len-4 > 4) { - w += sldns_str_print(s, sl, "trailingdata:"); - w += print_hex_buf(s, sl, data+4+4, len-4-4); - w += sldns_str_print(s, sl, " "); - len = 4+4; - } - memmove(ip4, data+4, len-4); - if(!inet_ntop(AF_INET, ip4, buf, (socklen_t)sizeof(buf))) { - w += sldns_str_print(s, sl, "ip4ntoperror "); - w += print_hex_buf(s, sl, data+4+4, len-4-4); - } else { - w += sldns_str_print(s, sl, "%s", buf); - } - } else if(family == 2) { - /* IP6 */ - char buf[64]; - uint8_t ip6[16]; - memset(ip6, 0, sizeof(ip6)); - if(len-4 > 16) { - w += sldns_str_print(s, sl, "trailingdata:"); - w += print_hex_buf(s, sl, data+4+16, len-4-16); - w += sldns_str_print(s, sl, " "); - len = 4+16; - } - memmove(ip6, data+4, len-4); -#ifdef AF_INET6 - if(!inet_ntop(AF_INET6, ip6, buf, (socklen_t)sizeof(buf))) { - w += sldns_str_print(s, sl, "ip6ntoperror "); - w += print_hex_buf(s, sl, data+4+4, len-4-4); - } else { - w += sldns_str_print(s, sl, "%s", buf); - } -#else - w += print_hex_buf(s, sl, data+4+4, len-4-4); -#endif - } else { - /* unknown */ - w += sldns_str_print(s, sl, "family %d ", - (int)family); - w += print_hex_buf(s, sl, data, len); - } - w += sldns_str_print(s, sl, "/%d scope /%d", (int)source, (int)scope); - return w; -} - -int sldns_wire2str_edns_keepalive_print(char** s, size_t* sl, uint8_t* data, - size_t len) -{ - int w = 0; - uint16_t timeout; - if(!(len == 0 || len == 2)) { - w += sldns_str_print(s, sl, "malformed keepalive "); - w += print_hex_buf(s, sl, data, len); - return w; - } - if(len == 0 ) { - w += sldns_str_print(s, sl, "no timeout value (only valid for client option) "); - } else { - timeout = sldns_read_uint16(data); - w += sldns_str_print(s, sl, "timeout value in units of 100ms %u", (int)timeout); - } - return w; -} - -int sldns_wire2str_edns_option_print(char** s, size_t* sl, - uint16_t option_code, uint8_t* optdata, size_t optlen) -{ - int w = 0; - w += sldns_wire2str_edns_option_code_print(s, sl, option_code); - w += sldns_str_print(s, sl, ": "); - switch(option_code) { - case LDNS_EDNS_LLQ: - w += sldns_wire2str_edns_llq_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_UL: - w += sldns_wire2str_edns_ul_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_NSID: - w += sldns_wire2str_edns_nsid_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_DAU: - w += sldns_wire2str_edns_dau_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_DHU: - w += sldns_wire2str_edns_dhu_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_N3U: - w += sldns_wire2str_edns_n3u_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_CLIENT_SUBNET: - w += sldns_wire2str_edns_subnet_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_KEEPALIVE: - w += sldns_wire2str_edns_keepalive_print(s, sl, optdata, optlen); - break; - case LDNS_EDNS_PADDING: - w += print_hex_buf(s, sl, optdata, optlen); - break; - default: - /* unknown option code */ - w += print_hex_buf(s, sl, optdata, optlen); - break; - } - return w; -} - -/** print the edns options to string */ -static int -print_edns_opts(char** s, size_t* sl, uint8_t* rdata, size_t rdatalen) -{ - uint16_t option_code, option_len; - int w = 0; - while(rdatalen > 0) { - /* option name */ - if(rdatalen < 4) { - w += sldns_str_print(s, sl, " ; malformed: "); - w += print_hex_buf(s, sl, rdata, rdatalen); - return w; - } - option_code = sldns_read_uint16(rdata); - option_len = sldns_read_uint16(rdata+2); - rdata += 4; - rdatalen -= 4; - - /* option value */ - if(rdatalen < (size_t)option_len) { - w += sldns_str_print(s, sl, " ; malformed "); - w += sldns_wire2str_edns_option_code_print(s, sl, - option_code); - w += sldns_str_print(s, sl, ": "); - w += print_hex_buf(s, sl, rdata, rdatalen); - return w; - } - w += sldns_str_print(s, sl, " ; "); - w += sldns_wire2str_edns_option_print(s, sl, option_code, - rdata, option_len); - rdata += option_len; - rdatalen -= option_len; - } - return w; -} - -int sldns_wire2str_edns_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen) -{ - int w = 0; - uint8_t ext_rcode, edns_version; - uint16_t udpsize, edns_bits, rdatalen; - w += sldns_str_print(str, str_len, "; EDNS:"); - - /* some input checks, domain name */ - if(*data_len < 1+10) - return w + print_remainder_hex("Error malformed 0x", - data, data_len, str, str_len); - if(*data[0] != 0) { - return w + print_remainder_hex("Error nonrootdname 0x", - data, data_len, str, str_len); - } - (*data)++; - (*data_len)--; - - /* check type and read fixed contents */ - if(sldns_read_uint16((*data)) != LDNS_RR_TYPE_OPT) { - return w + print_remainder_hex("Error nottypeOPT 0x", - data, data_len, str, str_len); - } - udpsize = sldns_read_uint16((*data)+2); - ext_rcode = (*data)[4]; - edns_version = (*data)[5]; - edns_bits = sldns_read_uint16((*data)+6); - rdatalen = sldns_read_uint16((*data)+8); - (*data)+=10; - (*data_len)-=10; - - w += sldns_str_print(str, str_len, " version: %u;", - (unsigned)edns_version); - w += sldns_str_print(str, str_len, " flags:"); - if((edns_bits & LDNS_EDNS_MASK_DO_BIT)) - w += sldns_str_print(str, str_len, " do"); - /* the extended rcode is the value set, shifted four bits, - * and or'd with the original rcode */ - if(ext_rcode) { - int rc = ((int)ext_rcode)<<4; - if(pkt && pktlen >= LDNS_HEADER_SIZE) - rc |= LDNS_RCODE_WIRE(pkt); - w += sldns_str_print(str, str_len, " ; ext-rcode: %d", rc); - } - w += sldns_str_print(str, str_len, " ; udp: %u", (unsigned)udpsize); - - if(rdatalen) { - if((size_t)*data_len < rdatalen) { - w += sldns_str_print(str, str_len, - " ; Error EDNS rdata too short; "); - rdatalen = (uint16_t)*data_len; - } - w += print_edns_opts(str, str_len, *data, rdatalen); - (*data) += rdatalen; - (*data_len) -= rdatalen; - } - w += sldns_str_print(str, str_len, "\n"); - return w; -} diff --git a/external/unbound/sldns/wire2str.h b/external/unbound/sldns/wire2str.h deleted file mode 100644 index e0fda9233..000000000 --- a/external/unbound/sldns/wire2str.h +++ /dev/null @@ -1,995 +0,0 @@ -/** - * wire2str.h - txt presentation of RRs - * - * (c) NLnet Labs, 2005-2006 - * - * See the file LICENSE for the license - */ - -/** - * \file - * - * Contains functions to translate the wireformat to text - * representation, as well as functions to print them. - */ - -#ifndef LDNS_WIRE2STR_H -#define LDNS_WIRE2STR_H - -#ifdef __cplusplus -extern "C" { -#endif -struct sldns_struct_lookup_table; - -/* lookup tables for standard DNS stuff */ -/** Taken from RFC 2535, section 7. */ -extern struct sldns_struct_lookup_table* sldns_algorithms; -/** DS record hash algorithms */ -extern struct sldns_struct_lookup_table* sldns_hashes; -/** Taken from RFC 2538, section 2.1. */ -extern struct sldns_struct_lookup_table* sldns_cert_algorithms; -/** Response codes */ -extern struct sldns_struct_lookup_table* sldns_rcodes; -/** Operation codes */ -extern struct sldns_struct_lookup_table* sldns_opcodes; -/** EDNS flags */ -extern struct sldns_struct_lookup_table* sldns_edns_flags; -/** EDNS option codes */ -extern struct sldns_struct_lookup_table* sldns_edns_options; -/** error string from wireparse */ -extern struct sldns_struct_lookup_table* sldns_wireparse_errors; - -/** - * Convert wireformat packet to a string representation - * @param data: wireformat packet data (starting at ID bytes). - * @param len: length of packet. - * @return string(malloced) or NULL on failure. - */ -char* sldns_wire2str_pkt(uint8_t* data, size_t len); - -/** - * Convert wireformat RR to a string representation. - * @param rr: the wireformat RR, in uncompressed form. Starts at the domain - * name start, ends with the rdata of the RR. - * @param len: length of the rr wireformat. - * @return string(malloced) or NULL on failure. - */ -char* sldns_wire2str_rr(uint8_t* rr, size_t len); - -/** - * Conver wire dname to a string. - * @param dname: the dname in uncompressed wireformat. - * @param dname_len: length of the dname. - * @return string or NULL on failure. - */ -char* sldns_wire2str_dname(uint8_t* dname, size_t dname_len); - -/** - * Convert wire RR type to a string, 'MX', 'TYPE1234'... - * @param rrtype: the RR type in host order. - * @return malloced string with the RR type or NULL on malloc failure. - */ -char* sldns_wire2str_type(uint16_t rrtype); - -/** - * Convert wire RR class to a string, 'IN', 'CLASS1'. - * @param rrclass: the RR class in host order. - * @return malloced string with the RR class or NULL on malloc failure. - */ -char* sldns_wire2str_class(uint16_t rrclass); - -/** - * Convert wire packet rcode to a string, 'NOERROR', 'NXDOMAIN'... - * @param rcode: as integer, host order - * @return malloced string with the rcode or NULL on malloc failure. - */ -char* sldns_wire2str_rcode(int rcode); - -/** - * Print to string, move string along for next content. With va_list. - * @param str: string buffer. Adjusted at end to after the output. - * @param slen: length of the string buffer. Adjusted at end. - * @param format: printf format string. - * @param args: arguments for printf. - * @return number of characters needed. Can be larger than slen. - */ -int sldns_str_vprint(char** str, size_t* slen, const char* format, va_list args); - -/** - * Print to string, move string along for next content. - * @param str: string buffer. Adjusted at end to after the output. - * @param slen: length of the string buffer. Adjusted at end. - * @param format: printf format string and arguments for it. - * @return number of characters needed. Can be larger than slen. - */ -int sldns_str_print(char** str, size_t* slen, const char* format, ...) - ATTR_FORMAT(printf, 3, 4); - -/** - * Convert wireformat packet to a string representation with user buffer - * It appends every RR with default comments. - * For more formatter options use the function: TBD(TODO) - * @param data: wireformat packet data (starting at ID bytes). - * @param data_len: length of packet. - * @param str: the string buffer for the output. - * If you pass NULL as the str the return value of the function is - * the str_len you need for the entire packet. It does not include - * the 0 byte at the end. - * @param str_len: the size of the string buffer. If more is needed, it'll - * silently truncate the output to fit in the buffer. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_pkt_buf(uint8_t* data, size_t data_len, char* str, - size_t str_len); - -/** - * Scan wireformat packet to a string representation with user buffer - * It appends every RR with default comments. - * For more formatter options use the function: TBD(TODO) - * @param data: wireformat packet data (starting at ID bytes). - * @param data_len: length of packet. - * @param str: the string buffer for the output. - * @param str_len: the size of the string buffer. - * @return number of characters for string. - * returns the number of characters that are needed (except terminating null), - * so it may return a value larger than str_len. - * On error you get less output (i.e. shorter output in str (null terminated)) - * On exit the data, data_len, str and str_len values are adjusted to move them - * from their original position along the input and output for the content - * that has been consumed (and produced) by this function. If the end of the - * output string is reached, *str_len is set to 0. The output string is null - * terminated (shortening the output if necessary). If the end of the input - * is reached *data_len is set to 0. - */ -int sldns_wire2str_pkt_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat rr to string, with user buffers. It shifts the arguments - * to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rr_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen); - -/** - * Scan wireformat question rr to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rrquestion_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen); - -/** - * Scan wireformat RR to string in unknown RR format, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rr_unknown_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen); - -/** - * Print to string the RR-information comment in default format, - * with user buffers. Moves string along. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param rr: wireformat data. - * @param rrlen: length of data buffer. - * @param dname_off: offset in buffer behind owner dname, the compressed size - * of the owner name. - * @param rrtype: type of the RR, host format. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rr_comment_print(char** str, size_t* str_len, uint8_t* rr, - size_t rrlen, size_t dname_off, uint16_t rrtype); - -/** - * Scan wireformat packet header to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_header_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat rdata to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. The length of the rdata in the - * buffer. The rdatalen itself has already been scanned, the data - * points to the rdata after the rdatalen. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param rrtype: RR type of Rdata, host format. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rdata_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint16_t rrtype, uint8_t* pkt, size_t pktlen); - -/** - * Scan wireformat rdata to string in unknown format, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer, the length of the rdata in buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rdata_unknown_scan(uint8_t** data, size_t* data_len, - char** str, size_t* str_len); - -/** - * Scan wireformat domain name to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_dname_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen); - -/** - * Scan wireformat rr type to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_type_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat rr class to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_class_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat rr ttl to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_ttl_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - - -/** - * Print host format rr type to string. Moves string along, user buffers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param rrtype: host format rr type. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_type_print(char** str, size_t* str_len, uint16_t rrtype); - -/** - * Print host format rr class to string. Moves string along, user buffers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param rrclass: host format rr class. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_class_print(char** str, size_t* str_len, uint16_t rrclass); - -/** - * Print host format rcode to string. Moves string along, user buffers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param rcode: host format rcode number. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_rcode_print(char** str, size_t* str_len, int rcode); - -/** - * Print host format opcode to string. Moves string along, user buffers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param opcode: host format opcode number. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_opcode_print(char** str, size_t* str_len, int opcode); - -/** - * Print host format EDNS0 option to string. Moves string along, user buffers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param opcode: host format option number. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_option_code_print(char** str, size_t* str_len, - uint16_t opcode); - -/** - * Convert RR to string presentation format, on one line. User buffer. - * @param rr: wireformat RR data - * @param rr_len: length of the rr wire data. - * @param str: the string buffer to write to. - * If you pass NULL as the str, the return value of the function is - * the str_len you need for the entire packet. It does not include - * the 0 byte at the end. - * @param str_len: the size of the string buffer. If more is needed, it'll - * silently truncate the output to fit in the buffer. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_rr_buf(uint8_t* rr, size_t rr_len, char* str, - size_t str_len); - -/** - * 3597 printout of an RR in unknown rr format. - * There are more format and comment options available for printout - * with the function: TBD(TODO) - * @param rr: wireformat RR data - * @param rr_len: length of the rr wire data. - * @param str: the string buffer to write to. - * If you pass NULL as the str, the return value of the function is - * the str_len you need for the entire rr. It does not include - * the 0 byte at the end. - * @param str_len: the size of the string buffer. If more is needed, it'll - * silently truncate the output to fit in the buffer. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_rr_unknown_buf(uint8_t* rr, size_t rr_len, char* str, - size_t str_len); - -/** - * This creates the comment to print after the RR. ; keytag=... , and other - * basic comments for RRs. - * There are more format and comment options available for printout - * with the function: TBD(TODO) - * @param rr: wireformat RR data - * @param rr_len: length of the rr wire data. - * @param dname_len: length of the dname in front of the RR. - * @param str: the string buffer to write to. - * If you pass NULL as the str, the return value of the function is - * the str_len you need for the entire comment. It does not include - * the 0 byte at the end. - * @param str_len: the size of the string buffer. If more is needed, it'll - * silently truncate the output to fit in the buffer. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_rr_comment_buf(uint8_t* rr, size_t rr_len, size_t dname_len, - char* str, size_t str_len); - -/** - * Convert RDATA to string presentation format, on one line. User buffer. - * @param rdata: wireformat rdata part of an RR. - * @param rdata_len: length of the rr wire data. - * @param str: the string buffer to write to. - * If you pass NULL as the str, the return value of the function is - * the str_len you need for the entire packet. It does not include - * the 0 byte at the end. - * @param str_len: the size of the string buffer. If more is needed, it'll - * silently truncate the output to fit in the buffer. - * @param rrtype: rr type of the data - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_rdata_buf(uint8_t* rdata, size_t rdata_len, char* str, - size_t str_len, uint16_t rrtype); - -/** - * Convert wire RR type to a string, 'MX', 'TYPE12'. With user buffer. - * @param rrtype: the RR type in host order. - * @param str: the string to write to. - * @param len: length of str. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_type_buf(uint16_t rrtype, char* str, size_t len); - -/** - * Convert wire RR class to a string, 'IN', 'CLASS12'. With user buffer. - * @param rrclass: the RR class in host order. - * @param str: the string to write to. - * @param len: length of str. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_class_buf(uint16_t rrclass, char* str, size_t len); - -/** - * Convert wire RR rcode to a string, 'NOERROR', 'NXDOMAIN'. With user buffer. - * @param rcode: rcode as integer in host order - * @param str: the string to write to. - * @param len: length of str. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_rcode_buf(int rcode, char* str, size_t len); - -/** - * Convert host format opcode to a string. 'QUERY', 'NOTIFY', 'UPDATE'. - * With user buffer. - * @param opcode: opcode as integer in host order - * @param str: the string to write to. - * @param len: length of str. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_opcode_buf(int opcode, char* str, size_t len); - -/** - * Convert wire dname to a string, "example.com.". With user buffer. - * @param dname: the dname in uncompressed wireformat. - * @param dname_len: length of the dname. - * @param str: the string to write to. - * @param len: length of string. - * @return the number of characters for this element, excluding zerobyte. - * Is larger or equal than str_len if output was truncated. - */ -int sldns_wire2str_dname_buf(uint8_t* dname, size_t dname_len, char* str, - size_t len); - -/** - * Scan wireformat rdf field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param rdftype: the type of the rdata field, enum sldns_rdf_type. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_rdf_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, int rdftype, uint8_t* pkt, size_t pktlen); - -/** - * Scan wireformat int8 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_int8_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat int16 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_int16_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat int32 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_int32_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat period field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_period_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat tsigtime field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_tsigtime_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat ip4 A field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_a_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat ip6 AAAA field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_aaaa_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat str field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_str_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat apl field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_apl_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat b32_ext field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_b32_ext_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat b64 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_b64_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat hex field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_hex_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat nsec bitmap field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_nsec_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat nsec3_salt field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_nsec3_salt_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat cert_alg field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_cert_alg_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat alg field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_alg_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat type unknown field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_unknown_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat time field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_time_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat LOC field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_loc_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat WKS field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_wks_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat NSAP field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_nsap_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat ATMA field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_atma_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat IPSECKEY field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param pkt: packet for decompression, if NULL no decompression. - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_ipseckey_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen); - -/** - * Scan wireformat HIP (algo, HIT, pubkey) field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_hip_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat int16_data field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_int16_data_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat nsec3_next_owner field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_nsec3_next_owner_scan(uint8_t** data, size_t* data_len, - char** str, size_t* str_len); - -/** - * Scan wireformat ILNP64 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_ilnp64_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat EUI48 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_eui48_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat EUI64 field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_eui64_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat TAG field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_tag_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Scan wireformat long_str field to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @return number of characters (except null) needed to print. - * Can return -1 on failure. - */ -int sldns_wire2str_long_str_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len); - -/** - * Print EDNS LLQ option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_llq_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print EDNS UL option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_ul_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print EDNS NSID option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_nsid_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print EDNS DAU option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_dau_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print EDNS DHU option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_dhu_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print EDNS N3U option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_n3u_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print EDNS SUBNET option data to string. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_subnet_print(char** str, size_t* str_len, - uint8_t* option_data, size_t option_len); - -/** - * Print an EDNS option as OPT: VALUE. User buffers, moves string pointers. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param option_code: host format EDNS option code. - * @param option_data: buffer with EDNS option code data. - * @param option_len: length of the data for this option. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_option_print(char** str, size_t* str_len, - uint16_t option_code, uint8_t* option_data, size_t option_len); - -/** - * Scan wireformat EDNS OPT to string, with user buffers. - * It shifts the arguments to move along (see sldns_wire2str_pkt_scan). - * @param data: wireformat data. - * @param data_len: length of data buffer. - * @param str: string buffer. - * @param str_len: length of string buffer. - * @param pkt: packet with header and other info (may be NULL) - * @param pktlen: length of packet buffer. - * @return number of characters (except null) needed to print. - */ -int sldns_wire2str_edns_scan(uint8_t** data, size_t* data_len, char** str, - size_t* str_len, uint8_t* pkt, size_t pktlen); - -#ifdef __cplusplus -} -#endif - -#endif /* LDNS_WIRE2STR_H */ |