xref: /freebsd-src/contrib/ldns/rr_functions.c (revision 7b5038d71c5c74ab863c1ff3fec33de94bf35a57)
1*7b5038d7SDag-Erling Smørgrav /*
2*7b5038d7SDag-Erling Smørgrav  * rr_function.c
3*7b5038d7SDag-Erling Smørgrav  *
4*7b5038d7SDag-Erling Smørgrav  * function that operate on specific rr types
5*7b5038d7SDag-Erling Smørgrav  *
6*7b5038d7SDag-Erling Smørgrav  * (c) NLnet Labs, 2004-2006
7*7b5038d7SDag-Erling Smørgrav  * See the file LICENSE for the license
8*7b5038d7SDag-Erling Smørgrav  */
9*7b5038d7SDag-Erling Smørgrav 
10*7b5038d7SDag-Erling Smørgrav /*
11*7b5038d7SDag-Erling Smørgrav  * These come strait from perldoc Net::DNS::RR::xxx
12*7b5038d7SDag-Erling Smørgrav  * first the read variant, then the write. This is
13*7b5038d7SDag-Erling Smørgrav  * not complete.
14*7b5038d7SDag-Erling Smørgrav  */
15*7b5038d7SDag-Erling Smørgrav 
16*7b5038d7SDag-Erling Smørgrav #include <ldns/config.h>
17*7b5038d7SDag-Erling Smørgrav 
18*7b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h>
19*7b5038d7SDag-Erling Smørgrav 
20*7b5038d7SDag-Erling Smørgrav #include <limits.h>
21*7b5038d7SDag-Erling Smørgrav #include <strings.h>
22*7b5038d7SDag-Erling Smørgrav 
23*7b5038d7SDag-Erling Smørgrav /**
24*7b5038d7SDag-Erling Smørgrav  * return a specific rdf
25*7b5038d7SDag-Erling Smørgrav  * \param[in] type type of RR
26*7b5038d7SDag-Erling Smørgrav  * \param[in] rr   the rr itself
27*7b5038d7SDag-Erling Smørgrav  * \param[in] pos  at which postion to get it
28*7b5038d7SDag-Erling Smørgrav  * \return the rdf sought
29*7b5038d7SDag-Erling Smørgrav  */
30*7b5038d7SDag-Erling Smørgrav static ldns_rdf *
31*7b5038d7SDag-Erling Smørgrav ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos)
32*7b5038d7SDag-Erling Smørgrav {
33*7b5038d7SDag-Erling Smørgrav         if (!rr || ldns_rr_get_type(rr) != type) {
34*7b5038d7SDag-Erling Smørgrav                 return NULL;
35*7b5038d7SDag-Erling Smørgrav         }
36*7b5038d7SDag-Erling Smørgrav         return ldns_rr_rdf(rr, pos);
37*7b5038d7SDag-Erling Smørgrav }
38*7b5038d7SDag-Erling Smørgrav 
39*7b5038d7SDag-Erling Smørgrav /**
40*7b5038d7SDag-Erling Smørgrav  * set a specific rdf
41*7b5038d7SDag-Erling Smørgrav  * \param[in] type type of RR
42*7b5038d7SDag-Erling Smørgrav  * \param[in] rr   the rr itself
43*7b5038d7SDag-Erling Smørgrav  * \param[in] rdf  the rdf to set
44*7b5038d7SDag-Erling Smørgrav  * \param[in] pos  at which postion to set it
45*7b5038d7SDag-Erling Smørgrav  * \return true or false
46*7b5038d7SDag-Erling Smørgrav  */
47*7b5038d7SDag-Erling Smørgrav static bool
48*7b5038d7SDag-Erling Smørgrav ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos)
49*7b5038d7SDag-Erling Smørgrav {
50*7b5038d7SDag-Erling Smørgrav         ldns_rdf *pop;
51*7b5038d7SDag-Erling Smørgrav         if (!rr || ldns_rr_get_type(rr) != type) {
52*7b5038d7SDag-Erling Smørgrav                 return false;
53*7b5038d7SDag-Erling Smørgrav         }
54*7b5038d7SDag-Erling Smørgrav         pop = ldns_rr_set_rdf(rr, rdf, pos);
55*7b5038d7SDag-Erling Smørgrav  	ldns_rdf_deep_free(pop);
56*7b5038d7SDag-Erling Smørgrav         return true;
57*7b5038d7SDag-Erling Smørgrav }
58*7b5038d7SDag-Erling Smørgrav 
59*7b5038d7SDag-Erling Smørgrav /* A/AAAA records */
60*7b5038d7SDag-Erling Smørgrav ldns_rdf *
61*7b5038d7SDag-Erling Smørgrav ldns_rr_a_address(const ldns_rr *r)
62*7b5038d7SDag-Erling Smørgrav {
63*7b5038d7SDag-Erling Smørgrav 	/* 2 types to check, cannot use the macro */
64*7b5038d7SDag-Erling Smørgrav 	if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
65*7b5038d7SDag-Erling Smørgrav 			ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
66*7b5038d7SDag-Erling Smørgrav 		return NULL;
67*7b5038d7SDag-Erling Smørgrav 	}
68*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_rdf(r, 0);
69*7b5038d7SDag-Erling Smørgrav }
70*7b5038d7SDag-Erling Smørgrav 
71*7b5038d7SDag-Erling Smørgrav bool
72*7b5038d7SDag-Erling Smørgrav ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f)
73*7b5038d7SDag-Erling Smørgrav {
74*7b5038d7SDag-Erling Smørgrav 	/* 2 types to check, cannot use the macro... */
75*7b5038d7SDag-Erling Smørgrav 	ldns_rdf *pop;
76*7b5038d7SDag-Erling Smørgrav 	if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
77*7b5038d7SDag-Erling Smørgrav 			ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
78*7b5038d7SDag-Erling Smørgrav 		return false;
79*7b5038d7SDag-Erling Smørgrav 	}
80*7b5038d7SDag-Erling Smørgrav 	pop = ldns_rr_set_rdf(r, f, 0);
81*7b5038d7SDag-Erling Smørgrav 	if (pop) {
82*7b5038d7SDag-Erling Smørgrav 		LDNS_FREE(pop);
83*7b5038d7SDag-Erling Smørgrav 		return true;
84*7b5038d7SDag-Erling Smørgrav 	} else {
85*7b5038d7SDag-Erling Smørgrav 		return false;
86*7b5038d7SDag-Erling Smørgrav 	}
87*7b5038d7SDag-Erling Smørgrav }
88*7b5038d7SDag-Erling Smørgrav 
89*7b5038d7SDag-Erling Smørgrav /* NS record */
90*7b5038d7SDag-Erling Smørgrav ldns_rdf *
91*7b5038d7SDag-Erling Smørgrav ldns_rr_ns_nsdname(const ldns_rr *r)
92*7b5038d7SDag-Erling Smørgrav {
93*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0);
94*7b5038d7SDag-Erling Smørgrav }
95*7b5038d7SDag-Erling Smørgrav 
96*7b5038d7SDag-Erling Smørgrav /* MX record */
97*7b5038d7SDag-Erling Smørgrav ldns_rdf *
98*7b5038d7SDag-Erling Smørgrav ldns_rr_mx_preference(const ldns_rr *r)
99*7b5038d7SDag-Erling Smørgrav {
100*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0);
101*7b5038d7SDag-Erling Smørgrav }
102*7b5038d7SDag-Erling Smørgrav 
103*7b5038d7SDag-Erling Smørgrav ldns_rdf *
104*7b5038d7SDag-Erling Smørgrav ldns_rr_mx_exchange(const ldns_rr *r)
105*7b5038d7SDag-Erling Smørgrav {
106*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1);
107*7b5038d7SDag-Erling Smørgrav }
108*7b5038d7SDag-Erling Smørgrav 
109*7b5038d7SDag-Erling Smørgrav /* RRSIG record */
110*7b5038d7SDag-Erling Smørgrav ldns_rdf *
111*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_typecovered(const ldns_rr *r)
112*7b5038d7SDag-Erling Smørgrav {
113*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0);
114*7b5038d7SDag-Erling Smørgrav }
115*7b5038d7SDag-Erling Smørgrav 
116*7b5038d7SDag-Erling Smørgrav bool
117*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f)
118*7b5038d7SDag-Erling Smørgrav {
119*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0);
120*7b5038d7SDag-Erling Smørgrav }
121*7b5038d7SDag-Erling Smørgrav 
122*7b5038d7SDag-Erling Smørgrav ldns_rdf *
123*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_algorithm(const ldns_rr *r)
124*7b5038d7SDag-Erling Smørgrav {
125*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1);
126*7b5038d7SDag-Erling Smørgrav }
127*7b5038d7SDag-Erling Smørgrav 
128*7b5038d7SDag-Erling Smørgrav bool
129*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f)
130*7b5038d7SDag-Erling Smørgrav {
131*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1);
132*7b5038d7SDag-Erling Smørgrav }
133*7b5038d7SDag-Erling Smørgrav 
134*7b5038d7SDag-Erling Smørgrav ldns_rdf *
135*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_labels(const ldns_rr *r)
136*7b5038d7SDag-Erling Smørgrav {
137*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2);
138*7b5038d7SDag-Erling Smørgrav }
139*7b5038d7SDag-Erling Smørgrav 
140*7b5038d7SDag-Erling Smørgrav bool
141*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f)
142*7b5038d7SDag-Erling Smørgrav {
143*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2);
144*7b5038d7SDag-Erling Smørgrav }
145*7b5038d7SDag-Erling Smørgrav 
146*7b5038d7SDag-Erling Smørgrav ldns_rdf *
147*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_origttl(const ldns_rr *r)
148*7b5038d7SDag-Erling Smørgrav {
149*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3);
150*7b5038d7SDag-Erling Smørgrav }
151*7b5038d7SDag-Erling Smørgrav 
152*7b5038d7SDag-Erling Smørgrav bool
153*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f)
154*7b5038d7SDag-Erling Smørgrav {
155*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3);
156*7b5038d7SDag-Erling Smørgrav }
157*7b5038d7SDag-Erling Smørgrav 
158*7b5038d7SDag-Erling Smørgrav ldns_rdf *
159*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_expiration(const ldns_rr *r)
160*7b5038d7SDag-Erling Smørgrav {
161*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4);
162*7b5038d7SDag-Erling Smørgrav }
163*7b5038d7SDag-Erling Smørgrav 
164*7b5038d7SDag-Erling Smørgrav bool
165*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f)
166*7b5038d7SDag-Erling Smørgrav {
167*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4);
168*7b5038d7SDag-Erling Smørgrav }
169*7b5038d7SDag-Erling Smørgrav 
170*7b5038d7SDag-Erling Smørgrav ldns_rdf *
171*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_inception(const ldns_rr *r)
172*7b5038d7SDag-Erling Smørgrav {
173*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5);
174*7b5038d7SDag-Erling Smørgrav }
175*7b5038d7SDag-Erling Smørgrav 
176*7b5038d7SDag-Erling Smørgrav bool
177*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f)
178*7b5038d7SDag-Erling Smørgrav {
179*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5);
180*7b5038d7SDag-Erling Smørgrav }
181*7b5038d7SDag-Erling Smørgrav 
182*7b5038d7SDag-Erling Smørgrav ldns_rdf *
183*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_keytag(const ldns_rr *r)
184*7b5038d7SDag-Erling Smørgrav {
185*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6);
186*7b5038d7SDag-Erling Smørgrav }
187*7b5038d7SDag-Erling Smørgrav 
188*7b5038d7SDag-Erling Smørgrav bool
189*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f)
190*7b5038d7SDag-Erling Smørgrav {
191*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6);
192*7b5038d7SDag-Erling Smørgrav }
193*7b5038d7SDag-Erling Smørgrav 
194*7b5038d7SDag-Erling Smørgrav ldns_rdf *
195*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_signame(const ldns_rr *r)
196*7b5038d7SDag-Erling Smørgrav {
197*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7);
198*7b5038d7SDag-Erling Smørgrav }
199*7b5038d7SDag-Erling Smørgrav 
200*7b5038d7SDag-Erling Smørgrav bool
201*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f)
202*7b5038d7SDag-Erling Smørgrav {
203*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7);
204*7b5038d7SDag-Erling Smørgrav }
205*7b5038d7SDag-Erling Smørgrav 
206*7b5038d7SDag-Erling Smørgrav ldns_rdf *
207*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_sig(const ldns_rr *r)
208*7b5038d7SDag-Erling Smørgrav {
209*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8);
210*7b5038d7SDag-Erling Smørgrav }
211*7b5038d7SDag-Erling Smørgrav 
212*7b5038d7SDag-Erling Smørgrav bool
213*7b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f)
214*7b5038d7SDag-Erling Smørgrav {
215*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8);
216*7b5038d7SDag-Erling Smørgrav }
217*7b5038d7SDag-Erling Smørgrav 
218*7b5038d7SDag-Erling Smørgrav /* DNSKEY record */
219*7b5038d7SDag-Erling Smørgrav ldns_rdf *
220*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_flags(const ldns_rr *r)
221*7b5038d7SDag-Erling Smørgrav {
222*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0);
223*7b5038d7SDag-Erling Smørgrav }
224*7b5038d7SDag-Erling Smørgrav 
225*7b5038d7SDag-Erling Smørgrav bool
226*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f)
227*7b5038d7SDag-Erling Smørgrav {
228*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0);
229*7b5038d7SDag-Erling Smørgrav }
230*7b5038d7SDag-Erling Smørgrav 
231*7b5038d7SDag-Erling Smørgrav ldns_rdf *
232*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_protocol(const ldns_rr *r)
233*7b5038d7SDag-Erling Smørgrav {
234*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1);
235*7b5038d7SDag-Erling Smørgrav }
236*7b5038d7SDag-Erling Smørgrav 
237*7b5038d7SDag-Erling Smørgrav bool
238*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f)
239*7b5038d7SDag-Erling Smørgrav {
240*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1);
241*7b5038d7SDag-Erling Smørgrav }
242*7b5038d7SDag-Erling Smørgrav 
243*7b5038d7SDag-Erling Smørgrav ldns_rdf *
244*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_algorithm(const ldns_rr *r)
245*7b5038d7SDag-Erling Smørgrav {
246*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2);
247*7b5038d7SDag-Erling Smørgrav }
248*7b5038d7SDag-Erling Smørgrav 
249*7b5038d7SDag-Erling Smørgrav bool
250*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f)
251*7b5038d7SDag-Erling Smørgrav {
252*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2);
253*7b5038d7SDag-Erling Smørgrav }
254*7b5038d7SDag-Erling Smørgrav 
255*7b5038d7SDag-Erling Smørgrav ldns_rdf *
256*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key(const ldns_rr *r)
257*7b5038d7SDag-Erling Smørgrav {
258*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3);
259*7b5038d7SDag-Erling Smørgrav }
260*7b5038d7SDag-Erling Smørgrav 
261*7b5038d7SDag-Erling Smørgrav bool
262*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f)
263*7b5038d7SDag-Erling Smørgrav {
264*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3);
265*7b5038d7SDag-Erling Smørgrav }
266*7b5038d7SDag-Erling Smørgrav 
267*7b5038d7SDag-Erling Smørgrav size_t
268*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key_size_raw(const unsigned char* keydata,
269*7b5038d7SDag-Erling Smørgrav                             const size_t len,
270*7b5038d7SDag-Erling Smørgrav                             const ldns_algorithm alg)
271*7b5038d7SDag-Erling Smørgrav {
272*7b5038d7SDag-Erling Smørgrav 	/* for DSA keys */
273*7b5038d7SDag-Erling Smørgrav 	uint8_t t;
274*7b5038d7SDag-Erling Smørgrav 
275*7b5038d7SDag-Erling Smørgrav 	/* for RSA keys */
276*7b5038d7SDag-Erling Smørgrav 	uint16_t exp;
277*7b5038d7SDag-Erling Smørgrav 	uint16_t int16;
278*7b5038d7SDag-Erling Smørgrav 
279*7b5038d7SDag-Erling Smørgrav 	switch ((ldns_signing_algorithm)alg) {
280*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_DSA:
281*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_DSA_NSEC3:
282*7b5038d7SDag-Erling Smørgrav 		if (len > 0) {
283*7b5038d7SDag-Erling Smørgrav 			t = keydata[0];
284*7b5038d7SDag-Erling Smørgrav 			return (64 + t*8)*8;
285*7b5038d7SDag-Erling Smørgrav 		} else {
286*7b5038d7SDag-Erling Smørgrav 			return 0;
287*7b5038d7SDag-Erling Smørgrav 		}
288*7b5038d7SDag-Erling Smørgrav 		break;
289*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSAMD5:
290*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA1:
291*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA1_NSEC3:
292*7b5038d7SDag-Erling Smørgrav #ifdef USE_SHA2
293*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA256:
294*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA512:
295*7b5038d7SDag-Erling Smørgrav #endif
296*7b5038d7SDag-Erling Smørgrav 		if (len > 0) {
297*7b5038d7SDag-Erling Smørgrav 			if (keydata[0] == 0) {
298*7b5038d7SDag-Erling Smørgrav 				/* big exponent */
299*7b5038d7SDag-Erling Smørgrav 				if (len > 3) {
300*7b5038d7SDag-Erling Smørgrav 					memmove(&int16, keydata + 1, 2);
301*7b5038d7SDag-Erling Smørgrav 					exp = ntohs(int16);
302*7b5038d7SDag-Erling Smørgrav 					return (len - exp - 3)*8;
303*7b5038d7SDag-Erling Smørgrav 				} else {
304*7b5038d7SDag-Erling Smørgrav 					return 0;
305*7b5038d7SDag-Erling Smørgrav 				}
306*7b5038d7SDag-Erling Smørgrav 			} else {
307*7b5038d7SDag-Erling Smørgrav 				exp = keydata[0];
308*7b5038d7SDag-Erling Smørgrav 				return (len-exp-1)*8;
309*7b5038d7SDag-Erling Smørgrav 			}
310*7b5038d7SDag-Erling Smørgrav 		} else {
311*7b5038d7SDag-Erling Smørgrav 			return 0;
312*7b5038d7SDag-Erling Smørgrav 		}
313*7b5038d7SDag-Erling Smørgrav 		break;
314*7b5038d7SDag-Erling Smørgrav #ifdef USE_GOST
315*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_ECC_GOST:
316*7b5038d7SDag-Erling Smørgrav 		return 512;
317*7b5038d7SDag-Erling Smørgrav #endif
318*7b5038d7SDag-Erling Smørgrav #ifdef USE_ECDSA
319*7b5038d7SDag-Erling Smørgrav         case LDNS_SIGN_ECDSAP256SHA256:
320*7b5038d7SDag-Erling Smørgrav                 return 256;
321*7b5038d7SDag-Erling Smørgrav         case LDNS_SIGN_ECDSAP384SHA384:
322*7b5038d7SDag-Erling Smørgrav                 return 384;
323*7b5038d7SDag-Erling Smørgrav #endif
324*7b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_HMACMD5:
325*7b5038d7SDag-Erling Smørgrav 		return len;
326*7b5038d7SDag-Erling Smørgrav 	default:
327*7b5038d7SDag-Erling Smørgrav 		return 0;
328*7b5038d7SDag-Erling Smørgrav 	}
329*7b5038d7SDag-Erling Smørgrav }
330*7b5038d7SDag-Erling Smørgrav 
331*7b5038d7SDag-Erling Smørgrav size_t
332*7b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key_size(const ldns_rr *key)
333*7b5038d7SDag-Erling Smørgrav {
334*7b5038d7SDag-Erling Smørgrav 	if (!key || !ldns_rr_dnskey_key(key)
335*7b5038d7SDag-Erling Smørgrav 			|| !ldns_rr_dnskey_algorithm(key)) {
336*7b5038d7SDag-Erling Smørgrav 		return 0;
337*7b5038d7SDag-Erling Smørgrav 	}
338*7b5038d7SDag-Erling Smørgrav 	return ldns_rr_dnskey_key_size_raw((unsigned char*)ldns_rdf_data(ldns_rr_dnskey_key(key)),
339*7b5038d7SDag-Erling Smørgrav 	                                   ldns_rdf_size(ldns_rr_dnskey_key(key)),
340*7b5038d7SDag-Erling Smørgrav 	                                   ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key))
341*7b5038d7SDag-Erling Smørgrav 	                                  );
342*7b5038d7SDag-Erling Smørgrav }
343*7b5038d7SDag-Erling Smørgrav 
344*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_identity(uint32_t ATTR_UNUSED(unused), void *data)
345*7b5038d7SDag-Erling Smørgrav {
346*7b5038d7SDag-Erling Smørgrav 	return (uint32_t) (intptr_t) data;
347*7b5038d7SDag-Erling Smørgrav }
348*7b5038d7SDag-Erling Smørgrav 
349*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_increment(uint32_t s, void *ATTR_UNUSED(unused))
350*7b5038d7SDag-Erling Smørgrav {
351*7b5038d7SDag-Erling Smørgrav 	return ldns_soa_serial_increment_by(s, (void *)1);
352*7b5038d7SDag-Erling Smørgrav }
353*7b5038d7SDag-Erling Smørgrav 
354*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data)
355*7b5038d7SDag-Erling Smørgrav {
356*7b5038d7SDag-Erling Smørgrav 	return s + (intptr_t) data;
357*7b5038d7SDag-Erling Smørgrav }
358*7b5038d7SDag-Erling Smørgrav 
359*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_datecounter(uint32_t s, void *data)
360*7b5038d7SDag-Erling Smørgrav {
361*7b5038d7SDag-Erling Smørgrav 	struct tm tm;
362*7b5038d7SDag-Erling Smørgrav 	char s_str[11];
363*7b5038d7SDag-Erling Smørgrav 	int32_t new_s;
364*7b5038d7SDag-Erling Smørgrav 	time_t t = data ? (time_t) (intptr_t) data : ldns_time(NULL);
365*7b5038d7SDag-Erling Smørgrav 
366*7b5038d7SDag-Erling Smørgrav 	(void) strftime(s_str, 11, "%Y%m%d00", localtime_r(&t, &tm));
367*7b5038d7SDag-Erling Smørgrav 	new_s = (int32_t) atoi(s_str);
368*7b5038d7SDag-Erling Smørgrav 	return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s);
369*7b5038d7SDag-Erling Smørgrav }
370*7b5038d7SDag-Erling Smørgrav 
371*7b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_unixtime(uint32_t s, void *data)
372*7b5038d7SDag-Erling Smørgrav {
373*7b5038d7SDag-Erling Smørgrav 	int32_t new_s = data ? (int32_t) (intptr_t) data
374*7b5038d7SDag-Erling Smørgrav 			     : (int32_t) ldns_time(NULL);
375*7b5038d7SDag-Erling Smørgrav 	return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s);
376*7b5038d7SDag-Erling Smørgrav }
377*7b5038d7SDag-Erling Smørgrav 
378*7b5038d7SDag-Erling Smørgrav void
379*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment(ldns_rr *soa)
380*7b5038d7SDag-Erling Smørgrav {
381*7b5038d7SDag-Erling Smørgrav 	ldns_rr_soa_increment_func_data(soa, ldns_soa_serial_increment, NULL);
382*7b5038d7SDag-Erling Smørgrav }
383*7b5038d7SDag-Erling Smørgrav 
384*7b5038d7SDag-Erling Smørgrav void
385*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func(ldns_rr *soa, ldns_soa_serial_increment_func_t f)
386*7b5038d7SDag-Erling Smørgrav {
387*7b5038d7SDag-Erling Smørgrav 	ldns_rr_soa_increment_func_data(soa, f, NULL);
388*7b5038d7SDag-Erling Smørgrav }
389*7b5038d7SDag-Erling Smørgrav 
390*7b5038d7SDag-Erling Smørgrav void
391*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_data(ldns_rr *soa,
392*7b5038d7SDag-Erling Smørgrav 		ldns_soa_serial_increment_func_t f, void *data)
393*7b5038d7SDag-Erling Smørgrav {
394*7b5038d7SDag-Erling Smørgrav 	ldns_rdf *prev_soa_serial_rdf;
395*7b5038d7SDag-Erling Smørgrav 	if ( !soa || !f || ldns_rr_get_type(soa) != LDNS_RR_TYPE_SOA
396*7b5038d7SDag-Erling Smørgrav 			|| !ldns_rr_rdf(soa, 2)) {
397*7b5038d7SDag-Erling Smørgrav 		return;
398*7b5038d7SDag-Erling Smørgrav 	}
399*7b5038d7SDag-Erling Smørgrav 	prev_soa_serial_rdf = ldns_rr_set_rdf(
400*7b5038d7SDag-Erling Smørgrav 		  soa
401*7b5038d7SDag-Erling Smørgrav 		, ldns_native2rdf_int32(
402*7b5038d7SDag-Erling Smørgrav 			  LDNS_RDF_TYPE_INT32
403*7b5038d7SDag-Erling Smørgrav 			, (*f)( ldns_rdf2native_int32(
404*7b5038d7SDag-Erling Smørgrav 					ldns_rr_rdf(soa, 2))
405*7b5038d7SDag-Erling Smørgrav 			      , data
406*7b5038d7SDag-Erling Smørgrav 			)
407*7b5038d7SDag-Erling Smørgrav 		)
408*7b5038d7SDag-Erling Smørgrav 		, 2
409*7b5038d7SDag-Erling Smørgrav 	);
410*7b5038d7SDag-Erling Smørgrav 	LDNS_FREE(prev_soa_serial_rdf);
411*7b5038d7SDag-Erling Smørgrav }
412*7b5038d7SDag-Erling Smørgrav 
413*7b5038d7SDag-Erling Smørgrav void
414*7b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_int(ldns_rr *soa,
415*7b5038d7SDag-Erling Smørgrav 		ldns_soa_serial_increment_func_t f, int data)
416*7b5038d7SDag-Erling Smørgrav {
417*7b5038d7SDag-Erling Smørgrav 	ldns_rr_soa_increment_func_data(soa, f, (void *) (intptr_t) data);
418*7b5038d7SDag-Erling Smørgrav }
419*7b5038d7SDag-Erling Smørgrav 
420