0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews/*
a134177ed9f82189504191d90f3ed9e97c2b47cbTinderbox User * Copyright (C) 2002, 2004, 2005, 2007, 2009-2017 Internet Systems Consortium, Inc. ("ISC")
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark 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/.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews/* $Id$ */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
058e44186b74531402c1f99088eb9dbe4926f8daMark Andrews/* RFC3658 */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews#ifndef RDATA_GENERIC_DS_43_C
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews#define RDATA_GENERIC_DS_43_C
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
12ff7274fe2ea531ecca6a71fb9f7e1ae92da389Mark Andrews#define RRTYPE_DS_ATTRIBUTES \
12ff7274fe2ea531ecca6a71fb9f7e1ae92da389Mark Andrews (DNS_RDATATYPEATTR_DNSSEC|DNS_RDATATYPEATTR_ATPARENT)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews#include <isc/sha1.h>
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews#include <isc/sha2.h>
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews#include <dns/ds.h>
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#include "dst_gost.h"
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsgeneric_fromtext_ds(ARGS_FROMTEXT) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_token_t token;
0da29be670f6fa5b2a6320d9d843bc8b802c153aMark Andrews unsigned char c;
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews int length;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(type);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(rdclass);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(origin);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(options);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(callbacks);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Key tag.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ISC_FALSE));
1676408640d8283c9f17eec0b183e1302ea7fd70Mark Andrews if (token.value.as_ulong > 0xffffU)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETTOK(ISC_R_RANGE);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(uint16_tobuffer(token.value.as_ulong, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Algorithm.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0da29be670f6fa5b2a6320d9d843bc8b802c153aMark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ISC_FALSE));
0da29be670f6fa5b2a6320d9d843bc8b802c153aMark Andrews RETTOK(dns_secalg_fromtext(&c, &token.value.as_textregion));
0da29be670f6fa5b2a6320d9d843bc8b802c153aMark Andrews RETERR(mem_tobuffer(target, &c, 1));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Digest type.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
058e44186b74531402c1f99088eb9dbe4926f8daMark Andrews RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ISC_FALSE));
058e44186b74531402c1f99088eb9dbe4926f8daMark Andrews RETTOK(dns_dsdigest_fromtext(&c, &token.value.as_textregion));
058e44186b74531402c1f99088eb9dbe4926f8daMark Andrews RETERR(mem_tobuffer(target, &c, 1));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Digest.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews switch (c) {
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews case DNS_DSDIGEST_SHA1:
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews length = ISC_SHA1_DIGESTLENGTH;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews break;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews case DNS_DSDIGEST_SHA256:
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews length = ISC_SHA256_DIGESTLENGTH;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews break;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#ifdef ISC_GOST_DIGESTLENGTH
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews case DNS_DSDIGEST_GOST:
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews length = ISC_GOST_DIGESTLENGTH;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews break;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#endif
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews case DNS_DSDIGEST_SHA384:
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews length = ISC_SHA384_DIGESTLENGTH;
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews break;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews default:
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews length = -1;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews break;
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews }
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews return (isc_hex_tobuffer(lexer, target, length));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsfromtext_ds(ARGS_FROMTEXT) {
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(type == dns_rdatatype_ds);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews return (generic_fromtext_ds(rdclass, type, lexer, origin, options,
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews target, callbacks));
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews}
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsgeneric_totext_ds(ARGS_TOTEXT) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_t sr;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews char buf[sizeof("64000 ")];
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews unsigned int n;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata->length != 0);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(tctx);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_toregion(rdata, &sr);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Key tag.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews n = uint16_fromregion(&sr);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_consume(&sr, 2);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf), "%u ", n);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(str_totext(buf, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Algorithm.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews n = uint8_fromregion(&sr);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_consume(&sr, 1);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf), "%u ", n);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(str_totext(buf, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Digest type.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews n = uint8_fromregion(&sr);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_consume(&sr, 1);
ad1317338af79edad878c9c3e4361798503310baMark Andrews snprintf(buf, sizeof(buf), "%u", n);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(str_totext(buf, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews /*
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews * Digest.
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews */
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(str_totext(" (", target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(str_totext(tctx->linebreak, target));
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews if ((tctx->flags & DNS_STYLEFLAG_NOCRYPTO) == 0) {
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews if (tctx->width == 0) /* No splitting */
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews RETERR(isc_hex_totext(&sr, 0, "", target));
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews else
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews RETERR(isc_hex_totext(&sr, tctx->width - 2,
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews tctx->linebreak, target));
21c8938824a2445bc750ba9c395a0d857f50ad72Tinderbox User } else
75ae74f8fd0847817bce2db7c868b179db67f019Mark Andrews RETERR(str_totext("[omitted]", target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(str_totext(" )", target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (ISC_R_SUCCESS);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewstotext_ds(ARGS_TOTEXT) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(rdata->type == dns_rdatatype_ds);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews return (generic_totext_ds(rdata, tctx, target));
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews}
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsgeneric_fromwire_ds(ARGS_FROMWIRE) {
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews isc_region_t sr;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(type);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(rdclass);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(dctx);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(options);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_buffer_activeregion(source, &sr);
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews /*
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews * Check digest lengths if we know them.
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews */
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews if (sr.length < 4 ||
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews (sr.base[3] == DNS_DSDIGEST_SHA1 &&
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews sr.length < 4 + ISC_SHA1_DIGESTLENGTH) ||
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews (sr.base[3] == DNS_DSDIGEST_SHA256 &&
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews sr.length < 4 + ISC_SHA256_DIGESTLENGTH) ||
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#ifdef ISC_GOST_DIGESTLENGTH
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews (sr.base[3] == DNS_DSDIGEST_GOST &&
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews sr.length < 4 + ISC_GOST_DIGESTLENGTH) ||
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#endif
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews (sr.base[3] == DNS_DSDIGEST_SHA384 &&
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews sr.length < 4 + ISC_SHA384_DIGESTLENGTH))
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (ISC_R_UNEXPECTEDEND);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews /*
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews * Only copy digest lengths if we know them.
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews * If there is extra data dns_rdata_fromwire() will
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews * detect that.
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews */
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews if (sr.base[3] == DNS_DSDIGEST_SHA1)
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews sr.length = 4 + ISC_SHA1_DIGESTLENGTH;
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews else if (sr.base[3] == DNS_DSDIGEST_SHA256)
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews sr.length = 4 + ISC_SHA256_DIGESTLENGTH;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#ifdef ISC_GOST_DIGESTLENGTH
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews else if (sr.base[3] == DNS_DSDIGEST_GOST)
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews sr.length = 4 + ISC_GOST_DIGESTLENGTH;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#endif
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews else if (sr.base[3] == DNS_DSDIGEST_SHA384)
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews sr.length = 4 + ISC_SHA384_DIGESTLENGTH;
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_buffer_forward(source, sr.length);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (mem_tobuffer(target, sr.base, sr.length));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsfromwire_ds(ARGS_FROMWIRE) {
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(type == dns_rdatatype_ds);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews return (generic_fromwire_ds(rdclass, type, source, dctx, options,
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews target));
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews}
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewstowire_ds(ARGS_TOWIRE) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_t sr;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_ds);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata->length != 0);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(cctx);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_toregion(rdata, &sr);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (mem_tobuffer(target, sr.base, sr.length));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline int
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewscompare_ds(ARGS_COMPARE) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_t r1;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_t r2;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata1->type == rdata2->type);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata1->rdclass == rdata2->rdclass);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata1->type == dns_rdatatype_ds);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata1->length != 0);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata2->length != 0);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_toregion(rdata1, &r1);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_toregion(rdata2, &r2);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (isc_region_compare(&r1, &r2));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsgeneric_fromstruct_ds(ARGS_FROMSTRUCT) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_ds_t *ds = source;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(source != NULL);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(ds->common.rdtype == type);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(ds->common.rdclass == rdclass);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews UNUSED(type);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews UNUSED(rdclass);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews switch (ds->digest_type) {
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews case DNS_DSDIGEST_SHA1:
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews REQUIRE(ds->length == ISC_SHA1_DIGESTLENGTH);
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews break;
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews case DNS_DSDIGEST_SHA256:
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews REQUIRE(ds->length == ISC_SHA256_DIGESTLENGTH);
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews break;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#ifdef ISC_GOST_DIGESTLENGTH
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews case DNS_DSDIGEST_GOST:
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews REQUIRE(ds->length == ISC_GOST_DIGESTLENGTH);
37dee1ff94960a61243f611c0f87f8c316815c53Mark Andrews break;
ba751492fcc4f161a18b983d4f018a1a52938cb9Evan Hunt#endif
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews case DNS_DSDIGEST_SHA384:
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews REQUIRE(ds->length == ISC_SHA384_DIGESTLENGTH);
aaaf8d4f4873d21e55c3ffb4f656203d08339865Mark Andrews break;
394f4aec2189750d7f861d00f97fe28ffcd9f659Mark Andrews }
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(uint16_tobuffer(ds->key_tag, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(uint8_tobuffer(ds->algorithm, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews RETERR(uint8_tobuffer(ds->digest_type, target));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (mem_tobuffer(target, ds->digest, ds->length));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsfromstruct_ds(ARGS_FROMSTRUCT) {
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(type == dns_rdatatype_ds);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews return (generic_fromstruct_ds(rdclass, type, source, target));
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews}
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsgeneric_tostruct_ds(ARGS_TOSTRUCT) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_ds_t *ds = target;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_t region;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(target != NULL);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(rdata->length != 0);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(ds->common.rdtype == rdata->type);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(ds->common.rdclass == rdata->rdclass);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(!ISC_LINK_LINKED(&ds->common, link));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_toregion(rdata, &region);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->key_tag = uint16_fromregion(&region);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_consume(&region, 2);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->algorithm = uint8_fromregion(&region);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_consume(&region, 1);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->digest_type = uint8_fromregion(&region);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_consume(&region, 1);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->length = region.length;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->digest = mem_maybedup(mctx, region.base, region.length);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews if (ds->digest == NULL)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (ISC_R_NOMEMORY);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->mctx = mctx;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (ISC_R_SUCCESS);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewsstatic inline isc_result_t
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrewstostruct_ds(ARGS_TOSTRUCT) {
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews dns_rdata_ds_t *ds = target;
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(rdata->type == dns_rdatatype_ds);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews REQUIRE(target != NULL);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews ds->common.rdclass = rdata->rdclass;
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews ds->common.rdtype = rdata->type;
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews ISC_LINK_INIT(&ds->common, link);
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews return (generic_tostruct_ds(rdata, target, mctx));
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews}
3dd63ba00f91f4d54ba45ba1831375950758c0a7Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline void
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsfreestruct_ds(ARGS_FREESTRUCT) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_ds_t *ds = source;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews REQUIRE(ds != NULL);
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(ds->common.rdtype == dns_rdatatype_ds);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews if (ds->mctx == NULL)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews if (ds->digest != NULL)
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_mem_free(ds->mctx, ds->digest);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews ds->mctx = NULL;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsadditionaldata_ds(ARGS_ADDLDATA) {
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_ds);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(rdata);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(add);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews UNUSED(arg);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return (ISC_R_SUCCESS);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsstatic inline isc_result_t
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrewsdigest_ds(ARGS_DIGEST) {
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews isc_region_t r;
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_ds);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews dns_rdata_toregion(rdata, &r);
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews return ((digest)(arg, &r));
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews}
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewsstatic inline isc_boolean_t
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewscheckowner_ds(ARGS_CHECKOWNER) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(type == dns_rdatatype_ds);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(name);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(type);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(rdclass);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(wildcard);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews return (ISC_TRUE);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews}
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewsstatic inline isc_boolean_t
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrewschecknames_ds(ARGS_CHECKNAMES) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman REQUIRE(rdata->type == dns_rdatatype_ds);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(rdata);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(owner);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews UNUSED(bad);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews return (ISC_TRUE);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews}
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrewsstatic inline int
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrewscasecompare_ds(ARGS_COMPARE) {
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews return (compare_ds(rdata1, rdata2));
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews}
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews
0b09763c354ec91fb352b6b4cea383bd0195b2d8Mark Andrews#endif /* RDATA_GENERIC_DS_43_C */