2 * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
19 /* draft-ietf-dane-protocol-19.txt */
21 #ifndef RDATA_GENERIC_TLSA_52_C
22 #define RDATA_GENERIC_TLSA_52_C
24 #define RRTYPE_TLSA_ATTRIBUTES 0
26 static inline isc_result_t
27 fromtext_tlsa(ARGS_FROMTEXT) {
41 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
43 if (token.value.as_ulong > 0xffU)
45 RETERR(uint8_tobuffer(token.value.as_ulong, target));
50 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
52 if (token.value.as_ulong > 0xffU)
54 RETERR(uint8_tobuffer(token.value.as_ulong, target));
59 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
61 if (token.value.as_ulong > 0xffU)
63 RETERR(uint8_tobuffer(token.value.as_ulong, target));
66 * Certificate Association Data.
68 return (isc_hex_tobuffer(lexer, target, -1));
71 static inline isc_result_t
72 totext_tlsa(ARGS_TOTEXT) {
74 char buf[sizeof("64000 ")];
77 REQUIRE(rdata->type == 52);
78 REQUIRE(rdata->length != 0);
82 dns_rdata_toregion(rdata, &sr);
87 n = uint8_fromregion(&sr);
88 isc_region_consume(&sr, 1);
89 sprintf(buf, "%u ", n);
90 RETERR(str_totext(buf, target));
95 n = uint8_fromregion(&sr);
96 isc_region_consume(&sr, 1);
97 sprintf(buf, "%u ", n);
98 RETERR(str_totext(buf, target));
103 n = uint8_fromregion(&sr);
104 isc_region_consume(&sr, 1);
105 sprintf(buf, "%u", n);
106 RETERR(str_totext(buf, target));
109 * Certificate Association Data.
111 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
112 RETERR(str_totext(" (", target));
113 RETERR(str_totext(tctx->linebreak, target));
114 if (tctx->width == 0) /* No splitting */
115 RETERR(isc_hex_totext(&sr, 0, "", target));
117 RETERR(isc_hex_totext(&sr, tctx->width - 2,
118 tctx->linebreak, target));
119 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
120 RETERR(str_totext(" )", target));
121 return (ISC_R_SUCCESS);
124 static inline isc_result_t
125 fromwire_tlsa(ARGS_FROMWIRE) {
135 isc_buffer_activeregion(source, &sr);
138 return (ISC_R_UNEXPECTEDEND);
140 isc_buffer_forward(source, sr.length);
141 return (mem_tobuffer(target, sr.base, sr.length));
144 static inline isc_result_t
145 towire_tlsa(ARGS_TOWIRE) {
148 REQUIRE(rdata->type == 52);
149 REQUIRE(rdata->length != 0);
153 dns_rdata_toregion(rdata, &sr);
154 return (mem_tobuffer(target, sr.base, sr.length));
158 compare_tlsa(ARGS_COMPARE) {
162 REQUIRE(rdata1->type == rdata2->type);
163 REQUIRE(rdata1->rdclass == rdata2->rdclass);
164 REQUIRE(rdata1->type == 52);
165 REQUIRE(rdata1->length != 0);
166 REQUIRE(rdata2->length != 0);
168 dns_rdata_toregion(rdata1, &r1);
169 dns_rdata_toregion(rdata2, &r2);
170 return (isc_region_compare(&r1, &r2));
173 static inline isc_result_t
174 fromstruct_tlsa(ARGS_FROMSTRUCT) {
175 dns_rdata_tlsa_t *tlsa = source;
178 REQUIRE(source != NULL);
179 REQUIRE(tlsa->common.rdtype == type);
180 REQUIRE(tlsa->common.rdclass == rdclass);
185 RETERR(uint8_tobuffer(tlsa->usage, target));
186 RETERR(uint8_tobuffer(tlsa->selector, target));
187 RETERR(uint8_tobuffer(tlsa->match, target));
189 return (mem_tobuffer(target, tlsa->data, tlsa->length));
192 static inline isc_result_t
193 tostruct_tlsa(ARGS_TOSTRUCT) {
194 dns_rdata_tlsa_t *tlsa = target;
197 REQUIRE(rdata->type == 52);
198 REQUIRE(target != NULL);
199 REQUIRE(rdata->length != 0);
201 tlsa->common.rdclass = rdata->rdclass;
202 tlsa->common.rdtype = rdata->type;
203 ISC_LINK_INIT(&tlsa->common, link);
205 dns_rdata_toregion(rdata, ®ion);
207 tlsa->usage = uint8_fromregion(®ion);
208 isc_region_consume(®ion, 1);
209 tlsa->selector = uint8_fromregion(®ion);
210 isc_region_consume(®ion, 1);
211 tlsa->match = uint8_fromregion(®ion);
212 isc_region_consume(®ion, 1);
213 tlsa->length = region.length;
215 tlsa->data = mem_maybedup(mctx, region.base, region.length);
216 if (tlsa->data == NULL)
217 return (ISC_R_NOMEMORY);
220 return (ISC_R_SUCCESS);
224 freestruct_tlsa(ARGS_FREESTRUCT) {
225 dns_rdata_tlsa_t *tlsa = source;
227 REQUIRE(tlsa != NULL);
228 REQUIRE(tlsa->common.rdtype == 52);
230 if (tlsa->mctx == NULL)
233 if (tlsa->data != NULL)
234 isc_mem_free(tlsa->mctx, tlsa->data);
238 static inline isc_result_t
239 additionaldata_tlsa(ARGS_ADDLDATA) {
240 REQUIRE(rdata->type == 52);
246 return (ISC_R_SUCCESS);
249 static inline isc_result_t
250 digest_tlsa(ARGS_DIGEST) {
253 REQUIRE(rdata->type == 52);
255 dns_rdata_toregion(rdata, &r);
257 return ((digest)(arg, &r));
260 static inline isc_boolean_t
261 checkowner_tlsa(ARGS_CHECKOWNER) {
273 static inline isc_boolean_t
274 checknames_tlsa(ARGS_CHECKNAMES) {
276 REQUIRE(rdata->type == 52);
286 casecompare_tlsa(ARGS_COMPARE) {
287 return (compare_tlsa(rdata1, rdata2));
290 #endif /* RDATA_GENERIC_TLSA_52_C */