2 * Copyright (C) 2009, 2011-2013 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 (0)
26 static inline isc_result_t
27 fromtext_keydata(ARGS_FROMTEXT) {
33 isc_uint32_t refresh, addhd, removehd;
35 REQUIRE(type == 65533);
44 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
46 RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &refresh));
47 RETERR(uint32_tobuffer(refresh, target));
50 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
52 RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &addhd));
53 RETERR(uint32_tobuffer(addhd, target));
55 /* remove hold-down */
56 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
58 RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &removehd));
59 RETERR(uint32_tobuffer(removehd, target));
62 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
64 RETTOK(dns_keyflags_fromtext(&flags, &token.value.as_textregion));
65 RETERR(uint16_tobuffer(flags, target));
68 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
70 RETTOK(dns_secproto_fromtext(&proto, &token.value.as_textregion));
71 RETERR(mem_tobuffer(target, &proto, 1));
74 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
76 RETTOK(dns_secalg_fromtext(&alg, &token.value.as_textregion));
77 RETERR(mem_tobuffer(target, &alg, 1));
80 if ((flags & 0xc000) == 0xc000)
81 return (ISC_R_SUCCESS);
83 result = isc_base64_tobuffer(lexer, target, -1);
84 if (result != ISC_R_SUCCESS)
87 /* Ensure there's at least enough data to compute a key ID for MD5 */
88 if (alg == DST_ALG_RSAMD5 && isc_buffer_usedlength(target) < 19)
89 return (ISC_R_UNEXPECTEDEND);
91 return (ISC_R_SUCCESS);
94 static inline isc_result_t
95 totext_keydata(ARGS_TOTEXT) {
97 char buf[sizeof("64000")];
99 unsigned char algorithm;
101 char algbuf[DNS_NAME_FORMATSIZE];
104 REQUIRE(rdata->type == 65533);
106 if ((tctx->flags & DNS_STYLEFLAG_KEYDATA) == 0 || rdata->length < 16)
107 return (unknown_totext(rdata, tctx, target));
109 dns_rdata_toregion(rdata, &sr);
112 when = uint32_fromregion(&sr);
113 isc_region_consume(&sr, 4);
114 RETERR(dns_time32_totext(when, target));
115 RETERR(str_totext(" ", target));
118 when = uint32_fromregion(&sr);
119 isc_region_consume(&sr, 4);
120 RETERR(dns_time32_totext(when, target));
121 RETERR(str_totext(" ", target));
123 /* remove hold-down */
124 when = uint32_fromregion(&sr);
125 isc_region_consume(&sr, 4);
126 RETERR(dns_time32_totext(when, target));
127 RETERR(str_totext(" ", target));
130 flags = uint16_fromregion(&sr);
131 isc_region_consume(&sr, 2);
132 sprintf(buf, "%u", flags);
133 RETERR(str_totext(buf, target));
134 RETERR(str_totext(" ", target));
135 if ((flags & DNS_KEYFLAG_KSK) != 0) {
136 if (flags & DNS_KEYFLAG_REVOKE)
137 keyinfo = "revoked KSK";
144 sprintf(buf, "%u", sr.base[0]);
145 isc_region_consume(&sr, 1);
146 RETERR(str_totext(buf, target));
147 RETERR(str_totext(" ", target));
150 algorithm = sr.base[0];
151 sprintf(buf, "%u", algorithm);
152 isc_region_consume(&sr, 1);
153 RETERR(str_totext(buf, target));
156 if ((flags & 0xc000) == 0xc000)
157 return (ISC_R_SUCCESS);
160 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
161 RETERR(str_totext(" (", target));
162 RETERR(str_totext(tctx->linebreak, target));
163 if (tctx->width == 0) /* No splitting */
164 RETERR(isc_base64_totext(&sr, 60, "", target));
166 RETERR(isc_base64_totext(&sr, tctx->width - 2,
167 tctx->linebreak, target));
169 if ((tctx->flags & DNS_STYLEFLAG_RRCOMMENT) != 0)
170 RETERR(str_totext(tctx->linebreak, target));
171 else if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
172 RETERR(str_totext(" ", target));
174 if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
175 RETERR(str_totext(")", target));
177 if ((tctx->flags & DNS_STYLEFLAG_RRCOMMENT) != 0) {
180 RETERR(str_totext(" ; ", target));
181 RETERR(str_totext(keyinfo, target));
182 dns_secalg_format((dns_secalg_t) algorithm, algbuf,
184 RETERR(str_totext("; alg = ", target));
185 RETERR(str_totext(algbuf, target));
186 RETERR(str_totext("; key id = ", target));
187 dns_rdata_toregion(rdata, &tmpr);
188 /* Skip over refresh, addhd, and removehd */
189 isc_region_consume(&tmpr, 12);
190 sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
191 RETERR(str_totext(buf, target));
193 return (ISC_R_SUCCESS);
196 static inline isc_result_t
197 fromwire_keydata(ARGS_FROMWIRE) {
200 REQUIRE(type == 65533);
207 isc_buffer_activeregion(source, &sr);
208 isc_buffer_forward(source, sr.length);
209 return (mem_tobuffer(target, sr.base, sr.length));
212 static inline isc_result_t
213 towire_keydata(ARGS_TOWIRE) {
216 REQUIRE(rdata->type == 65533);
220 dns_rdata_toregion(rdata, &sr);
221 return (mem_tobuffer(target, sr.base, sr.length));
225 compare_keydata(ARGS_COMPARE) {
229 REQUIRE(rdata1->type == rdata2->type);
230 REQUIRE(rdata1->rdclass == rdata2->rdclass);
231 REQUIRE(rdata1->type == 65533);
233 dns_rdata_toregion(rdata1, &r1);
234 dns_rdata_toregion(rdata2, &r2);
235 return (isc_region_compare(&r1, &r2));
238 static inline isc_result_t
239 fromstruct_keydata(ARGS_FROMSTRUCT) {
240 dns_rdata_keydata_t *keydata = source;
242 REQUIRE(type == 65533);
243 REQUIRE(source != NULL);
244 REQUIRE(keydata->common.rdtype == type);
245 REQUIRE(keydata->common.rdclass == rdclass);
251 RETERR(uint32_tobuffer(keydata->refresh, target));
254 RETERR(uint32_tobuffer(keydata->addhd, target));
256 /* Remove hold-down */
257 RETERR(uint32_tobuffer(keydata->removehd, target));
260 RETERR(uint16_tobuffer(keydata->flags, target));
263 RETERR(uint8_tobuffer(keydata->protocol, target));
266 RETERR(uint8_tobuffer(keydata->algorithm, target));
269 return (mem_tobuffer(target, keydata->data, keydata->datalen));
272 static inline isc_result_t
273 tostruct_keydata(ARGS_TOSTRUCT) {
274 dns_rdata_keydata_t *keydata = target;
277 REQUIRE(rdata->type == 65533);
278 REQUIRE(target != NULL);
280 keydata->common.rdclass = rdata->rdclass;
281 keydata->common.rdtype = rdata->type;
282 ISC_LINK_INIT(&keydata->common, link);
284 dns_rdata_toregion(rdata, &sr);
288 return (ISC_R_UNEXPECTEDEND);
289 keydata->refresh = uint32_fromregion(&sr);
290 isc_region_consume(&sr, 4);
294 return (ISC_R_UNEXPECTEDEND);
295 keydata->addhd = uint32_fromregion(&sr);
296 isc_region_consume(&sr, 4);
298 /* Remove hold-down */
300 return (ISC_R_UNEXPECTEDEND);
301 keydata->removehd = uint32_fromregion(&sr);
302 isc_region_consume(&sr, 4);
306 return (ISC_R_UNEXPECTEDEND);
307 keydata->flags = uint16_fromregion(&sr);
308 isc_region_consume(&sr, 2);
312 return (ISC_R_UNEXPECTEDEND);
313 keydata->protocol = uint8_fromregion(&sr);
314 isc_region_consume(&sr, 1);
318 return (ISC_R_UNEXPECTEDEND);
319 keydata->algorithm = uint8_fromregion(&sr);
320 isc_region_consume(&sr, 1);
323 keydata->datalen = sr.length;
324 keydata->data = mem_maybedup(mctx, sr.base, keydata->datalen);
325 if (keydata->data == NULL)
326 return (ISC_R_NOMEMORY);
328 keydata->mctx = mctx;
329 return (ISC_R_SUCCESS);
333 freestruct_keydata(ARGS_FREESTRUCT) {
334 dns_rdata_keydata_t *keydata = (dns_rdata_keydata_t *) source;
336 REQUIRE(source != NULL);
337 REQUIRE(keydata->common.rdtype == 65533);
339 if (keydata->mctx == NULL)
342 if (keydata->data != NULL)
343 isc_mem_free(keydata->mctx, keydata->data);
344 keydata->mctx = NULL;
347 static inline isc_result_t
348 additionaldata_keydata(ARGS_ADDLDATA) {
349 REQUIRE(rdata->type == 65533);
355 return (ISC_R_SUCCESS);
358 static inline isc_result_t
359 digest_keydata(ARGS_DIGEST) {
362 REQUIRE(rdata->type == 65533);
364 dns_rdata_toregion(rdata, &r);
366 return ((digest)(arg, &r));
369 static inline isc_boolean_t
370 checkowner_keydata(ARGS_CHECKOWNER) {
372 REQUIRE(type == 65533);
382 static inline isc_boolean_t
383 checknames_keydata(ARGS_CHECKNAMES) {
385 REQUIRE(rdata->type == 65533);
395 casecompare_keydata(ARGS_COMPARE) {
396 return (compare_keydata(rdata1, rdata2));
399 #endif /* GENERIC_KEYDATA_65533_C */