diff options
Diffstat (limited to 'src/libknot/tsig.c')
-rw-r--r-- | src/libknot/tsig.c | 572 |
1 files changed, 193 insertions, 379 deletions
diff --git a/src/libknot/tsig.c b/src/libknot/tsig.c index a4a8f1b..fd59709 100644 --- a/src/libknot/tsig.c +++ b/src/libknot/tsig.c @@ -14,9 +14,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <config.h> #include <string.h> #include <stdlib.h> #include <stdint.h> +#include <inttypes.h> #include <assert.h> #include <time.h> @@ -25,296 +27,225 @@ #include "common.h" #include "util/utils.h" #include "rrset.h" -#include "rdata.h" #include "dname.h" - -/*! \brief TSIG algorithms table. */ -#define TSIG_ALG_TABLE_SIZE 8 -static knot_lookup_table_t tsig_alg_table[TSIG_ALG_TABLE_SIZE] = { - { KNOT_TSIG_ALG_NULL, "gss-tsig." }, - { KNOT_TSIG_ALG_HMAC_MD5, "hmac-md5.sig-alg.reg.int." }, - { KNOT_TSIG_ALG_HMAC_SHA1, "hmac-sha1." }, - { KNOT_TSIG_ALG_HMAC_SHA224, "hmac-sha224." }, - { KNOT_TSIG_ALG_HMAC_SHA256, "hmac-sha256." }, - { KNOT_TSIG_ALG_HMAC_SHA384, "hmac-sha384." }, - { KNOT_TSIG_ALG_HMAC_SHA512, "hmac-sha512." }, - { KNOT_TSIG_ALG_NULL, NULL } -}; - -int tsig_rdata_init(knot_rrset_t *tsig) +#include "consts.h" + +/*! \brief TSIG field offsets. */ +typedef enum tsig_off_t { + TSIG_ALGNAME_O = 0, + TSIG_TSIGNED_O, + TSIG_FUDGE_O, + TSIG_MACLEN_O, + TSIG_MAC_O, + TSIG_ORIGID_O, + TSIG_ERROR_O, + TSIG_OLEN_O, + TSIG_OTHER_O +} tsig_off_t; + +/* Helpers for r offset calculation. */ +#define TSIG_NAMELEN (sizeof(knot_dname_t*)) +#define TSIG_OTHER_MAXLEN (3 * sizeof(uint16_t)) +#define TSIG_OFF_MACLEN (TSIG_NAMELEN + 4 * sizeof(uint16_t)) +#define TSIG_FIXED_RDLEN (TSIG_NAMELEN + 11 * sizeof(uint16_t)) + +/*! + * \brief Seek offset of a TSIG RR field. + * + * \param rr TSIG RR. + * \param id Field index. + * \param nb Required number of bytes after the offset (for boundaries check). + * \return pointer to field on wire or NULL. + */ +static uint8_t* tsig_rdata_seek(const knot_rrset_t *rr, tsig_off_t id, size_t nb) { - if (!tsig) { - return KNOT_EINVAL; + uint8_t *rd = knot_rrset_get_rdata(rr, 0); + if (rd == NULL) { + return NULL; } - /* Initializes rdata. */ - tsig->rdata = knot_rdata_new(); - if (!tsig->rdata) { - return KNOT_ENOMEM; + /* Check if fixed part is readable. */ + uint16_t lim = rrset_rdata_item_size(rr, 0); + if (lim < TSIG_NAMELEN + 5 * sizeof(uint16_t)) { + dbg_tsig("TSIG: rdata: not enough items " + "(has %"PRIu16", min %zu).\n", + lim, TSIG_NAMELEN + 5 * sizeof(uint16_t)); + return NULL; } - tsig->rdata->items = - malloc(sizeof(knot_rdata_item_t) * KNOT_TSIG_ITEM_COUNT); - if (!tsig->rdata->items) { - return KNOT_ENOMEM; + /* Not pretty, but fast. */ + uint8_t *bp = rd; + switch(id) { + case TSIG_ALGNAME_O: break; + case TSIG_TSIGNED_O: rd += TSIG_NAMELEN; break; + case TSIG_FUDGE_O: rd += TSIG_NAMELEN + 3 * sizeof(uint16_t); break; + case TSIG_MACLEN_O: rd += TSIG_NAMELEN + 4 * sizeof(uint16_t); break; + case TSIG_MAC_O: rd += TSIG_NAMELEN + 5 * sizeof(uint16_t); break; + case TSIG_ORIGID_O: + rd += TSIG_NAMELEN + 4 * sizeof(uint16_t); + rd += knot_wire_read_u16(rd) + sizeof(uint16_t); + break; + + case TSIG_ERROR_O: + rd += TSIG_NAMELEN + 4 * sizeof(uint16_t); + rd += knot_wire_read_u16(rd) + 2 * sizeof(uint16_t); + break; + case TSIG_OLEN_O: + rd += TSIG_NAMELEN + 4 * sizeof(uint16_t); + rd += knot_wire_read_u16(rd) + 3 * sizeof(uint16_t); + break; + case TSIG_OTHER_O: + rd += TSIG_NAMELEN + 4 * sizeof(uint16_t); + rd += knot_wire_read_u16(rd) + 4 * sizeof(uint16_t); + break; + } + + /* Check remaining bytes. */ + if (rd + nb > bp + lim) { + dbg_tsig("TSIG: rdata: not enough items (needs %zu, has %u).\n", + (rd-bp)+nb, lim); + return NULL; } - memset(tsig->rdata->items, 0, - sizeof(knot_rdata_item_t) * KNOT_TSIG_ITEM_COUNT); + return rd; +} + +static int tsig_rdata_set_tsig_error(knot_rrset_t *tsig, uint16_t tsig_error) +{ + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_ERROR_O, sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; + } + knot_wire_write_u16(rd, tsig_error); return KNOT_EOK; } -int tsig_rdata_set_alg_name(knot_rrset_t *tsig, knot_dname_t *alg_name) +int tsig_create_rdata(knot_rrset_t *rr, uint16_t maclen, uint16_t tsig_err) { - if (!tsig) { + if (!rr) { return KNOT_EINVAL; } - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; + /* We already checked rr and know rdlen > 0, no need to check rets. */ + size_t rdlen = TSIG_FIXED_RDLEN + maclen; + if (tsig_err != KNOT_RCODE_BADTIME) { + rdlen -= TSIG_OTHER_MAXLEN; } - assert(knot_rdata_item_count(rdata) >= 1); + uint8_t *rd = knot_rrset_create_rdata(rr, rdlen); + memset(rd, 0, rdlen); - knot_dname_t *alg_name_copy = knot_dname_deep_copy(alg_name); - if (!alg_name_copy) { - return KNOT_ENOMEM; - } + /* Set MAC variable length in advance. */ + rd += TSIG_OFF_MACLEN; + knot_wire_write_u16(rd, maclen); - knot_rdata_item_set_dname(rdata, 0, alg_name_copy); - - /* Release the dname. We want it to have 1 reference only. */ - knot_dname_release(alg_name_copy); + /* Set error. */ + tsig_rdata_set_tsig_error(rr, tsig_err); return KNOT_EOK; } -int tsig_rdata_set_alg(knot_rrset_t *tsig, tsig_algorithm_t alg) +int tsig_rdata_set_alg_name(knot_rrset_t *tsig, knot_dname_t *alg_name) { - if (!tsig) { - return KNOT_EINVAL; - } - - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; - } - assert(knot_rdata_item_count(rdata) >= 1); - - const char *alg_str = tsig_alg_to_str(alg); - knot_dname_t *alg_name_copy = knot_dname_new_from_str(alg_str, - strlen(alg_str), - NULL); - if (!alg_name_copy) { - return KNOT_ENOMEM; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_ALGNAME_O, TSIG_NAMELEN); + if (!rd) { + return KNOT_ERROR; } - - knot_rdata_item_set_dname(rdata, 0, alg_name_copy); - - /* Release the dname. We want it to have 1 reference only. */ - knot_dname_release(alg_name_copy); + memcpy(rd, &alg_name, sizeof(knot_dname_t*)); + knot_dname_retain(alg_name); return KNOT_EOK; } -int tsig_rdata_set_time_signed(knot_rrset_t *tsig, uint64_t time) +int tsig_rdata_set_alg(knot_rrset_t *tsig, knot_tsig_algorithm_t alg) { - if (!tsig) { - return KNOT_EINVAL; - } - - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; - } - assert(knot_rdata_item_count(rdata) >= 2); + const char *s = tsig_alg_to_str(alg); + knot_dname_t *alg_name = knot_dname_new_from_str(s, strlen(s), NULL); + int ret = tsig_rdata_set_alg_name(tsig, alg_name); + knot_dname_release(alg_name); + return ret; +} - /* Create the wire format. */ - uint16_t *wire = malloc(sizeof(uint8_t) * 6 + sizeof(uint16_t)); - if (!wire) { - ERR_ALLOC_FAILED; - return KNOT_ENOMEM; +int tsig_rdata_set_time_signed(knot_rrset_t *tsig, uint64_t time) +{ + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_TSIGNED_O, 3*sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } - /* Write the length - 6. */ - wire[0] = 6; - knot_wire_write_u48((uint8_t *)(wire + 1), time); - - knot_rdata_item_set_raw_data(rdata, 1, wire); - + knot_wire_write_u48(rd, time); return KNOT_EOK; } int tsig_rdata_set_fudge(knot_rrset_t *tsig, uint16_t fudge) { - if (!tsig) { - return KNOT_EINVAL; - } - - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_FUDGE_O, sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } - assert(knot_rdata_item_count(rdata) >= 3); - - /* Create the wire format. */ - uint16_t *wire = malloc(sizeof(uint8_t) * 2 + sizeof(uint16_t)); - if (!wire) { - ERR_ALLOC_FAILED; - return KNOT_ENOMEM; - } - - /* Write the length - 2. */ - wire[0] = sizeof(uint16_t); - knot_wire_write_u16((uint8_t *)(wire + 1), fudge); - - knot_rdata_item_set_raw_data(rdata, 2, wire); + knot_wire_write_u16(rd, fudge); return KNOT_EOK; } int tsig_rdata_set_mac(knot_rrset_t *tsig, uint16_t length, const uint8_t *mac) { - if (!tsig) { - return KNOT_EINVAL; - } - - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_MAC_O, length); + if (!rd) { + return KNOT_ERROR; } - assert(knot_rdata_item_count(rdata) >= 4); - /* Create the wire format. */ - uint16_t *wire = malloc(sizeof(uint8_t) * length + 2 * sizeof(uint16_t)); - if (!wire) { - ERR_ALLOC_FAILED; - return KNOT_ENOMEM; - } + /*! \note Cannot change length, as rdata is already preallocd. */ - /* Write the length. */ - wire[0] = length + sizeof(uint16_t); - knot_wire_write_u16((uint8_t *)(wire + 1), length); /* Copy the actual MAC. */ - memcpy((uint8_t *)(wire + 2), mac, sizeof(uint8_t) * length); - knot_rdata_item_set_raw_data(rdata, 3, wire); - + memcpy(rd, mac, length); return KNOT_EOK; } int tsig_rdata_set_orig_id(knot_rrset_t *tsig, uint16_t id) { - if (!tsig) { - return KNOT_EINVAL; - } - - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; - } - assert(knot_rdata_item_count(rdata) >= 5); - - /* Create the wire format. */ - uint16_t *wire = malloc(sizeof(uint8_t) * 2 + sizeof(uint16_t)); - if (!wire) { - ERR_ALLOC_FAILED; - return KNOT_ENOMEM; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_ORIGID_O, sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } /* Write the length - 2. */ - wire[0] = sizeof(uint16_t); - knot_wire_write_u16((uint8_t *)(wire + 1), id); - - knot_rdata_item_set_raw_data(rdata, 4, wire); - + knot_wire_write_u16(rd, id); return KNOT_EOK; } -int tsig_rdata_set_tsig_error(knot_rrset_t *tsig, uint16_t tsig_error) -{ - if (!tsig) { - return KNOT_EINVAL; - } - - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; - } - assert(knot_rdata_item_count(rdata) >= 6); - - /* Create the wire format. */ - uint16_t *wire = malloc(sizeof(uint8_t) * 2 + sizeof(uint16_t)); - if (!wire) { - ERR_ALLOC_FAILED; - return KNOT_ENOMEM; - } - - /* Write the length - 2. */ - wire[0] = sizeof(uint16_t); - knot_wire_write_u16((uint8_t *)(wire + 1), tsig_error); - - knot_rdata_item_set_raw_data(rdata, 5, wire); - - return KNOT_EOK; -} - -int tsig_rdata_set_other_data(knot_rrset_t *tsig, uint16_t length, +int tsig_rdata_set_other_data(knot_rrset_t *tsig, uint16_t len, const uint8_t *other_data) { - if (!tsig) { + if (len > TSIG_OTHER_MAXLEN) { + dbg_tsig("TSIG: rdata: other len > %zu B\n", TSIG_OTHER_MAXLEN); return KNOT_EINVAL; } - knot_rdata_t *rdata = knot_rrset_get_rdata(tsig); - if (!rdata) { - return KNOT_EINVAL; - } - assert(knot_rdata_item_count(rdata) >= 6); - - /* Create the wire format. */ - uint16_t *wire = malloc(sizeof(uint8_t) * length + 2 * sizeof(uint16_t)); - if (!wire) { - ERR_ALLOC_FAILED; - return KNOT_ENOMEM; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_OLEN_O, len+sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } /* Write the length. */ - wire[0] = length + 2; - knot_wire_write_u16((uint8_t *)(wire + 1), length); - /* Copy the actual data. */ - memcpy(wire + 2, other_data, sizeof(uint8_t) * length); - knot_rdata_item_set_raw_data(rdata, 6, wire); + knot_wire_write_u16(rd, len); + /* Copy the actual data. */ + memcpy(rd + sizeof(uint16_t), other_data, len); return KNOT_EOK; } const knot_dname_t *tsig_rdata_alg_name(const knot_rrset_t *tsig) { - if (!tsig) { + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_ALGNAME_O, TSIG_NAMELEN); + if (!rd) { return NULL; } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - dbg_tsig("TSIG: rdata: alg name: no rdata.\n"); - return NULL; - } - - if (knot_rdata_item_count(rdata) < 1) { - dbg_tsig("TSIG: rdata: alg name: not enough items.\n"); - return NULL; - } - - return knot_rdata_item(rdata, 0)->dname; + return *((knot_dname_t**)rd); } -tsig_algorithm_t tsig_rdata_alg(const knot_rrset_t *tsig) +knot_tsig_algorithm_t tsig_rdata_alg(const knot_rrset_t *tsig) { - if (!tsig) { - return KNOT_TSIG_ALG_NULL; - } - /* Get the algorithm name. */ const knot_dname_t *alg_name = tsig_rdata_alg_name(tsig); if (!alg_name) { @@ -329,183 +260,87 @@ tsig_algorithm_t tsig_rdata_alg(const knot_rrset_t *tsig) return KNOT_TSIG_ALG_NULL; } - knot_lookup_table_t *item = knot_lookup_by_name(tsig_alg_table, name); + knot_lookup_table_t *item = knot_lookup_by_name( + knot_tsig_alg_domain_names, name); free(name); if (!item) { dbg_tsig("TSIG: rdata: unknown algorithm.\n"); return KNOT_TSIG_ALG_NULL; } - return item->id; } uint64_t tsig_rdata_time_signed(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { + /*! \todo How to return invalid value? */ + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_TSIGNED_O, 3*sizeof(uint16_t)); + if (!rd) { return 0; } - - if (knot_rdata_item_count(rdata) < 2) { - return 0; - } - - uint16_t *wire = knot_rdata_item(rdata, 1)->raw_data; - assert(wire[0] == 6); - /* Skip the size. */ - wire++; - - return knot_wire_read_u48((uint8_t *)wire); + return knot_wire_read_u48(rd); } uint16_t tsig_rdata_fudge(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - return 0; - } - - if (knot_rdata_item_count(rdata) < 3) { + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_FUDGE_O, sizeof(uint16_t)); + if (!rd) { return 0; } - - uint16_t *wire = knot_rdata_item(rdata, 2)->raw_data; - assert(wire[0] == 2); - /* Skip the size. */ - wire++; - - return knot_wire_read_u16((uint8_t *)wire); + return knot_wire_read_u16(rd); } const uint8_t *tsig_rdata_mac(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - return 0; - } - - if (knot_rdata_item_count(rdata) < 4) { - return 0; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_MAC_O, 0); + if (!rd) { + return NULL; } - - return (uint8_t*)(knot_rdata_item(rdata, 3)->raw_data + 2); + return rd; } size_t tsig_rdata_mac_length(const knot_rrset_t *tsig) { - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata || knot_rdata_item_count(rdata) < 4) { + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_MACLEN_O, sizeof(uint16_t)); + if (!rd) { return 0; } - - return knot_wire_read_u16( - (uint8_t *)(knot_rdata_item(rdata, 3)->raw_data + 1)); + return knot_wire_read_u16(rd); } uint16_t tsig_rdata_orig_id(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - return 0; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_ORIGID_O, sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } - - if (knot_rdata_item_count(rdata) < 5) { - return 0; - } - - uint16_t *wire = knot_rdata_item(rdata, 4)->raw_data; - assert(wire[0] == 2); - /* Skip the size. */ - wire++; - - return knot_wire_read_u16((uint8_t *)wire); + return knot_wire_read_u16(rd); } uint16_t tsig_rdata_error(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - return 0; - } - - if (knot_rdata_item_count(rdata) < 6) { - return 0; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_ERROR_O, sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } - - uint16_t *wire = knot_rdata_item(rdata, 5)->raw_data; - assert(wire[0] == 2); - /* Skip the size. */ - wire++; - - return knot_wire_read_u16((uint8_t *)wire); + return knot_wire_read_u16(rd); } const uint8_t *tsig_rdata_other_data(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - return 0; - } - - if (knot_rdata_item_count(rdata) < 7) { - return 0; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_OTHER_O, 0); + if (!rd) { + return NULL; } - - return (uint8_t *)(knot_rdata_item(rdata, 6)->raw_data + 2); + return rd; } uint16_t tsig_rdata_other_data_length(const knot_rrset_t *tsig) { - /*! \note How about assert. Or maybe change API??? */ - if (!tsig) { - return 0; - } - - const knot_rdata_t *rdata = knot_rrset_rdata(tsig); - if (!rdata) { - return 0; - } - - if (knot_rdata_item_count(rdata) < 7) { - return 0; + uint8_t *rd = tsig_rdata_seek(tsig, TSIG_OLEN_O, sizeof(uint16_t)); + if (!rd) { + return KNOT_ERROR; } - - return knot_wire_read_u16((uint8_t *) - (knot_rdata_item(rdata, 6)->raw_data + 1)); + return knot_wire_read_u16(rd); } int tsig_alg_from_name(const knot_dname_t *alg_name) @@ -520,7 +355,7 @@ int tsig_alg_from_name(const knot_dname_t *alg_name) } knot_lookup_table_t *found = - knot_lookup_by_name(tsig_alg_table, name); + knot_lookup_by_name(knot_tsig_alg_domain_names, name); if (!found) { dbg_tsig("Unknown algorithm: %s \n", name); @@ -533,28 +368,6 @@ int tsig_alg_from_name(const knot_dname_t *alg_name) return found->id; } -uint16_t tsig_alg_digest_length(tsig_algorithm_t alg) -{ - switch (alg) { - case KNOT_TSIG_ALG_GSS_TSIG: - return KNOT_TSIG_ALG_DIG_LENGTH_GSS_TSIG; - case KNOT_TSIG_ALG_HMAC_MD5: - return KNOT_TSIG_ALG_DIG_LENGTH_HMAC_MD5; - case KNOT_TSIG_ALG_HMAC_SHA1: - return KNOT_TSIG_ALG_DIG_LENGTH_SHA1; - case KNOT_TSIG_ALG_HMAC_SHA224: - return KNOT_TSIG_ALG_DIG_LENGTH_SHA224; - case KNOT_TSIG_ALG_HMAC_SHA256: - return KNOT_TSIG_ALG_DIG_LENGTH_SHA256; - case KNOT_TSIG_ALG_HMAC_SHA384: - return KNOT_TSIG_ALG_DIG_LENGTH_SHA384; - case KNOT_TSIG_ALG_HMAC_SHA512: - return KNOT_TSIG_ALG_DIG_LENGTH_SHA512; - default: - return 0; - } /* switch(alg) */ -} - size_t tsig_rdata_tsig_variables_length(const knot_rrset_t *tsig) { if (tsig == NULL) { @@ -579,6 +392,7 @@ size_t tsig_rdata_tsig_variables_length(const knot_rrset_t *tsig) size_t tsig_rdata_tsig_timers_length() { + /*! \todo Cleanup */ return KNOT_TSIG_TIMERS_LENGTH; } @@ -594,25 +408,24 @@ int tsig_rdata_store_current_time(knot_rrset_t *tsig) return KNOT_EOK; } -const char* tsig_alg_to_str(tsig_algorithm_t alg) +const char* tsig_alg_to_str(knot_tsig_algorithm_t alg) { - for (unsigned i = 0; i < TSIG_ALG_TABLE_SIZE; ++i) { - if (tsig_alg_table[i].id == alg) { - return tsig_alg_table[i].name; - } - } + knot_lookup_table_t *item; + + item = knot_lookup_by_id(knot_tsig_alg_domain_names, alg); - return ""; + if (item != NULL) { + return item->name; + } else { + return ""; + } } -size_t tsig_wire_maxsize(const knot_key_t* key) +size_t tsig_wire_maxsize(const knot_tsig_key_t *key) { - if (key == NULL) { - return 0; - } - size_t alg_name_size = strlen(tsig_alg_to_str(key->algorithm)) + 1; + /*! \todo Used fixed size as a base. */ return knot_dname_size(key->name) + sizeof(uint16_t) + /* TYPE */ sizeof(uint16_t) + /* CLASS */ @@ -622,7 +435,7 @@ size_t tsig_wire_maxsize(const knot_key_t* key) 6 * sizeof(uint8_t) + /* Time signed */ sizeof(uint16_t) + /* Fudge */ sizeof(uint16_t) + /* MAC size */ - tsig_alg_digest_length(key->algorithm) + /* MAC */ + knot_tsig_digest_length(key->algorithm) + /* MAC */ sizeof(uint16_t) + /* Original ID */ sizeof(uint16_t) + /* Error */ sizeof(uint16_t) + /* Other len */ @@ -634,7 +447,8 @@ size_t tsig_wire_actsize(const knot_rrset_t *tsig) if (tsig == NULL) { return 0; } - + + /*! \todo Used fixed size as a base. */ return knot_dname_size(knot_rrset_owner(tsig)) + sizeof(uint16_t) + /* TYPE */ sizeof(uint16_t) + /* CLASS */ @@ -653,10 +467,10 @@ size_t tsig_wire_actsize(const knot_rrset_t *tsig) int tsig_rdata_is_ok(const knot_rrset_t *tsig) { + /*! \todo Check size, needs to check variable-length fields. */ return (tsig - && knot_rrset_rdata(tsig) != NULL - && knot_rdata_item_count(knot_rrset_rdata(tsig)) >= 7 + && knot_rrset_get_rdata(tsig, 0) != NULL + && tsig_rdata_seek(tsig, TSIG_OTHER_O, 0) != NULL && tsig_rdata_alg_name(tsig) != NULL && tsig_rdata_time_signed(tsig) != 0); } - |