1*00b67f09SDavid van Moolenbroek /* $NetBSD: keydata_65533.c,v 1.8 2015/07/08 17:28:59 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2009, 2011-2013, 2015 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek *
6*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek *
10*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek */
18*00b67f09SDavid van Moolenbroek
19*00b67f09SDavid van Moolenbroek #ifndef GENERIC_KEYDATA_65533_C
20*00b67f09SDavid van Moolenbroek #define GENERIC_KEYDATA_65533_C 1
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <isc/time.h>
23*00b67f09SDavid van Moolenbroek #include <isc/stdtime.h>
24*00b67f09SDavid van Moolenbroek
25*00b67f09SDavid van Moolenbroek #include <dst/dst.h>
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #define RRTYPE_KEYDATA_ATTRIBUTES (0)
28*00b67f09SDavid van Moolenbroek
29*00b67f09SDavid van Moolenbroek static inline isc_result_t
fromtext_keydata(ARGS_FROMTEXT)30*00b67f09SDavid van Moolenbroek fromtext_keydata(ARGS_FROMTEXT) {
31*00b67f09SDavid van Moolenbroek isc_result_t result;
32*00b67f09SDavid van Moolenbroek isc_token_t token;
33*00b67f09SDavid van Moolenbroek dns_secalg_t alg;
34*00b67f09SDavid van Moolenbroek dns_secproto_t proto;
35*00b67f09SDavid van Moolenbroek dns_keyflags_t flags;
36*00b67f09SDavid van Moolenbroek isc_uint32_t refresh, addhd, removehd;
37*00b67f09SDavid van Moolenbroek
38*00b67f09SDavid van Moolenbroek REQUIRE(type == 65533);
39*00b67f09SDavid van Moolenbroek
40*00b67f09SDavid van Moolenbroek UNUSED(type);
41*00b67f09SDavid van Moolenbroek UNUSED(rdclass);
42*00b67f09SDavid van Moolenbroek UNUSED(origin);
43*00b67f09SDavid van Moolenbroek UNUSED(options);
44*00b67f09SDavid van Moolenbroek UNUSED(callbacks);
45*00b67f09SDavid van Moolenbroek
46*00b67f09SDavid van Moolenbroek /* refresh timer */
47*00b67f09SDavid van Moolenbroek RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
48*00b67f09SDavid van Moolenbroek ISC_FALSE));
49*00b67f09SDavid van Moolenbroek RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &refresh));
50*00b67f09SDavid van Moolenbroek RETERR(uint32_tobuffer(refresh, target));
51*00b67f09SDavid van Moolenbroek
52*00b67f09SDavid van Moolenbroek /* add hold-down */
53*00b67f09SDavid van Moolenbroek RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
54*00b67f09SDavid van Moolenbroek ISC_FALSE));
55*00b67f09SDavid van Moolenbroek RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &addhd));
56*00b67f09SDavid van Moolenbroek RETERR(uint32_tobuffer(addhd, target));
57*00b67f09SDavid van Moolenbroek
58*00b67f09SDavid van Moolenbroek /* remove hold-down */
59*00b67f09SDavid van Moolenbroek RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
60*00b67f09SDavid van Moolenbroek ISC_FALSE));
61*00b67f09SDavid van Moolenbroek RETTOK(dns_time32_fromtext(DNS_AS_STR(token), &removehd));
62*00b67f09SDavid van Moolenbroek RETERR(uint32_tobuffer(removehd, target));
63*00b67f09SDavid van Moolenbroek
64*00b67f09SDavid van Moolenbroek /* flags */
65*00b67f09SDavid van Moolenbroek RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
66*00b67f09SDavid van Moolenbroek ISC_FALSE));
67*00b67f09SDavid van Moolenbroek RETTOK(dns_keyflags_fromtext(&flags, &token.value.as_textregion));
68*00b67f09SDavid van Moolenbroek RETERR(uint16_tobuffer(flags, target));
69*00b67f09SDavid van Moolenbroek
70*00b67f09SDavid van Moolenbroek /* protocol */
71*00b67f09SDavid van Moolenbroek RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
72*00b67f09SDavid van Moolenbroek ISC_FALSE));
73*00b67f09SDavid van Moolenbroek RETTOK(dns_secproto_fromtext(&proto, &token.value.as_textregion));
74*00b67f09SDavid van Moolenbroek RETERR(mem_tobuffer(target, &proto, 1));
75*00b67f09SDavid van Moolenbroek
76*00b67f09SDavid van Moolenbroek /* algorithm */
77*00b67f09SDavid van Moolenbroek RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
78*00b67f09SDavid van Moolenbroek ISC_FALSE));
79*00b67f09SDavid van Moolenbroek RETTOK(dns_secalg_fromtext(&alg, &token.value.as_textregion));
80*00b67f09SDavid van Moolenbroek RETERR(mem_tobuffer(target, &alg, 1));
81*00b67f09SDavid van Moolenbroek
82*00b67f09SDavid van Moolenbroek /* No Key? */
83*00b67f09SDavid van Moolenbroek if ((flags & 0xc000) == 0xc000)
84*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
85*00b67f09SDavid van Moolenbroek
86*00b67f09SDavid van Moolenbroek result = isc_base64_tobuffer(lexer, target, -1);
87*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS)
88*00b67f09SDavid van Moolenbroek return (result);
89*00b67f09SDavid van Moolenbroek
90*00b67f09SDavid van Moolenbroek /* Ensure there's at least enough data to compute a key ID for MD5 */
91*00b67f09SDavid van Moolenbroek if (alg == DST_ALG_RSAMD5 && isc_buffer_usedlength(target) < 19)
92*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
93*00b67f09SDavid van Moolenbroek
94*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
95*00b67f09SDavid van Moolenbroek }
96*00b67f09SDavid van Moolenbroek
97*00b67f09SDavid van Moolenbroek static inline isc_result_t
totext_keydata(ARGS_TOTEXT)98*00b67f09SDavid van Moolenbroek totext_keydata(ARGS_TOTEXT) {
99*00b67f09SDavid van Moolenbroek isc_region_t sr;
100*00b67f09SDavid van Moolenbroek char buf[sizeof("64000")];
101*00b67f09SDavid van Moolenbroek unsigned int flags;
102*00b67f09SDavid van Moolenbroek unsigned char algorithm;
103*00b67f09SDavid van Moolenbroek unsigned long refresh, add, remove;
104*00b67f09SDavid van Moolenbroek char algbuf[DNS_NAME_FORMATSIZE];
105*00b67f09SDavid van Moolenbroek const char *keyinfo;
106*00b67f09SDavid van Moolenbroek
107*00b67f09SDavid van Moolenbroek REQUIRE(rdata->type == 65533);
108*00b67f09SDavid van Moolenbroek
109*00b67f09SDavid van Moolenbroek if ((tctx->flags & DNS_STYLEFLAG_KEYDATA) == 0 || rdata->length < 16)
110*00b67f09SDavid van Moolenbroek return (unknown_totext(rdata, tctx, target));
111*00b67f09SDavid van Moolenbroek
112*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata, &sr);
113*00b67f09SDavid van Moolenbroek
114*00b67f09SDavid van Moolenbroek /* refresh timer */
115*00b67f09SDavid van Moolenbroek refresh = uint32_fromregion(&sr);
116*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 4);
117*00b67f09SDavid van Moolenbroek RETERR(dns_time32_totext(refresh, target));
118*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ", target));
119*00b67f09SDavid van Moolenbroek
120*00b67f09SDavid van Moolenbroek /* add hold-down */
121*00b67f09SDavid van Moolenbroek add = uint32_fromregion(&sr);
122*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 4);
123*00b67f09SDavid van Moolenbroek RETERR(dns_time32_totext(add, target));
124*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ", target));
125*00b67f09SDavid van Moolenbroek
126*00b67f09SDavid van Moolenbroek /* remove hold-down */
127*00b67f09SDavid van Moolenbroek remove = uint32_fromregion(&sr);
128*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 4);
129*00b67f09SDavid van Moolenbroek RETERR(dns_time32_totext(remove, target));
130*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ", target));
131*00b67f09SDavid van Moolenbroek
132*00b67f09SDavid van Moolenbroek /* flags */
133*00b67f09SDavid van Moolenbroek flags = uint16_fromregion(&sr);
134*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 2);
135*00b67f09SDavid van Moolenbroek sprintf(buf, "%u", flags);
136*00b67f09SDavid van Moolenbroek RETERR(str_totext(buf, target));
137*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ", target));
138*00b67f09SDavid van Moolenbroek if ((flags & DNS_KEYFLAG_KSK) != 0) {
139*00b67f09SDavid van Moolenbroek if (flags & DNS_KEYFLAG_REVOKE)
140*00b67f09SDavid van Moolenbroek keyinfo = "revoked KSK";
141*00b67f09SDavid van Moolenbroek else
142*00b67f09SDavid van Moolenbroek keyinfo = "KSK";
143*00b67f09SDavid van Moolenbroek } else
144*00b67f09SDavid van Moolenbroek keyinfo = "ZSK";
145*00b67f09SDavid van Moolenbroek
146*00b67f09SDavid van Moolenbroek /* protocol */
147*00b67f09SDavid van Moolenbroek sprintf(buf, "%u", sr.base[0]);
148*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 1);
149*00b67f09SDavid van Moolenbroek RETERR(str_totext(buf, target));
150*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ", target));
151*00b67f09SDavid van Moolenbroek
152*00b67f09SDavid van Moolenbroek /* algorithm */
153*00b67f09SDavid van Moolenbroek algorithm = sr.base[0];
154*00b67f09SDavid van Moolenbroek sprintf(buf, "%u", algorithm);
155*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 1);
156*00b67f09SDavid van Moolenbroek RETERR(str_totext(buf, target));
157*00b67f09SDavid van Moolenbroek
158*00b67f09SDavid van Moolenbroek /* No Key? */
159*00b67f09SDavid van Moolenbroek if ((flags & 0xc000) == 0xc000)
160*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
161*00b67f09SDavid van Moolenbroek
162*00b67f09SDavid van Moolenbroek /* key */
163*00b67f09SDavid van Moolenbroek if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
164*00b67f09SDavid van Moolenbroek RETERR(str_totext(" (", target));
165*00b67f09SDavid van Moolenbroek RETERR(str_totext(tctx->linebreak, target));
166*00b67f09SDavid van Moolenbroek if (tctx->width == 0) /* No splitting */
167*00b67f09SDavid van Moolenbroek RETERR(isc_base64_totext(&sr, 60, "", target));
168*00b67f09SDavid van Moolenbroek else
169*00b67f09SDavid van Moolenbroek RETERR(isc_base64_totext(&sr, tctx->width - 2,
170*00b67f09SDavid van Moolenbroek tctx->linebreak, target));
171*00b67f09SDavid van Moolenbroek
172*00b67f09SDavid van Moolenbroek if ((tctx->flags & DNS_STYLEFLAG_RRCOMMENT) != 0)
173*00b67f09SDavid van Moolenbroek RETERR(str_totext(tctx->linebreak, target));
174*00b67f09SDavid van Moolenbroek else if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
175*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ", target));
176*00b67f09SDavid van Moolenbroek
177*00b67f09SDavid van Moolenbroek if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0)
178*00b67f09SDavid van Moolenbroek RETERR(str_totext(")", target));
179*00b67f09SDavid van Moolenbroek
180*00b67f09SDavid van Moolenbroek if ((tctx->flags & DNS_STYLEFLAG_RRCOMMENT) != 0) {
181*00b67f09SDavid van Moolenbroek isc_region_t tmpr;
182*00b67f09SDavid van Moolenbroek char rbuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
183*00b67f09SDavid van Moolenbroek char abuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
184*00b67f09SDavid van Moolenbroek char dbuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
185*00b67f09SDavid van Moolenbroek isc_time_t t;
186*00b67f09SDavid van Moolenbroek
187*00b67f09SDavid van Moolenbroek RETERR(str_totext(" ; ", target));
188*00b67f09SDavid van Moolenbroek RETERR(str_totext(keyinfo, target));
189*00b67f09SDavid van Moolenbroek dns_secalg_format((dns_secalg_t) algorithm, algbuf,
190*00b67f09SDavid van Moolenbroek sizeof(algbuf));
191*00b67f09SDavid van Moolenbroek RETERR(str_totext("; alg = ", target));
192*00b67f09SDavid van Moolenbroek RETERR(str_totext(algbuf, target));
193*00b67f09SDavid van Moolenbroek RETERR(str_totext("; key id = ", target));
194*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata, &tmpr);
195*00b67f09SDavid van Moolenbroek /* Skip over refresh, addhd, and removehd */
196*00b67f09SDavid van Moolenbroek isc_region_consume(&tmpr, 12);
197*00b67f09SDavid van Moolenbroek sprintf(buf, "%u", dst_region_computeid(&tmpr, algorithm));
198*00b67f09SDavid van Moolenbroek RETERR(str_totext(buf, target));
199*00b67f09SDavid van Moolenbroek
200*00b67f09SDavid van Moolenbroek if ((tctx->flags & DNS_STYLEFLAG_MULTILINE) != 0) {
201*00b67f09SDavid van Moolenbroek isc_stdtime_t now;
202*00b67f09SDavid van Moolenbroek
203*00b67f09SDavid van Moolenbroek isc_stdtime_get(&now);
204*00b67f09SDavid van Moolenbroek
205*00b67f09SDavid van Moolenbroek RETERR(str_totext(tctx->linebreak, target));
206*00b67f09SDavid van Moolenbroek RETERR(str_totext("; next refresh: ", target));
207*00b67f09SDavid van Moolenbroek isc_time_set(&t, refresh, 0);
208*00b67f09SDavid van Moolenbroek isc_time_formathttptimestamp(&t, rbuf, sizeof(rbuf));
209*00b67f09SDavid van Moolenbroek RETERR(str_totext(rbuf, target));
210*00b67f09SDavid van Moolenbroek
211*00b67f09SDavid van Moolenbroek if (add == 0) {
212*00b67f09SDavid van Moolenbroek RETERR(str_totext(tctx->linebreak, target));
213*00b67f09SDavid van Moolenbroek RETERR(str_totext("; no trust", target));
214*00b67f09SDavid van Moolenbroek } else {
215*00b67f09SDavid van Moolenbroek RETERR(str_totext(tctx->linebreak, target));
216*00b67f09SDavid van Moolenbroek if (add < now) {
217*00b67f09SDavid van Moolenbroek RETERR(str_totext("; trusted since: ",
218*00b67f09SDavid van Moolenbroek target));
219*00b67f09SDavid van Moolenbroek } else {
220*00b67f09SDavid van Moolenbroek RETERR(str_totext("; trust pending: ",
221*00b67f09SDavid van Moolenbroek target));
222*00b67f09SDavid van Moolenbroek }
223*00b67f09SDavid van Moolenbroek isc_time_set(&t, add, 0);
224*00b67f09SDavid van Moolenbroek isc_time_formathttptimestamp(&t, abuf,
225*00b67f09SDavid van Moolenbroek sizeof(abuf));
226*00b67f09SDavid van Moolenbroek RETERR(str_totext(abuf, target));
227*00b67f09SDavid van Moolenbroek }
228*00b67f09SDavid van Moolenbroek
229*00b67f09SDavid van Moolenbroek if (remove != 0) {
230*00b67f09SDavid van Moolenbroek RETERR(str_totext(tctx->linebreak, target));
231*00b67f09SDavid van Moolenbroek RETERR(str_totext("; removal pending: ",
232*00b67f09SDavid van Moolenbroek target));
233*00b67f09SDavid van Moolenbroek isc_time_set(&t, remove, 0);
234*00b67f09SDavid van Moolenbroek isc_time_formathttptimestamp(&t, dbuf,
235*00b67f09SDavid van Moolenbroek sizeof(dbuf));
236*00b67f09SDavid van Moolenbroek RETERR(str_totext(dbuf, target));
237*00b67f09SDavid van Moolenbroek }
238*00b67f09SDavid van Moolenbroek }
239*00b67f09SDavid van Moolenbroek
240*00b67f09SDavid van Moolenbroek }
241*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
242*00b67f09SDavid van Moolenbroek }
243*00b67f09SDavid van Moolenbroek
244*00b67f09SDavid van Moolenbroek static inline isc_result_t
fromwire_keydata(ARGS_FROMWIRE)245*00b67f09SDavid van Moolenbroek fromwire_keydata(ARGS_FROMWIRE) {
246*00b67f09SDavid van Moolenbroek isc_region_t sr;
247*00b67f09SDavid van Moolenbroek
248*00b67f09SDavid van Moolenbroek REQUIRE(type == 65533);
249*00b67f09SDavid van Moolenbroek
250*00b67f09SDavid van Moolenbroek UNUSED(type);
251*00b67f09SDavid van Moolenbroek UNUSED(rdclass);
252*00b67f09SDavid van Moolenbroek UNUSED(dctx);
253*00b67f09SDavid van Moolenbroek UNUSED(options);
254*00b67f09SDavid van Moolenbroek
255*00b67f09SDavid van Moolenbroek isc_buffer_activeregion(source, &sr);
256*00b67f09SDavid van Moolenbroek isc_buffer_forward(source, sr.length);
257*00b67f09SDavid van Moolenbroek return (mem_tobuffer(target, sr.base, sr.length));
258*00b67f09SDavid van Moolenbroek }
259*00b67f09SDavid van Moolenbroek
260*00b67f09SDavid van Moolenbroek static inline isc_result_t
towire_keydata(ARGS_TOWIRE)261*00b67f09SDavid van Moolenbroek towire_keydata(ARGS_TOWIRE) {
262*00b67f09SDavid van Moolenbroek isc_region_t sr;
263*00b67f09SDavid van Moolenbroek
264*00b67f09SDavid van Moolenbroek REQUIRE(rdata->type == 65533);
265*00b67f09SDavid van Moolenbroek
266*00b67f09SDavid van Moolenbroek UNUSED(cctx);
267*00b67f09SDavid van Moolenbroek
268*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata, &sr);
269*00b67f09SDavid van Moolenbroek return (mem_tobuffer(target, sr.base, sr.length));
270*00b67f09SDavid van Moolenbroek }
271*00b67f09SDavid van Moolenbroek
272*00b67f09SDavid van Moolenbroek static inline int
compare_keydata(ARGS_COMPARE)273*00b67f09SDavid van Moolenbroek compare_keydata(ARGS_COMPARE) {
274*00b67f09SDavid van Moolenbroek isc_region_t r1;
275*00b67f09SDavid van Moolenbroek isc_region_t r2;
276*00b67f09SDavid van Moolenbroek
277*00b67f09SDavid van Moolenbroek REQUIRE(rdata1->type == rdata2->type);
278*00b67f09SDavid van Moolenbroek REQUIRE(rdata1->rdclass == rdata2->rdclass);
279*00b67f09SDavid van Moolenbroek REQUIRE(rdata1->type == 65533);
280*00b67f09SDavid van Moolenbroek
281*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata1, &r1);
282*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata2, &r2);
283*00b67f09SDavid van Moolenbroek return (isc_region_compare(&r1, &r2));
284*00b67f09SDavid van Moolenbroek }
285*00b67f09SDavid van Moolenbroek
286*00b67f09SDavid van Moolenbroek static inline isc_result_t
fromstruct_keydata(ARGS_FROMSTRUCT)287*00b67f09SDavid van Moolenbroek fromstruct_keydata(ARGS_FROMSTRUCT) {
288*00b67f09SDavid van Moolenbroek dns_rdata_keydata_t *keydata = source;
289*00b67f09SDavid van Moolenbroek
290*00b67f09SDavid van Moolenbroek REQUIRE(type == 65533);
291*00b67f09SDavid van Moolenbroek REQUIRE(source != NULL);
292*00b67f09SDavid van Moolenbroek REQUIRE(keydata->common.rdtype == type);
293*00b67f09SDavid van Moolenbroek REQUIRE(keydata->common.rdclass == rdclass);
294*00b67f09SDavid van Moolenbroek
295*00b67f09SDavid van Moolenbroek UNUSED(type);
296*00b67f09SDavid van Moolenbroek UNUSED(rdclass);
297*00b67f09SDavid van Moolenbroek
298*00b67f09SDavid van Moolenbroek /* Refresh timer */
299*00b67f09SDavid van Moolenbroek RETERR(uint32_tobuffer(keydata->refresh, target));
300*00b67f09SDavid van Moolenbroek
301*00b67f09SDavid van Moolenbroek /* Add hold-down */
302*00b67f09SDavid van Moolenbroek RETERR(uint32_tobuffer(keydata->addhd, target));
303*00b67f09SDavid van Moolenbroek
304*00b67f09SDavid van Moolenbroek /* Remove hold-down */
305*00b67f09SDavid van Moolenbroek RETERR(uint32_tobuffer(keydata->removehd, target));
306*00b67f09SDavid van Moolenbroek
307*00b67f09SDavid van Moolenbroek /* Flags */
308*00b67f09SDavid van Moolenbroek RETERR(uint16_tobuffer(keydata->flags, target));
309*00b67f09SDavid van Moolenbroek
310*00b67f09SDavid van Moolenbroek /* Protocol */
311*00b67f09SDavid van Moolenbroek RETERR(uint8_tobuffer(keydata->protocol, target));
312*00b67f09SDavid van Moolenbroek
313*00b67f09SDavid van Moolenbroek /* Algorithm */
314*00b67f09SDavid van Moolenbroek RETERR(uint8_tobuffer(keydata->algorithm, target));
315*00b67f09SDavid van Moolenbroek
316*00b67f09SDavid van Moolenbroek /* Data */
317*00b67f09SDavid van Moolenbroek return (mem_tobuffer(target, keydata->data, keydata->datalen));
318*00b67f09SDavid van Moolenbroek }
319*00b67f09SDavid van Moolenbroek
320*00b67f09SDavid van Moolenbroek static inline isc_result_t
tostruct_keydata(ARGS_TOSTRUCT)321*00b67f09SDavid van Moolenbroek tostruct_keydata(ARGS_TOSTRUCT) {
322*00b67f09SDavid van Moolenbroek dns_rdata_keydata_t *keydata = target;
323*00b67f09SDavid van Moolenbroek isc_region_t sr;
324*00b67f09SDavid van Moolenbroek
325*00b67f09SDavid van Moolenbroek REQUIRE(rdata->type == 65533);
326*00b67f09SDavid van Moolenbroek REQUIRE(target != NULL);
327*00b67f09SDavid van Moolenbroek
328*00b67f09SDavid van Moolenbroek keydata->common.rdclass = rdata->rdclass;
329*00b67f09SDavid van Moolenbroek keydata->common.rdtype = rdata->type;
330*00b67f09SDavid van Moolenbroek ISC_LINK_INIT(&keydata->common, link);
331*00b67f09SDavid van Moolenbroek
332*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata, &sr);
333*00b67f09SDavid van Moolenbroek
334*00b67f09SDavid van Moolenbroek /* Refresh timer */
335*00b67f09SDavid van Moolenbroek if (sr.length < 4)
336*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
337*00b67f09SDavid van Moolenbroek keydata->refresh = uint32_fromregion(&sr);
338*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 4);
339*00b67f09SDavid van Moolenbroek
340*00b67f09SDavid van Moolenbroek /* Add hold-down */
341*00b67f09SDavid van Moolenbroek if (sr.length < 4)
342*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
343*00b67f09SDavid van Moolenbroek keydata->addhd = uint32_fromregion(&sr);
344*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 4);
345*00b67f09SDavid van Moolenbroek
346*00b67f09SDavid van Moolenbroek /* Remove hold-down */
347*00b67f09SDavid van Moolenbroek if (sr.length < 4)
348*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
349*00b67f09SDavid van Moolenbroek keydata->removehd = uint32_fromregion(&sr);
350*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 4);
351*00b67f09SDavid van Moolenbroek
352*00b67f09SDavid van Moolenbroek /* Flags */
353*00b67f09SDavid van Moolenbroek if (sr.length < 2)
354*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
355*00b67f09SDavid van Moolenbroek keydata->flags = uint16_fromregion(&sr);
356*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 2);
357*00b67f09SDavid van Moolenbroek
358*00b67f09SDavid van Moolenbroek /* Protocol */
359*00b67f09SDavid van Moolenbroek if (sr.length < 1)
360*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
361*00b67f09SDavid van Moolenbroek keydata->protocol = uint8_fromregion(&sr);
362*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 1);
363*00b67f09SDavid van Moolenbroek
364*00b67f09SDavid van Moolenbroek /* Algorithm */
365*00b67f09SDavid van Moolenbroek if (sr.length < 1)
366*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTEDEND);
367*00b67f09SDavid van Moolenbroek keydata->algorithm = uint8_fromregion(&sr);
368*00b67f09SDavid van Moolenbroek isc_region_consume(&sr, 1);
369*00b67f09SDavid van Moolenbroek
370*00b67f09SDavid van Moolenbroek /* Data */
371*00b67f09SDavid van Moolenbroek keydata->datalen = sr.length;
372*00b67f09SDavid van Moolenbroek keydata->data = mem_maybedup(mctx, sr.base, keydata->datalen);
373*00b67f09SDavid van Moolenbroek if (keydata->data == NULL)
374*00b67f09SDavid van Moolenbroek return (ISC_R_NOMEMORY);
375*00b67f09SDavid van Moolenbroek
376*00b67f09SDavid van Moolenbroek keydata->mctx = mctx;
377*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
378*00b67f09SDavid van Moolenbroek }
379*00b67f09SDavid van Moolenbroek
380*00b67f09SDavid van Moolenbroek static inline void
freestruct_keydata(ARGS_FREESTRUCT)381*00b67f09SDavid van Moolenbroek freestruct_keydata(ARGS_FREESTRUCT) {
382*00b67f09SDavid van Moolenbroek dns_rdata_keydata_t *keydata = (dns_rdata_keydata_t *) source;
383*00b67f09SDavid van Moolenbroek
384*00b67f09SDavid van Moolenbroek REQUIRE(source != NULL);
385*00b67f09SDavid van Moolenbroek REQUIRE(keydata->common.rdtype == 65533);
386*00b67f09SDavid van Moolenbroek
387*00b67f09SDavid van Moolenbroek if (keydata->mctx == NULL)
388*00b67f09SDavid van Moolenbroek return;
389*00b67f09SDavid van Moolenbroek
390*00b67f09SDavid van Moolenbroek if (keydata->data != NULL)
391*00b67f09SDavid van Moolenbroek isc_mem_free(keydata->mctx, keydata->data);
392*00b67f09SDavid van Moolenbroek keydata->mctx = NULL;
393*00b67f09SDavid van Moolenbroek }
394*00b67f09SDavid van Moolenbroek
395*00b67f09SDavid van Moolenbroek static inline isc_result_t
additionaldata_keydata(ARGS_ADDLDATA)396*00b67f09SDavid van Moolenbroek additionaldata_keydata(ARGS_ADDLDATA) {
397*00b67f09SDavid van Moolenbroek REQUIRE(rdata->type == 65533);
398*00b67f09SDavid van Moolenbroek
399*00b67f09SDavid van Moolenbroek UNUSED(rdata);
400*00b67f09SDavid van Moolenbroek UNUSED(add);
401*00b67f09SDavid van Moolenbroek UNUSED(arg);
402*00b67f09SDavid van Moolenbroek
403*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
404*00b67f09SDavid van Moolenbroek }
405*00b67f09SDavid van Moolenbroek
406*00b67f09SDavid van Moolenbroek static inline isc_result_t
digest_keydata(ARGS_DIGEST)407*00b67f09SDavid van Moolenbroek digest_keydata(ARGS_DIGEST) {
408*00b67f09SDavid van Moolenbroek isc_region_t r;
409*00b67f09SDavid van Moolenbroek
410*00b67f09SDavid van Moolenbroek REQUIRE(rdata->type == 65533);
411*00b67f09SDavid van Moolenbroek
412*00b67f09SDavid van Moolenbroek dns_rdata_toregion(rdata, &r);
413*00b67f09SDavid van Moolenbroek
414*00b67f09SDavid van Moolenbroek return ((digest)(arg, &r));
415*00b67f09SDavid van Moolenbroek }
416*00b67f09SDavid van Moolenbroek
417*00b67f09SDavid van Moolenbroek static inline isc_boolean_t
checkowner_keydata(ARGS_CHECKOWNER)418*00b67f09SDavid van Moolenbroek checkowner_keydata(ARGS_CHECKOWNER) {
419*00b67f09SDavid van Moolenbroek
420*00b67f09SDavid van Moolenbroek REQUIRE(type == 65533);
421*00b67f09SDavid van Moolenbroek
422*00b67f09SDavid van Moolenbroek UNUSED(name);
423*00b67f09SDavid van Moolenbroek UNUSED(type);
424*00b67f09SDavid van Moolenbroek UNUSED(rdclass);
425*00b67f09SDavid van Moolenbroek UNUSED(wildcard);
426*00b67f09SDavid van Moolenbroek
427*00b67f09SDavid van Moolenbroek return (ISC_TRUE);
428*00b67f09SDavid van Moolenbroek }
429*00b67f09SDavid van Moolenbroek
430*00b67f09SDavid van Moolenbroek static inline isc_boolean_t
checknames_keydata(ARGS_CHECKNAMES)431*00b67f09SDavid van Moolenbroek checknames_keydata(ARGS_CHECKNAMES) {
432*00b67f09SDavid van Moolenbroek
433*00b67f09SDavid van Moolenbroek REQUIRE(rdata->type == 65533);
434*00b67f09SDavid van Moolenbroek
435*00b67f09SDavid van Moolenbroek UNUSED(rdata);
436*00b67f09SDavid van Moolenbroek UNUSED(owner);
437*00b67f09SDavid van Moolenbroek UNUSED(bad);
438*00b67f09SDavid van Moolenbroek
439*00b67f09SDavid van Moolenbroek return (ISC_TRUE);
440*00b67f09SDavid van Moolenbroek }
441*00b67f09SDavid van Moolenbroek
442*00b67f09SDavid van Moolenbroek static inline int
casecompare_keydata(ARGS_COMPARE)443*00b67f09SDavid van Moolenbroek casecompare_keydata(ARGS_COMPARE) {
444*00b67f09SDavid van Moolenbroek return (compare_keydata(rdata1, rdata2));
445*00b67f09SDavid van Moolenbroek }
446*00b67f09SDavid van Moolenbroek
447*00b67f09SDavid van Moolenbroek #endif /* GENERIC_KEYDATA_65533_C */
448