xref: /freebsd-src/contrib/ldns/rr_functions.c (revision 5afab0e5e56fe90a378fb57249600e7924e1cab2)
17b5038d7SDag-Erling Smørgrav /*
27b5038d7SDag-Erling Smørgrav  * rr_function.c
37b5038d7SDag-Erling Smørgrav  *
47b5038d7SDag-Erling Smørgrav  * function that operate on specific rr types
57b5038d7SDag-Erling Smørgrav  *
67b5038d7SDag-Erling Smørgrav  * (c) NLnet Labs, 2004-2006
77b5038d7SDag-Erling Smørgrav  * See the file LICENSE for the license
87b5038d7SDag-Erling Smørgrav  */
97b5038d7SDag-Erling Smørgrav 
107b5038d7SDag-Erling Smørgrav /*
117b5038d7SDag-Erling Smørgrav  * These come strait from perldoc Net::DNS::RR::xxx
127b5038d7SDag-Erling Smørgrav  * first the read variant, then the write. This is
137b5038d7SDag-Erling Smørgrav  * not complete.
147b5038d7SDag-Erling Smørgrav  */
157b5038d7SDag-Erling Smørgrav 
167b5038d7SDag-Erling Smørgrav #include <ldns/config.h>
177b5038d7SDag-Erling Smørgrav 
187b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h>
197b5038d7SDag-Erling Smørgrav 
207b5038d7SDag-Erling Smørgrav #include <limits.h>
217b5038d7SDag-Erling Smørgrav #include <strings.h>
227b5038d7SDag-Erling Smørgrav 
237b5038d7SDag-Erling Smørgrav /**
247b5038d7SDag-Erling Smørgrav  * return a specific rdf
257b5038d7SDag-Erling Smørgrav  * \param[in] type type of RR
267b5038d7SDag-Erling Smørgrav  * \param[in] rr   the rr itself
27*5afab0e5SDag-Erling Smørgrav  * \param[in] pos  at which position to get it
287b5038d7SDag-Erling Smørgrav  * \return the rdf sought
297b5038d7SDag-Erling Smørgrav  */
307b5038d7SDag-Erling Smørgrav static ldns_rdf *
ldns_rr_function(ldns_rr_type type,const ldns_rr * rr,size_t pos)317b5038d7SDag-Erling Smørgrav ldns_rr_function(ldns_rr_type type, const ldns_rr *rr, size_t pos)
327b5038d7SDag-Erling Smørgrav {
337b5038d7SDag-Erling Smørgrav         if (!rr || ldns_rr_get_type(rr) != type) {
347b5038d7SDag-Erling Smørgrav                 return NULL;
357b5038d7SDag-Erling Smørgrav         }
367b5038d7SDag-Erling Smørgrav         return ldns_rr_rdf(rr, pos);
377b5038d7SDag-Erling Smørgrav }
387b5038d7SDag-Erling Smørgrav 
397b5038d7SDag-Erling Smørgrav /**
407b5038d7SDag-Erling Smørgrav  * set a specific rdf
417b5038d7SDag-Erling Smørgrav  * \param[in] type type of RR
427b5038d7SDag-Erling Smørgrav  * \param[in] rr   the rr itself
437b5038d7SDag-Erling Smørgrav  * \param[in] rdf  the rdf to set
44*5afab0e5SDag-Erling Smørgrav  * \param[in] pos  at which position to set it
457b5038d7SDag-Erling Smørgrav  * \return true or false
467b5038d7SDag-Erling Smørgrav  */
477b5038d7SDag-Erling Smørgrav static bool
ldns_rr_set_function(ldns_rr_type type,ldns_rr * rr,ldns_rdf * rdf,size_t pos)487b5038d7SDag-Erling Smørgrav ldns_rr_set_function(ldns_rr_type type, ldns_rr *rr, ldns_rdf *rdf, size_t pos)
497b5038d7SDag-Erling Smørgrav {
507b5038d7SDag-Erling Smørgrav         ldns_rdf *pop;
517b5038d7SDag-Erling Smørgrav         if (!rr || ldns_rr_get_type(rr) != type) {
527b5038d7SDag-Erling Smørgrav                 return false;
537b5038d7SDag-Erling Smørgrav         }
547b5038d7SDag-Erling Smørgrav         pop = ldns_rr_set_rdf(rr, rdf, pos);
557b5038d7SDag-Erling Smørgrav  	ldns_rdf_deep_free(pop);
567b5038d7SDag-Erling Smørgrav         return true;
577b5038d7SDag-Erling Smørgrav }
587b5038d7SDag-Erling Smørgrav 
597b5038d7SDag-Erling Smørgrav /* A/AAAA records */
607b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_a_address(const ldns_rr * r)617b5038d7SDag-Erling Smørgrav ldns_rr_a_address(const ldns_rr *r)
627b5038d7SDag-Erling Smørgrav {
637b5038d7SDag-Erling Smørgrav 	/* 2 types to check, cannot use the macro */
647b5038d7SDag-Erling Smørgrav 	if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
657b5038d7SDag-Erling Smørgrav 			ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
667b5038d7SDag-Erling Smørgrav 		return NULL;
677b5038d7SDag-Erling Smørgrav 	}
687b5038d7SDag-Erling Smørgrav 	return ldns_rr_rdf(r, 0);
697b5038d7SDag-Erling Smørgrav }
707b5038d7SDag-Erling Smørgrav 
717b5038d7SDag-Erling Smørgrav bool
ldns_rr_a_set_address(ldns_rr * r,ldns_rdf * f)727b5038d7SDag-Erling Smørgrav ldns_rr_a_set_address(ldns_rr *r, ldns_rdf *f)
737b5038d7SDag-Erling Smørgrav {
747b5038d7SDag-Erling Smørgrav 	/* 2 types to check, cannot use the macro... */
757b5038d7SDag-Erling Smørgrav 	ldns_rdf *pop;
767b5038d7SDag-Erling Smørgrav 	if (!r || (ldns_rr_get_type(r) != LDNS_RR_TYPE_A &&
777b5038d7SDag-Erling Smørgrav 			ldns_rr_get_type(r) != LDNS_RR_TYPE_AAAA)) {
787b5038d7SDag-Erling Smørgrav 		return false;
797b5038d7SDag-Erling Smørgrav 	}
807b5038d7SDag-Erling Smørgrav 	pop = ldns_rr_set_rdf(r, f, 0);
817b5038d7SDag-Erling Smørgrav 	if (pop) {
827b5038d7SDag-Erling Smørgrav 		LDNS_FREE(pop);
837b5038d7SDag-Erling Smørgrav 		return true;
847b5038d7SDag-Erling Smørgrav 	} else {
857b5038d7SDag-Erling Smørgrav 		return false;
867b5038d7SDag-Erling Smørgrav 	}
877b5038d7SDag-Erling Smørgrav }
887b5038d7SDag-Erling Smørgrav 
897b5038d7SDag-Erling Smørgrav /* NS record */
907b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_ns_nsdname(const ldns_rr * r)917b5038d7SDag-Erling Smørgrav ldns_rr_ns_nsdname(const ldns_rr *r)
927b5038d7SDag-Erling Smørgrav {
937b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_NS, r, 0);
947b5038d7SDag-Erling Smørgrav }
957b5038d7SDag-Erling Smørgrav 
967b5038d7SDag-Erling Smørgrav /* MX record */
977b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_mx_preference(const ldns_rr * r)987b5038d7SDag-Erling Smørgrav ldns_rr_mx_preference(const ldns_rr *r)
997b5038d7SDag-Erling Smørgrav {
1007b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_MX, r, 0);
1017b5038d7SDag-Erling Smørgrav }
1027b5038d7SDag-Erling Smørgrav 
1037b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_mx_exchange(const ldns_rr * r)1047b5038d7SDag-Erling Smørgrav ldns_rr_mx_exchange(const ldns_rr *r)
1057b5038d7SDag-Erling Smørgrav {
1067b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_MX, r, 1);
1077b5038d7SDag-Erling Smørgrav }
1087b5038d7SDag-Erling Smørgrav 
1097b5038d7SDag-Erling Smørgrav /* RRSIG record */
1107b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_typecovered(const ldns_rr * r)1117b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_typecovered(const ldns_rr *r)
1127b5038d7SDag-Erling Smørgrav {
1137b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 0);
1147b5038d7SDag-Erling Smørgrav }
1157b5038d7SDag-Erling Smørgrav 
1167b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_typecovered(ldns_rr * r,ldns_rdf * f)1177b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_typecovered(ldns_rr *r, ldns_rdf *f)
1187b5038d7SDag-Erling Smørgrav {
1197b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 0);
1207b5038d7SDag-Erling Smørgrav }
1217b5038d7SDag-Erling Smørgrav 
1227b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_algorithm(const ldns_rr * r)1237b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_algorithm(const ldns_rr *r)
1247b5038d7SDag-Erling Smørgrav {
1257b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 1);
1267b5038d7SDag-Erling Smørgrav }
1277b5038d7SDag-Erling Smørgrav 
1287b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_algorithm(ldns_rr * r,ldns_rdf * f)1297b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_algorithm(ldns_rr *r, ldns_rdf *f)
1307b5038d7SDag-Erling Smørgrav {
1317b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 1);
1327b5038d7SDag-Erling Smørgrav }
1337b5038d7SDag-Erling Smørgrav 
1347b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_labels(const ldns_rr * r)1357b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_labels(const ldns_rr *r)
1367b5038d7SDag-Erling Smørgrav {
1377b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 2);
1387b5038d7SDag-Erling Smørgrav }
1397b5038d7SDag-Erling Smørgrav 
1407b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_labels(ldns_rr * r,ldns_rdf * f)1417b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_labels(ldns_rr *r, ldns_rdf *f)
1427b5038d7SDag-Erling Smørgrav {
1437b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 2);
1447b5038d7SDag-Erling Smørgrav }
1457b5038d7SDag-Erling Smørgrav 
1467b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_origttl(const ldns_rr * r)1477b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_origttl(const ldns_rr *r)
1487b5038d7SDag-Erling Smørgrav {
1497b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 3);
1507b5038d7SDag-Erling Smørgrav }
1517b5038d7SDag-Erling Smørgrav 
1527b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_origttl(ldns_rr * r,ldns_rdf * f)1537b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_origttl(ldns_rr *r, ldns_rdf *f)
1547b5038d7SDag-Erling Smørgrav {
1557b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 3);
1567b5038d7SDag-Erling Smørgrav }
1577b5038d7SDag-Erling Smørgrav 
1587b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_expiration(const ldns_rr * r)1597b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_expiration(const ldns_rr *r)
1607b5038d7SDag-Erling Smørgrav {
1617b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 4);
1627b5038d7SDag-Erling Smørgrav }
1637b5038d7SDag-Erling Smørgrav 
1647b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_expiration(ldns_rr * r,ldns_rdf * f)1657b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_expiration(ldns_rr *r, ldns_rdf *f)
1667b5038d7SDag-Erling Smørgrav {
1677b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 4);
1687b5038d7SDag-Erling Smørgrav }
1697b5038d7SDag-Erling Smørgrav 
1707b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_inception(const ldns_rr * r)1717b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_inception(const ldns_rr *r)
1727b5038d7SDag-Erling Smørgrav {
1737b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 5);
1747b5038d7SDag-Erling Smørgrav }
1757b5038d7SDag-Erling Smørgrav 
1767b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_inception(ldns_rr * r,ldns_rdf * f)1777b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_inception(ldns_rr *r, ldns_rdf *f)
1787b5038d7SDag-Erling Smørgrav {
1797b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 5);
1807b5038d7SDag-Erling Smørgrav }
1817b5038d7SDag-Erling Smørgrav 
1827b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_keytag(const ldns_rr * r)1837b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_keytag(const ldns_rr *r)
1847b5038d7SDag-Erling Smørgrav {
1857b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 6);
1867b5038d7SDag-Erling Smørgrav }
1877b5038d7SDag-Erling Smørgrav 
1887b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_keytag(ldns_rr * r,ldns_rdf * f)1897b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_keytag(ldns_rr *r, ldns_rdf *f)
1907b5038d7SDag-Erling Smørgrav {
1917b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 6);
1927b5038d7SDag-Erling Smørgrav }
1937b5038d7SDag-Erling Smørgrav 
1947b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_signame(const ldns_rr * r)1957b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_signame(const ldns_rr *r)
1967b5038d7SDag-Erling Smørgrav {
1977b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 7);
1987b5038d7SDag-Erling Smørgrav }
1997b5038d7SDag-Erling Smørgrav 
2007b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_signame(ldns_rr * r,ldns_rdf * f)2017b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_signame(ldns_rr *r, ldns_rdf *f)
2027b5038d7SDag-Erling Smørgrav {
2037b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 7);
2047b5038d7SDag-Erling Smørgrav }
2057b5038d7SDag-Erling Smørgrav 
2067b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_rrsig_sig(const ldns_rr * r)2077b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_sig(const ldns_rr *r)
2087b5038d7SDag-Erling Smørgrav {
2097b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_RRSIG, r, 8);
2107b5038d7SDag-Erling Smørgrav }
2117b5038d7SDag-Erling Smørgrav 
2127b5038d7SDag-Erling Smørgrav bool
ldns_rr_rrsig_set_sig(ldns_rr * r,ldns_rdf * f)2137b5038d7SDag-Erling Smørgrav ldns_rr_rrsig_set_sig(ldns_rr *r, ldns_rdf *f)
2147b5038d7SDag-Erling Smørgrav {
2157b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_RRSIG, r, f, 8);
2167b5038d7SDag-Erling Smørgrav }
2177b5038d7SDag-Erling Smørgrav 
2187b5038d7SDag-Erling Smørgrav /* DNSKEY record */
2197b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_dnskey_flags(const ldns_rr * r)2207b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_flags(const ldns_rr *r)
2217b5038d7SDag-Erling Smørgrav {
2227b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 0);
2237b5038d7SDag-Erling Smørgrav }
2247b5038d7SDag-Erling Smørgrav 
2257b5038d7SDag-Erling Smørgrav bool
ldns_rr_dnskey_set_flags(ldns_rr * r,ldns_rdf * f)2267b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_flags(ldns_rr *r, ldns_rdf *f)
2277b5038d7SDag-Erling Smørgrav {
2287b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 0);
2297b5038d7SDag-Erling Smørgrav }
2307b5038d7SDag-Erling Smørgrav 
2317b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_dnskey_protocol(const ldns_rr * r)2327b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_protocol(const ldns_rr *r)
2337b5038d7SDag-Erling Smørgrav {
2347b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 1);
2357b5038d7SDag-Erling Smørgrav }
2367b5038d7SDag-Erling Smørgrav 
2377b5038d7SDag-Erling Smørgrav bool
ldns_rr_dnskey_set_protocol(ldns_rr * r,ldns_rdf * f)2387b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_protocol(ldns_rr *r, ldns_rdf *f)
2397b5038d7SDag-Erling Smørgrav {
2407b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 1);
2417b5038d7SDag-Erling Smørgrav }
2427b5038d7SDag-Erling Smørgrav 
2437b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_dnskey_algorithm(const ldns_rr * r)2447b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_algorithm(const ldns_rr *r)
2457b5038d7SDag-Erling Smørgrav {
2467b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 2);
2477b5038d7SDag-Erling Smørgrav }
2487b5038d7SDag-Erling Smørgrav 
2497b5038d7SDag-Erling Smørgrav bool
ldns_rr_dnskey_set_algorithm(ldns_rr * r,ldns_rdf * f)2507b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_algorithm(ldns_rr *r, ldns_rdf *f)
2517b5038d7SDag-Erling Smørgrav {
2527b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 2);
2537b5038d7SDag-Erling Smørgrav }
2547b5038d7SDag-Erling Smørgrav 
2557b5038d7SDag-Erling Smørgrav ldns_rdf *
ldns_rr_dnskey_key(const ldns_rr * r)2567b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key(const ldns_rr *r)
2577b5038d7SDag-Erling Smørgrav {
2587b5038d7SDag-Erling Smørgrav 	return ldns_rr_function(LDNS_RR_TYPE_DNSKEY, r, 3);
2597b5038d7SDag-Erling Smørgrav }
2607b5038d7SDag-Erling Smørgrav 
2617b5038d7SDag-Erling Smørgrav bool
ldns_rr_dnskey_set_key(ldns_rr * r,ldns_rdf * f)2627b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_set_key(ldns_rr *r, ldns_rdf *f)
2637b5038d7SDag-Erling Smørgrav {
2647b5038d7SDag-Erling Smørgrav 	return ldns_rr_set_function(LDNS_RR_TYPE_DNSKEY, r, f, 3);
2657b5038d7SDag-Erling Smørgrav }
2667b5038d7SDag-Erling Smørgrav 
2677b5038d7SDag-Erling Smørgrav size_t
ldns_rr_dnskey_key_size_raw(const unsigned char * keydata,const size_t len,const ldns_algorithm alg)2687b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key_size_raw(const unsigned char* keydata,
2697b5038d7SDag-Erling Smørgrav                             const size_t len,
2707b5038d7SDag-Erling Smørgrav                             const ldns_algorithm alg)
2717b5038d7SDag-Erling Smørgrav {
272*5afab0e5SDag-Erling Smørgrav #ifdef USE_DSA
2737b5038d7SDag-Erling Smørgrav 	/* for DSA keys */
2747b5038d7SDag-Erling Smørgrav 	uint8_t t;
275*5afab0e5SDag-Erling Smørgrav #endif /* USE_DSA */
2767b5038d7SDag-Erling Smørgrav 
2777b5038d7SDag-Erling Smørgrav 	/* for RSA keys */
2787b5038d7SDag-Erling Smørgrav 	uint16_t exp;
2797b5038d7SDag-Erling Smørgrav 	uint16_t int16;
2807b5038d7SDag-Erling Smørgrav 
2817b5038d7SDag-Erling Smørgrav 	switch ((ldns_signing_algorithm)alg) {
282*5afab0e5SDag-Erling Smørgrav #ifdef USE_DSA
2837b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_DSA:
2847b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_DSA_NSEC3:
2857b5038d7SDag-Erling Smørgrav 		if (len > 0) {
2867b5038d7SDag-Erling Smørgrav 			t = keydata[0];
2877b5038d7SDag-Erling Smørgrav 			return (64 + t*8)*8;
2887b5038d7SDag-Erling Smørgrav 		} else {
2897b5038d7SDag-Erling Smørgrav 			return 0;
2907b5038d7SDag-Erling Smørgrav 		}
2917b5038d7SDag-Erling Smørgrav 		break;
292*5afab0e5SDag-Erling Smørgrav #endif /* USE_DSA */
2937b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSAMD5:
2947b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA1:
2957b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA1_NSEC3:
2967b5038d7SDag-Erling Smørgrav #ifdef USE_SHA2
2977b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA256:
2987b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_RSASHA512:
2997b5038d7SDag-Erling Smørgrav #endif
3007b5038d7SDag-Erling Smørgrav 		if (len > 0) {
3017b5038d7SDag-Erling Smørgrav 			if (keydata[0] == 0) {
3027b5038d7SDag-Erling Smørgrav 				/* big exponent */
3037b5038d7SDag-Erling Smørgrav 				if (len > 3) {
3047b5038d7SDag-Erling Smørgrav 					memmove(&int16, keydata + 1, 2);
3057b5038d7SDag-Erling Smørgrav 					exp = ntohs(int16);
3067b5038d7SDag-Erling Smørgrav 					return (len - exp - 3)*8;
3077b5038d7SDag-Erling Smørgrav 				} else {
3087b5038d7SDag-Erling Smørgrav 					return 0;
3097b5038d7SDag-Erling Smørgrav 				}
3107b5038d7SDag-Erling Smørgrav 			} else {
3117b5038d7SDag-Erling Smørgrav 				exp = keydata[0];
3127b5038d7SDag-Erling Smørgrav 				return (len-exp-1)*8;
3137b5038d7SDag-Erling Smørgrav 			}
3147b5038d7SDag-Erling Smørgrav 		} else {
3157b5038d7SDag-Erling Smørgrav 			return 0;
3167b5038d7SDag-Erling Smørgrav 		}
3177b5038d7SDag-Erling Smørgrav 		break;
3187b5038d7SDag-Erling Smørgrav #ifdef USE_GOST
3197b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_ECC_GOST:
3207b5038d7SDag-Erling Smørgrav 		return 512;
3217b5038d7SDag-Erling Smørgrav #endif
3227b5038d7SDag-Erling Smørgrav #ifdef USE_ECDSA
3237b5038d7SDag-Erling Smørgrav         case LDNS_SIGN_ECDSAP256SHA256:
3247b5038d7SDag-Erling Smørgrav                 return 256;
3257b5038d7SDag-Erling Smørgrav         case LDNS_SIGN_ECDSAP384SHA384:
3267b5038d7SDag-Erling Smørgrav                 return 384;
3277b5038d7SDag-Erling Smørgrav #endif
328986ba33cSDag-Erling Smørgrav #ifdef USE_ED25519
329986ba33cSDag-Erling Smørgrav 	case LDNS_SIGN_ED25519:
330986ba33cSDag-Erling Smørgrav 		return 256;
331986ba33cSDag-Erling Smørgrav #endif
332986ba33cSDag-Erling Smørgrav #ifdef USE_ED448
333986ba33cSDag-Erling Smørgrav 	case LDNS_SIGN_ED448:
334986ba33cSDag-Erling Smørgrav 		return 456;
335986ba33cSDag-Erling Smørgrav #endif
3367b5038d7SDag-Erling Smørgrav 	case LDNS_SIGN_HMACMD5:
3377b5038d7SDag-Erling Smørgrav 		return len;
3387b5038d7SDag-Erling Smørgrav 	default:
3397b5038d7SDag-Erling Smørgrav 		return 0;
3407b5038d7SDag-Erling Smørgrav 	}
3417b5038d7SDag-Erling Smørgrav }
3427b5038d7SDag-Erling Smørgrav 
3437b5038d7SDag-Erling Smørgrav size_t
ldns_rr_dnskey_key_size(const ldns_rr * key)3447b5038d7SDag-Erling Smørgrav ldns_rr_dnskey_key_size(const ldns_rr *key)
3457b5038d7SDag-Erling Smørgrav {
3467b5038d7SDag-Erling Smørgrav 	if (!key || !ldns_rr_dnskey_key(key)
3477b5038d7SDag-Erling Smørgrav 			|| !ldns_rr_dnskey_algorithm(key)) {
3487b5038d7SDag-Erling Smørgrav 		return 0;
3497b5038d7SDag-Erling Smørgrav 	}
3507b5038d7SDag-Erling Smørgrav 	return ldns_rr_dnskey_key_size_raw((unsigned char*)ldns_rdf_data(ldns_rr_dnskey_key(key)),
3517b5038d7SDag-Erling Smørgrav 	                                   ldns_rdf_size(ldns_rr_dnskey_key(key)),
3527b5038d7SDag-Erling Smørgrav 	                                   ldns_rdf2native_int8(ldns_rr_dnskey_algorithm(key))
3537b5038d7SDag-Erling Smørgrav 	                                  );
3547b5038d7SDag-Erling Smørgrav }
3557b5038d7SDag-Erling Smørgrav 
ldns_soa_serial_identity(uint32_t ATTR_UNUSED (unused),void * data)3567b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_identity(uint32_t ATTR_UNUSED(unused), void *data)
3577b5038d7SDag-Erling Smørgrav {
3587b5038d7SDag-Erling Smørgrav 	return (uint32_t) (intptr_t) data;
3597b5038d7SDag-Erling Smørgrav }
3607b5038d7SDag-Erling Smørgrav 
ldns_soa_serial_increment(uint32_t s,void * ATTR_UNUSED (unused))3617b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_increment(uint32_t s, void *ATTR_UNUSED(unused))
3627b5038d7SDag-Erling Smørgrav {
3637b5038d7SDag-Erling Smørgrav 	return ldns_soa_serial_increment_by(s, (void *)1);
3647b5038d7SDag-Erling Smørgrav }
3657b5038d7SDag-Erling Smørgrav 
ldns_soa_serial_increment_by(uint32_t s,void * data)3667b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_increment_by(uint32_t s, void *data)
3677b5038d7SDag-Erling Smørgrav {
3687b5038d7SDag-Erling Smørgrav 	return s + (intptr_t) data;
3697b5038d7SDag-Erling Smørgrav }
3707b5038d7SDag-Erling Smørgrav 
ldns_soa_serial_datecounter(uint32_t s,void * data)3717b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_datecounter(uint32_t s, void *data)
3727b5038d7SDag-Erling Smørgrav {
3737b5038d7SDag-Erling Smørgrav 	struct tm tm;
3747b5038d7SDag-Erling Smørgrav 	char s_str[11];
3757b5038d7SDag-Erling Smørgrav 	int32_t new_s;
3767b5038d7SDag-Erling Smørgrav 	time_t t = data ? (time_t) (intptr_t) data : ldns_time(NULL);
3777b5038d7SDag-Erling Smørgrav 
3787b5038d7SDag-Erling Smørgrav 	(void) strftime(s_str, 11, "%Y%m%d00", localtime_r(&t, &tm));
3797b5038d7SDag-Erling Smørgrav 	new_s = (int32_t) atoi(s_str);
3807b5038d7SDag-Erling Smørgrav 	return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s);
3817b5038d7SDag-Erling Smørgrav }
3827b5038d7SDag-Erling Smørgrav 
ldns_soa_serial_unixtime(uint32_t s,void * data)3837b5038d7SDag-Erling Smørgrav uint32_t ldns_soa_serial_unixtime(uint32_t s, void *data)
3847b5038d7SDag-Erling Smørgrav {
3857b5038d7SDag-Erling Smørgrav 	int32_t new_s = data ? (int32_t) (intptr_t) data
3867b5038d7SDag-Erling Smørgrav 			     : (int32_t) ldns_time(NULL);
3877b5038d7SDag-Erling Smørgrav 	return new_s - ((int32_t) s) <= 0 ? s+1 : ((uint32_t) new_s);
3887b5038d7SDag-Erling Smørgrav }
3897b5038d7SDag-Erling Smørgrav 
3907b5038d7SDag-Erling Smørgrav void
ldns_rr_soa_increment(ldns_rr * soa)3917b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment(ldns_rr *soa)
3927b5038d7SDag-Erling Smørgrav {
3937b5038d7SDag-Erling Smørgrav 	ldns_rr_soa_increment_func_data(soa, ldns_soa_serial_increment, NULL);
3947b5038d7SDag-Erling Smørgrav }
3957b5038d7SDag-Erling Smørgrav 
3967b5038d7SDag-Erling Smørgrav void
ldns_rr_soa_increment_func(ldns_rr * soa,ldns_soa_serial_increment_func_t f)3977b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func(ldns_rr *soa, ldns_soa_serial_increment_func_t f)
3987b5038d7SDag-Erling Smørgrav {
3997b5038d7SDag-Erling Smørgrav 	ldns_rr_soa_increment_func_data(soa, f, NULL);
4007b5038d7SDag-Erling Smørgrav }
4017b5038d7SDag-Erling Smørgrav 
4027b5038d7SDag-Erling Smørgrav void
ldns_rr_soa_increment_func_data(ldns_rr * soa,ldns_soa_serial_increment_func_t f,void * data)4037b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_data(ldns_rr *soa,
4047b5038d7SDag-Erling Smørgrav 		ldns_soa_serial_increment_func_t f, void *data)
4057b5038d7SDag-Erling Smørgrav {
4067b5038d7SDag-Erling Smørgrav 	ldns_rdf *prev_soa_serial_rdf;
4077b5038d7SDag-Erling Smørgrav 	if ( !soa || !f || ldns_rr_get_type(soa) != LDNS_RR_TYPE_SOA
4087b5038d7SDag-Erling Smørgrav 			|| !ldns_rr_rdf(soa, 2)) {
4097b5038d7SDag-Erling Smørgrav 		return;
4107b5038d7SDag-Erling Smørgrav 	}
4117b5038d7SDag-Erling Smørgrav 	prev_soa_serial_rdf = ldns_rr_set_rdf(
4127b5038d7SDag-Erling Smørgrav 		  soa
4137b5038d7SDag-Erling Smørgrav 		, ldns_native2rdf_int32(
4147b5038d7SDag-Erling Smørgrav 			  LDNS_RDF_TYPE_INT32
4157b5038d7SDag-Erling Smørgrav 			, (*f)( ldns_rdf2native_int32(
4167b5038d7SDag-Erling Smørgrav 					ldns_rr_rdf(soa, 2))
4177b5038d7SDag-Erling Smørgrav 			      , data
4187b5038d7SDag-Erling Smørgrav 			)
4197b5038d7SDag-Erling Smørgrav 		)
4207b5038d7SDag-Erling Smørgrav 		, 2
4217b5038d7SDag-Erling Smørgrav 	);
4227b5038d7SDag-Erling Smørgrav 	LDNS_FREE(prev_soa_serial_rdf);
4237b5038d7SDag-Erling Smørgrav }
4247b5038d7SDag-Erling Smørgrav 
4257b5038d7SDag-Erling Smørgrav void
ldns_rr_soa_increment_func_int(ldns_rr * soa,ldns_soa_serial_increment_func_t f,int data)4267b5038d7SDag-Erling Smørgrav ldns_rr_soa_increment_func_int(ldns_rr *soa,
4277b5038d7SDag-Erling Smørgrav 		ldns_soa_serial_increment_func_t f, int data)
4287b5038d7SDag-Erling Smørgrav {
4297b5038d7SDag-Erling Smørgrav 	ldns_rr_soa_increment_func_data(soa, f, (void *) (intptr_t) data);
4307b5038d7SDag-Erling Smørgrav }
4317b5038d7SDag-Erling Smørgrav 
432