393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews/*
a134177ed9f82189504191d90f3ed9e97c2b47cbTinderbox User * Copyright (C) 2012, 2014-2017 Internet Systems Consortium, Inc. ("ISC")
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
f2ea8c2f965be7ff4c59f805712c12d469226b7bEvan Hunt/* rfc6698.txt */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews#ifndef RDATA_GENERIC_TLSA_52_C
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews#define RDATA_GENERIC_TLSA_52_C
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews#define RRTYPE_TLSA_ATTRIBUTES 0
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsgeneric_fromtext_tlsa(ARGS_FROMTEXT) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_token_t token;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(type);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(rdclass);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(origin);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(options);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(callbacks);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Certificate Usage.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews ISC_FALSE));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (token.value.as_ulong > 0xffU)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETTOK(ISC_R_RANGE);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(uint8_tobuffer(token.value.as_ulong, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Selector.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews ISC_FALSE));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (token.value.as_ulong > 0xffU)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETTOK(ISC_R_RANGE);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(uint8_tobuffer(token.value.as_ulong, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Matching type.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews ISC_FALSE));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (token.value.as_ulong > 0xffU)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETTOK(ISC_R_RANGE);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(uint8_tobuffer(token.value.as_ulong, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Certificate Association Data.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (isc_hex_tobuffer(lexer, target, -1));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsgeneric_totext_tlsa(ARGS_TOTEXT) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t sr;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews char buf[sizeof("64000 ")];
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews unsigned int n;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata->length != 0);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(tctx);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_toregion(rdata, &sr);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Certificate Usage.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews n = uint8_fromregion(&sr);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_consume(&sr, 1);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf), "%u ", n);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(str_totext(buf, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Selector.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews n = uint8_fromregion(&sr);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_consume(&sr, 1);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf), "%u ", n);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(str_totext(buf, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Matching type.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews n = uint8_fromregion(&sr);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_consume(&sr, 1);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf), "%u", n);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(str_totext(buf, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews /*
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews * Certificate Association Data.
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(str_totext(" (", target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(str_totext(tctx->linebreak, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (tctx->width == 0) /* No splitting */
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(isc_hex_totext(&sr, 0, "", target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews else
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(isc_hex_totext(&sr, tctx->width - 2,
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tctx->linebreak, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(str_totext(" )", target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_R_SUCCESS);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsgeneric_fromwire_tlsa(ARGS_FROMWIRE) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t sr;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(type);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(rdclass);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(dctx);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(options);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_buffer_activeregion(source, &sr);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (sr.length < 3)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_R_UNEXPECTEDEND);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_buffer_forward(source, sr.length);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (mem_tobuffer(target, sr.base, sr.length));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsfromtext_tlsa(ARGS_FROMTEXT) {
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(type == dns_rdatatype_tlsa);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews return (generic_fromtext_tlsa(rdclass, type, lexer, origin, options,
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews target, callbacks));
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews}
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewstotext_tlsa(ARGS_TOTEXT) {
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(rdata->type == dns_rdatatype_tlsa);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews return (generic_totext_tlsa(rdata, tctx, target));
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews}
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsfromwire_tlsa(ARGS_FROMWIRE) {
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(type == dns_rdatatype_tlsa);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews return (generic_fromwire_tlsa(rdclass, type, source, dctx, options,
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews target));
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews}
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewstowire_tlsa(ARGS_TOWIRE) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t sr;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_tlsa);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata->length != 0);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(cctx);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_toregion(rdata, &sr);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (mem_tobuffer(target, sr.base, sr.length));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline int
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewscompare_tlsa(ARGS_COMPARE) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t r1;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t r2;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata1->type == rdata2->type);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata1->rdclass == rdata2->rdclass);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata1->type == dns_rdatatype_tlsa);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata1->length != 0);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata2->length != 0);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_toregion(rdata1, &r1);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_toregion(rdata2, &r2);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (isc_region_compare(&r1, &r2));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsgeneric_fromstruct_tlsa(ARGS_FROMSTRUCT) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_tlsa_t *tlsa = source;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(source != NULL);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(tlsa->common.rdtype == type);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(tlsa->common.rdclass == rdclass);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(type);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(rdclass);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(uint8_tobuffer(tlsa->usage, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(uint8_tobuffer(tlsa->selector, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews RETERR(uint8_tobuffer(tlsa->match, target));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (mem_tobuffer(target, tlsa->data, tlsa->length));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsgeneric_tostruct_tlsa(ARGS_TOSTRUCT) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_tlsa_t *tlsa = target;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t region;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(target != NULL);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(rdata->length != 0);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->common.rdclass = rdata->rdclass;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->common.rdtype = rdata->type;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews ISC_LINK_INIT(&tlsa->common, link);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_toregion(rdata, &region);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->usage = uint8_fromregion(&region);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_consume(&region, 1);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->selector = uint8_fromregion(&region);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_consume(&region, 1);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->match = uint8_fromregion(&region);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_consume(&region, 1);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->length = region.length;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->data = mem_maybedup(mctx, region.base, region.length);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (tlsa->data == NULL)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_R_NOMEMORY);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->mctx = mctx;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_R_SUCCESS);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline void
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsgeneric_freestruct_tlsa(ARGS_FREESTRUCT) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_tlsa_t *tlsa = source;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews REQUIRE(tlsa != NULL);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (tlsa->mctx == NULL)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews if (tlsa->data != NULL)
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_mem_free(tlsa->mctx, tlsa->data);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews tlsa->mctx = NULL;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsfromstruct_tlsa(ARGS_FROMSTRUCT) {
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(type == dns_rdatatype_tlsa);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews return (generic_fromstruct_tlsa(rdclass, type, source, target));
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews}
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsstatic inline isc_result_t
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewstostruct_tlsa(ARGS_TOSTRUCT) {
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews dns_rdata_txt_t *txt = target;
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(rdata->type == dns_rdatatype_tlsa);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(target != NULL);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews txt->common.rdclass = rdata->rdclass;
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews txt->common.rdtype = rdata->type;
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews ISC_LINK_INIT(&txt->common, link);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews return (generic_tostruct_tlsa(rdata, target, mctx));
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews}
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsstatic inline void
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrewsfreestruct_tlsa(ARGS_FREESTRUCT) {
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews dns_rdata_txt_t *txt = source;
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(source != NULL);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews REQUIRE(txt->common.rdtype == dns_rdatatype_tlsa);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews generic_freestruct_tlsa(source);
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews}
322e6b5be784d79d15fea9db9440dd821162c574Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsadditionaldata_tlsa(ARGS_ADDLDATA) {
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_tlsa);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(rdata);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(add);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(arg);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_R_SUCCESS);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_result_t
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsdigest_tlsa(ARGS_DIGEST) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews isc_region_t r;
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_tlsa);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews dns_rdata_toregion(rdata, &r);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return ((digest)(arg, &r));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_boolean_t
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewscheckowner_tlsa(ARGS_CHECKOWNER) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_tlsa);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(name);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(type);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(rdclass);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(wildcard);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_TRUE);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline isc_boolean_t
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewschecknames_tlsa(ARGS_CHECKNAMES) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_tlsa);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(rdata);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(owner);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews UNUSED(bad);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (ISC_TRUE);
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewsstatic inline int
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrewscasecompare_tlsa(ARGS_COMPARE) {
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews return (compare_tlsa(rdata1, rdata2));
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews}
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews
393fd55d91306e6def3a3d06748eee031f57bd17Mark Andrews#endif /* RDATA_GENERIC_TLSA_52_C */