2 * Copyright (C) 2009, 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 #ifndef GENERIC_KEYDATA_65533_C
20 #define GENERIC_KEYDATA_65533_C 1
24 #define RRTYPE_KEYDATA_ATTRIBUTES (DNS_RDATATYPEATTR_DNSSEC)
26 static inline isc_result_t
27 fromtext_keydata(ARGS_FROMTEXT) {
32 isc_uint32_t refresh, addhd, removehd;
34 REQUIRE(type == 65533);
43 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
45 RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &refresh));
46 RETERR(uint32_tobuffer(refresh, target));
49 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
51 RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &addhd));
52 RETERR(uint32_tobuffer(addhd, target));
54 /* remove hold-down */
55 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
57 RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &removehd));
58 RETERR(uint32_tobuffer(removehd, target));
61 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
63 RETTOK(dns_keyflags_fromtext(&flags, &token.value.as_textregion));
64 RETERR(uint16_tobuffer(flags, target));
67 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
69 RETTOK(dns_secproto_fromtext(&proto, &token.value.as_textregion));
70 RETERR(mem_tobuffer(target, &proto, 1));
73 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
75 RETTOK(dns_secalg_fromtext(&alg, &token.value.as_textregion));
76 RETERR(mem_tobuffer(target, &alg, 1));
79 if ((flags & 0xc000) == 0xc000)
80 return (ISC_R_SUCCESS);
82 return (isc_base64_tobuffer(lexer, target, -1));
85 static inline isc_result_t
86 totext_keydata(ARGS_TOTEXT) {
88 char buf[sizeof("64000")];
90 unsigned char algorithm;
93 REQUIRE(rdata->type == 65533);
94 REQUIRE(rdata->length != 0);
96 dns_rdata_toregion(rdata, &sr);
99 when = uint32_fromregion(&sr);
100 isc_region_consume(&sr, 4);
101 RETERR(dns_time32_totext(when, target));
102 RETERR(str_totext(" ", target));
105 when = uint32_fromregion(&sr);
106 isc_region_consume(&sr, 4);
107 RETERR(dns_time32_totext(when, target));
108 RETERR(str_totext(" ", target));
110 /* remove hold-down */
111 when = uint32_fromregion(&sr);
112 isc_region_consume(&sr, 4);
113 RETERR(dns_time32_totext(when, target));
114 RETERR(str_totext(" ", target));
117 flags = uint16_fromregion(&sr);
118 isc_region_consume(&sr, 2);
119 sprintf(buf, "%u", flags);
120 RETERR(str_totext(buf, target));
121 RETERR(str_totext(" ", target));
124 sprintf(buf, "%u", sr.base[0]);
125 isc_region_consume(&sr, 1);
126 RETERR(str_totext(buf, target));
127 RETERR(str_totext(" ", target));
130 algorithm = sr.base[0];
131 sprintf(buf, "%u", algorithm);
132 isc_region_consume(&sr, 1);
133 RETERR(str_totext(buf, target));
136 if ((flags & 0xc000) == 0xc000)
137 return (ISC_R_SUCCESS);
140 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
141 RETERR(str_totext(" (", target));
142 RETERR(str_totext(tctx->linebreak, target));
143 RETERR(isc_base64_totext(&sr, tctx->width - 2,
144 tctx->linebreak, target));
146 if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0)
147 RETERR(str_totext(tctx->linebreak, target));
148 else if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
149 RETERR(str_totext(" ", target));
151 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
152 RETERR(str_totext(")", target));
154 if ((tctx->flags & DNS_STYLEFLAG_COMMENT) != 0) {
157 RETERR(str_totext(" ; key id = ", target));
158 dns_rdata_toregion(rdata, &tmpr);
159 /* Skip over refresh, addhd, and removehd */
160 isc_region_consume(&tmpr, 12);
161 sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
162 RETERR(str_totext(buf, target));
164 return (ISC_R_SUCCESS);
167 static inline isc_result_t
168 fromwire_keydata(ARGS_FROMWIRE) {
171 REQUIRE(type == 65533);
178 isc_buffer_activeregion(source, &sr);
180 return (ISC_R_UNEXPECTEDEND);
182 isc_buffer_forward(source, sr.length);
183 return (mem_tobuffer(target, sr.base, sr.length));
186 static inline isc_result_t
187 towire_keydata(ARGS_TOWIRE) {
190 REQUIRE(rdata->type == 65533);
191 REQUIRE(rdata->length != 0);
195 dns_rdata_toregion(rdata, &sr);
196 return (mem_tobuffer(target, sr.base, sr.length));
200 compare_keydata(ARGS_COMPARE) {
204 REQUIRE(rdata1->type == rdata2->type);
205 REQUIRE(rdata1->rdclass == rdata2->rdclass);
206 REQUIRE(rdata1->type == 65533);
207 REQUIRE(rdata1->length != 0);
208 REQUIRE(rdata2->length != 0);
210 dns_rdata_toregion(rdata1, &r1);
211 dns_rdata_toregion(rdata2, &r2);
212 return (isc_region_compare(&r1, &r2));
215 static inline isc_result_t
216 fromstruct_keydata(ARGS_FROMSTRUCT) {
217 dns_rdata_keydata_t *keydata = source;
219 REQUIRE(type == 65533);
220 REQUIRE(source != NULL);
221 REQUIRE(keydata->common.rdtype == type);
222 REQUIRE(keydata->common.rdclass == rdclass);
228 RETERR(uint32_tobuffer(keydata->refresh, target));
231 RETERR(uint32_tobuffer(keydata->addhd, target));
233 /* Remove hold-down */
234 RETERR(uint32_tobuffer(keydata->removehd, target));
237 RETERR(uint16_tobuffer(keydata->flags, target));
240 RETERR(uint8_tobuffer(keydata->protocol, target));
243 RETERR(uint8_tobuffer(keydata->algorithm, target));
246 return (mem_tobuffer(target, keydata->data, keydata->datalen));
249 static inline isc_result_t
250 tostruct_keydata(ARGS_TOSTRUCT) {
251 dns_rdata_keydata_t *keydata = target;
254 REQUIRE(rdata->type == 65533);
255 REQUIRE(target != NULL);
256 REQUIRE(rdata->length != 0);
258 keydata->common.rdclass = rdata->rdclass;
259 keydata->common.rdtype = rdata->type;
260 ISC_LINK_INIT(&keydata->common, link);
262 dns_rdata_toregion(rdata, &sr);
266 return (ISC_R_UNEXPECTEDEND);
267 keydata->refresh = uint32_fromregion(&sr);
268 isc_region_consume(&sr, 4);
272 return (ISC_R_UNEXPECTEDEND);
273 keydata->addhd = uint32_fromregion(&sr);
274 isc_region_consume(&sr, 4);
276 /* Remove hold-down */
278 return (ISC_R_UNEXPECTEDEND);
279 keydata->removehd = uint32_fromregion(&sr);
280 isc_region_consume(&sr, 4);
284 return (ISC_R_UNEXPECTEDEND);
285 keydata->flags = uint16_fromregion(&sr);
286 isc_region_consume(&sr, 2);
290 return (ISC_R_UNEXPECTEDEND);
291 keydata->protocol = uint8_fromregion(&sr);
292 isc_region_consume(&sr, 1);
296 return (ISC_R_UNEXPECTEDEND);
297 keydata->algorithm = uint8_fromregion(&sr);
298 isc_region_consume(&sr, 1);
301 keydata->datalen = sr.length;
302 keydata->data = mem_maybedup(mctx, sr.base, keydata->datalen);
303 if (keydata->data == NULL)
304 return (ISC_R_NOMEMORY);
306 keydata->mctx = mctx;
307 return (ISC_R_SUCCESS);
311 freestruct_keydata(ARGS_FREESTRUCT) {
312 dns_rdata_keydata_t *keydata = (dns_rdata_keydata_t *) source;
314 REQUIRE(source != NULL);
315 REQUIRE(keydata->common.rdtype == 65533);
317 if (keydata->mctx == NULL)
320 if (keydata->data != NULL)
321 isc_mem_free(keydata->mctx, keydata->data);
322 keydata->mctx = NULL;
325 static inline isc_result_t
326 additionaldata_keydata(ARGS_ADDLDATA) {
327 REQUIRE(rdata->type == 65533);
333 return (ISC_R_SUCCESS);
336 static inline isc_result_t
337 digest_keydata(ARGS_DIGEST) {
340 REQUIRE(rdata->type == 65533);
342 dns_rdata_toregion(rdata, &r);
344 return ((digest)(arg, &r));
347 static inline isc_boolean_t
348 checkowner_keydata(ARGS_CHECKOWNER) {
350 REQUIRE(type == 65533);
360 static inline isc_boolean_t
361 checknames_keydata(ARGS_CHECKNAMES) {
363 REQUIRE(rdata->type == 65533);
373 casecompare_keydata(ARGS_COMPARE) {
374 return (compare_keydata(rdata1, rdata2));
377 #endif /* GENERIC_KEYDATA_65533_C */