xref: /minix3/external/bsd/bind/dist/lib/dns/rdata/generic/keydata_65533.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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