xref: /dragonfly/contrib/ldns/rr_functions.c (revision ee791feb)
1825eb42bSJan Lentfer /*
2825eb42bSJan Lentfer  * rr_function.c
3825eb42bSJan Lentfer  *
4825eb42bSJan Lentfer  * function that operate on specific rr types
5825eb42bSJan Lentfer  *
6825eb42bSJan Lentfer  * (c) NLnet Labs, 2004-2006
7825eb42bSJan Lentfer  * See the file LICENSE for the license
8825eb42bSJan Lentfer  */
9825eb42bSJan Lentfer 
10825eb42bSJan Lentfer /*
11825eb42bSJan Lentfer  * These come strait from perldoc Net::DNS::RR::xxx
12825eb42bSJan Lentfer  * first the read variant, then the write. This is
13825eb42bSJan Lentfer  * not complete.
14825eb42bSJan Lentfer  */
15825eb42bSJan Lentfer 
16825eb42bSJan Lentfer #include <ldns/config.h>
17825eb42bSJan Lentfer 
18825eb42bSJan Lentfer #include <ldns/ldns.h>
19825eb42bSJan Lentfer 
20825eb42bSJan Lentfer #include <limits.h>
21825eb42bSJan Lentfer #include <strings.h>
22825eb42bSJan Lentfer 
23825eb42bSJan Lentfer /**
24825eb42bSJan Lentfer  * return a specific rdf
25825eb42bSJan Lentfer  * \param[in] type type of RR
26825eb42bSJan Lentfer  * \param[in] rr   the rr itself
27*ee791febSAntonio Huete Jimenez  * \param[in] pos  at which position to get it
28825eb42bSJan Lentfer  * \return the rdf sought
29825eb42bSJan Lentfer  */
30825eb42bSJan Lentfer static ldns_rdf *
ldns_rr_function(ldns_rr_type type,const ldns_rr * rr,size_t pos)31825eb42bSJan Lentfer ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos)
32825eb42bSJan Lentfer {
33825eb42bSJan Lentfer         if (!rr || ldns_rr_get_type(rr) != type) {
34825eb42bSJan Lentfer                 return NULL;
35825eb42bSJan Lentfer         }
36825eb42bSJan Lentfer         return ldns_rr_rdf(rr, pos);
37825eb42bSJan Lentfer }
38825eb42bSJan Lentfer 
39825eb42bSJan Lentfer /**
40825eb42bSJan Lentfer  * set a specific rdf
41825eb42bSJan Lentfer  * \param[in] type type of RR
42825eb42bSJan Lentfer  * \param[in] rr   the rr itself
43825eb42bSJan Lentfer  * \param[in] rdf  the rdf to set
44*ee791febSAntonio Huete Jimenez  * \param[in] pos  at which position to set it
45825eb42bSJan Lentfer  * \return true or false
46825eb42bSJan Lentfer  */
47825eb42bSJan Lentfer static bool
ldns_rr_set_function(ldns_rr_type type,ldns_rr * rr,ldns_rdf * rdf,size_t pos)48825eb42bSJan Lentfer ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos)
49825eb42bSJan Lentfer {
50825eb42bSJan Lentfer         ldns_rdf *pop;
51825eb42bSJan Lentfer         if (!rr || ldns_rr_get_type(rr) != type) {
52825eb42bSJan Lentfer                 return false;
53825eb42bSJan Lentfer         }
54825eb42bSJan Lentfer         pop = ldns_rr_set_rdf(rr, rdf, pos);
55825eb42bSJan Lentfer  	ldns_rdf_deep_free(pop);
56825eb42bSJan Lentfer         return true;
57825eb42bSJan Lentfer }
58825eb42bSJan Lentfer 
59825eb42bSJan Lentfer /* A/AAAA records */
60825eb42bSJan Lentfer ldns_rdf *
ldns_rr_a_address(const ldns_rr * r)61825eb42bSJan Lentfer ldns_rr_a_address(const ldns_rr *r)
62825eb42bSJan Lentfer {
63825eb42bSJan Lentfer 	/* 2 types to check, cannot use the macro */
64825eb42bSJan Lentfer 	if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
65825eb42bSJan Lentfer 			ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
66825eb42bSJan Lentfer 		return NULL;
67825eb42bSJan Lentfer 	}
68825eb42bSJan Lentfer 	return ldns_rr_rdf(r, 0);
69825eb42bSJan Lentfer }
70825eb42bSJan Lentfer 
71825eb42bSJan Lentfer bool
ldns_rr_a_set_address(ldns_rr * r,ldns_rdf * f)72825eb42bSJan Lentfer ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f)
73825eb42bSJan Lentfer {
74825eb42bSJan Lentfer 	/* 2 types to check, cannot use the macro... */
75825eb42bSJan Lentfer 	ldns_rdf *pop;
76825eb42bSJan Lentfer 	if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
77825eb42bSJan Lentfer 			ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
78825eb42bSJan Lentfer 		return false;
79825eb42bSJan Lentfer 	}
80825eb42bSJan Lentfer 	pop = ldns_rr_set_rdf(r, f, 0);
81825eb42bSJan Lentfer 	if (pop) {
82825eb42bSJan Lentfer 		LDNS_FREE(pop);
83825eb42bSJan Lentfer 		return true;
84825eb42bSJan Lentfer 	} else {
85825eb42bSJan Lentfer 		return false;
86825eb42bSJan Lentfer 	}
87825eb42bSJan Lentfer }
88825eb42bSJan Lentfer 
89825eb42bSJan Lentfer /* NS record */
90825eb42bSJan Lentfer ldns_rdf *
ldns_rr_ns_nsdname(const ldns_rr * r)91825eb42bSJan Lentfer ldns_rr_ns_nsdname(const ldns_rr *r)
92825eb42bSJan Lentfer {
93825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0);
94825eb42bSJan Lentfer }
95825eb42bSJan Lentfer 
96825eb42bSJan Lentfer /* MX record */
97825eb42bSJan Lentfer ldns_rdf *
ldns_rr_mx_preference(const ldns_rr * r)98825eb42bSJan Lentfer ldns_rr_mx_preference(const ldns_rr *r)
99825eb42bSJan Lentfer {
100825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0);
101825eb42bSJan Lentfer }
102825eb42bSJan Lentfer 
103825eb42bSJan Lentfer ldns_rdf *
ldns_rr_mx_exchange(const ldns_rr * r)104825eb42bSJan Lentfer ldns_rr_mx_exchange(const ldns_rr *r)
105825eb42bSJan Lentfer {
106825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1);
107825eb42bSJan Lentfer }
108825eb42bSJan Lentfer 
109825eb42bSJan Lentfer /* RRSIG record */
110825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_typecovered(const ldns_rr * r)111825eb42bSJan Lentfer ldns_rr_rrsig_typecovered(const ldns_rr *r)
112825eb42bSJan Lentfer {
113825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0);
114825eb42bSJan Lentfer }
115825eb42bSJan Lentfer 
116825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_typecovered(ldns_rr * r,ldns_rdf * f)117825eb42bSJan Lentfer ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f)
118825eb42bSJan Lentfer {
119825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0);
120825eb42bSJan Lentfer }
121825eb42bSJan Lentfer 
122825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_algorithm(const ldns_rr * r)123825eb42bSJan Lentfer ldns_rr_rrsig_algorithm(const ldns_rr *r)
124825eb42bSJan Lentfer {
125825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1);
126825eb42bSJan Lentfer }
127825eb42bSJan Lentfer 
128825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_algorithm(ldns_rr * r,ldns_rdf * f)129825eb42bSJan Lentfer ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f)
130825eb42bSJan Lentfer {
131825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1);
132825eb42bSJan Lentfer }
133825eb42bSJan Lentfer 
134825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_labels(const ldns_rr * r)135825eb42bSJan Lentfer ldns_rr_rrsig_labels(const ldns_rr *r)
136825eb42bSJan Lentfer {
137825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2);
138825eb42bSJan Lentfer }
139825eb42bSJan Lentfer 
140825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_labels(ldns_rr * r,ldns_rdf * f)141825eb42bSJan Lentfer ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f)
142825eb42bSJan Lentfer {
143825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2);
144825eb42bSJan Lentfer }
145825eb42bSJan Lentfer 
146825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_origttl(const ldns_rr * r)147825eb42bSJan Lentfer ldns_rr_rrsig_origttl(const ldns_rr *r)
148825eb42bSJan Lentfer {
149825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3);
150825eb42bSJan Lentfer }
151825eb42bSJan Lentfer 
152825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_origttl(ldns_rr * r,ldns_rdf * f)153825eb42bSJan Lentfer ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f)
154825eb42bSJan Lentfer {
155825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3);
156825eb42bSJan Lentfer }
157825eb42bSJan Lentfer 
158825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_expiration(const ldns_rr * r)159825eb42bSJan Lentfer ldns_rr_rrsig_expiration(const ldns_rr *r)
160825eb42bSJan Lentfer {
161825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4);
162825eb42bSJan Lentfer }
163825eb42bSJan Lentfer 
164825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_expiration(ldns_rr * r,ldns_rdf * f)165825eb42bSJan Lentfer ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f)
166825eb42bSJan Lentfer {
167825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4);
168825eb42bSJan Lentfer }
169825eb42bSJan Lentfer 
170825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_inception(const ldns_rr * r)171825eb42bSJan Lentfer ldns_rr_rrsig_inception(const ldns_rr *r)
172825eb42bSJan Lentfer {
173825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5);
174825eb42bSJan Lentfer }
175825eb42bSJan Lentfer 
176825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_inception(ldns_rr * r,ldns_rdf * f)177825eb42bSJan Lentfer ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f)
178825eb42bSJan Lentfer {
179825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5);
180825eb42bSJan Lentfer }
181825eb42bSJan Lentfer 
182825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_keytag(const ldns_rr * r)183825eb42bSJan Lentfer ldns_rr_rrsig_keytag(const ldns_rr *r)
184825eb42bSJan Lentfer {
185825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6);
186825eb42bSJan Lentfer }
187825eb42bSJan Lentfer 
188825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_keytag(ldns_rr * r,ldns_rdf * f)189825eb42bSJan Lentfer ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f)
190825eb42bSJan Lentfer {
191825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6);
192825eb42bSJan Lentfer }
193825eb42bSJan Lentfer 
194825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_signame(const ldns_rr * r)195825eb42bSJan Lentfer ldns_rr_rrsig_signame(const ldns_rr *r)
196825eb42bSJan Lentfer {
197825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7);
198825eb42bSJan Lentfer }
199825eb42bSJan Lentfer 
200825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_signame(ldns_rr * r,ldns_rdf * f)201825eb42bSJan Lentfer ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f)
202825eb42bSJan Lentfer {
203825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7);
204825eb42bSJan Lentfer }
205825eb42bSJan Lentfer 
206825eb42bSJan Lentfer ldns_rdf *
ldns_rr_rrsig_sig(const ldns_rr * r)207825eb42bSJan Lentfer ldns_rr_rrsig_sig(const ldns_rr *r)
208825eb42bSJan Lentfer {
209825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8);
210825eb42bSJan Lentfer }
211825eb42bSJan Lentfer 
212825eb42bSJan Lentfer bool
ldns_rr_rrsig_set_sig(ldns_rr * r,ldns_rdf * f)213825eb42bSJan Lentfer ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f)
214825eb42bSJan Lentfer {
215825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8);
216825eb42bSJan Lentfer }
217825eb42bSJan Lentfer 
218825eb42bSJan Lentfer /* DNSKEY record */
219825eb42bSJan Lentfer ldns_rdf *
ldns_rr_dnskey_flags(const ldns_rr * r)220825eb42bSJan Lentfer ldns_rr_dnskey_flags(const ldns_rr *r)
221825eb42bSJan Lentfer {
222825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0);
223825eb42bSJan Lentfer }
224825eb42bSJan Lentfer 
225825eb42bSJan Lentfer bool
ldns_rr_dnskey_set_flags(ldns_rr * r,ldns_rdf * f)226825eb42bSJan Lentfer ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f)
227825eb42bSJan Lentfer {
228825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0);
229825eb42bSJan Lentfer }
230825eb42bSJan Lentfer 
231825eb42bSJan Lentfer ldns_rdf *
ldns_rr_dnskey_protocol(const ldns_rr * r)232825eb42bSJan Lentfer ldns_rr_dnskey_protocol(const ldns_rr *r)
233825eb42bSJan Lentfer {
234825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1);
235825eb42bSJan Lentfer }
236825eb42bSJan Lentfer 
237825eb42bSJan Lentfer bool
ldns_rr_dnskey_set_protocol(ldns_rr * r,ldns_rdf * f)238825eb42bSJan Lentfer ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f)
239825eb42bSJan Lentfer {
240825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1);
241825eb42bSJan Lentfer }
242825eb42bSJan Lentfer 
243825eb42bSJan Lentfer ldns_rdf *
ldns_rr_dnskey_algorithm(const ldns_rr * r)244825eb42bSJan Lentfer ldns_rr_dnskey_algorithm(const ldns_rr *r)
245825eb42bSJan Lentfer {
246825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2);
247825eb42bSJan Lentfer }
248825eb42bSJan Lentfer 
249825eb42bSJan Lentfer bool
ldns_rr_dnskey_set_algorithm(ldns_rr * r,ldns_rdf * f)250825eb42bSJan Lentfer ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f)
251825eb42bSJan Lentfer {
252825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2);
253825eb42bSJan Lentfer }
254825eb42bSJan Lentfer 
255825eb42bSJan Lentfer ldns_rdf *
ldns_rr_dnskey_key(const ldns_rr * r)256825eb42bSJan Lentfer ldns_rr_dnskey_key(const ldns_rr *r)
257825eb42bSJan Lentfer {
258825eb42bSJan Lentfer 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3);
259825eb42bSJan Lentfer }
260825eb42bSJan Lentfer 
261825eb42bSJan Lentfer bool
ldns_rr_dnskey_set_key(ldns_rr * r,ldns_rdf * f)262825eb42bSJan Lentfer ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f)
263825eb42bSJan Lentfer {
264825eb42bSJan Lentfer 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3);
265825eb42bSJan Lentfer }
266825eb42bSJan Lentfer 
267825eb42bSJan Lentfer size_t
ldns_rr_dnskey_key_size_raw(const unsigned char * keydata,const size_t len,const ldns_algorithm alg)268825eb42bSJan Lentfer ldns_rr_dnskey_key_size_raw(const unsigned char* keydata,
269825eb42bSJan Lentfer                             const size_t len,
270825eb42bSJan Lentfer                             const ldns_algorithm alg)
271825eb42bSJan Lentfer {
272*ee791febSAntonio Huete Jimenez #ifdef USE_DSA
273825eb42bSJan Lentfer 	/* for DSA keys */
274825eb42bSJan Lentfer 	uint8_t t;
275*ee791febSAntonio Huete Jimenez #endif /* USE_DSA */
276825eb42bSJan Lentfer 
277825eb42bSJan Lentfer 	/* for RSA keys */
278825eb42bSJan Lentfer 	uint16_t exp;
279825eb42bSJan Lentfer 	uint16_t int16;
280825eb42bSJan Lentfer 
281fd185f4dSJan Lentfer 	switch ((ldns_signing_algorithm)alg) {
282*ee791febSAntonio Huete Jimenez #ifdef USE_DSA
283825eb42bSJan Lentfer 	case LDNS_SIGN_DSA:
284825eb42bSJan Lentfer 	case LDNS_SIGN_DSA_NSEC3:
285825eb42bSJan Lentfer 		if (len > 0) {
286825eb42bSJan Lentfer 			t = keydata[0];
287825eb42bSJan Lentfer 			return (64 + t*8)*8;
288825eb42bSJan Lentfer 		} else {
289825eb42bSJan Lentfer 			return 0;
290825eb42bSJan Lentfer 		}
291825eb42bSJan Lentfer 		break;
292*ee791febSAntonio Huete Jimenez #endif /* USE_DSA */
293825eb42bSJan Lentfer 	case LDNS_SIGN_RSAMD5:
294825eb42bSJan Lentfer 	case LDNS_SIGN_RSASHA1:
295825eb42bSJan Lentfer 	case LDNS_SIGN_RSASHA1_NSEC3:
296825eb42bSJan Lentfer #ifdef USE_SHA2
297825eb42bSJan Lentfer 	case LDNS_SIGN_RSASHA256:
298825eb42bSJan Lentfer 	case LDNS_SIGN_RSASHA512:
299825eb42bSJan Lentfer #endif
300825eb42bSJan Lentfer 		if (len > 0) {
301825eb42bSJan Lentfer 			if (keydata[0] == 0) {
302825eb42bSJan Lentfer 				/* big exponent */
303825eb42bSJan Lentfer 				if (len > 3) {
304825eb42bSJan Lentfer 					memmove(&int16, keydata + 1, 2);
305825eb42bSJan Lentfer 					exp = ntohs(int16);
306825eb42bSJan Lentfer 					return (len - exp - 3)*8;
307825eb42bSJan Lentfer 				} else {
308825eb42bSJan Lentfer 					return 0;
309825eb42bSJan Lentfer 				}
310825eb42bSJan Lentfer 			} else {
311825eb42bSJan Lentfer 				exp = keydata[0];
312825eb42bSJan Lentfer 				return (len-exp-1)*8;
313825eb42bSJan Lentfer 			}
314825eb42bSJan Lentfer 		} else {
315825eb42bSJan Lentfer 			return 0;
316825eb42bSJan Lentfer 		}
317825eb42bSJan Lentfer 		break;
318825eb42bSJan Lentfer #ifdef USE_GOST
319ac996e71SJan Lentfer 	case LDNS_SIGN_ECC_GOST:
320825eb42bSJan Lentfer 		return 512;
321ac996e71SJan Lentfer #endif
322ac996e71SJan Lentfer #ifdef USE_ECDSA
323ac996e71SJan Lentfer         case LDNS_SIGN_ECDSAP256SHA256:
324ac996e71SJan Lentfer                 return 256;
325ac996e71SJan Lentfer         case LDNS_SIGN_ECDSAP384SHA384:
326ac996e71SJan Lentfer                 return 384;
327825eb42bSJan Lentfer #endif
3285340022aSzrj #ifdef USE_ED25519
3295340022aSzrj 	case LDNS_SIGN_ED25519:
3305340022aSzrj 		return 256;
3315340022aSzrj #endif
3325340022aSzrj #ifdef USE_ED448
3335340022aSzrj 	case LDNS_SIGN_ED448:
3345340022aSzrj 		return 456;
3355340022aSzrj #endif
336825eb42bSJan Lentfer 	case LDNS_SIGN_HMACMD5:
337825eb42bSJan Lentfer 		return len;
338825eb42bSJan Lentfer 	default:
339825eb42bSJan Lentfer 		return 0;
340825eb42bSJan Lentfer 	}
341825eb42bSJan Lentfer }
342825eb42bSJan Lentfer 
343825eb42bSJan Lentfer size_t
ldns_rr_dnskey_key_size(const ldns_rr * key)344825eb42bSJan Lentfer ldns_rr_dnskey_key_size(const ldns_rr *key)
345825eb42bSJan Lentfer {
346b5dedccaSJan Lentfer 	if (!key || !ldns_rr_dnskey_key(key)
347b5dedccaSJan Lentfer 			|| !ldns_rr_dnskey_algorithm(key)) {
348825eb42bSJan Lentfer 		return 0;
349825eb42bSJan Lentfer 	}
350fd185f4dSJan Lentfer 	return ldns_rr_dnskey_key_size_raw((unsigned char*)ldns_rdf_data(ldns_rr_dnskey_key(key)),
351825eb42bSJan Lentfer 	                                   ldns_rdf_size(ldns_rr_dnskey_key(key)),
352825eb42bSJan Lentfer 	                                   ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key))
353825eb42bSJan Lentfer 	                                  );
354825eb42bSJan Lentfer }
355d1b2b5caSJohn Marino 
ldns_soa_serial_identity(uint32_t ATTR_UNUSED (unused),void * data)356d1b2b5caSJohn Marino uint32_t ldns_soa_serial_identity(uint32_t ATTR_UNUSED(unused), void *data)
357d1b2b5caSJohn Marino {
358d1b2b5caSJohn Marino 	return (uint32_t) (intptr_t) data;
359d1b2b5caSJohn Marino }
360d1b2b5caSJohn Marino 
ldns_soa_serial_increment(uint32_t s,void * ATTR_UNUSED (unused))361d1b2b5caSJohn Marino uint32_t ldns_soa_serial_increment(uint32_t s, void *ATTR_UNUSED(unused))
362d1b2b5caSJohn Marino {
363d1b2b5caSJohn Marino 	return ldns_soa_serial_increment_by(s, (void *)1);
364d1b2b5caSJohn Marino }
365d1b2b5caSJohn Marino 
ldns_soa_serial_increment_by(uint32_t s,void * data)366d1b2b5caSJohn Marino uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data)
367d1b2b5caSJohn Marino {
368d1b2b5caSJohn Marino 	return s + (intptr_t) data;
369d1b2b5caSJohn Marino }
370d1b2b5caSJohn Marino 
ldns_soa_serial_datecounter(uint32_t s,void * data)371d1b2b5caSJohn Marino uint32_t ldns_soa_serial_datecounter(uint32_t s, void *data)
372d1b2b5caSJohn Marino {
373d1b2b5caSJohn Marino 	struct tm tm;
374d1b2b5caSJohn Marino 	char s_str[11];
375d1b2b5caSJohn Marino 	int32_t new_s;
376d1b2b5caSJohn Marino 	time_t t = data ? (time_t) (intptr_t) data : ldns_time(NULL);
377d1b2b5caSJohn Marino 
378d1b2b5caSJohn Marino 	(void) strftime(s_str, 11, "%Y%m%d00", localtime_r(&t, &tm));
379d1b2b5caSJohn Marino 	new_s = (int32_t) atoi(s_str);
380d1b2b5caSJohn Marino 	return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s);
381d1b2b5caSJohn Marino }
382d1b2b5caSJohn Marino 
ldns_soa_serial_unixtime(uint32_t s,void * data)383d1b2b5caSJohn Marino uint32_t ldns_soa_serial_unixtime(uint32_t s, void *data)
384d1b2b5caSJohn Marino {
385d1b2b5caSJohn Marino 	int32_t new_s = data ? (int32_t) (intptr_t) data
386d1b2b5caSJohn Marino 			     : (int32_t) ldns_time(NULL);
387d1b2b5caSJohn Marino 	return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s);
388d1b2b5caSJohn Marino }
389d1b2b5caSJohn Marino 
390d1b2b5caSJohn Marino void
ldns_rr_soa_increment(ldns_rr * soa)391d1b2b5caSJohn Marino ldns_rr_soa_increment(ldns_rr *soa)
392d1b2b5caSJohn Marino {
393d1b2b5caSJohn Marino 	ldns_rr_soa_increment_func_data(soa, ldns_soa_serial_increment, NULL);
394d1b2b5caSJohn Marino }
395d1b2b5caSJohn Marino 
396d1b2b5caSJohn Marino void
ldns_rr_soa_increment_func(ldns_rr * soa,ldns_soa_serial_increment_func_t f)397d1b2b5caSJohn Marino ldns_rr_soa_increment_func(ldns_rr *soa, ldns_soa_serial_increment_func_t f)
398d1b2b5caSJohn Marino {
399d1b2b5caSJohn Marino 	ldns_rr_soa_increment_func_data(soa, f, NULL);
400d1b2b5caSJohn Marino }
401d1b2b5caSJohn Marino 
402d1b2b5caSJohn Marino void
ldns_rr_soa_increment_func_data(ldns_rr * soa,ldns_soa_serial_increment_func_t f,void * data)403d1b2b5caSJohn Marino ldns_rr_soa_increment_func_data(ldns_rr *soa,
404d1b2b5caSJohn Marino 		ldns_soa_serial_increment_func_t f, void *data)
405d1b2b5caSJohn Marino {
406d1b2b5caSJohn Marino 	ldns_rdf *prev_soa_serial_rdf;
407d1b2b5caSJohn Marino 	if ( !soa || !f || ldns_rr_get_type(soa) != LDNS_RR_TYPE_SOA
408d1b2b5caSJohn Marino 			|| !ldns_rr_rdf(soa, 2)) {
409d1b2b5caSJohn Marino 		return;
410d1b2b5caSJohn Marino 	}
411d1b2b5caSJohn Marino 	prev_soa_serial_rdf = ldns_rr_set_rdf(
412d1b2b5caSJohn Marino 		  soa
413d1b2b5caSJohn Marino 		, ldns_native2rdf_int32(
414d1b2b5caSJohn Marino 			  LDNS_RDF_TYPE_INT32
415d1b2b5caSJohn Marino 			, (*f)( ldns_rdf2native_int32(
416d1b2b5caSJohn Marino 					ldns_rr_rdf(soa, 2))
417d1b2b5caSJohn Marino 			      , data
418d1b2b5caSJohn Marino 			)
419d1b2b5caSJohn Marino 		)
420d1b2b5caSJohn Marino 		, 2
421d1b2b5caSJohn Marino 	);
422d1b2b5caSJohn Marino 	LDNS_FREE(prev_soa_serial_rdf);
423d1b2b5caSJohn Marino }
424d1b2b5caSJohn Marino 
425d1b2b5caSJohn Marino void
ldns_rr_soa_increment_func_int(ldns_rr * soa,ldns_soa_serial_increment_func_t f,int data)426d1b2b5caSJohn Marino ldns_rr_soa_increment_func_int(ldns_rr *soa,
427d1b2b5caSJohn Marino 		ldns_soa_serial_increment_func_t f, int data)
428d1b2b5caSJohn Marino {
429d1b2b5caSJohn Marino 	ldns_rr_soa_increment_func_data(soa, f, (void *) (intptr_t) data);
430d1b2b5caSJohn Marino }
431d1b2b5caSJohn Marino 
432