xref: /freebsd-src/contrib/ldns/host2str.c (revision 5afab0e5e56fe90a378fb57249600e7924e1cab2)
17b5038d7SDag-Erling Smørgrav /*
27b5038d7SDag-Erling Smørgrav  * host2str.c
37b5038d7SDag-Erling Smørgrav  *
47b5038d7SDag-Erling Smørgrav  * conversion routines from the host format
57b5038d7SDag-Erling Smørgrav  * to the presentation format (strings)
67b5038d7SDag-Erling Smørgrav  *
77b5038d7SDag-Erling Smørgrav  * a Net::DNS like library for C
87b5038d7SDag-Erling Smørgrav  *
97b5038d7SDag-Erling Smørgrav  * (c) NLnet Labs, 2004-2006
107b5038d7SDag-Erling Smørgrav  *
117b5038d7SDag-Erling Smørgrav  * See the file LICENSE for the license
127b5038d7SDag-Erling Smørgrav  */
137b5038d7SDag-Erling Smørgrav #include <ldns/config.h>
147b5038d7SDag-Erling Smørgrav 
157b5038d7SDag-Erling Smørgrav #include <ldns/ldns.h>
16*5afab0e5SDag-Erling Smørgrav #include <ldns/internal.h>
177b5038d7SDag-Erling Smørgrav 
187b5038d7SDag-Erling Smørgrav #include <limits.h>
197b5038d7SDag-Erling Smørgrav 
207b5038d7SDag-Erling Smørgrav #ifdef HAVE_SYS_SOCKET_H
217b5038d7SDag-Erling Smørgrav #include <sys/socket.h>
227b5038d7SDag-Erling Smørgrav #endif
237b5038d7SDag-Erling Smørgrav #ifdef HAVE_ARPA_INET_H
247b5038d7SDag-Erling Smørgrav #include <arpa/inet.h>
257b5038d7SDag-Erling Smørgrav #endif
267b5038d7SDag-Erling Smørgrav #ifdef HAVE_NETDB_H
277b5038d7SDag-Erling Smørgrav #include <netdb.h>
287b5038d7SDag-Erling Smørgrav #endif
297b5038d7SDag-Erling Smørgrav #include <time.h>
307b5038d7SDag-Erling Smørgrav #include <sys/time.h>
317b5038d7SDag-Erling Smørgrav 
32*5afab0e5SDag-Erling Smørgrav #ifdef HAVE_SSL
33*5afab0e5SDag-Erling Smørgrav #include <openssl/bn.h>
34*5afab0e5SDag-Erling Smørgrav #include <openssl/rsa.h>
35*5afab0e5SDag-Erling Smørgrav #ifdef USE_DSA
36*5afab0e5SDag-Erling Smørgrav #include <openssl/dsa.h>
37*5afab0e5SDag-Erling Smørgrav #endif
38*5afab0e5SDag-Erling Smørgrav #endif
39*5afab0e5SDag-Erling Smørgrav 
407b5038d7SDag-Erling Smørgrav #ifndef INET_ADDRSTRLEN
417b5038d7SDag-Erling Smørgrav #define INET_ADDRSTRLEN 16
427b5038d7SDag-Erling Smørgrav #endif
437b5038d7SDag-Erling Smørgrav #ifndef INET6_ADDRSTRLEN
447b5038d7SDag-Erling Smørgrav #define INET6_ADDRSTRLEN 46
457b5038d7SDag-Erling Smørgrav #endif
467b5038d7SDag-Erling Smørgrav 
477b5038d7SDag-Erling Smørgrav /* lookup tables for standard DNS stuff  */
487b5038d7SDag-Erling Smørgrav 
497b5038d7SDag-Erling Smørgrav /* Taken from RFC 2535, section 7.  */
507b5038d7SDag-Erling Smørgrav ldns_lookup_table ldns_algorithms[] = {
517b5038d7SDag-Erling Smørgrav         { LDNS_RSAMD5, "RSAMD5" },
527b5038d7SDag-Erling Smørgrav         { LDNS_DH, "DH" },
537b5038d7SDag-Erling Smørgrav         { LDNS_DSA, "DSA" },
547b5038d7SDag-Erling Smørgrav         { LDNS_ECC, "ECC" },
557b5038d7SDag-Erling Smørgrav         { LDNS_RSASHA1, "RSASHA1" },
567b5038d7SDag-Erling Smørgrav         { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" },
577b5038d7SDag-Erling Smørgrav         { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" },
587b5038d7SDag-Erling Smørgrav 	{ LDNS_RSASHA256, "RSASHA256"},
597b5038d7SDag-Erling Smørgrav 	{ LDNS_RSASHA512, "RSASHA512"},
607b5038d7SDag-Erling Smørgrav 	{ LDNS_ECC_GOST, "ECC-GOST"},
617b5038d7SDag-Erling Smørgrav         { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"},
627b5038d7SDag-Erling Smørgrav         { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"},
63986ba33cSDag-Erling Smørgrav 	{ LDNS_ED25519, "ED25519"},
64986ba33cSDag-Erling Smørgrav 	{ LDNS_ED448, "ED448"},
657b5038d7SDag-Erling Smørgrav         { LDNS_INDIRECT, "INDIRECT" },
667b5038d7SDag-Erling Smørgrav         { LDNS_PRIVATEDNS, "PRIVATEDNS" },
677b5038d7SDag-Erling Smørgrav         { LDNS_PRIVATEOID, "PRIVATEOID" },
687b5038d7SDag-Erling Smørgrav         { 0, NULL }
697b5038d7SDag-Erling Smørgrav };
707b5038d7SDag-Erling Smørgrav 
71*5afab0e5SDag-Erling Smørgrav /* Hashing algorithms used in the DS record */
72*5afab0e5SDag-Erling Smørgrav ldns_lookup_table ldns_hashes[] = {
73*5afab0e5SDag-Erling Smørgrav         {LDNS_SHA1     , "SHA1" },      /* RFC 4034 */
74*5afab0e5SDag-Erling Smørgrav         {LDNS_SHA256   , "SHA256" },    /* RFC 4509 */
75*5afab0e5SDag-Erling Smørgrav         {LDNS_HASH_GOST, "HASH-GOST" }, /* RFC 5933 */
76*5afab0e5SDag-Erling Smørgrav         {LDNS_SHA384   , "SHA384" },    /* RFC 6605 */
77*5afab0e5SDag-Erling Smørgrav         { 0, NULL }
78*5afab0e5SDag-Erling Smørgrav };
79*5afab0e5SDag-Erling Smørgrav 
807b5038d7SDag-Erling Smørgrav /* Taken from RFC 4398  */
817b5038d7SDag-Erling Smørgrav ldns_lookup_table ldns_cert_algorithms[] = {
827b5038d7SDag-Erling Smørgrav         { LDNS_CERT_PKIX, "PKIX" },
837b5038d7SDag-Erling Smørgrav         { LDNS_CERT_SPKI, "SPKI" },
847b5038d7SDag-Erling Smørgrav         { LDNS_CERT_PGP, "PGP" },
857b5038d7SDag-Erling Smørgrav         { LDNS_CERT_IPKIX, "IPKIX" },
867b5038d7SDag-Erling Smørgrav         { LDNS_CERT_ISPKI, "ISPKI" },
877b5038d7SDag-Erling Smørgrav         { LDNS_CERT_IPGP, "IPGP" },
887b5038d7SDag-Erling Smørgrav         { LDNS_CERT_ACPKIX, "ACPKIX" },
897b5038d7SDag-Erling Smørgrav         { LDNS_CERT_IACPKIX, "IACPKIX" },
907b5038d7SDag-Erling Smørgrav         { LDNS_CERT_URI, "URI" },
917b5038d7SDag-Erling Smørgrav         { LDNS_CERT_OID, "OID" },
927b5038d7SDag-Erling Smørgrav         { 0, NULL }
937b5038d7SDag-Erling Smørgrav };
947b5038d7SDag-Erling Smørgrav 
957b5038d7SDag-Erling Smørgrav /* classes  */
967b5038d7SDag-Erling Smørgrav ldns_lookup_table ldns_rr_classes[] = {
977b5038d7SDag-Erling Smørgrav         { LDNS_RR_CLASS_IN, "IN" },
987b5038d7SDag-Erling Smørgrav         { LDNS_RR_CLASS_CH, "CH" },
997b5038d7SDag-Erling Smørgrav         { LDNS_RR_CLASS_HS, "HS" },
1007b5038d7SDag-Erling Smørgrav         { LDNS_RR_CLASS_NONE, "NONE" },
1017b5038d7SDag-Erling Smørgrav         { LDNS_RR_CLASS_ANY, "ANY" },
1027b5038d7SDag-Erling Smørgrav         { 0, NULL }
1037b5038d7SDag-Erling Smørgrav };
1047b5038d7SDag-Erling Smørgrav 
1057b5038d7SDag-Erling Smørgrav /* if these are used elsewhere */
1067b5038d7SDag-Erling Smørgrav ldns_lookup_table ldns_rcodes[] = {
1077b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_NOERROR, "NOERROR" },
1087b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_FORMERR, "FORMERR" },
1097b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_SERVFAIL, "SERVFAIL" },
1107b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" },
1117b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_NOTIMPL, "NOTIMPL" },
1127b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_REFUSED, "REFUSED" },
1137b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" },
1147b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_YXRRSET, "YXRRSET" },
1157b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_NXRRSET, "NXRRSET" },
1167b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_NOTAUTH, "NOTAUTH" },
1177b5038d7SDag-Erling Smørgrav         { LDNS_RCODE_NOTZONE, "NOTZONE" },
1187b5038d7SDag-Erling Smørgrav         { 0, NULL }
1197b5038d7SDag-Erling Smørgrav };
1207b5038d7SDag-Erling Smørgrav 
1217b5038d7SDag-Erling Smørgrav ldns_lookup_table ldns_opcodes[] = {
1227b5038d7SDag-Erling Smørgrav         { LDNS_PACKET_QUERY, "QUERY" },
1237b5038d7SDag-Erling Smørgrav         { LDNS_PACKET_IQUERY, "IQUERY" },
1247b5038d7SDag-Erling Smørgrav         { LDNS_PACKET_STATUS, "STATUS" },
1257b5038d7SDag-Erling Smørgrav 	{ LDNS_PACKET_NOTIFY, "NOTIFY" },
1267b5038d7SDag-Erling Smørgrav 	{ LDNS_PACKET_UPDATE, "UPDATE" },
1277b5038d7SDag-Erling Smørgrav         { 0, NULL }
1287b5038d7SDag-Erling Smørgrav };
1297b5038d7SDag-Erling Smørgrav 
1307b5038d7SDag-Erling Smørgrav const ldns_output_format   ldns_output_format_nocomments_record = { 0, NULL };
1317b5038d7SDag-Erling Smørgrav const ldns_output_format  *ldns_output_format_nocomments
1327b5038d7SDag-Erling Smørgrav 			= &ldns_output_format_nocomments_record;
1337b5038d7SDag-Erling Smørgrav const ldns_output_format   ldns_output_format_onlykeyids_record = {
1347b5038d7SDag-Erling Smørgrav 	LDNS_COMMENT_KEY, NULL
1357b5038d7SDag-Erling Smørgrav };
1367b5038d7SDag-Erling Smørgrav const ldns_output_format  *ldns_output_format_onlykeyids
1377b5038d7SDag-Erling Smørgrav 			= &ldns_output_format_onlykeyids_record;
1387b5038d7SDag-Erling Smørgrav const ldns_output_format  *ldns_output_format_default
1397b5038d7SDag-Erling Smørgrav 			= &ldns_output_format_onlykeyids_record;
1402787e39aSDag-Erling Smørgrav 
1417b5038d7SDag-Erling Smørgrav const ldns_output_format   ldns_output_format_bubblebabble_record = {
1427b5038d7SDag-Erling Smørgrav 	LDNS_COMMENT_KEY | LDNS_COMMENT_BUBBLEBABBLE | LDNS_COMMENT_FLAGS, NULL
1437b5038d7SDag-Erling Smørgrav };
1447b5038d7SDag-Erling Smørgrav const ldns_output_format  *ldns_output_format_bubblebabble
1457b5038d7SDag-Erling Smørgrav 			= &ldns_output_format_bubblebabble_record;
1467b5038d7SDag-Erling Smørgrav 
14717d15b25SDag-Erling Smørgrav static bool
ldns_output_format_covers_type(const ldns_output_format * fmt,ldns_rr_type t)14817d15b25SDag-Erling Smørgrav ldns_output_format_covers_type(const ldns_output_format* fmt, ldns_rr_type t)
14917d15b25SDag-Erling Smørgrav {
15017d15b25SDag-Erling Smørgrav 	return fmt && (fmt->flags & LDNS_FMT_RFC3597) &&
15117d15b25SDag-Erling Smørgrav 		((ldns_output_format_storage*)fmt)->bitmap &&
15217d15b25SDag-Erling Smørgrav 		ldns_nsec_bitmap_covers_type(
15317d15b25SDag-Erling Smørgrav 				((ldns_output_format_storage*)fmt)->bitmap, t);
15417d15b25SDag-Erling Smørgrav }
15517d15b25SDag-Erling Smørgrav 
15617d15b25SDag-Erling Smørgrav ldns_status
ldns_output_format_set_type(ldns_output_format * fmt,ldns_rr_type t)15717d15b25SDag-Erling Smørgrav ldns_output_format_set_type(ldns_output_format* fmt, ldns_rr_type t)
15817d15b25SDag-Erling Smørgrav {
15917d15b25SDag-Erling Smørgrav 	ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt;
16017d15b25SDag-Erling Smørgrav 	ldns_status s;
16117d15b25SDag-Erling Smørgrav 
16217d15b25SDag-Erling Smørgrav 	assert(fmt != NULL);
16317d15b25SDag-Erling Smørgrav 
16417d15b25SDag-Erling Smørgrav 	if (!(fmt_st->flags & LDNS_FMT_RFC3597)) {
16517d15b25SDag-Erling Smørgrav 		ldns_output_format_set(fmt, LDNS_FMT_RFC3597);
16617d15b25SDag-Erling Smørgrav 	}
16717d15b25SDag-Erling Smørgrav 	if (! fmt_st->bitmap) {
16817d15b25SDag-Erling Smørgrav 		s = ldns_rdf_bitmap_known_rr_types_space(&fmt_st->bitmap);
16917d15b25SDag-Erling Smørgrav 		if (s != LDNS_STATUS_OK) {
17017d15b25SDag-Erling Smørgrav 			return s;
17117d15b25SDag-Erling Smørgrav 		}
17217d15b25SDag-Erling Smørgrav 	}
17317d15b25SDag-Erling Smørgrav 	return ldns_nsec_bitmap_set_type(fmt_st->bitmap, t);
17417d15b25SDag-Erling Smørgrav }
17517d15b25SDag-Erling Smørgrav 
17617d15b25SDag-Erling Smørgrav ldns_status
ldns_output_format_clear_type(ldns_output_format * fmt,ldns_rr_type t)17717d15b25SDag-Erling Smørgrav ldns_output_format_clear_type(ldns_output_format* fmt, ldns_rr_type t)
17817d15b25SDag-Erling Smørgrav {
17917d15b25SDag-Erling Smørgrav 	ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt;
18017d15b25SDag-Erling Smørgrav 	ldns_status s;
18117d15b25SDag-Erling Smørgrav 
18217d15b25SDag-Erling Smørgrav 	assert(fmt != NULL);
18317d15b25SDag-Erling Smørgrav 
18417d15b25SDag-Erling Smørgrav 	if (!(fmt_st->flags & LDNS_FMT_RFC3597)) {
18517d15b25SDag-Erling Smørgrav 		ldns_output_format_set(fmt, LDNS_FMT_RFC3597);
18617d15b25SDag-Erling Smørgrav 	}
18717d15b25SDag-Erling Smørgrav 	if (! fmt_st->bitmap) {
18817d15b25SDag-Erling Smørgrav 		s = ldns_rdf_bitmap_known_rr_types(&fmt_st->bitmap);
18917d15b25SDag-Erling Smørgrav 		if (s != LDNS_STATUS_OK) {
19017d15b25SDag-Erling Smørgrav 			return s;
19117d15b25SDag-Erling Smørgrav 		}
19217d15b25SDag-Erling Smørgrav 	}
19317d15b25SDag-Erling Smørgrav 	return ldns_nsec_bitmap_clear_type(fmt_st->bitmap, t);
19417d15b25SDag-Erling Smørgrav }
19517d15b25SDag-Erling Smørgrav 
1967b5038d7SDag-Erling Smørgrav ldns_status
ldns_pkt_opcode2buffer_str(ldns_buffer * output,ldns_pkt_opcode opcode)1977b5038d7SDag-Erling Smørgrav ldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode)
1987b5038d7SDag-Erling Smørgrav {
1997b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode);
2007b5038d7SDag-Erling Smørgrav 	if (lt && lt->name) {
2017b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", lt->name);
2027b5038d7SDag-Erling Smørgrav 	} else {
2037b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "OPCODE%u", opcode);
2047b5038d7SDag-Erling Smørgrav 	}
2057b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2067b5038d7SDag-Erling Smørgrav }
2077b5038d7SDag-Erling Smørgrav 
2087b5038d7SDag-Erling Smørgrav ldns_status
ldns_pkt_rcode2buffer_str(ldns_buffer * output,ldns_pkt_rcode rcode)2097b5038d7SDag-Erling Smørgrav ldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode)
2107b5038d7SDag-Erling Smørgrav {
2117b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode);
2127b5038d7SDag-Erling Smørgrav 	if (lt && lt->name) {
2137b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", lt->name);
2147b5038d7SDag-Erling Smørgrav 	} else {
2157b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "RCODE%u", rcode);
2167b5038d7SDag-Erling Smørgrav 	}
2177b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2187b5038d7SDag-Erling Smørgrav }
2197b5038d7SDag-Erling Smørgrav 
2207b5038d7SDag-Erling Smørgrav ldns_status
ldns_algorithm2buffer_str(ldns_buffer * output,ldns_algorithm algorithm)2217b5038d7SDag-Erling Smørgrav ldns_algorithm2buffer_str(ldns_buffer *output,
2227b5038d7SDag-Erling Smørgrav                           ldns_algorithm algorithm)
2237b5038d7SDag-Erling Smørgrav {
2247b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms,
2257b5038d7SDag-Erling Smørgrav 	                                          algorithm);
2267b5038d7SDag-Erling Smørgrav 	if (lt && lt->name) {
2277b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", lt->name);
2287b5038d7SDag-Erling Smørgrav 	} else {
2297b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "ALG%u", algorithm);
2307b5038d7SDag-Erling Smørgrav 	}
2317b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2327b5038d7SDag-Erling Smørgrav }
2337b5038d7SDag-Erling Smørgrav 
2347b5038d7SDag-Erling Smørgrav ldns_status
ldns_cert_algorithm2buffer_str(ldns_buffer * output,ldns_cert_algorithm cert_algorithm)2357b5038d7SDag-Erling Smørgrav ldns_cert_algorithm2buffer_str(ldns_buffer *output,
2367b5038d7SDag-Erling Smørgrav                                ldns_cert_algorithm cert_algorithm)
2377b5038d7SDag-Erling Smørgrav {
2387b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms,
2397b5038d7SDag-Erling Smørgrav 	                                          cert_algorithm);
2407b5038d7SDag-Erling Smørgrav 	if (lt && lt->name) {
2417b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", lt->name);
2427b5038d7SDag-Erling Smørgrav 	} else {
2437b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "CERT_ALG%u",
2447b5038d7SDag-Erling Smørgrav 		                   cert_algorithm);
2457b5038d7SDag-Erling Smørgrav 	}
2467b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2477b5038d7SDag-Erling Smørgrav }
2487b5038d7SDag-Erling Smørgrav 
2497b5038d7SDag-Erling Smørgrav char *
ldns_pkt_opcode2str(ldns_pkt_opcode opcode)2507b5038d7SDag-Erling Smørgrav ldns_pkt_opcode2str(ldns_pkt_opcode opcode)
2517b5038d7SDag-Erling Smørgrav {
2527b5038d7SDag-Erling Smørgrav 	char *str;
2537b5038d7SDag-Erling Smørgrav 	ldns_buffer *buf;
2547b5038d7SDag-Erling Smørgrav 
2557b5038d7SDag-Erling Smørgrav 	buf = ldns_buffer_new(12);
2567b5038d7SDag-Erling Smørgrav 	if (!buf) {
2577b5038d7SDag-Erling Smørgrav 		return NULL;
2587b5038d7SDag-Erling Smørgrav 	}
2597b5038d7SDag-Erling Smørgrav 
2607b5038d7SDag-Erling Smørgrav 	str = NULL;
2617b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
2622787e39aSDag-Erling Smørgrav 		str = ldns_buffer_export2str(buf);
2637b5038d7SDag-Erling Smørgrav 	}
2647b5038d7SDag-Erling Smørgrav 
2657b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(buf);
2667b5038d7SDag-Erling Smørgrav 	return str;
2677b5038d7SDag-Erling Smørgrav }
2687b5038d7SDag-Erling Smørgrav 
2697b5038d7SDag-Erling Smørgrav char *
ldns_pkt_rcode2str(ldns_pkt_rcode rcode)2707b5038d7SDag-Erling Smørgrav ldns_pkt_rcode2str(ldns_pkt_rcode rcode)
2717b5038d7SDag-Erling Smørgrav {
2727b5038d7SDag-Erling Smørgrav 	char *str;
2737b5038d7SDag-Erling Smørgrav 	ldns_buffer *buf;
2747b5038d7SDag-Erling Smørgrav 
2757b5038d7SDag-Erling Smørgrav 	buf = ldns_buffer_new(10);
2767b5038d7SDag-Erling Smørgrav 	if (!buf) {
2777b5038d7SDag-Erling Smørgrav 		return NULL;
2787b5038d7SDag-Erling Smørgrav 	}
2797b5038d7SDag-Erling Smørgrav 
2807b5038d7SDag-Erling Smørgrav 	str = NULL;
2817b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
2822787e39aSDag-Erling Smørgrav 		str = ldns_buffer_export2str(buf);
2837b5038d7SDag-Erling Smørgrav 	}
2847b5038d7SDag-Erling Smørgrav 
2857b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(buf);
2867b5038d7SDag-Erling Smørgrav 	return str;
2877b5038d7SDag-Erling Smørgrav }
2887b5038d7SDag-Erling Smørgrav 
2897b5038d7SDag-Erling Smørgrav char *
ldns_pkt_algorithm2str(ldns_algorithm algorithm)2907b5038d7SDag-Erling Smørgrav ldns_pkt_algorithm2str(ldns_algorithm algorithm)
2917b5038d7SDag-Erling Smørgrav {
2927b5038d7SDag-Erling Smørgrav 	char *str;
2937b5038d7SDag-Erling Smørgrav 	ldns_buffer *buf;
2947b5038d7SDag-Erling Smørgrav 
2957b5038d7SDag-Erling Smørgrav 	buf = ldns_buffer_new(10);
2967b5038d7SDag-Erling Smørgrav 	if (!buf) {
2977b5038d7SDag-Erling Smørgrav 		return NULL;
2987b5038d7SDag-Erling Smørgrav 	}
2997b5038d7SDag-Erling Smørgrav 
3007b5038d7SDag-Erling Smørgrav 	str = NULL;
3017b5038d7SDag-Erling Smørgrav 	if (ldns_algorithm2buffer_str(buf, algorithm)
3027b5038d7SDag-Erling Smørgrav 	    == LDNS_STATUS_OK) {
3032787e39aSDag-Erling Smørgrav 		str = ldns_buffer_export2str(buf);
3047b5038d7SDag-Erling Smørgrav 	}
3057b5038d7SDag-Erling Smørgrav 
3067b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(buf);
3077b5038d7SDag-Erling Smørgrav 	return str;
3087b5038d7SDag-Erling Smørgrav }
3097b5038d7SDag-Erling Smørgrav 
3107b5038d7SDag-Erling Smørgrav char *
ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)3117b5038d7SDag-Erling Smørgrav ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)
3127b5038d7SDag-Erling Smørgrav {
3137b5038d7SDag-Erling Smørgrav 	char *str;
3147b5038d7SDag-Erling Smørgrav 	ldns_buffer *buf;
3157b5038d7SDag-Erling Smørgrav 
3167b5038d7SDag-Erling Smørgrav 	buf = ldns_buffer_new(10);
3177b5038d7SDag-Erling Smørgrav 	if (!buf) {
3187b5038d7SDag-Erling Smørgrav 		return NULL;
3197b5038d7SDag-Erling Smørgrav 	}
3207b5038d7SDag-Erling Smørgrav 
3217b5038d7SDag-Erling Smørgrav 	str = NULL;
3227b5038d7SDag-Erling Smørgrav 	if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
3237b5038d7SDag-Erling Smørgrav 	    == LDNS_STATUS_OK) {
3242787e39aSDag-Erling Smørgrav 		str = ldns_buffer_export2str(buf);
3257b5038d7SDag-Erling Smørgrav 	}
3267b5038d7SDag-Erling Smørgrav 
3277b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(buf);
3287b5038d7SDag-Erling Smørgrav 	return str;
3297b5038d7SDag-Erling Smørgrav }
3307b5038d7SDag-Erling Smørgrav 
3317b5038d7SDag-Erling Smørgrav 
3327b5038d7SDag-Erling Smørgrav /* do NOT pass compressed data here :p */
3337b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_dname(ldns_buffer * output,const ldns_rdf * dname)3347b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname)
3357b5038d7SDag-Erling Smørgrav {
3367b5038d7SDag-Erling Smørgrav 	/* can we do with 1 pos var? or without at all? */
3377b5038d7SDag-Erling Smørgrav 	uint8_t src_pos = 0;
3387b5038d7SDag-Erling Smørgrav 	uint8_t len;
3397b5038d7SDag-Erling Smørgrav 	uint8_t *data;
3407b5038d7SDag-Erling Smørgrav 	uint8_t i;
3417b5038d7SDag-Erling Smørgrav 	unsigned char c;
3427b5038d7SDag-Erling Smørgrav 
3437b5038d7SDag-Erling Smørgrav 	data = (uint8_t*)ldns_rdf_data(dname);
3447b5038d7SDag-Erling Smørgrav 	len = data[src_pos];
3457b5038d7SDag-Erling Smørgrav 
3467b5038d7SDag-Erling Smørgrav 	if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) {
3477b5038d7SDag-Erling Smørgrav 		/* too large, return */
3487b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_DOMAINNAME_OVERFLOW;
3497b5038d7SDag-Erling Smørgrav 	}
3507b5038d7SDag-Erling Smørgrav 
3517b5038d7SDag-Erling Smørgrav 	/* special case: root label */
3527b5038d7SDag-Erling Smørgrav 	if (1 == ldns_rdf_size(dname)) {
3537b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ".");
3547b5038d7SDag-Erling Smørgrav 	} else {
3557b5038d7SDag-Erling Smørgrav 		while ((len > 0) && src_pos < ldns_rdf_size(dname)) {
3567b5038d7SDag-Erling Smørgrav 			src_pos++;
3577b5038d7SDag-Erling Smørgrav 			for(i = 0; i < len; i++) {
3587b5038d7SDag-Erling Smørgrav 				/* paranoia check for various 'strange'
3597b5038d7SDag-Erling Smørgrav 				   characters in dnames
3607b5038d7SDag-Erling Smørgrav 				*/
3617b5038d7SDag-Erling Smørgrav 				c = (unsigned char) data[src_pos];
3627b5038d7SDag-Erling Smørgrav 				if(c == '.' || c == ';' ||
3637b5038d7SDag-Erling Smørgrav 				   c == '(' || c == ')' ||
3647b5038d7SDag-Erling Smørgrav 				   c == '\\') {
3657b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "\\%c",
3667b5038d7SDag-Erling Smørgrav 							data[src_pos]);
3677b5038d7SDag-Erling Smørgrav 				} else if (!(isascii(c) && isgraph(c))) {
3687b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "\\%03u",
3697b5038d7SDag-Erling Smørgrav 						        data[src_pos]);
3707b5038d7SDag-Erling Smørgrav 				} else {
3717b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "%c", data[src_pos]);
3727b5038d7SDag-Erling Smørgrav 				}
3737b5038d7SDag-Erling Smørgrav 				src_pos++;
3747b5038d7SDag-Erling Smørgrav 			}
3757b5038d7SDag-Erling Smørgrav 
3767b5038d7SDag-Erling Smørgrav 			if (src_pos < ldns_rdf_size(dname)) {
3777b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, ".");
3787b5038d7SDag-Erling Smørgrav 			}
3797b5038d7SDag-Erling Smørgrav 			len = data[src_pos];
3807b5038d7SDag-Erling Smørgrav 		}
3817b5038d7SDag-Erling Smørgrav 	}
3827b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
3837b5038d7SDag-Erling Smørgrav }
3847b5038d7SDag-Erling Smørgrav 
3857b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_int8(ldns_buffer * output,const ldns_rdf * rdf)3867b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf)
3877b5038d7SDag-Erling Smørgrav {
3887b5038d7SDag-Erling Smørgrav 	uint8_t data = ldns_rdf_data(rdf)[0];
3897b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%lu", (unsigned long) data);
3907b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
3917b5038d7SDag-Erling Smørgrav }
3927b5038d7SDag-Erling Smørgrav 
3937b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_int16(ldns_buffer * output,const ldns_rdf * rdf)3947b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf)
3957b5038d7SDag-Erling Smørgrav {
3967b5038d7SDag-Erling Smørgrav 	uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
3977b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%lu", (unsigned long) data);
3987b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
3997b5038d7SDag-Erling Smørgrav }
4007b5038d7SDag-Erling Smørgrav 
4017b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_int32(ldns_buffer * output,const ldns_rdf * rdf)4027b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf)
4037b5038d7SDag-Erling Smørgrav {
4047b5038d7SDag-Erling Smørgrav 	uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf));
4057b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%lu", (unsigned long) data);
4067b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
4077b5038d7SDag-Erling Smørgrav }
4087b5038d7SDag-Erling Smørgrav 
4097b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_time(ldns_buffer * output,const ldns_rdf * rdf)4107b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf)
4117b5038d7SDag-Erling Smørgrav {
4127b5038d7SDag-Erling Smørgrav 	/* create a YYYYMMDDHHMMSS string if possible */
4137b5038d7SDag-Erling Smørgrav 	struct tm tm;
4147b5038d7SDag-Erling Smørgrav 	char date_buf[16];
4157b5038d7SDag-Erling Smørgrav 
4167b5038d7SDag-Erling Smørgrav 	memset(&tm, 0, sizeof(tm));
417*5afab0e5SDag-Erling Smørgrav 	if (ldns_serial_arithmetics_gmtime_r(ldns_rdf2native_int32(rdf), time(NULL), &tm)
4187b5038d7SDag-Erling Smørgrav 	    && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) {
4197b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", date_buf);
4207b5038d7SDag-Erling Smørgrav 	}
4217b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
4227b5038d7SDag-Erling Smørgrav }
4237b5038d7SDag-Erling Smørgrav 
4247b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_a(ldns_buffer * output,const ldns_rdf * rdf)4257b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf)
4267b5038d7SDag-Erling Smørgrav {
4277b5038d7SDag-Erling Smørgrav 	char str[INET_ADDRSTRLEN];
4287b5038d7SDag-Erling Smørgrav 
4297b5038d7SDag-Erling Smørgrav 	if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) {
4307b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", str);
4317b5038d7SDag-Erling Smørgrav 	}
4327b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
4337b5038d7SDag-Erling Smørgrav }
4347b5038d7SDag-Erling Smørgrav 
4357b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_aaaa(ldns_buffer * output,const ldns_rdf * rdf)4367b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf)
4377b5038d7SDag-Erling Smørgrav {
4387b5038d7SDag-Erling Smørgrav 	char str[INET6_ADDRSTRLEN];
4397b5038d7SDag-Erling Smørgrav 
4407b5038d7SDag-Erling Smørgrav 	if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) {
4417b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", str);
4427b5038d7SDag-Erling Smørgrav 	}
4437b5038d7SDag-Erling Smørgrav 
4447b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
4457b5038d7SDag-Erling Smørgrav }
4467b5038d7SDag-Erling Smørgrav 
44717d15b25SDag-Erling Smørgrav static void
ldns_characters2buffer_str(ldns_buffer * output,size_t amount,const uint8_t * characters)44817d15b25SDag-Erling Smørgrav ldns_characters2buffer_str(ldns_buffer* output,
44917d15b25SDag-Erling Smørgrav 		size_t amount, const uint8_t* characters)
4507b5038d7SDag-Erling Smørgrav {
45117d15b25SDag-Erling Smørgrav 	uint8_t ch;
45217d15b25SDag-Erling Smørgrav 	while (amount > 0) {
45317d15b25SDag-Erling Smørgrav 		ch = *characters++;
4547b5038d7SDag-Erling Smørgrav 		if (isprint((int)ch) || ch == '\t') {
4557b5038d7SDag-Erling Smørgrav 			if (ch == '\"' || ch == '\\')
4567b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "\\%c", ch);
4577b5038d7SDag-Erling Smørgrav 			else
4587b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "%c", ch);
4597b5038d7SDag-Erling Smørgrav 		} else {
4607b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "\\%03u",
4617b5038d7SDag-Erling Smørgrav                                 (unsigned)(uint8_t) ch);
4627b5038d7SDag-Erling Smørgrav 		}
46317d15b25SDag-Erling Smørgrav 		amount--;
4647b5038d7SDag-Erling Smørgrav 	}
46517d15b25SDag-Erling Smørgrav }
46617d15b25SDag-Erling Smørgrav 
46717d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_str(ldns_buffer * output,const ldns_rdf * rdf)46817d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf)
46917d15b25SDag-Erling Smørgrav {
47017d15b25SDag-Erling Smørgrav         if(ldns_rdf_size(rdf) < 1) {
47117d15b25SDag-Erling Smørgrav                 return LDNS_STATUS_WIRE_RDATA_ERR;
47217d15b25SDag-Erling Smørgrav         }
47317d15b25SDag-Erling Smørgrav         if((int)ldns_rdf_size(rdf) < (int)ldns_rdf_data(rdf)[0] + 1) {
47417d15b25SDag-Erling Smørgrav                 return LDNS_STATUS_WIRE_RDATA_ERR;
47517d15b25SDag-Erling Smørgrav         }
47617d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\"");
47717d15b25SDag-Erling Smørgrav 	ldns_characters2buffer_str(output,
47817d15b25SDag-Erling Smørgrav 			ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf) + 1);
4797b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\"");
4807b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
4817b5038d7SDag-Erling Smørgrav }
4827b5038d7SDag-Erling Smørgrav 
4837b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_b64(ldns_buffer * output,const ldns_rdf * rdf)4847b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf)
4857b5038d7SDag-Erling Smørgrav {
486*5afab0e5SDag-Erling Smørgrav 	size_t size;
487*5afab0e5SDag-Erling Smørgrav 	char *b64;
488*5afab0e5SDag-Erling Smørgrav 
489*5afab0e5SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) == 0) {
490*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "0");
491*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
492*5afab0e5SDag-Erling Smørgrav 	} else
493*5afab0e5SDag-Erling Smørgrav 		size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf));
494*5afab0e5SDag-Erling Smørgrav 
495*5afab0e5SDag-Erling Smørgrav 	if (!(b64 = LDNS_XMALLOC(char, size)))
496*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_MEM_ERR;
497*5afab0e5SDag-Erling Smørgrav 
4987b5038d7SDag-Erling Smørgrav 	if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) {
4997b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", b64);
5007b5038d7SDag-Erling Smørgrav 	}
5017b5038d7SDag-Erling Smørgrav 	LDNS_FREE(b64);
5027b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
5037b5038d7SDag-Erling Smørgrav }
5047b5038d7SDag-Erling Smørgrav 
5057b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_b32_ext(ldns_buffer * output,const ldns_rdf * rdf)5067b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf)
5077b5038d7SDag-Erling Smørgrav {
5087b5038d7SDag-Erling Smørgrav 	size_t size;
5097b5038d7SDag-Erling Smørgrav 	char *b32;
5107b5038d7SDag-Erling Smørgrav 	if(ldns_rdf_size(rdf) == 0)
5117b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_OK;
5127b5038d7SDag-Erling Smørgrav         /* remove -1 for the b32-hash-len octet */
5137b5038d7SDag-Erling Smørgrav 	size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
5147b5038d7SDag-Erling Smørgrav         /* add one for the end nul for the string */
5157b5038d7SDag-Erling Smørgrav 	b32 = LDNS_XMALLOC(char, size + 1);
5167b5038d7SDag-Erling Smørgrav 	if(!b32) return LDNS_STATUS_MEM_ERR;
5177b5038d7SDag-Erling Smørgrav 	size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
5187b5038d7SDag-Erling Smørgrav 		ldns_rdf_size(rdf) - 1, b32, size+1);
5197b5038d7SDag-Erling Smørgrav 	if (size > 0) {
5207b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", b32);
5217b5038d7SDag-Erling Smørgrav 	}
5227b5038d7SDag-Erling Smørgrav 	LDNS_FREE(b32);
5237b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
5247b5038d7SDag-Erling Smørgrav }
5257b5038d7SDag-Erling Smørgrav 
5267b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_hex(ldns_buffer * output,const ldns_rdf * rdf)5277b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf)
5287b5038d7SDag-Erling Smørgrav {
5297b5038d7SDag-Erling Smørgrav 	size_t i;
5307b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rdf_size(rdf); i++) {
5317b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]);
5327b5038d7SDag-Erling Smørgrav 	}
5337b5038d7SDag-Erling Smørgrav 
5347b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
5357b5038d7SDag-Erling Smørgrav }
5367b5038d7SDag-Erling Smørgrav 
53717d15b25SDag-Erling Smørgrav static ldns_status
ldns_rdf2buffer_str_type_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rdf * rdf)53817d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_type_fmt(ldns_buffer *output,
53917d15b25SDag-Erling Smørgrav 		const ldns_output_format* fmt, const ldns_rdf *rdf)
5407b5038d7SDag-Erling Smørgrav {
5417b5038d7SDag-Erling Smørgrav         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
5427b5038d7SDag-Erling Smørgrav 
54317d15b25SDag-Erling Smørgrav 	if (! ldns_output_format_covers_type(fmt, data) &&
54417d15b25SDag-Erling Smørgrav 			ldns_rr_descript(data) &&
54517d15b25SDag-Erling Smørgrav 			ldns_rr_descript(data)->_name) {
54617d15b25SDag-Erling Smørgrav 
54717d15b25SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s",ldns_rr_descript(data)->_name);
5487b5038d7SDag-Erling Smørgrav 	} else {
5497b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "TYPE%u", data);
5507b5038d7SDag-Erling Smørgrav 	}
5517b5038d7SDag-Erling Smørgrav 	return  ldns_buffer_status(output);
5527b5038d7SDag-Erling Smørgrav }
5537b5038d7SDag-Erling Smørgrav 
5547b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_type(ldns_buffer * output,const ldns_rdf * rdf)55517d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf)
55617d15b25SDag-Erling Smørgrav {
55717d15b25SDag-Erling Smørgrav 	return ldns_rdf2buffer_str_type_fmt(output,
55817d15b25SDag-Erling Smørgrav 			ldns_output_format_default, rdf);
55917d15b25SDag-Erling Smørgrav }
56017d15b25SDag-Erling Smørgrav 
56117d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_class(ldns_buffer * output,const ldns_rdf * rdf)5627b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf)
5637b5038d7SDag-Erling Smørgrav {
5647b5038d7SDag-Erling Smørgrav 	uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
5657b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt;
5667b5038d7SDag-Erling Smørgrav 
5677b5038d7SDag-Erling Smørgrav  	lt = ldns_lookup_by_id(ldns_rr_classes, (int) data);
5687b5038d7SDag-Erling Smørgrav 	if (lt) {
5697b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\t%s", lt->name);
5707b5038d7SDag-Erling Smørgrav 	} else {
5717b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\tCLASS%d", data);
5727b5038d7SDag-Erling Smørgrav 	}
5737b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
5747b5038d7SDag-Erling Smørgrav }
5757b5038d7SDag-Erling Smørgrav 
5767b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_cert_alg(ldns_buffer * output,const ldns_rdf * rdf)5777b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf)
5787b5038d7SDag-Erling Smørgrav {
5797b5038d7SDag-Erling Smørgrav         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
5807b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt;
5817b5038d7SDag-Erling Smørgrav  	lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data);
5827b5038d7SDag-Erling Smørgrav 	if (lt) {
5837b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", lt->name);
5847b5038d7SDag-Erling Smørgrav 	} else {
5857b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%d", data);
5867b5038d7SDag-Erling Smørgrav 	}
5877b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
5887b5038d7SDag-Erling Smørgrav }
5897b5038d7SDag-Erling Smørgrav 
5907b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_alg(ldns_buffer * output,const ldns_rdf * rdf)5917b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf)
5927b5038d7SDag-Erling Smørgrav {
593986ba33cSDag-Erling Smørgrav 	return ldns_rdf2buffer_str_int8(output, rdf);
5947b5038d7SDag-Erling Smørgrav }
5957b5038d7SDag-Erling Smørgrav 
5967b5038d7SDag-Erling Smørgrav static void
loc_cm_print(ldns_buffer * output,uint8_t mantissa,uint8_t exponent)5977b5038d7SDag-Erling Smørgrav loc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent)
5987b5038d7SDag-Erling Smørgrav {
5997b5038d7SDag-Erling Smørgrav 	uint8_t i;
6007b5038d7SDag-Erling Smørgrav 	/* is it 0.<two digits> ? */
6017b5038d7SDag-Erling Smørgrav 	if(exponent < 2) {
6027b5038d7SDag-Erling Smørgrav 		if(exponent == 1)
6037b5038d7SDag-Erling Smørgrav 			mantissa *= 10;
6047b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "0.%02ld", (long)mantissa);
6057b5038d7SDag-Erling Smørgrav 		return;
6067b5038d7SDag-Erling Smørgrav 	}
6077b5038d7SDag-Erling Smørgrav 	/* always <digit><string of zeros> */
6087b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%d", (int)mantissa);
6097b5038d7SDag-Erling Smørgrav 	for(i=0; i<exponent-2; i++)
6107b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "0");
6117b5038d7SDag-Erling Smørgrav }
6127b5038d7SDag-Erling Smørgrav 
6137b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_type2buffer_str(ldns_buffer * output,const ldns_rr_type type)6147b5038d7SDag-Erling Smørgrav ldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type)
6157b5038d7SDag-Erling Smørgrav {
6167b5038d7SDag-Erling Smørgrav 	const ldns_rr_descriptor *descriptor;
6177b5038d7SDag-Erling Smørgrav 
6187b5038d7SDag-Erling Smørgrav 	descriptor = ldns_rr_descript(type);
6197b5038d7SDag-Erling Smørgrav 
6207b5038d7SDag-Erling Smørgrav 	switch (type) {
6217b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_IXFR:
6227b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "IXFR");
6237b5038d7SDag-Erling Smørgrav 			break;
6247b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_AXFR:
6257b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "AXFR");
6267b5038d7SDag-Erling Smørgrav 			break;
6277b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_MAILA:
6287b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "MAILA");
6297b5038d7SDag-Erling Smørgrav 			break;
6307b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_MAILB:
6317b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "MAILB");
6327b5038d7SDag-Erling Smørgrav 			break;
6337b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_ANY:
6347b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "ANY");
6357b5038d7SDag-Erling Smørgrav 			break;
6367b5038d7SDag-Erling Smørgrav 		default:
637986ba33cSDag-Erling Smørgrav 			if (descriptor && descriptor->_name) {
638986ba33cSDag-Erling Smørgrav 				ldns_buffer_printf(output, "%s", descriptor->_name);
639986ba33cSDag-Erling Smørgrav 			} else {
6407b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "TYPE%u", type);
6417b5038d7SDag-Erling Smørgrav 			}
6427b5038d7SDag-Erling Smørgrav 	}
6437b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
6447b5038d7SDag-Erling Smørgrav }
6457b5038d7SDag-Erling Smørgrav 
6467b5038d7SDag-Erling Smørgrav char *
ldns_rr_type2str(const ldns_rr_type type)6477b5038d7SDag-Erling Smørgrav ldns_rr_type2str(const ldns_rr_type type)
6487b5038d7SDag-Erling Smørgrav {
6497b5038d7SDag-Erling Smørgrav 	char *str;
6507b5038d7SDag-Erling Smørgrav 	ldns_buffer *buf;
6517b5038d7SDag-Erling Smørgrav 
6527b5038d7SDag-Erling Smørgrav 	buf = ldns_buffer_new(10);
6537b5038d7SDag-Erling Smørgrav 	if (!buf) {
6547b5038d7SDag-Erling Smørgrav 		return NULL;
6557b5038d7SDag-Erling Smørgrav 	}
6567b5038d7SDag-Erling Smørgrav 
6577b5038d7SDag-Erling Smørgrav 	str = NULL;
6587b5038d7SDag-Erling Smørgrav 	if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
6592787e39aSDag-Erling Smørgrav 		str = ldns_buffer_export2str(buf);
6607b5038d7SDag-Erling Smørgrav 	}
6617b5038d7SDag-Erling Smørgrav 
6627b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(buf);
6637b5038d7SDag-Erling Smørgrav 	return str;
6647b5038d7SDag-Erling Smørgrav }
6657b5038d7SDag-Erling Smørgrav 
6667b5038d7SDag-Erling Smørgrav 
6677b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_class2buffer_str(ldns_buffer * output,const ldns_rr_class klass)6687b5038d7SDag-Erling Smørgrav ldns_rr_class2buffer_str(ldns_buffer *output,
6697b5038d7SDag-Erling Smørgrav                          const ldns_rr_class klass)
6707b5038d7SDag-Erling Smørgrav {
6717b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *lt;
6727b5038d7SDag-Erling Smørgrav 
6737b5038d7SDag-Erling Smørgrav 	lt = ldns_lookup_by_id(ldns_rr_classes, klass);
6747b5038d7SDag-Erling Smørgrav 	if (lt) {
6757b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", lt->name);
6767b5038d7SDag-Erling Smørgrav 	} else {
6777b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "CLASS%d", klass);
6787b5038d7SDag-Erling Smørgrav 	}
6797b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
6807b5038d7SDag-Erling Smørgrav }
6817b5038d7SDag-Erling Smørgrav 
6827b5038d7SDag-Erling Smørgrav char *
ldns_rr_class2str(const ldns_rr_class klass)6837b5038d7SDag-Erling Smørgrav ldns_rr_class2str(const ldns_rr_class klass)
6847b5038d7SDag-Erling Smørgrav {
6857b5038d7SDag-Erling Smørgrav 	ldns_buffer *buf;
6867b5038d7SDag-Erling Smørgrav 	char *str;
6877b5038d7SDag-Erling Smørgrav 
6887b5038d7SDag-Erling Smørgrav 	buf = ldns_buffer_new(10);
6897b5038d7SDag-Erling Smørgrav 	if (!buf) {
6907b5038d7SDag-Erling Smørgrav 		return NULL;
6917b5038d7SDag-Erling Smørgrav 	}
6927b5038d7SDag-Erling Smørgrav 
6937b5038d7SDag-Erling Smørgrav 	str = NULL;
6947b5038d7SDag-Erling Smørgrav 	if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
6952787e39aSDag-Erling Smørgrav 		str = ldns_buffer_export2str(buf);
6967b5038d7SDag-Erling Smørgrav 	}
6977b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(buf);
6987b5038d7SDag-Erling Smørgrav 	return str;
6997b5038d7SDag-Erling Smørgrav }
7007b5038d7SDag-Erling Smørgrav 
7017b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_loc(ldns_buffer * output,const ldns_rdf * rdf)7027b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf)
7037b5038d7SDag-Erling Smørgrav {
7047b5038d7SDag-Erling Smørgrav 	/* we could do checking (ie degrees < 90 etc)? */
70517d15b25SDag-Erling Smørgrav 	uint8_t version;
7067b5038d7SDag-Erling Smørgrav 	uint8_t size;
7077b5038d7SDag-Erling Smørgrav 	uint8_t horizontal_precision;
7087b5038d7SDag-Erling Smørgrav 	uint8_t vertical_precision;
7097b5038d7SDag-Erling Smørgrav 	uint32_t longitude;
7107b5038d7SDag-Erling Smørgrav 	uint32_t latitude;
7117b5038d7SDag-Erling Smørgrav 	uint32_t altitude;
712*5afab0e5SDag-Erling Smørgrav 	char latitude_hemisphere;
713*5afab0e5SDag-Erling Smørgrav 	char longitude_hemisphere;
7147b5038d7SDag-Erling Smørgrav 	uint32_t h;
7157b5038d7SDag-Erling Smørgrav 	uint32_t m;
7167b5038d7SDag-Erling Smørgrav 	double s;
7177b5038d7SDag-Erling Smørgrav 
7187b5038d7SDag-Erling Smørgrav 	uint32_t equator = (uint32_t) ldns_power(2, 31);
7197b5038d7SDag-Erling Smørgrav 
72017d15b25SDag-Erling Smørgrav         if(ldns_rdf_size(rdf) < 1) {
72117d15b25SDag-Erling Smørgrav                 return LDNS_STATUS_WIRE_RDATA_ERR;
72217d15b25SDag-Erling Smørgrav         }
72317d15b25SDag-Erling Smørgrav        	version = ldns_rdf_data(rdf)[0];
7247b5038d7SDag-Erling Smørgrav 	if (version == 0) {
72517d15b25SDag-Erling Smørgrav 		if(ldns_rdf_size(rdf) < 16) {
72617d15b25SDag-Erling Smørgrav 			return LDNS_STATUS_WIRE_RDATA_ERR;
72717d15b25SDag-Erling Smørgrav 		}
7287b5038d7SDag-Erling Smørgrav 		size = ldns_rdf_data(rdf)[1];
7297b5038d7SDag-Erling Smørgrav 		horizontal_precision = ldns_rdf_data(rdf)[2];
7307b5038d7SDag-Erling Smørgrav 		vertical_precision = ldns_rdf_data(rdf)[3];
7317b5038d7SDag-Erling Smørgrav 
7327b5038d7SDag-Erling Smørgrav 		latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]);
7337b5038d7SDag-Erling Smørgrav 		longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]);
7347b5038d7SDag-Erling Smørgrav 		altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]);
7357b5038d7SDag-Erling Smørgrav 
7367b5038d7SDag-Erling Smørgrav 		if (latitude > equator) {
737*5afab0e5SDag-Erling Smørgrav 			latitude_hemisphere = 'N';
7387b5038d7SDag-Erling Smørgrav 			latitude = latitude - equator;
7397b5038d7SDag-Erling Smørgrav 		} else {
740*5afab0e5SDag-Erling Smørgrav 			latitude_hemisphere = 'S';
7417b5038d7SDag-Erling Smørgrav 			latitude = equator - latitude;
7427b5038d7SDag-Erling Smørgrav 		}
7437b5038d7SDag-Erling Smørgrav 		h = latitude / (1000 * 60 * 60);
7447b5038d7SDag-Erling Smørgrav 		latitude = latitude % (1000 * 60 * 60);
7457b5038d7SDag-Erling Smørgrav 		m = latitude / (1000 * 60);
7467b5038d7SDag-Erling Smørgrav 		latitude = latitude % (1000 * 60);
7477b5038d7SDag-Erling Smørgrav 		s = (double) latitude / 1000.0;
7487b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
749*5afab0e5SDag-Erling Smørgrav 			h, m, s, latitude_hemisphere);
7507b5038d7SDag-Erling Smørgrav 
7517b5038d7SDag-Erling Smørgrav 		if (longitude > equator) {
752*5afab0e5SDag-Erling Smørgrav 			longitude_hemisphere = 'E';
7537b5038d7SDag-Erling Smørgrav 			longitude = longitude - equator;
7547b5038d7SDag-Erling Smørgrav 		} else {
755*5afab0e5SDag-Erling Smørgrav 			longitude_hemisphere = 'W';
7567b5038d7SDag-Erling Smørgrav 			longitude = equator - longitude;
7577b5038d7SDag-Erling Smørgrav 		}
7587b5038d7SDag-Erling Smørgrav 		h = longitude / (1000 * 60 * 60);
7597b5038d7SDag-Erling Smørgrav 		longitude = longitude % (1000 * 60 * 60);
7607b5038d7SDag-Erling Smørgrav 		m = longitude / (1000 * 60);
7617b5038d7SDag-Erling Smørgrav 		longitude = longitude % (1000 * 60);
7627b5038d7SDag-Erling Smørgrav 		s = (double) longitude / (1000.0);
7637b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
764*5afab0e5SDag-Erling Smørgrav 			h, m, s, longitude_hemisphere);
7657b5038d7SDag-Erling Smørgrav 
7667b5038d7SDag-Erling Smørgrav 		s = ((double) altitude) / 100;
7677b5038d7SDag-Erling Smørgrav 		s -= 100000;
7687b5038d7SDag-Erling Smørgrav 
7697b5038d7SDag-Erling Smørgrav 		if(altitude%100 != 0)
7707b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%.2f", s);
7717b5038d7SDag-Erling Smørgrav 		else
7727b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%.0f", s);
7737b5038d7SDag-Erling Smørgrav 
7747b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "m ");
7757b5038d7SDag-Erling Smørgrav 
7767b5038d7SDag-Erling Smørgrav 		loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f);
7777b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "m ");
7787b5038d7SDag-Erling Smørgrav 
7797b5038d7SDag-Erling Smørgrav 		loc_cm_print(output, (horizontal_precision & 0xf0) >> 4,
7807b5038d7SDag-Erling Smørgrav 			horizontal_precision & 0x0f);
7817b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "m ");
7827b5038d7SDag-Erling Smørgrav 
7837b5038d7SDag-Erling Smørgrav 		loc_cm_print(output, (vertical_precision & 0xf0) >> 4,
7847b5038d7SDag-Erling Smørgrav 			vertical_precision & 0x0f);
7857b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "m");
7867b5038d7SDag-Erling Smørgrav 
7877b5038d7SDag-Erling Smørgrav 		return ldns_buffer_status(output);
7887b5038d7SDag-Erling Smørgrav 	} else {
7897b5038d7SDag-Erling Smørgrav 		return ldns_rdf2buffer_str_hex(output, rdf);
7907b5038d7SDag-Erling Smørgrav 	}
7917b5038d7SDag-Erling Smørgrav }
7927b5038d7SDag-Erling Smørgrav 
7937b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_unknown(ldns_buffer * output,const ldns_rdf * rdf)7947b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf)
7957b5038d7SDag-Erling Smørgrav {
7967b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf));
7977b5038d7SDag-Erling Smørgrav 	return ldns_rdf2buffer_str_hex(output, rdf);
7987b5038d7SDag-Erling Smørgrav }
7997b5038d7SDag-Erling Smørgrav 
8007b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_nsap(ldns_buffer * output,const ldns_rdf * rdf)8017b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf)
8027b5038d7SDag-Erling Smørgrav {
8037b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "0x");
8047b5038d7SDag-Erling Smørgrav 	return ldns_rdf2buffer_str_hex(output, rdf);
8057b5038d7SDag-Erling Smørgrav }
8067b5038d7SDag-Erling Smørgrav 
8077b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_atma(ldns_buffer * output,const ldns_rdf * rdf)8087b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf)
8097b5038d7SDag-Erling Smørgrav {
8107b5038d7SDag-Erling Smørgrav 	return ldns_rdf2buffer_str_hex(output, rdf);
8117b5038d7SDag-Erling Smørgrav }
8127b5038d7SDag-Erling Smørgrav 
8137b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_wks(ldns_buffer * output,const ldns_rdf * rdf)8147b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf)
8157b5038d7SDag-Erling Smørgrav {
8167b5038d7SDag-Erling Smørgrav 	/* protocol, followed by bitmap of services */
8177b5038d7SDag-Erling Smørgrav 	struct protoent *protocol;
8187b5038d7SDag-Erling Smørgrav 	char *proto_name = NULL;
8197b5038d7SDag-Erling Smørgrav 	uint8_t protocol_nr;
8207b5038d7SDag-Erling Smørgrav 	struct servent *service;
8217b5038d7SDag-Erling Smørgrav 	uint16_t current_service;
8227b5038d7SDag-Erling Smørgrav 
82317d15b25SDag-Erling Smørgrav         if(ldns_rdf_size(rdf) < 1) {
82417d15b25SDag-Erling Smørgrav                 return LDNS_STATUS_WIRE_RDATA_ERR;
82517d15b25SDag-Erling Smørgrav         }
8267b5038d7SDag-Erling Smørgrav 	protocol_nr = ldns_rdf_data(rdf)[0];
8277b5038d7SDag-Erling Smørgrav 	protocol = getprotobynumber((int) protocol_nr);
8287b5038d7SDag-Erling Smørgrav 	if (protocol && (protocol->p_name != NULL)) {
8297b5038d7SDag-Erling Smørgrav 		proto_name = protocol->p_name;
8307b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s ", protocol->p_name);
8317b5038d7SDag-Erling Smørgrav 	} else {
8327b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%u ", protocol_nr);
8337b5038d7SDag-Erling Smørgrav 	}
8347b5038d7SDag-Erling Smørgrav 
8357b5038d7SDag-Erling Smørgrav #ifdef HAVE_ENDPROTOENT
8367b5038d7SDag-Erling Smørgrav 	endprotoent();
8377b5038d7SDag-Erling Smørgrav #endif
8387b5038d7SDag-Erling Smørgrav 
8397b5038d7SDag-Erling Smørgrav 	for (current_service = 0;
840986ba33cSDag-Erling Smørgrav 	     current_service < (ldns_rdf_size(rdf)-1)*8; current_service++) {
8417b5038d7SDag-Erling Smørgrav 		if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) {
8427b5038d7SDag-Erling Smørgrav 			service = getservbyport((int) htons(current_service),
8437b5038d7SDag-Erling Smørgrav 			                        proto_name);
8447b5038d7SDag-Erling Smørgrav 			if (service && service->s_name) {
8457b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "%s ", service->s_name);
8467b5038d7SDag-Erling Smørgrav 			} else {
8477b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "%u ", current_service);
8487b5038d7SDag-Erling Smørgrav 			}
8497b5038d7SDag-Erling Smørgrav #ifdef HAVE_ENDSERVENT
8507b5038d7SDag-Erling Smørgrav 			endservent();
8517b5038d7SDag-Erling Smørgrav #endif
8527b5038d7SDag-Erling Smørgrav 		}
853*5afab0e5SDag-Erling Smørgrav 		/* exit from loop before integer overflow */
854*5afab0e5SDag-Erling Smørgrav 		if(current_service == 65535) { break; }
8557b5038d7SDag-Erling Smørgrav 	}
8567b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
8577b5038d7SDag-Erling Smørgrav }
8587b5038d7SDag-Erling Smørgrav 
85917d15b25SDag-Erling Smørgrav static ldns_status
ldns_rdf2buffer_str_nsec_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rdf * rdf)86017d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_nsec_fmt(ldns_buffer *output,
86117d15b25SDag-Erling Smørgrav 		const ldns_output_format* fmt, const ldns_rdf *rdf)
8627b5038d7SDag-Erling Smørgrav {
8637b5038d7SDag-Erling Smørgrav 	/* Note: this code is duplicated in higher.c in
8647b5038d7SDag-Erling Smørgrav 	 * ldns_nsec_type_check() function
8657b5038d7SDag-Erling Smørgrav 	 */
8667b5038d7SDag-Erling Smørgrav 	uint8_t window_block_nr;
8677b5038d7SDag-Erling Smørgrav 	uint8_t bitmap_length;
8687b5038d7SDag-Erling Smørgrav 	uint16_t type;
8697b5038d7SDag-Erling Smørgrav 	uint16_t pos = 0;
8707b5038d7SDag-Erling Smørgrav 	uint16_t bit_pos;
8717b5038d7SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
8727b5038d7SDag-Erling Smørgrav 
87317d15b25SDag-Erling Smørgrav 	while((size_t)(pos + 2) < ldns_rdf_size(rdf)) {
8747b5038d7SDag-Erling Smørgrav 		window_block_nr = data[pos];
8757b5038d7SDag-Erling Smørgrav 		bitmap_length = data[pos + 1];
8767b5038d7SDag-Erling Smørgrav 		pos += 2;
87717d15b25SDag-Erling Smørgrav 		if (ldns_rdf_size(rdf) < pos + bitmap_length) {
87817d15b25SDag-Erling Smørgrav 			return LDNS_STATUS_WIRE_RDATA_ERR;
87917d15b25SDag-Erling Smørgrav 		}
8807b5038d7SDag-Erling Smørgrav 		for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) {
88117d15b25SDag-Erling Smørgrav 			if (! ldns_get_bit(&data[pos], bit_pos)) {
88217d15b25SDag-Erling Smørgrav 				continue;
88317d15b25SDag-Erling Smørgrav 			}
8847b5038d7SDag-Erling Smørgrav 			type = 256 * (uint16_t) window_block_nr + bit_pos;
8857b5038d7SDag-Erling Smørgrav 
88617d15b25SDag-Erling Smørgrav 			if (! ldns_output_format_covers_type(fmt, type) &&
88717d15b25SDag-Erling Smørgrav 					ldns_rr_descript(type) &&
88817d15b25SDag-Erling Smørgrav 					ldns_rr_descript(type)->_name){
88917d15b25SDag-Erling Smørgrav 
8907b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "%s ",
89117d15b25SDag-Erling Smørgrav 						ldns_rr_descript(type)->_name);
8927b5038d7SDag-Erling Smørgrav 			} else {
8937b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "TYPE%u ", type);
8947b5038d7SDag-Erling Smørgrav 			}
8957b5038d7SDag-Erling Smørgrav 		}
8967b5038d7SDag-Erling Smørgrav 		pos += (uint16_t) bitmap_length;
8977b5038d7SDag-Erling Smørgrav 	}
8987b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
8997b5038d7SDag-Erling Smørgrav }
9007b5038d7SDag-Erling Smørgrav 
9017b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_nsec(ldns_buffer * output,const ldns_rdf * rdf)90217d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf)
90317d15b25SDag-Erling Smørgrav {
90417d15b25SDag-Erling Smørgrav 	return ldns_rdf2buffer_str_nsec_fmt(output,
90517d15b25SDag-Erling Smørgrav 			ldns_output_format_default, rdf);
90617d15b25SDag-Erling Smørgrav }
90717d15b25SDag-Erling Smørgrav 
90817d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_nsec3_salt(ldns_buffer * output,const ldns_rdf * rdf)9097b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf)
9107b5038d7SDag-Erling Smørgrav {
9117b5038d7SDag-Erling Smørgrav 	uint8_t salt_length;
9127b5038d7SDag-Erling Smørgrav 	uint8_t salt_pos;
9137b5038d7SDag-Erling Smørgrav 
9147b5038d7SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
9157b5038d7SDag-Erling Smørgrav 
91617d15b25SDag-Erling Smørgrav         if(ldns_rdf_size(rdf) < 1) {
91717d15b25SDag-Erling Smørgrav                 return LDNS_STATUS_WIRE_RDATA_ERR;
9187b5038d7SDag-Erling Smørgrav         }
9197b5038d7SDag-Erling Smørgrav 	salt_length = data[0];
9207b5038d7SDag-Erling Smørgrav 	/* from now there are variable length entries so remember pos */
9217b5038d7SDag-Erling Smørgrav 	if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) {
9227b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "- ");
9237b5038d7SDag-Erling Smørgrav 	} else {
9247b5038d7SDag-Erling Smørgrav 		for (salt_pos = 0; salt_pos < salt_length; salt_pos++) {
9257b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%02x", data[1 + salt_pos]);
9267b5038d7SDag-Erling Smørgrav 		}
9277b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, " ");
9287b5038d7SDag-Erling Smørgrav 	}
9297b5038d7SDag-Erling Smørgrav 
9307b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
9317b5038d7SDag-Erling Smørgrav }
9327b5038d7SDag-Erling Smørgrav 
9337b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_period(ldns_buffer * output,const ldns_rdf * rdf)9347b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf)
9357b5038d7SDag-Erling Smørgrav {
9367b5038d7SDag-Erling Smørgrav 	/* period is the number of seconds */
93717d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) != 4) {
93817d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
93917d15b25SDag-Erling Smørgrav 	}
94017d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%u", ldns_read_uint32(ldns_rdf_data(rdf)));
9417b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
9427b5038d7SDag-Erling Smørgrav }
9437b5038d7SDag-Erling Smørgrav 
9447b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_tsigtime(ldns_buffer * output,const ldns_rdf * rdf)9457b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const  ldns_rdf *rdf)
9467b5038d7SDag-Erling Smørgrav {
9477b5038d7SDag-Erling Smørgrav 	/* tsigtime is 48 bits network order unsigned integer */
9487b5038d7SDag-Erling Smørgrav 	uint64_t tsigtime = 0;
9497b5038d7SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
95017d15b25SDag-Erling Smørgrav 	uint64_t d0, d1, d2, d3, d4, d5;
9517b5038d7SDag-Erling Smørgrav 
95217d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) < 6) {
95317d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
9547b5038d7SDag-Erling Smørgrav 	}
95517d15b25SDag-Erling Smørgrav 	d0 = data[0]; /* cast to uint64 for shift operations */
95617d15b25SDag-Erling Smørgrav 	d1 = data[1];
95717d15b25SDag-Erling Smørgrav 	d2 = data[2];
95817d15b25SDag-Erling Smørgrav 	d3 = data[3];
95917d15b25SDag-Erling Smørgrav 	d4 = data[4];
96017d15b25SDag-Erling Smørgrav 	d5 = data[5];
96117d15b25SDag-Erling Smørgrav 	tsigtime = (d0<<40) | (d1<<32) | (d2<<24) | (d3<<16) | (d4<<8) | d5;
9627b5038d7SDag-Erling Smørgrav 
96317d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%llu ", (long long)tsigtime);
9647b5038d7SDag-Erling Smørgrav 
9657b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
9667b5038d7SDag-Erling Smørgrav }
9677b5038d7SDag-Erling Smørgrav 
9687b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_apl(ldns_buffer * output,const ldns_rdf * rdf)9697b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf)
9707b5038d7SDag-Erling Smørgrav {
9717b5038d7SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
9727b5038d7SDag-Erling Smørgrav 	uint16_t address_family;
9737b5038d7SDag-Erling Smørgrav 	uint8_t prefix;
9747b5038d7SDag-Erling Smørgrav 	bool negation;
9757b5038d7SDag-Erling Smørgrav 	uint8_t adf_length;
9767b5038d7SDag-Erling Smørgrav 	size_t i;
9777b5038d7SDag-Erling Smørgrav 	size_t pos = 0;
9787b5038d7SDag-Erling Smørgrav 
9797b5038d7SDag-Erling Smørgrav 	while (pos < (unsigned int) ldns_rdf_size(rdf)) {
9807b5038d7SDag-Erling Smørgrav                 if(pos + 3 >= (unsigned)ldns_rdf_size(rdf))
98117d15b25SDag-Erling Smørgrav                         return LDNS_STATUS_WIRE_RDATA_ERR;
9827b5038d7SDag-Erling Smørgrav 		address_family = ldns_read_uint16(&data[pos]);
9837b5038d7SDag-Erling Smørgrav 		prefix = data[pos + 2];
9847b5038d7SDag-Erling Smørgrav 		negation = data[pos + 3] & LDNS_APL_NEGATION;
9857b5038d7SDag-Erling Smørgrav 		adf_length = data[pos + 3] & LDNS_APL_MASK;
9867b5038d7SDag-Erling Smørgrav 		if (address_family == LDNS_APL_IP4) {
9877b5038d7SDag-Erling Smørgrav 			/* check if prefix < 32? */
9887b5038d7SDag-Erling Smørgrav 			if (negation) {
9897b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "!");
9907b5038d7SDag-Erling Smørgrav 			}
9917b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%u:", address_family);
9927b5038d7SDag-Erling Smørgrav 			/* address is variable length 0 - 4 */
9937b5038d7SDag-Erling Smørgrav 			for (i = 0; i < 4; i++) {
9947b5038d7SDag-Erling Smørgrav 				if (i > 0) {
9957b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, ".");
9967b5038d7SDag-Erling Smørgrav 				}
9977b5038d7SDag-Erling Smørgrav 				if (i < (unsigned short) adf_length) {
9987b5038d7SDag-Erling Smørgrav                                         if(pos+i+4 >= ldns_rdf_size(rdf))
99917d15b25SDag-Erling Smørgrav 					    return LDNS_STATUS_WIRE_RDATA_ERR;
10007b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "%d",
10017b5038d7SDag-Erling Smørgrav 					                   data[pos + i + 4]);
10027b5038d7SDag-Erling Smørgrav 				} else {
10037b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "0");
10047b5038d7SDag-Erling Smørgrav 				}
10057b5038d7SDag-Erling Smørgrav 			}
10067b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "/%u ", prefix);
10077b5038d7SDag-Erling Smørgrav 		} else if (address_family == LDNS_APL_IP6) {
10087b5038d7SDag-Erling Smørgrav 			/* check if prefix < 128? */
10097b5038d7SDag-Erling Smørgrav 			if (negation) {
10107b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "!");
10117b5038d7SDag-Erling Smørgrav 			}
10127b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%u:", address_family);
10137b5038d7SDag-Erling Smørgrav 			/* address is variable length 0 - 16 */
10147b5038d7SDag-Erling Smørgrav 			for (i = 0; i < 16; i++) {
10157b5038d7SDag-Erling Smørgrav 				if (i % 2 == 0 && i > 0) {
10167b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, ":");
10177b5038d7SDag-Erling Smørgrav 				}
10187b5038d7SDag-Erling Smørgrav 				if (i < (unsigned short) adf_length) {
10197b5038d7SDag-Erling Smørgrav                                         if(pos+i+4 >= ldns_rdf_size(rdf))
102017d15b25SDag-Erling Smørgrav 					    return LDNS_STATUS_WIRE_RDATA_ERR;
10217b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "%02x",
10227b5038d7SDag-Erling Smørgrav 					                   data[pos + i + 4]);
10237b5038d7SDag-Erling Smørgrav 				} else {
10247b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, "00");
10257b5038d7SDag-Erling Smørgrav 				}
10267b5038d7SDag-Erling Smørgrav 			}
10277b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "/%u ", prefix);
10287b5038d7SDag-Erling Smørgrav 
10297b5038d7SDag-Erling Smørgrav 		} else {
10307b5038d7SDag-Erling Smørgrav 			/* unknown address family */
103117d15b25SDag-Erling Smørgrav 			ldns_buffer_printf(output,
103217d15b25SDag-Erling Smørgrav 					"Unknown address family: %u data: ",
10337b5038d7SDag-Erling Smørgrav 					address_family);
10347b5038d7SDag-Erling Smørgrav 			for (i = 1; i < (unsigned short) (4 + adf_length); i++) {
10357b5038d7SDag-Erling Smørgrav                                 if(pos+i >= ldns_rdf_size(rdf))
103617d15b25SDag-Erling Smørgrav                                         return LDNS_STATUS_WIRE_RDATA_ERR;
10377b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "%02x", data[i]);
10387b5038d7SDag-Erling Smørgrav 			}
10397b5038d7SDag-Erling Smørgrav 		}
10407b5038d7SDag-Erling Smørgrav 		pos += 4 + adf_length;
10417b5038d7SDag-Erling Smørgrav 	}
10427b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
10437b5038d7SDag-Erling Smørgrav }
10447b5038d7SDag-Erling Smørgrav 
10457b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_int16_data(ldns_buffer * output,const ldns_rdf * rdf)10467b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf)
10477b5038d7SDag-Erling Smørgrav {
104817d15b25SDag-Erling Smørgrav 	size_t size;
104917d15b25SDag-Erling Smørgrav 	char *b64;
105017d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) < 2) {
105117d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
105217d15b25SDag-Erling Smørgrav 	}
10537b5038d7SDag-Erling Smørgrav 	/* Subtract the size (2) of the number that specifies the length */
105417d15b25SDag-Erling Smørgrav 	size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2);
105517d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2);
105617d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) > 2) {
105717d15b25SDag-Erling Smørgrav 		b64 = LDNS_XMALLOC(char, size);
10587b5038d7SDag-Erling Smørgrav 		if(!b64)
10597b5038d7SDag-Erling Smørgrav 			return LDNS_STATUS_MEM_ERR;
10607b5038d7SDag-Erling Smørgrav 
10617b5038d7SDag-Erling Smørgrav 		if (ldns_rdf_size(rdf) > 2 &&
10627b5038d7SDag-Erling Smørgrav 		ldns_b64_ntop(ldns_rdf_data(rdf) + 2,
10637b5038d7SDag-Erling Smørgrav 					ldns_rdf_size(rdf) - 2,
10647b5038d7SDag-Erling Smørgrav 					b64, size)) {
10657b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%s", b64);
10667b5038d7SDag-Erling Smørgrav 		}
10677b5038d7SDag-Erling Smørgrav 		LDNS_FREE(b64);
106817d15b25SDag-Erling Smørgrav 	}
10697b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
10707b5038d7SDag-Erling Smørgrav }
10717b5038d7SDag-Erling Smørgrav 
10727b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_ipseckey(ldns_buffer * output,const ldns_rdf * rdf)10737b5038d7SDag-Erling Smørgrav ldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf)
10747b5038d7SDag-Erling Smørgrav {
10757b5038d7SDag-Erling Smørgrav 	/* wire format from
10767b5038d7SDag-Erling Smørgrav 	   http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt
10777b5038d7SDag-Erling Smørgrav 	*/
10787b5038d7SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
10797b5038d7SDag-Erling Smørgrav 	uint8_t precedence;
10807b5038d7SDag-Erling Smørgrav 	uint8_t gateway_type;
10817b5038d7SDag-Erling Smørgrav 	uint8_t algorithm;
10827b5038d7SDag-Erling Smørgrav 
10837b5038d7SDag-Erling Smørgrav 	ldns_rdf *gateway = NULL;
10847b5038d7SDag-Erling Smørgrav 	uint8_t *gateway_data;
10857b5038d7SDag-Erling Smørgrav 
10867b5038d7SDag-Erling Smørgrav 	size_t public_key_size;
10877b5038d7SDag-Erling Smørgrav 	uint8_t *public_key_data;
10887b5038d7SDag-Erling Smørgrav 	ldns_rdf *public_key;
10897b5038d7SDag-Erling Smørgrav 
10907b5038d7SDag-Erling Smørgrav 	size_t offset = 0;
10917b5038d7SDag-Erling Smørgrav 	ldns_status status;
10927b5038d7SDag-Erling Smørgrav 
109317d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) < 3) {
109417d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
109517d15b25SDag-Erling Smørgrav 	}
10967b5038d7SDag-Erling Smørgrav 	precedence = data[0];
10977b5038d7SDag-Erling Smørgrav 	gateway_type = data[1];
10987b5038d7SDag-Erling Smørgrav 	algorithm = data[2];
10997b5038d7SDag-Erling Smørgrav 	offset = 3;
11007b5038d7SDag-Erling Smørgrav 
11017b5038d7SDag-Erling Smørgrav 	switch (gateway_type) {
11027b5038d7SDag-Erling Smørgrav 		case 0:
11037b5038d7SDag-Erling Smørgrav 			/* no gateway */
11047b5038d7SDag-Erling Smørgrav 			break;
11057b5038d7SDag-Erling Smørgrav 		case 1:
110617d15b25SDag-Erling Smørgrav 			if (ldns_rdf_size(rdf) < offset + LDNS_IP4ADDRLEN) {
110717d15b25SDag-Erling Smørgrav 				return LDNS_STATUS_ERR;
110817d15b25SDag-Erling Smørgrav 			}
1109*5afab0e5SDag-Erling Smørgrav 			gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
1110*5afab0e5SDag-Erling Smørgrav                         if(!gateway_data)
1111*5afab0e5SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
11127b5038d7SDag-Erling Smørgrav 			memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN);
111317d15b25SDag-Erling Smørgrav 			gateway = ldns_rdf_new(LDNS_RDF_TYPE_A,
111417d15b25SDag-Erling Smørgrav 					LDNS_IP4ADDRLEN , gateway_data);
11157b5038d7SDag-Erling Smørgrav 			offset += LDNS_IP4ADDRLEN;
11167b5038d7SDag-Erling Smørgrav                         if(!gateway) {
11177b5038d7SDag-Erling Smørgrav                                 LDNS_FREE(gateway_data);
11187b5038d7SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
11197b5038d7SDag-Erling Smørgrav                         }
11207b5038d7SDag-Erling Smørgrav 			break;
11217b5038d7SDag-Erling Smørgrav 		case 2:
112217d15b25SDag-Erling Smørgrav 			if (ldns_rdf_size(rdf) < offset + LDNS_IP6ADDRLEN) {
112317d15b25SDag-Erling Smørgrav 				return LDNS_STATUS_ERR;
112417d15b25SDag-Erling Smørgrav 			}
1125*5afab0e5SDag-Erling Smørgrav 			gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
1126*5afab0e5SDag-Erling Smørgrav                         if(!gateway_data)
1127*5afab0e5SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
11287b5038d7SDag-Erling Smørgrav 			memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN);
11297b5038d7SDag-Erling Smørgrav 			offset += LDNS_IP6ADDRLEN;
11307b5038d7SDag-Erling Smørgrav 			gateway =
113117d15b25SDag-Erling Smørgrav 				ldns_rdf_new(LDNS_RDF_TYPE_AAAA,
113217d15b25SDag-Erling Smørgrav 						LDNS_IP6ADDRLEN, gateway_data);
11337b5038d7SDag-Erling Smørgrav                         if(!gateway) {
11347b5038d7SDag-Erling Smørgrav                                 LDNS_FREE(gateway_data);
11357b5038d7SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
11367b5038d7SDag-Erling Smørgrav                         }
11377b5038d7SDag-Erling Smørgrav 			break;
11387b5038d7SDag-Erling Smørgrav 		case 3:
113917d15b25SDag-Erling Smørgrav 			status = ldns_wire2dname(&gateway, data,
114017d15b25SDag-Erling Smørgrav 					ldns_rdf_size(rdf), &offset);
11417b5038d7SDag-Erling Smørgrav                         if(status != LDNS_STATUS_OK)
11427b5038d7SDag-Erling Smørgrav                                 return status;
11437b5038d7SDag-Erling Smørgrav 			break;
11447b5038d7SDag-Erling Smørgrav 		default:
11457b5038d7SDag-Erling Smørgrav 			/* error? */
11467b5038d7SDag-Erling Smørgrav 			break;
11477b5038d7SDag-Erling Smørgrav 	}
11487b5038d7SDag-Erling Smørgrav 
114917d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) <= offset) {
1150*5afab0e5SDag-Erling Smørgrav                 ldns_rdf_deep_free(gateway);
115117d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_ERR;
115217d15b25SDag-Erling Smørgrav 	}
11537b5038d7SDag-Erling Smørgrav 	public_key_size = ldns_rdf_size(rdf) - offset;
11547b5038d7SDag-Erling Smørgrav 	public_key_data = LDNS_XMALLOC(uint8_t, public_key_size);
11557b5038d7SDag-Erling Smørgrav         if(!public_key_data) {
1156986ba33cSDag-Erling Smørgrav                 ldns_rdf_deep_free(gateway);
11577b5038d7SDag-Erling Smørgrav                 return LDNS_STATUS_MEM_ERR;
11587b5038d7SDag-Erling Smørgrav         }
11597b5038d7SDag-Erling Smørgrav 	memcpy(public_key_data, &data[offset], public_key_size);
116017d15b25SDag-Erling Smørgrav 	public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64,
116117d15b25SDag-Erling Smørgrav 			public_key_size, public_key_data);
11627b5038d7SDag-Erling Smørgrav         if(!public_key) {
11637b5038d7SDag-Erling Smørgrav                 LDNS_FREE(public_key_data);
1164986ba33cSDag-Erling Smørgrav                 ldns_rdf_deep_free(gateway);
11657b5038d7SDag-Erling Smørgrav                 return LDNS_STATUS_MEM_ERR;
11667b5038d7SDag-Erling Smørgrav         }
11677b5038d7SDag-Erling Smørgrav 
11687b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm);
11697b5038d7SDag-Erling Smørgrav 	if (gateway)
11707b5038d7SDag-Erling Smørgrav 	  	(void) ldns_rdf2buffer_str(output, gateway);
11717b5038d7SDag-Erling Smørgrav 	else
11727b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ".");
11737b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, " ");
11747b5038d7SDag-Erling Smørgrav 	(void) ldns_rdf2buffer_str(output, public_key);
11757b5038d7SDag-Erling Smørgrav 
1176986ba33cSDag-Erling Smørgrav 	ldns_rdf_deep_free(gateway);
1177986ba33cSDag-Erling Smørgrav 	ldns_rdf_deep_free(public_key);
11787b5038d7SDag-Erling Smørgrav 
11797b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
11807b5038d7SDag-Erling Smørgrav }
11817b5038d7SDag-Erling Smørgrav 
11827b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_ilnp64(ldns_buffer * output,const ldns_rdf * rdf)118317d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_ilnp64(ldns_buffer *output, const ldns_rdf *rdf)
11847b5038d7SDag-Erling Smørgrav {
118517d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) != 8) {
118617d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
118717d15b25SDag-Erling Smørgrav 	}
118817d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output,"%.4x:%.4x:%.4x:%.4x",
118917d15b25SDag-Erling Smørgrav 				ldns_read_uint16(ldns_rdf_data(rdf)),
119017d15b25SDag-Erling Smørgrav 				ldns_read_uint16(ldns_rdf_data(rdf)+2),
119117d15b25SDag-Erling Smørgrav 				ldns_read_uint16(ldns_rdf_data(rdf)+4),
119217d15b25SDag-Erling Smørgrav 				ldns_read_uint16(ldns_rdf_data(rdf)+6));
119317d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
11947b5038d7SDag-Erling Smørgrav }
11957b5038d7SDag-Erling Smørgrav 
119617d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_eui48(ldns_buffer * output,const ldns_rdf * rdf)119717d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_eui48(ldns_buffer *output, const ldns_rdf *rdf)
119817d15b25SDag-Erling Smørgrav {
119917d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) != 6) {
120017d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
120117d15b25SDag-Erling Smørgrav 	}
120217d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",
120317d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf)[1],
120417d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[2], ldns_rdf_data(rdf)[3],
120517d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[4], ldns_rdf_data(rdf)[5]);
120617d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
120717d15b25SDag-Erling Smørgrav }
12087b5038d7SDag-Erling Smørgrav 
12097b5038d7SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_eui64(ldns_buffer * output,const ldns_rdf * rdf)121017d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_eui64(ldns_buffer *output, const ldns_rdf *rdf)
121117d15b25SDag-Erling Smørgrav {
121217d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) != 8) {
121317d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
121417d15b25SDag-Erling Smørgrav 	}
121517d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",
121617d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf)[1],
121717d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[2], ldns_rdf_data(rdf)[3],
121817d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[4], ldns_rdf_data(rdf)[5],
121917d15b25SDag-Erling Smørgrav 				ldns_rdf_data(rdf)[6], ldns_rdf_data(rdf)[7]);
122017d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
122117d15b25SDag-Erling Smørgrav }
122217d15b25SDag-Erling Smørgrav 
122317d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_tag(ldns_buffer * output,const ldns_rdf * rdf)122417d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_tag(ldns_buffer *output, const ldns_rdf *rdf)
122517d15b25SDag-Erling Smørgrav {
122617d15b25SDag-Erling Smørgrav 	size_t nchars;
122717d15b25SDag-Erling Smørgrav 	const uint8_t* chars;
122817d15b25SDag-Erling Smørgrav 	char ch;
122917d15b25SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) < 2) {
123017d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
123117d15b25SDag-Erling Smørgrav 	}
123217d15b25SDag-Erling Smørgrav 	nchars = ldns_rdf_data(rdf)[0];
123317d15b25SDag-Erling Smørgrav 	if (nchars >= ldns_rdf_size(rdf) || /* should be rdf_size - 1 */
123417d15b25SDag-Erling Smørgrav 			nchars < 1) {
123517d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
123617d15b25SDag-Erling Smørgrav 	}
123717d15b25SDag-Erling Smørgrav 	chars = ldns_rdf_data(rdf) + 1;
123817d15b25SDag-Erling Smørgrav 	while (nchars > 0) {
123917d15b25SDag-Erling Smørgrav 		ch = (char)*chars++;
1240986ba33cSDag-Erling Smørgrav 		if (! isalnum((unsigned char)ch)) {
124117d15b25SDag-Erling Smørgrav 			return LDNS_STATUS_WIRE_RDATA_ERR;
124217d15b25SDag-Erling Smørgrav 		}
124317d15b25SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%c", ch);
124417d15b25SDag-Erling Smørgrav 		nchars--;
124517d15b25SDag-Erling Smørgrav 	}
124617d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
124717d15b25SDag-Erling Smørgrav }
124817d15b25SDag-Erling Smørgrav 
124917d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_long_str(ldns_buffer * output,const ldns_rdf * rdf)125017d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_long_str(ldns_buffer *output, const ldns_rdf *rdf)
125117d15b25SDag-Erling Smørgrav {
125217d15b25SDag-Erling Smørgrav 
125317d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\"");
125417d15b25SDag-Erling Smørgrav 	ldns_characters2buffer_str(output,
125517d15b25SDag-Erling Smørgrav 			ldns_rdf_size(rdf), ldns_rdf_data(rdf));
125617d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\"");
125717d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
125817d15b25SDag-Erling Smørgrav }
125917d15b25SDag-Erling Smørgrav 
126017d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_hip(ldns_buffer * output,const ldns_rdf * rdf)126117d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_hip(ldns_buffer *output, const ldns_rdf *rdf)
126217d15b25SDag-Erling Smørgrav {
126317d15b25SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
126417d15b25SDag-Erling Smørgrav 	size_t rdf_size = ldns_rdf_size(rdf);
126517d15b25SDag-Erling Smørgrav 	uint8_t hit_size;
126617d15b25SDag-Erling Smørgrav 	uint16_t pk_size;
126717d15b25SDag-Erling Smørgrav 	int written;
126817d15b25SDag-Erling Smørgrav 
126917d15b25SDag-Erling Smørgrav 	if (rdf_size < 6) {
127017d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
127117d15b25SDag-Erling Smørgrav 	}
127217d15b25SDag-Erling Smørgrav 	if ((hit_size = data[0]) == 0 ||
127317d15b25SDag-Erling Smørgrav 			(pk_size = ldns_read_uint16(data + 2)) == 0 ||
127417d15b25SDag-Erling Smørgrav 			rdf_size < (size_t) hit_size + pk_size + 4) {
127517d15b25SDag-Erling Smørgrav 
127617d15b25SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
127717d15b25SDag-Erling Smørgrav 	}
127817d15b25SDag-Erling Smørgrav 
127917d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%d ", (int) data[1]);
128017d15b25SDag-Erling Smørgrav 
128117d15b25SDag-Erling Smørgrav 	for (data += 4; hit_size > 0; hit_size--, data++) {
128217d15b25SDag-Erling Smørgrav 
128317d15b25SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%02x", (int) *data);
128417d15b25SDag-Erling Smørgrav 	}
1285*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_write_char(output, (uint8_t) ' ');
128617d15b25SDag-Erling Smørgrav 
128717d15b25SDag-Erling Smørgrav 	if (ldns_buffer_reserve(output,
128817d15b25SDag-Erling Smørgrav 				ldns_b64_ntop_calculate_size(pk_size))) {
128917d15b25SDag-Erling Smørgrav 
129017d15b25SDag-Erling Smørgrav 		written = ldns_b64_ntop(data, pk_size,
129117d15b25SDag-Erling Smørgrav 				(char *) ldns_buffer_current(output),
129217d15b25SDag-Erling Smørgrav 				ldns_buffer_remaining(output));
129317d15b25SDag-Erling Smørgrav 
129417d15b25SDag-Erling Smørgrav 		if (written > 0 &&
129517d15b25SDag-Erling Smørgrav 				written < (int) ldns_buffer_remaining(output)) {
129617d15b25SDag-Erling Smørgrav 
129717d15b25SDag-Erling Smørgrav 			output->_position += written;
129817d15b25SDag-Erling Smørgrav 		}
129917d15b25SDag-Erling Smørgrav 	}
130017d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
130117d15b25SDag-Erling Smørgrav }
130217d15b25SDag-Erling Smørgrav 
1303*5afab0e5SDag-Erling Smørgrav /* implementation mimicked from ldns_rdf2buffer_str_ipseckey */
1304*5afab0e5SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_amtrelay(ldns_buffer * output,const ldns_rdf * rdf)1305*5afab0e5SDag-Erling Smørgrav ldns_rdf2buffer_str_amtrelay(ldns_buffer *output, const ldns_rdf *rdf)
1306*5afab0e5SDag-Erling Smørgrav {
1307*5afab0e5SDag-Erling Smørgrav 	/* wire format from
1308*5afab0e5SDag-Erling Smørgrav 	 * draft-ietf-mboned-driad-amt-discovery Section 4.2
1309*5afab0e5SDag-Erling Smørgrav 	 */
1310*5afab0e5SDag-Erling Smørgrav 	uint8_t *data = ldns_rdf_data(rdf);
1311*5afab0e5SDag-Erling Smørgrav 	uint8_t precedence;
1312*5afab0e5SDag-Erling Smørgrav 	uint8_t discovery_optional;
1313*5afab0e5SDag-Erling Smørgrav 	uint8_t relay_type;
1314*5afab0e5SDag-Erling Smørgrav 
1315*5afab0e5SDag-Erling Smørgrav 	ldns_rdf *relay = NULL;
1316*5afab0e5SDag-Erling Smørgrav 	uint8_t *relay_data;
1317*5afab0e5SDag-Erling Smørgrav 
1318*5afab0e5SDag-Erling Smørgrav 	size_t offset = 0;
1319*5afab0e5SDag-Erling Smørgrav 	ldns_status status;
1320*5afab0e5SDag-Erling Smørgrav 
1321*5afab0e5SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) < 2) {
1322*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_WIRE_RDATA_ERR;
1323*5afab0e5SDag-Erling Smørgrav 	}
1324*5afab0e5SDag-Erling Smørgrav 	precedence = data[0];
1325*5afab0e5SDag-Erling Smørgrav 	discovery_optional = ((data[1] & 0x80) >> 7);
1326*5afab0e5SDag-Erling Smørgrav 	relay_type = data[1] & 0x7F;
1327*5afab0e5SDag-Erling Smørgrav 	offset = 2;
1328*5afab0e5SDag-Erling Smørgrav 
1329*5afab0e5SDag-Erling Smørgrav 	switch (relay_type) {
1330*5afab0e5SDag-Erling Smørgrav 		case 0:
1331*5afab0e5SDag-Erling Smørgrav 			/* no relay */
1332*5afab0e5SDag-Erling Smørgrav 			break;
1333*5afab0e5SDag-Erling Smørgrav 		case 1:
1334*5afab0e5SDag-Erling Smørgrav 			if (ldns_rdf_size(rdf) < offset + LDNS_IP4ADDRLEN) {
1335*5afab0e5SDag-Erling Smørgrav 				return LDNS_STATUS_ERR;
1336*5afab0e5SDag-Erling Smørgrav 			}
1337*5afab0e5SDag-Erling Smørgrav 			relay_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
1338*5afab0e5SDag-Erling Smørgrav                         if(!relay_data)
1339*5afab0e5SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
1340*5afab0e5SDag-Erling Smørgrav 			memcpy(relay_data, &data[offset], LDNS_IP4ADDRLEN);
1341*5afab0e5SDag-Erling Smørgrav 			relay = ldns_rdf_new(LDNS_RDF_TYPE_A,
1342*5afab0e5SDag-Erling Smørgrav 					LDNS_IP4ADDRLEN , relay_data);
1343*5afab0e5SDag-Erling Smørgrav 			offset += LDNS_IP4ADDRLEN;
1344*5afab0e5SDag-Erling Smørgrav                         if(!relay) {
1345*5afab0e5SDag-Erling Smørgrav                                 LDNS_FREE(relay_data);
1346*5afab0e5SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
1347*5afab0e5SDag-Erling Smørgrav                         }
1348*5afab0e5SDag-Erling Smørgrav 			break;
1349*5afab0e5SDag-Erling Smørgrav 		case 2:
1350*5afab0e5SDag-Erling Smørgrav 			if (ldns_rdf_size(rdf) < offset + LDNS_IP6ADDRLEN) {
1351*5afab0e5SDag-Erling Smørgrav 				return LDNS_STATUS_ERR;
1352*5afab0e5SDag-Erling Smørgrav 			}
1353*5afab0e5SDag-Erling Smørgrav 			relay_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
1354*5afab0e5SDag-Erling Smørgrav                         if(!relay_data)
1355*5afab0e5SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
1356*5afab0e5SDag-Erling Smørgrav 			memcpy(relay_data, &data[offset], LDNS_IP6ADDRLEN);
1357*5afab0e5SDag-Erling Smørgrav 			offset += LDNS_IP6ADDRLEN;
1358*5afab0e5SDag-Erling Smørgrav 			relay =
1359*5afab0e5SDag-Erling Smørgrav 				ldns_rdf_new(LDNS_RDF_TYPE_AAAA,
1360*5afab0e5SDag-Erling Smørgrav 						LDNS_IP6ADDRLEN, relay_data);
1361*5afab0e5SDag-Erling Smørgrav                         if(!relay) {
1362*5afab0e5SDag-Erling Smørgrav                                 LDNS_FREE(relay_data);
1363*5afab0e5SDag-Erling Smørgrav                                 return LDNS_STATUS_MEM_ERR;
1364*5afab0e5SDag-Erling Smørgrav                         }
1365*5afab0e5SDag-Erling Smørgrav 			break;
1366*5afab0e5SDag-Erling Smørgrav 		case 3:
1367*5afab0e5SDag-Erling Smørgrav 			status = ldns_wire2dname(&relay, data,
1368*5afab0e5SDag-Erling Smørgrav 					ldns_rdf_size(rdf), &offset);
1369*5afab0e5SDag-Erling Smørgrav                         if(status != LDNS_STATUS_OK)
1370*5afab0e5SDag-Erling Smørgrav                                 return status;
1371*5afab0e5SDag-Erling Smørgrav 			break;
1372*5afab0e5SDag-Erling Smørgrav 		default:
1373*5afab0e5SDag-Erling Smørgrav 			/* error? */
1374*5afab0e5SDag-Erling Smørgrav 			break;
1375*5afab0e5SDag-Erling Smørgrav 	}
1376*5afab0e5SDag-Erling Smørgrav 
1377*5afab0e5SDag-Erling Smørgrav 	if (ldns_rdf_size(rdf) != offset) {
1378*5afab0e5SDag-Erling Smørgrav                 ldns_rdf_deep_free(relay);
1379*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_ERR;
1380*5afab0e5SDag-Erling Smørgrav 	}
1381*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%u %u %u ",
1382*5afab0e5SDag-Erling Smørgrav 			precedence, discovery_optional, relay_type);
1383*5afab0e5SDag-Erling Smørgrav 	if (relay)
1384*5afab0e5SDag-Erling Smørgrav 	  	(void) ldns_rdf2buffer_str(output, relay);
1385*5afab0e5SDag-Erling Smørgrav 
1386*5afab0e5SDag-Erling Smørgrav 	ldns_rdf_deep_free(relay);
1387*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1388*5afab0e5SDag-Erling Smørgrav }
1389*5afab0e5SDag-Erling Smørgrav 
1390*5afab0e5SDag-Erling Smørgrav #ifdef RRTYPE_SVCB_HTTPS
1391*5afab0e5SDag-Erling Smørgrav ldns_status svcparam_key2buffer_str(ldns_buffer *output, uint16_t key);
1392*5afab0e5SDag-Erling Smørgrav 
1393*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_mandatory2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1394*5afab0e5SDag-Erling Smørgrav svcparam_mandatory2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1395*5afab0e5SDag-Erling Smørgrav {
1396*5afab0e5SDag-Erling Smørgrav 	if (sz % 2)
1397*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1398*5afab0e5SDag-Erling Smørgrav 
1399*5afab0e5SDag-Erling Smørgrav 	svcparam_key2buffer_str(output, ldns_read_uint16(data));
1400*5afab0e5SDag-Erling Smørgrav 	for (data += 2, sz -= 2; sz; data += 2, sz -= 2) {
1401*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, ',');
1402*5afab0e5SDag-Erling Smørgrav 		svcparam_key2buffer_str(output, ldns_read_uint16(data));
1403*5afab0e5SDag-Erling Smørgrav 	}
1404*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1405*5afab0e5SDag-Erling Smørgrav }
1406*5afab0e5SDag-Erling Smørgrav 
1407*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_alpn2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1408*5afab0e5SDag-Erling Smørgrav svcparam_alpn2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1409*5afab0e5SDag-Erling Smørgrav {
1410*5afab0e5SDag-Erling Smørgrav 	uint8_t *eod = data + sz, *dp;
1411*5afab0e5SDag-Erling Smørgrav 	bool quote = false;
1412*5afab0e5SDag-Erling Smørgrav 	size_t i;
1413*5afab0e5SDag-Erling Smørgrav 
1414*5afab0e5SDag-Erling Smørgrav 	for (dp = data; dp < eod && !quote; dp += 1 + *dp) {
1415*5afab0e5SDag-Erling Smørgrav 		if (dp + 1 + *dp > eod)
1416*5afab0e5SDag-Erling Smørgrav 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1417*5afab0e5SDag-Erling Smørgrav 
1418*5afab0e5SDag-Erling Smørgrav 		for (i = 0; i < *dp; i++)
1419*5afab0e5SDag-Erling Smørgrav 			if (isspace(dp[i + 1]))
1420*5afab0e5SDag-Erling Smørgrav 				break;
1421*5afab0e5SDag-Erling Smørgrav 		quote = i < *dp;
1422*5afab0e5SDag-Erling Smørgrav 	}
1423*5afab0e5SDag-Erling Smørgrav 	if (quote)
1424*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, '"');
1425*5afab0e5SDag-Erling Smørgrav 	while (data < eod) {
1426*5afab0e5SDag-Erling Smørgrav 		uint8_t *eot = data + 1 + *data;
1427*5afab0e5SDag-Erling Smørgrav 
1428*5afab0e5SDag-Erling Smørgrav 		if (eot > eod)
1429*5afab0e5SDag-Erling Smørgrav 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1430*5afab0e5SDag-Erling Smørgrav 
1431*5afab0e5SDag-Erling Smørgrav 		if (eod - data < (int)sz)
1432*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_write_char(output, ',');
1433*5afab0e5SDag-Erling Smørgrav 
1434*5afab0e5SDag-Erling Smørgrav 		for (data += 1; data < eot; data += 1) {
1435*5afab0e5SDag-Erling Smørgrav 			uint8_t ch = *data;
1436*5afab0e5SDag-Erling Smørgrav 
1437*5afab0e5SDag-Erling Smørgrav 			if (isprint(ch) || ch == '\t') {
1438*5afab0e5SDag-Erling Smørgrav 				if (ch == '"' ||  ch == ',' || ch == '\\')
1439*5afab0e5SDag-Erling Smørgrav 					ldns_buffer_write_char(output, '\\');
1440*5afab0e5SDag-Erling Smørgrav 				ldns_buffer_write_char(output, ch);
1441*5afab0e5SDag-Erling Smørgrav 			} else
1442*5afab0e5SDag-Erling Smørgrav 				ldns_buffer_printf(output, "\\%03u"
1443*5afab0e5SDag-Erling Smørgrav 				                         , (unsigned)ch);
1444*5afab0e5SDag-Erling Smørgrav 		}
1445*5afab0e5SDag-Erling Smørgrav 	}
1446*5afab0e5SDag-Erling Smørgrav 	if (quote)
1447*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, '"');
1448*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1449*5afab0e5SDag-Erling Smørgrav }
1450*5afab0e5SDag-Erling Smørgrav 
1451*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_port2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1452*5afab0e5SDag-Erling Smørgrav svcparam_port2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1453*5afab0e5SDag-Erling Smørgrav {
1454*5afab0e5SDag-Erling Smørgrav 	if (sz != 2)
1455*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1456*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "%d", (int)ldns_read_uint16(data));
1457*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1458*5afab0e5SDag-Erling Smørgrav }
1459*5afab0e5SDag-Erling Smørgrav 
1460*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_ipv4hint2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1461*5afab0e5SDag-Erling Smørgrav svcparam_ipv4hint2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1462*5afab0e5SDag-Erling Smørgrav {
1463*5afab0e5SDag-Erling Smørgrav 	char str[INET_ADDRSTRLEN];
1464*5afab0e5SDag-Erling Smørgrav 
1465*5afab0e5SDag-Erling Smørgrav 	if (sz % 4 || !inet_ntop(AF_INET, data, str, INET_ADDRSTRLEN))
1466*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1467*5afab0e5SDag-Erling Smørgrav 
1468*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_write_chars(output, str);
1469*5afab0e5SDag-Erling Smørgrav 
1470*5afab0e5SDag-Erling Smørgrav 	for (data += 4, sz -= 4; sz ; data += 4, sz -= 4 ) {
1471*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, ',');
1472*5afab0e5SDag-Erling Smørgrav 		if (!inet_ntop(AF_INET, data, str, INET_ADDRSTRLEN))
1473*5afab0e5SDag-Erling Smørgrav 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1474*5afab0e5SDag-Erling Smørgrav 
1475*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_chars(output, str);
1476*5afab0e5SDag-Erling Smørgrav 	}
1477*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1478*5afab0e5SDag-Erling Smørgrav }
1479*5afab0e5SDag-Erling Smørgrav 
1480*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_ech2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1481*5afab0e5SDag-Erling Smørgrav svcparam_ech2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1482*5afab0e5SDag-Erling Smørgrav {
1483*5afab0e5SDag-Erling Smørgrav 	size_t str_sz = ldns_b64_ntop_calculate_size(sz);
1484*5afab0e5SDag-Erling Smørgrav 	int written;
1485*5afab0e5SDag-Erling Smørgrav 
1486*5afab0e5SDag-Erling Smørgrav 	if (!ldns_buffer_reserve(output, str_sz))
1487*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_MEM_ERR;
1488*5afab0e5SDag-Erling Smørgrav 
1489*5afab0e5SDag-Erling Smørgrav 	written = ldns_b64_ntop( data, sz
1490*5afab0e5SDag-Erling Smørgrav 	                       , (char *)ldns_buffer_current(output), str_sz);
1491*5afab0e5SDag-Erling Smørgrav 	if (written > 0)
1492*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_skip(output, written);
1493*5afab0e5SDag-Erling Smørgrav 	else
1494*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1495*5afab0e5SDag-Erling Smørgrav 
1496*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1497*5afab0e5SDag-Erling Smørgrav }
1498*5afab0e5SDag-Erling Smørgrav 
1499*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_ipv6hint2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1500*5afab0e5SDag-Erling Smørgrav svcparam_ipv6hint2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1501*5afab0e5SDag-Erling Smørgrav {
1502*5afab0e5SDag-Erling Smørgrav 	char str[INET6_ADDRSTRLEN];
1503*5afab0e5SDag-Erling Smørgrav 
1504*5afab0e5SDag-Erling Smørgrav 	if (sz % 16 || !inet_ntop(AF_INET6, data, str, INET6_ADDRSTRLEN))
1505*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1506*5afab0e5SDag-Erling Smørgrav 
1507*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_write_chars(output, str);
1508*5afab0e5SDag-Erling Smørgrav 
1509*5afab0e5SDag-Erling Smørgrav 	for (data += 16, sz -= 16; sz ; data += 16, sz -= 16) {
1510*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, ',');
1511*5afab0e5SDag-Erling Smørgrav 		if (!inet_ntop(AF_INET6, data, str, INET6_ADDRSTRLEN))
1512*5afab0e5SDag-Erling Smørgrav 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1513*5afab0e5SDag-Erling Smørgrav 
1514*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_chars(output, str);
1515*5afab0e5SDag-Erling Smørgrav 	}
1516*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1517*5afab0e5SDag-Erling Smørgrav }
1518*5afab0e5SDag-Erling Smørgrav 
1519*5afab0e5SDag-Erling Smørgrav static ldns_status
svcparam_value2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1520*5afab0e5SDag-Erling Smørgrav svcparam_value2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1521*5afab0e5SDag-Erling Smørgrav {
1522*5afab0e5SDag-Erling Smørgrav 	uint8_t *eod = data + sz, *dp;
1523*5afab0e5SDag-Erling Smørgrav 	bool quote = false;
1524*5afab0e5SDag-Erling Smørgrav 
1525*5afab0e5SDag-Erling Smørgrav 	for (dp = data; dp < eod && !isspace(*dp); dp++)
1526*5afab0e5SDag-Erling Smørgrav 		; /* pass */
1527*5afab0e5SDag-Erling Smørgrav 
1528*5afab0e5SDag-Erling Smørgrav 	if ((quote = dp < eod))
1529*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, '"');
1530*5afab0e5SDag-Erling Smørgrav 
1531*5afab0e5SDag-Erling Smørgrav 	for (dp = data; dp < eod; dp++) {
1532*5afab0e5SDag-Erling Smørgrav 		uint8_t ch = *dp;
1533*5afab0e5SDag-Erling Smørgrav 
1534*5afab0e5SDag-Erling Smørgrav 		if (isprint(ch) || ch == '\t') {
1535*5afab0e5SDag-Erling Smørgrav 			if (ch == '"' ||  ch == '\\')
1536*5afab0e5SDag-Erling Smørgrav 				ldns_buffer_write_char(output, '\\');
1537*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_write_char(output, ch);
1538*5afab0e5SDag-Erling Smørgrav 		} else
1539*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "\\%03u", (unsigned)ch);
1540*5afab0e5SDag-Erling Smørgrav 	}
1541*5afab0e5SDag-Erling Smørgrav 	if (quote)
1542*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, '"');
1543*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1544*5afab0e5SDag-Erling Smørgrav }
1545*5afab0e5SDag-Erling Smørgrav 
1546*5afab0e5SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_svcparams(ldns_buffer * output,const ldns_rdf * rdf)1547*5afab0e5SDag-Erling Smørgrav ldns_rdf2buffer_str_svcparams(ldns_buffer *output, const ldns_rdf *rdf)
1548*5afab0e5SDag-Erling Smørgrav {
1549*5afab0e5SDag-Erling Smørgrav 	uint8_t    *data, *dp, *next_dp = NULL;
1550*5afab0e5SDag-Erling Smørgrav 	size_t      sz;
1551*5afab0e5SDag-Erling Smørgrav 	ldns_status st;
1552*5afab0e5SDag-Erling Smørgrav 
1553*5afab0e5SDag-Erling Smørgrav 	if (!output)
1554*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_NULL;
1555*5afab0e5SDag-Erling Smørgrav 
1556*5afab0e5SDag-Erling Smørgrav 	if (!rdf || !(data = ldns_rdf_data(rdf)) || !(sz = ldns_rdf_size(rdf)))
1557*5afab0e5SDag-Erling Smørgrav 		/* No svcparams is just fine. Just nothing to print. */
1558*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_OK;
1559*5afab0e5SDag-Erling Smørgrav 
1560*5afab0e5SDag-Erling Smørgrav 	for (dp = data; dp + 4 <= data + sz; dp = next_dp) {
1561*5afab0e5SDag-Erling Smørgrav 		ldns_svcparam_key key    = ldns_read_uint16(dp);
1562*5afab0e5SDag-Erling Smørgrav 		uint16_t          val_sz = ldns_read_uint16(dp + 2);
1563*5afab0e5SDag-Erling Smørgrav 
1564*5afab0e5SDag-Erling Smørgrav 		if ((next_dp = dp + 4 + val_sz) > data + sz)
1565*5afab0e5SDag-Erling Smørgrav 			return LDNS_STATUS_RDATA_OVERFLOW;
1566*5afab0e5SDag-Erling Smørgrav 
1567*5afab0e5SDag-Erling Smørgrav 		if (dp > data)
1568*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_write_char(output, ' ');
1569*5afab0e5SDag-Erling Smørgrav 
1570*5afab0e5SDag-Erling Smørgrav 		if ((st = svcparam_key2buffer_str(output, key)))
1571*5afab0e5SDag-Erling Smørgrav 			return st;
1572*5afab0e5SDag-Erling Smørgrav 
1573*5afab0e5SDag-Erling Smørgrav 		if (val_sz == 0)
1574*5afab0e5SDag-Erling Smørgrav 			continue;
1575*5afab0e5SDag-Erling Smørgrav 		dp += 4;
1576*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(output, '=');
1577*5afab0e5SDag-Erling Smørgrav 		switch (key) {
1578*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_MANDATORY:
1579*5afab0e5SDag-Erling Smørgrav 			st = svcparam_mandatory2buffer_str(output, val_sz, dp);
1580*5afab0e5SDag-Erling Smørgrav 			break;
1581*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_ALPN:
1582*5afab0e5SDag-Erling Smørgrav 			st = svcparam_alpn2buffer_str(output, val_sz, dp);
1583*5afab0e5SDag-Erling Smørgrav 			break;
1584*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_NO_DEFAULT_ALPN:
1585*5afab0e5SDag-Erling Smørgrav 			return LDNS_STATUS_NO_SVCPARAM_VALUE_EXPECTED;
1586*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_PORT:
1587*5afab0e5SDag-Erling Smørgrav 			st = svcparam_port2buffer_str(output, val_sz, dp);
1588*5afab0e5SDag-Erling Smørgrav 			break;
1589*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_IPV4HINT:
1590*5afab0e5SDag-Erling Smørgrav 			st = svcparam_ipv4hint2buffer_str(output, val_sz, dp);
1591*5afab0e5SDag-Erling Smørgrav 			break;
1592*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_ECH:
1593*5afab0e5SDag-Erling Smørgrav 			st = svcparam_ech2buffer_str(output, val_sz, dp);
1594*5afab0e5SDag-Erling Smørgrav 			break;
1595*5afab0e5SDag-Erling Smørgrav 		case LDNS_SVCPARAM_KEY_IPV6HINT:
1596*5afab0e5SDag-Erling Smørgrav 			st = svcparam_ipv6hint2buffer_str(output, val_sz, dp);
1597*5afab0e5SDag-Erling Smørgrav 			break;
1598*5afab0e5SDag-Erling Smørgrav 		default:
1599*5afab0e5SDag-Erling Smørgrav 			st = svcparam_value2buffer_str(output, val_sz, dp);
1600*5afab0e5SDag-Erling Smørgrav 			break;
1601*5afab0e5SDag-Erling Smørgrav 		}
1602*5afab0e5SDag-Erling Smørgrav 		if (st)
1603*5afab0e5SDag-Erling Smørgrav 			return st;
1604*5afab0e5SDag-Erling Smørgrav 	}
1605*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
1606*5afab0e5SDag-Erling Smørgrav }
1607*5afab0e5SDag-Erling Smørgrav #else	/* #ifdef RRTYPE_SVCB_HTTPS */
1608*5afab0e5SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str_svcparams(ldns_buffer * output,const ldns_rdf * rdf)1609*5afab0e5SDag-Erling Smørgrav ldns_rdf2buffer_str_svcparams(ldns_buffer *output, const ldns_rdf *rdf)
1610*5afab0e5SDag-Erling Smørgrav {
1611*5afab0e5SDag-Erling Smørgrav 	(void)output; (void)rdf;
1612*5afab0e5SDag-Erling Smørgrav 	return LDNS_STATUS_NOT_IMPL;
1613*5afab0e5SDag-Erling Smørgrav }
1614*5afab0e5SDag-Erling Smørgrav #endif	/* #ifdef RRTYPE_SVCB_HTTPS */
1615*5afab0e5SDag-Erling Smørgrav 
161617d15b25SDag-Erling Smørgrav static ldns_status
ldns_rdf2buffer_str_fmt(ldns_buffer * buffer,const ldns_output_format * fmt,const ldns_rdf * rdf)161717d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str_fmt(ldns_buffer *buffer,
161817d15b25SDag-Erling Smørgrav 		const ldns_output_format* fmt, const ldns_rdf *rdf)
16197b5038d7SDag-Erling Smørgrav {
16207b5038d7SDag-Erling Smørgrav 	ldns_status res = LDNS_STATUS_OK;
16217b5038d7SDag-Erling Smørgrav 
16227b5038d7SDag-Erling Smørgrav 	/*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/
16237b5038d7SDag-Erling Smørgrav 	if (rdf) {
16247b5038d7SDag-Erling Smørgrav 		switch(ldns_rdf_get_type(rdf)) {
16257b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NONE:
16267b5038d7SDag-Erling Smørgrav 			break;
16277b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_DNAME:
16287b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_dname(buffer, rdf);
16297b5038d7SDag-Erling Smørgrav 			break;
1630986ba33cSDag-Erling Smørgrav 		case LDNS_RDF_TYPE_INT8: /* Don't output mnemonics for these */
1631986ba33cSDag-Erling Smørgrav 		case LDNS_RDF_TYPE_ALG:
1632986ba33cSDag-Erling Smørgrav 		case LDNS_RDF_TYPE_CERTIFICATE_USAGE:
1633986ba33cSDag-Erling Smørgrav 		case LDNS_RDF_TYPE_SELECTOR:
1634986ba33cSDag-Erling Smørgrav 		case LDNS_RDF_TYPE_MATCHING_TYPE:
16357b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_int8(buffer, rdf);
16367b5038d7SDag-Erling Smørgrav 			break;
16377b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_INT16:
16387b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_int16(buffer, rdf);
16397b5038d7SDag-Erling Smørgrav 			break;
16407b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_INT32:
16417b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_int32(buffer, rdf);
16427b5038d7SDag-Erling Smørgrav 			break;
16437b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_PERIOD:
16447b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_period(buffer, rdf);
16457b5038d7SDag-Erling Smørgrav 			break;
16467b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_TSIGTIME:
16477b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_tsigtime(buffer, rdf);
16487b5038d7SDag-Erling Smørgrav 			break;
16497b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_A:
16507b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_a(buffer, rdf);
16517b5038d7SDag-Erling Smørgrav 			break;
16527b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_AAAA:
16537b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_aaaa(buffer, rdf);
16547b5038d7SDag-Erling Smørgrav 			break;
16557b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_STR:
16567b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_str(buffer, rdf);
16577b5038d7SDag-Erling Smørgrav 			break;
16587b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_APL:
16597b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_apl(buffer, rdf);
16607b5038d7SDag-Erling Smørgrav 			break;
16617b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_B32_EXT:
16627b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
16637b5038d7SDag-Erling Smørgrav 			break;
16647b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_B64:
16657b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_b64(buffer, rdf);
16667b5038d7SDag-Erling Smørgrav 			break;
16677b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_HEX:
16687b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_hex(buffer, rdf);
16697b5038d7SDag-Erling Smørgrav 			break;
16707b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NSEC:
167117d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_nsec_fmt(buffer, fmt, rdf);
16727b5038d7SDag-Erling Smørgrav 			break;
16737b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NSEC3_SALT:
16747b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf);
16757b5038d7SDag-Erling Smørgrav 			break;
16767b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_TYPE:
167717d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_type_fmt(buffer, fmt, rdf);
16787b5038d7SDag-Erling Smørgrav 			break;
16797b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_CLASS:
16807b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_class(buffer, rdf);
16817b5038d7SDag-Erling Smørgrav 			break;
16827b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_CERT_ALG:
16837b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_cert_alg(buffer, rdf);
16847b5038d7SDag-Erling Smørgrav 			break;
16857b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_UNKNOWN:
16867b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_unknown(buffer, rdf);
16877b5038d7SDag-Erling Smørgrav 			break;
16887b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_TIME:
16897b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_time(buffer, rdf);
16907b5038d7SDag-Erling Smørgrav 			break;
169117d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_HIP:
169217d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_hip(buffer, rdf);
169317d15b25SDag-Erling Smørgrav 			break;
16947b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_LOC:
16957b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_loc(buffer, rdf);
16967b5038d7SDag-Erling Smørgrav 			break;
16977b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_WKS:
16987b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_SERVICE:
16997b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_wks(buffer, rdf);
17007b5038d7SDag-Erling Smørgrav 			break;
17017b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NSAP:
17027b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_nsap(buffer, rdf);
17037b5038d7SDag-Erling Smørgrav 			break;
17047b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_ATMA:
17057b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_atma(buffer, rdf);
17067b5038d7SDag-Erling Smørgrav 			break;
17077b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_IPSECKEY:
17087b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_ipseckey(buffer, rdf);
17097b5038d7SDag-Erling Smørgrav 			break;
17107b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_INT16_DATA:
17117b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_int16_data(buffer, rdf);
17127b5038d7SDag-Erling Smørgrav 			break;
17137b5038d7SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER:
17147b5038d7SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
17157b5038d7SDag-Erling Smørgrav 			break;
171617d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_ILNP64:
171717d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_ilnp64(buffer, rdf);
171817d15b25SDag-Erling Smørgrav 			break;
171917d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_EUI48:
172017d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_eui48(buffer, rdf);
172117d15b25SDag-Erling Smørgrav 			break;
172217d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_EUI64:
172317d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_eui64(buffer, rdf);
172417d15b25SDag-Erling Smørgrav 			break;
172517d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_TAG:
172617d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_tag(buffer, rdf);
172717d15b25SDag-Erling Smørgrav 			break;
172817d15b25SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_LONG_STR:
172917d15b25SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_long_str(buffer, rdf);
173017d15b25SDag-Erling Smørgrav 			break;
1731*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_AMTRELAY:
1732*5afab0e5SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_amtrelay(buffer, rdf);
1733*5afab0e5SDag-Erling Smørgrav 			break;
1734*5afab0e5SDag-Erling Smørgrav 		case LDNS_RDF_TYPE_SVCPARAMS:
1735*5afab0e5SDag-Erling Smørgrav 			res = ldns_rdf2buffer_str_svcparams(buffer, rdf);
1736*5afab0e5SDag-Erling Smørgrav 			break;
17377b5038d7SDag-Erling Smørgrav 		}
17387b5038d7SDag-Erling Smørgrav 	} else {
17392787e39aSDag-Erling Smørgrav 		/** This will write mangled RRs */
17407b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(buffer, "(null) ");
17412787e39aSDag-Erling Smørgrav 		res = LDNS_STATUS_ERR;
17427b5038d7SDag-Erling Smørgrav 	}
17437b5038d7SDag-Erling Smørgrav 	return res;
17447b5038d7SDag-Erling Smørgrav }
17457b5038d7SDag-Erling Smørgrav 
174617d15b25SDag-Erling Smørgrav ldns_status
ldns_rdf2buffer_str(ldns_buffer * buffer,const ldns_rdf * rdf)174717d15b25SDag-Erling Smørgrav ldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf)
174817d15b25SDag-Erling Smørgrav {
174917d15b25SDag-Erling Smørgrav 	return ldns_rdf2buffer_str_fmt(buffer,ldns_output_format_default,rdf);
175017d15b25SDag-Erling Smørgrav }
175117d15b25SDag-Erling Smørgrav 
17527b5038d7SDag-Erling Smørgrav static ldns_rdf *
ldns_b32_ext2dname(const ldns_rdf * rdf)17537b5038d7SDag-Erling Smørgrav ldns_b32_ext2dname(const ldns_rdf *rdf)
17547b5038d7SDag-Erling Smørgrav {
17557b5038d7SDag-Erling Smørgrav 	size_t size;
17567b5038d7SDag-Erling Smørgrav 	char *b32;
17577b5038d7SDag-Erling Smørgrav 	ldns_rdf *out;
17587b5038d7SDag-Erling Smørgrav 	if(ldns_rdf_size(rdf) == 0)
17597b5038d7SDag-Erling Smørgrav 		return NULL;
17607b5038d7SDag-Erling Smørgrav         /* remove -1 for the b32-hash-len octet */
17617b5038d7SDag-Erling Smørgrav 	size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
17627b5038d7SDag-Erling Smørgrav         /* add one for the end nul for the string */
17637b5038d7SDag-Erling Smørgrav 	b32 = LDNS_XMALLOC(char, size + 2);
17647b5038d7SDag-Erling Smørgrav 	if (b32) {
17657b5038d7SDag-Erling Smørgrav 		if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
17667b5038d7SDag-Erling Smørgrav 				ldns_rdf_size(rdf) - 1, b32, size+1) > 0) {
17677b5038d7SDag-Erling Smørgrav 			b32[size] = '.';
17687b5038d7SDag-Erling Smørgrav 			b32[size+1] = '\0';
17697b5038d7SDag-Erling Smørgrav 			if (ldns_str2rdf_dname(&out, b32) == LDNS_STATUS_OK) {
17707b5038d7SDag-Erling Smørgrav 				LDNS_FREE(b32);
17717b5038d7SDag-Erling Smørgrav 				return out;
17727b5038d7SDag-Erling Smørgrav 			}
17737b5038d7SDag-Erling Smørgrav 		}
17747b5038d7SDag-Erling Smørgrav 		LDNS_FREE(b32);
17757b5038d7SDag-Erling Smørgrav 	}
17767b5038d7SDag-Erling Smørgrav 	return NULL;
17777b5038d7SDag-Erling Smørgrav }
17787b5038d7SDag-Erling Smørgrav 
177917d15b25SDag-Erling Smørgrav static ldns_status
ldns_rr2buffer_str_rfc3597(ldns_buffer * output,const ldns_rr * rr)178017d15b25SDag-Erling Smørgrav ldns_rr2buffer_str_rfc3597(ldns_buffer *output, const ldns_rr *rr)
178117d15b25SDag-Erling Smørgrav {
178217d15b25SDag-Erling Smørgrav 	size_t total_rdfsize = 0;
178317d15b25SDag-Erling Smørgrav 	size_t i, j;
178417d15b25SDag-Erling Smørgrav 
178517d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "TYPE%u\t", ldns_rr_get_type(rr));
178617d15b25SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
178717d15b25SDag-Erling Smørgrav 		total_rdfsize += ldns_rdf_size(ldns_rr_rdf(rr, i));
178817d15b25SDag-Erling Smørgrav 	}
178917d15b25SDag-Erling Smørgrav 	if (total_rdfsize == 0) {
179017d15b25SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\\# 0\n");
179117d15b25SDag-Erling Smørgrav 		return ldns_buffer_status(output);
179217d15b25SDag-Erling Smørgrav 	}
179317d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\\# %d ", total_rdfsize);
179417d15b25SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
179517d15b25SDag-Erling Smørgrav 		for (j = 0; j < ldns_rdf_size(ldns_rr_rdf(rr, i)); j++) {
179617d15b25SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%.2x",
179717d15b25SDag-Erling Smørgrav 					ldns_rdf_data(ldns_rr_rdf(rr, i))[j]);
179817d15b25SDag-Erling Smørgrav 		}
179917d15b25SDag-Erling Smørgrav 	}
180017d15b25SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\n");
180117d15b25SDag-Erling Smørgrav 	return ldns_buffer_status(output);
180217d15b25SDag-Erling Smørgrav }
180317d15b25SDag-Erling Smørgrav 
18047b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr2buffer_str_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rr * rr)18057b5038d7SDag-Erling Smørgrav ldns_rr2buffer_str_fmt(ldns_buffer *output,
18067b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_rr *rr)
18077b5038d7SDag-Erling Smørgrav {
18087b5038d7SDag-Erling Smørgrav 	uint16_t i, flags;
18097b5038d7SDag-Erling Smørgrav 	ldns_status status = LDNS_STATUS_OK;
181017d15b25SDag-Erling Smørgrav 	ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt;
18117b5038d7SDag-Erling Smørgrav 
181217d15b25SDag-Erling Smørgrav 	if (fmt_st == NULL) {
181317d15b25SDag-Erling Smørgrav 		fmt_st = (ldns_output_format_storage*)
181417d15b25SDag-Erling Smørgrav 			  ldns_output_format_default;
18157b5038d7SDag-Erling Smørgrav 	}
1816*5afab0e5SDag-Erling Smørgrav 	if (!(fmt_st->flags & LDNS_FMT_SHORT)) {
18177b5038d7SDag-Erling Smørgrav 		if (!rr) {
181817d15b25SDag-Erling Smørgrav 			if (LDNS_COMMENT_NULLS & fmt_st->flags) {
18197b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "; (null)\n");
18207b5038d7SDag-Erling Smørgrav 			}
18217b5038d7SDag-Erling Smørgrav 			return ldns_buffer_status(output);
18227b5038d7SDag-Erling Smørgrav 		}
18237b5038d7SDag-Erling Smørgrav 		if (ldns_rr_owner(rr)) {
18247b5038d7SDag-Erling Smørgrav 			status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr));
18257b5038d7SDag-Erling Smørgrav 		}
18267b5038d7SDag-Erling Smørgrav 		if (status != LDNS_STATUS_OK) {
18277b5038d7SDag-Erling Smørgrav 			return status;
18287b5038d7SDag-Erling Smørgrav 		}
18297b5038d7SDag-Erling Smørgrav 
18307b5038d7SDag-Erling Smørgrav 		/* TTL should NOT be printed if it is a question */
18317b5038d7SDag-Erling Smørgrav 		if (!ldns_rr_is_question(rr)) {
1832*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "\t%u", (unsigned)ldns_rr_ttl(rr));
18337b5038d7SDag-Erling Smørgrav 		}
18347b5038d7SDag-Erling Smørgrav 
18357b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\t");
18367b5038d7SDag-Erling Smørgrav 		status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr));
18377b5038d7SDag-Erling Smørgrav 		if (status != LDNS_STATUS_OK) {
18387b5038d7SDag-Erling Smørgrav 			return status;
18397b5038d7SDag-Erling Smørgrav 		}
18407b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\t");
18417b5038d7SDag-Erling Smørgrav 
184217d15b25SDag-Erling Smørgrav 		if (ldns_output_format_covers_type(fmt, ldns_rr_get_type(rr))) {
184317d15b25SDag-Erling Smørgrav 			return ldns_rr2buffer_str_rfc3597(output, rr);
184417d15b25SDag-Erling Smørgrav 		}
18457b5038d7SDag-Erling Smørgrav 		status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr));
18467b5038d7SDag-Erling Smørgrav 		if (status != LDNS_STATUS_OK) {
18477b5038d7SDag-Erling Smørgrav 			return status;
18487b5038d7SDag-Erling Smørgrav 		}
18497b5038d7SDag-Erling Smørgrav 
18507b5038d7SDag-Erling Smørgrav 		if (ldns_rr_rd_count(rr) > 0) {
18517b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "\t");
18527b5038d7SDag-Erling Smørgrav 		} else if (!ldns_rr_is_question(rr)) {
18537b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "\t\\# 0");
18547b5038d7SDag-Erling Smørgrav 		}
1855*5afab0e5SDag-Erling Smørgrav 	} else if (ldns_rr_rd_count(rr) == 0) {
1856*5afab0e5SDag-Erling Smørgrav 		/* assert(fmt_st->flags & LDNS_FMT_SHORT); */
18577b5038d7SDag-Erling Smørgrav 
1858*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "# 0");
1859*5afab0e5SDag-Erling Smørgrav 	}
18607b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
18617b5038d7SDag-Erling Smørgrav 		/* ldns_rdf2buffer_str handles NULL input fine! */
186217d15b25SDag-Erling Smørgrav 		if ((fmt_st->flags & LDNS_FMT_ZEROIZE_RRSIGS) &&
18632787e39aSDag-Erling Smørgrav 				(ldns_rr_get_type(rr) == LDNS_RR_TYPE_RRSIG) &&
18642787e39aSDag-Erling Smørgrav 				((/* inception  */ i == 4 &&
18652787e39aSDag-Erling Smørgrav 				  ldns_rdf_get_type(ldns_rr_rdf(rr, 4)) ==
18662787e39aSDag-Erling Smørgrav 							LDNS_RDF_TYPE_TIME) ||
18672787e39aSDag-Erling Smørgrav 				  (/* expiration */ i == 5 &&
18682787e39aSDag-Erling Smørgrav 				   ldns_rdf_get_type(ldns_rr_rdf(rr, 5)) ==
18692787e39aSDag-Erling Smørgrav 				   			LDNS_RDF_TYPE_TIME) ||
18702787e39aSDag-Erling Smørgrav 				  (/* signature  */ i == 8 &&
18712787e39aSDag-Erling Smørgrav 				   ldns_rdf_get_type(ldns_rr_rdf(rr, 8)) ==
18722787e39aSDag-Erling Smørgrav 				   			LDNS_RDF_TYPE_B64))) {
18732787e39aSDag-Erling Smørgrav 
18742787e39aSDag-Erling Smørgrav 			ldns_buffer_printf(output, "(null)");
18752787e39aSDag-Erling Smørgrav 			status = ldns_buffer_status(output);
187617d15b25SDag-Erling Smørgrav 		} else if ((fmt_st->flags & LDNS_FMT_PAD_SOA_SERIAL) &&
18772787e39aSDag-Erling Smørgrav 				(ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) &&
18782787e39aSDag-Erling Smørgrav 				/* serial */ i == 2 &&
18792787e39aSDag-Erling Smørgrav 			 	ldns_rdf_get_type(ldns_rr_rdf(rr, 2)) ==
18802787e39aSDag-Erling Smørgrav 			 				LDNS_RDF_TYPE_INT32) {
18812787e39aSDag-Erling Smørgrav 			ldns_buffer_printf(output, "%10lu",
18822787e39aSDag-Erling Smørgrav 				(unsigned long) ldns_read_uint32(
18832787e39aSDag-Erling Smørgrav 					ldns_rdf_data(ldns_rr_rdf(rr, 2))));
18842787e39aSDag-Erling Smørgrav 			status = ldns_buffer_status(output);
18852787e39aSDag-Erling Smørgrav 		} else {
188617d15b25SDag-Erling Smørgrav 			status = ldns_rdf2buffer_str_fmt(output,
188717d15b25SDag-Erling Smørgrav 					fmt, ldns_rr_rdf(rr, i));
18882787e39aSDag-Erling Smørgrav 		}
18897b5038d7SDag-Erling Smørgrav 		if(status != LDNS_STATUS_OK)
18907b5038d7SDag-Erling Smørgrav 			return status;
18917b5038d7SDag-Erling Smørgrav 		if (i < ldns_rr_rd_count(rr) - 1) {
18927b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ");
18937b5038d7SDag-Erling Smørgrav 		}
18947b5038d7SDag-Erling Smørgrav 	}
18957b5038d7SDag-Erling Smørgrav 	/* per RR special comments - handy for DNSSEC types */
18967b5038d7SDag-Erling Smørgrav 	/* check to prevent question sec. rr from
18977b5038d7SDag-Erling Smørgrav 	 * getting here */
18987b5038d7SDag-Erling Smørgrav 	if (ldns_rr_rd_count(rr) > 0) {
18997b5038d7SDag-Erling Smørgrav 		switch (ldns_rr_get_type(rr)) {
19007b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_DNSKEY:
19017b5038d7SDag-Erling Smørgrav 			/* if ldns_rr_rd_count(rr) > 0
19027b5038d7SDag-Erling Smørgrav 				then ldns_rr_rdf(rr, 0) exists! */
190317d15b25SDag-Erling Smørgrav 			if (! (fmt_st->flags & LDNS_COMMENT_KEY)) {
19047b5038d7SDag-Erling Smørgrav 				break;
19057b5038d7SDag-Erling Smørgrav 			}
190617d15b25SDag-Erling Smørgrav 			flags = ldns_rdf2native_int16(ldns_rr_rdf(rr, 0));
19077b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ;{");
190817d15b25SDag-Erling Smørgrav 			if (fmt_st->flags & LDNS_COMMENT_KEY_ID) {
19097b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "id = %u",
191017d15b25SDag-Erling Smørgrav 					(unsigned int) ldns_calc_keytag(rr));
19117b5038d7SDag-Erling Smørgrav 			}
191217d15b25SDag-Erling Smørgrav 			if ((fmt_st->flags & LDNS_COMMENT_KEY_TYPE) &&
191317d15b25SDag-Erling Smørgrav 					(flags & LDNS_KEY_ZONE_KEY)){
191417d15b25SDag-Erling Smørgrav 
19157b5038d7SDag-Erling Smørgrav 				if (flags & LDNS_KEY_SEP_KEY) {
191617d15b25SDag-Erling Smørgrav 					ldns_buffer_printf(output, " (ksk)");
191717d15b25SDag-Erling Smørgrav 				} else {
191817d15b25SDag-Erling Smørgrav 					ldns_buffer_printf(output, " (zsk)");
19197b5038d7SDag-Erling Smørgrav 				}
192017d15b25SDag-Erling Smørgrav 				if (fmt_st->flags & LDNS_COMMENT_KEY_SIZE){
192117d15b25SDag-Erling Smørgrav 					ldns_buffer_printf(output, ", ");
19227b5038d7SDag-Erling Smørgrav 				}
192317d15b25SDag-Erling Smørgrav 			} else if (fmt_st->flags
19247b5038d7SDag-Erling Smørgrav 					& (LDNS_COMMENT_KEY_ID
19257b5038d7SDag-Erling Smørgrav 						|LDNS_COMMENT_KEY_SIZE)) {
19267b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf( output, ", ");
19277b5038d7SDag-Erling Smørgrav 			}
192817d15b25SDag-Erling Smørgrav 			if (fmt_st->flags & LDNS_COMMENT_KEY_SIZE) {
19297b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "size = %db",
19307b5038d7SDag-Erling Smørgrav 					ldns_rr_dnskey_key_size(rr));
19317b5038d7SDag-Erling Smørgrav 			}
19327b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "}");
19337b5038d7SDag-Erling Smørgrav 			break;
19347b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_RRSIG:
193517d15b25SDag-Erling Smørgrav 			if ((fmt_st->flags & LDNS_COMMENT_KEY)
193617d15b25SDag-Erling Smørgrav 					&& (fmt_st->flags& LDNS_COMMENT_RRSIGS)
19377b5038d7SDag-Erling Smørgrav 					&& ldns_rr_rdf(rr, 6) != NULL) {
193817d15b25SDag-Erling Smørgrav 				ldns_buffer_printf(output, " ;{id = %d}",
193917d15b25SDag-Erling Smørgrav 						ldns_rdf2native_int16(
19407b5038d7SDag-Erling Smørgrav 							ldns_rr_rdf(rr, 6)));
19417b5038d7SDag-Erling Smørgrav 			}
19427b5038d7SDag-Erling Smørgrav 			break;
19437b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_DS:
194417d15b25SDag-Erling Smørgrav 			if ((fmt_st->flags & LDNS_COMMENT_BUBBLEBABBLE) &&
194517d15b25SDag-Erling Smørgrav 					ldns_rr_rdf(rr, 3) != NULL) {
194617d15b25SDag-Erling Smørgrav 
19477b5038d7SDag-Erling Smørgrav 				uint8_t *data = ldns_rdf_data(
19487b5038d7SDag-Erling Smørgrav 						ldns_rr_rdf(rr, 3));
194917d15b25SDag-Erling Smørgrav 				size_t len = ldns_rdf_size(ldns_rr_rdf(rr, 3));
195017d15b25SDag-Erling Smørgrav 				char *babble = ldns_bubblebabble(data, len);
19517b5038d7SDag-Erling Smørgrav 				if(babble) {
195217d15b25SDag-Erling Smørgrav 					ldns_buffer_printf(output,
195317d15b25SDag-Erling Smørgrav 							" ;{%s}", babble);
19547b5038d7SDag-Erling Smørgrav 				}
19557b5038d7SDag-Erling Smørgrav 				LDNS_FREE(babble);
19567b5038d7SDag-Erling Smørgrav 			}
19577b5038d7SDag-Erling Smørgrav 			break;
19587b5038d7SDag-Erling Smørgrav 		case LDNS_RR_TYPE_NSEC3:
195917d15b25SDag-Erling Smørgrav 			if (! (fmt_st->flags & LDNS_COMMENT_FLAGS) &&
196017d15b25SDag-Erling Smørgrav 				! (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN)) {
19617b5038d7SDag-Erling Smørgrav 				break;
19627b5038d7SDag-Erling Smørgrav 			}
19637b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ;{");
196417d15b25SDag-Erling Smørgrav 			if ((fmt_st->flags & LDNS_COMMENT_FLAGS)) {
19657b5038d7SDag-Erling Smørgrav 				if (ldns_nsec3_optout(rr)) {
19667b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
19677b5038d7SDag-Erling Smørgrav 						" flags: optout");
19687b5038d7SDag-Erling Smørgrav 				} else {
196917d15b25SDag-Erling Smørgrav 					ldns_buffer_printf(output," flags: -");
19707b5038d7SDag-Erling Smørgrav 				}
197117d15b25SDag-Erling Smørgrav 				if (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN &&
197217d15b25SDag-Erling Smørgrav 						fmt_st->hashmap != NULL) {
19737b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, ", ");
19747b5038d7SDag-Erling Smørgrav 				}
19757b5038d7SDag-Erling Smørgrav 			}
197617d15b25SDag-Erling Smørgrav 			if (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN &&
197717d15b25SDag-Erling Smørgrav 					fmt_st->hashmap != NULL) {
19787b5038d7SDag-Erling Smørgrav 				ldns_rbnode_t *node;
19797b5038d7SDag-Erling Smørgrav 				ldns_rdf *key = ldns_dname_label(
19807b5038d7SDag-Erling Smørgrav 						ldns_rr_owner(rr), 0);
19817b5038d7SDag-Erling Smørgrav 				if (key) {
19827b5038d7SDag-Erling Smørgrav 					node = ldns_rbtree_search(
198317d15b25SDag-Erling Smørgrav 						fmt_st->hashmap,
19847b5038d7SDag-Erling Smørgrav 						(void *) key);
19857b5038d7SDag-Erling Smørgrav 					if (node->data) {
198617d15b25SDag-Erling Smørgrav 						ldns_buffer_printf(output,
19877b5038d7SDag-Erling Smørgrav 							"from: ");
198817d15b25SDag-Erling Smørgrav 						(void) ldns_rdf2buffer_str(
19897b5038d7SDag-Erling Smørgrav 							output,
199017d15b25SDag-Erling Smørgrav 							ldns_dnssec_name_name(
199117d15b25SDag-Erling Smørgrav 							   (ldns_dnssec_name*)
199217d15b25SDag-Erling Smørgrav 							   node->data
199317d15b25SDag-Erling Smørgrav 							));
19947b5038d7SDag-Erling Smørgrav 					}
1995*5afab0e5SDag-Erling Smørgrav 					ldns_rdf_deep_free(key);
19967b5038d7SDag-Erling Smørgrav 				}
19977b5038d7SDag-Erling Smørgrav 				key = ldns_b32_ext2dname(
19987b5038d7SDag-Erling Smørgrav 						ldns_nsec3_next_owner(rr));
19997b5038d7SDag-Erling Smørgrav 				if (key) {
20007b5038d7SDag-Erling Smørgrav 					node = ldns_rbtree_search(
200117d15b25SDag-Erling Smørgrav 						fmt_st->hashmap,
20027b5038d7SDag-Erling Smørgrav 						(void *) key);
20037b5038d7SDag-Erling Smørgrav 					if (node->data) {
200417d15b25SDag-Erling Smørgrav 						ldns_buffer_printf(output,
20057b5038d7SDag-Erling Smørgrav 							" to: ");
200617d15b25SDag-Erling Smørgrav 						(void) ldns_rdf2buffer_str(
20077b5038d7SDag-Erling Smørgrav 							output,
200817d15b25SDag-Erling Smørgrav 							ldns_dnssec_name_name(
200917d15b25SDag-Erling Smørgrav 							   (ldns_dnssec_name*)
201017d15b25SDag-Erling Smørgrav 							   node->data
201117d15b25SDag-Erling Smørgrav 							));
20127b5038d7SDag-Erling Smørgrav 					}
2013*5afab0e5SDag-Erling Smørgrav 					ldns_rdf_deep_free(key);
20147b5038d7SDag-Erling Smørgrav 				}
20157b5038d7SDag-Erling Smørgrav 			}
20167b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "}");
20177b5038d7SDag-Erling Smørgrav 			break;
20187b5038d7SDag-Erling Smørgrav 		default:
20197b5038d7SDag-Erling Smørgrav 			break;
20207b5038d7SDag-Erling Smørgrav 
20217b5038d7SDag-Erling Smørgrav 		}
20227b5038d7SDag-Erling Smørgrav 	}
20237b5038d7SDag-Erling Smørgrav 	/* last */
20247b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\n");
20257b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
20267b5038d7SDag-Erling Smørgrav }
20277b5038d7SDag-Erling Smørgrav 
20287b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr2buffer_str(ldns_buffer * output,const ldns_rr * rr)20297b5038d7SDag-Erling Smørgrav ldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr)
20307b5038d7SDag-Erling Smørgrav {
20317b5038d7SDag-Erling Smørgrav 	return ldns_rr2buffer_str_fmt(output, ldns_output_format_default, rr);
20327b5038d7SDag-Erling Smørgrav }
20337b5038d7SDag-Erling Smørgrav 
20347b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_list2buffer_str_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rr_list * list)20357b5038d7SDag-Erling Smørgrav ldns_rr_list2buffer_str_fmt(ldns_buffer *output,
20367b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_rr_list *list)
20377b5038d7SDag-Erling Smørgrav {
20387b5038d7SDag-Erling Smørgrav 	uint16_t i;
20397b5038d7SDag-Erling Smørgrav 
20407b5038d7SDag-Erling Smørgrav 	for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
20417b5038d7SDag-Erling Smørgrav 		(void) ldns_rr2buffer_str_fmt(output, fmt,
20427b5038d7SDag-Erling Smørgrav 				ldns_rr_list_rr(list, i));
20437b5038d7SDag-Erling Smørgrav 	}
20447b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
20457b5038d7SDag-Erling Smørgrav }
20467b5038d7SDag-Erling Smørgrav 
20477b5038d7SDag-Erling Smørgrav ldns_status
ldns_rr_list2buffer_str(ldns_buffer * output,const ldns_rr_list * list)20487b5038d7SDag-Erling Smørgrav ldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list)
20497b5038d7SDag-Erling Smørgrav {
20507b5038d7SDag-Erling Smørgrav 	return ldns_rr_list2buffer_str_fmt(
20517b5038d7SDag-Erling Smørgrav 			output, ldns_output_format_default, list);
20527b5038d7SDag-Erling Smørgrav }
20537b5038d7SDag-Erling Smørgrav 
20547b5038d7SDag-Erling Smørgrav ldns_status
ldns_pktheader2buffer_str(ldns_buffer * output,const ldns_pkt * pkt)20557b5038d7SDag-Erling Smørgrav ldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
20567b5038d7SDag-Erling Smørgrav {
20577b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes,
20587b5038d7SDag-Erling Smørgrav 			                    (int) ldns_pkt_get_opcode(pkt));
20597b5038d7SDag-Erling Smørgrav 	ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes,
20607b5038d7SDag-Erling Smørgrav 			                    (int) ldns_pkt_get_rcode(pkt));
20617b5038d7SDag-Erling Smørgrav 
20627b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, ";; ->>HEADER<<- ");
20637b5038d7SDag-Erling Smørgrav 	if (opcode) {
20647b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "opcode: %s, ", opcode->name);
20657b5038d7SDag-Erling Smørgrav 	} else {
20667b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "opcode: ?? (%u), ",
20677b5038d7SDag-Erling Smørgrav 				ldns_pkt_get_opcode(pkt));
20687b5038d7SDag-Erling Smørgrav 	}
20697b5038d7SDag-Erling Smørgrav 	if (rcode) {
20707b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "rcode: %s, ", rcode->name);
20717b5038d7SDag-Erling Smørgrav 	} else {
20727b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt));
20737b5038d7SDag-Erling Smørgrav 	}
20747b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt));
20757b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, ";; flags: ");
20767b5038d7SDag-Erling Smørgrav 
20777b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_qr(pkt)) {
20787b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "qr ");
20797b5038d7SDag-Erling Smørgrav 	}
20807b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_aa(pkt)) {
20817b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "aa ");
20827b5038d7SDag-Erling Smørgrav 	}
20837b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_tc(pkt)) {
20847b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "tc ");
20857b5038d7SDag-Erling Smørgrav 	}
20867b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_rd(pkt)) {
20877b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "rd ");
20887b5038d7SDag-Erling Smørgrav 	}
20897b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_cd(pkt)) {
20907b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "cd ");
20917b5038d7SDag-Erling Smørgrav 	}
20927b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_ra(pkt)) {
20937b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "ra ");
20947b5038d7SDag-Erling Smørgrav 	}
20957b5038d7SDag-Erling Smørgrav 	if (ldns_pkt_ad(pkt)) {
20967b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "ad ");
20977b5038d7SDag-Erling Smørgrav 	}
20987b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; ");
20997b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt));
21007b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt));
21017b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt));
21027b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt));
21037b5038d7SDag-Erling Smørgrav 	return ldns_buffer_status(output);
21047b5038d7SDag-Erling Smørgrav }
21057b5038d7SDag-Erling Smørgrav 
2106*5afab0e5SDag-Erling Smørgrav 
2107*5afab0e5SDag-Erling Smørgrav /* print EDNS option data in the Dig format: 76 61 6c 69 ... */
2108*5afab0e5SDag-Erling Smørgrav static void
ldns_edns_hex_data2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2109*5afab0e5SDag-Erling Smørgrav ldns_edns_hex_data2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2110*5afab0e5SDag-Erling Smørgrav {
2111*5afab0e5SDag-Erling Smørgrav 	size_t j;
2112*5afab0e5SDag-Erling Smørgrav 	for (j = 0; j < len; j++) {
2113*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " %02x", data[j]);
2114*5afab0e5SDag-Erling Smørgrav 	}
2115*5afab0e5SDag-Erling Smørgrav }
2116*5afab0e5SDag-Erling Smørgrav 
2117*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_llq2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2118*5afab0e5SDag-Erling Smørgrav ldns_edns_llq2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2119*5afab0e5SDag-Erling Smørgrav {
2120*5afab0e5SDag-Erling Smørgrav 	/* LLQ constants */
2121*5afab0e5SDag-Erling Smørgrav 	const char* llq_errors[] = {"NO-ERROR", "SERV-FULL", "STATIC",
2122*5afab0e5SDag-Erling Smørgrav 		"FORMAT-ERR", "NO-SUCH-LLQ", "BAD-VERS", "UNKNOWN_ERR"};
2123*5afab0e5SDag-Erling Smørgrav 	const unsigned int llq_errors_num = 7;
2124*5afab0e5SDag-Erling Smørgrav 	const char* llq_opcodes[] = {"LLQ-SETUP", "LLQ-REFRESH", "LLQ-EVENT"};
2125*5afab0e5SDag-Erling Smørgrav 	const unsigned int llq_opcodes_num = 3;
2126*5afab0e5SDag-Erling Smørgrav 
2127*5afab0e5SDag-Erling Smørgrav 	uint16_t version, llq_opcode, error_code;
2128*5afab0e5SDag-Erling Smørgrav 	uint64_t llq_id;
2129*5afab0e5SDag-Erling Smørgrav 	uint32_t lease_life; /* Requested or granted life of LLQ, in seconds */
2130*5afab0e5SDag-Erling Smørgrav 
2131*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; Long-Lived Query:");
2132*5afab0e5SDag-Erling Smørgrav 
2133*5afab0e5SDag-Erling Smørgrav 	/* read the record */
2134*5afab0e5SDag-Erling Smørgrav 	if(len != 18) {
2135*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " malformed LLQ ");
2136*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2137*5afab0e5SDag-Erling Smørgrav 
2138*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2139*5afab0e5SDag-Erling Smørgrav 	}
2140*5afab0e5SDag-Erling Smørgrav 	version = ldns_read_uint16(data);
2141*5afab0e5SDag-Erling Smørgrav 	llq_opcode = ldns_read_uint16(data+2);
2142*5afab0e5SDag-Erling Smørgrav 	error_code = ldns_read_uint16(data+4);
2143*5afab0e5SDag-Erling Smørgrav 	memmove(&llq_id, data+6, sizeof(uint64_t));
2144*5afab0e5SDag-Erling Smørgrav 	lease_life = ldns_read_uint32(data+14);
2145*5afab0e5SDag-Erling Smørgrav 
2146*5afab0e5SDag-Erling Smørgrav 	/* print option field entires */
2147*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "v%d ", (int)version);
2148*5afab0e5SDag-Erling Smørgrav 
2149*5afab0e5SDag-Erling Smørgrav 	if(llq_opcode < llq_opcodes_num) {
2150*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "%s", llq_opcodes[llq_opcode]);
2151*5afab0e5SDag-Erling Smørgrav 	} else {
2152*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "opcode %d", (int)llq_opcode);
2153*5afab0e5SDag-Erling Smørgrav 	}
2154*5afab0e5SDag-Erling Smørgrav 
2155*5afab0e5SDag-Erling Smørgrav 	if(error_code < llq_errors_num)
2156*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " %s", llq_errors[error_code]);
2157*5afab0e5SDag-Erling Smørgrav 	else {
2158*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " error %d", (int)error_code);
2159*5afab0e5SDag-Erling Smørgrav 	}
2160*5afab0e5SDag-Erling Smørgrav 
2161*5afab0e5SDag-Erling Smørgrav #ifndef USE_WINSOCK
2162*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, " id %llx lease-life %lu",
2163*5afab0e5SDag-Erling Smørgrav 		(unsigned long long)llq_id, (unsigned long)lease_life);
2164*5afab0e5SDag-Erling Smørgrav #else
2165*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, " id %I64x lease-life %lu",
2166*5afab0e5SDag-Erling Smørgrav 		(unsigned long long)llq_id, (unsigned long)lease_life);
2167*5afab0e5SDag-Erling Smørgrav #endif
2168*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2169*5afab0e5SDag-Erling Smørgrav }
2170*5afab0e5SDag-Erling Smørgrav 
2171*5afab0e5SDag-Erling Smørgrav 
2172*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_ul2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2173*5afab0e5SDag-Erling Smørgrav ldns_edns_ul2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2174*5afab0e5SDag-Erling Smørgrav {
2175*5afab0e5SDag-Erling Smørgrav 	uint32_t lease;
2176*5afab0e5SDag-Erling Smørgrav 
2177*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; Update Lease:");
2178*5afab0e5SDag-Erling Smørgrav 
2179*5afab0e5SDag-Erling Smørgrav 	if(len != 4) {
2180*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " malformed UL ");
2181*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2182*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2183*5afab0e5SDag-Erling Smørgrav 	}
2184*5afab0e5SDag-Erling Smørgrav 	lease = ldns_read_uint32(data);
2185*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "lease %lu", (unsigned long)lease);
2186*5afab0e5SDag-Erling Smørgrav 
2187*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2188*5afab0e5SDag-Erling Smørgrav }
2189*5afab0e5SDag-Erling Smørgrav 
2190*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_nsid2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2191*5afab0e5SDag-Erling Smørgrav ldns_edns_nsid2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2192*5afab0e5SDag-Erling Smørgrav {
2193*5afab0e5SDag-Erling Smørgrav 	size_t i, printed=0;
2194*5afab0e5SDag-Erling Smørgrav 
2195*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; NSID:");
2196*5afab0e5SDag-Erling Smørgrav 	ldns_edns_hex_data2buffer_str(output, data, len);
2197*5afab0e5SDag-Erling Smørgrav 
2198*5afab0e5SDag-Erling Smørgrav 	/* print the human-readable text string */
2199*5afab0e5SDag-Erling Smørgrav 	for(i = 0; i < len; i++) {
2200*5afab0e5SDag-Erling Smørgrav 		if(isprint((unsigned char)data[i]) || data[i] == '\t') {
2201*5afab0e5SDag-Erling Smørgrav 			if(!printed) {
2202*5afab0e5SDag-Erling Smørgrav 				ldns_buffer_printf(output, " (");
2203*5afab0e5SDag-Erling Smørgrav 				printed = 1;
2204*5afab0e5SDag-Erling Smørgrav 			}
2205*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%c", (char)data[i]);
2206*5afab0e5SDag-Erling Smørgrav 		}
2207*5afab0e5SDag-Erling Smørgrav 	}
2208*5afab0e5SDag-Erling Smørgrav 	if(printed)
2209*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, ")");
2210*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2211*5afab0e5SDag-Erling Smørgrav }
2212*5afab0e5SDag-Erling Smørgrav 
2213*5afab0e5SDag-Erling Smørgrav 
2214*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_dau2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2215*5afab0e5SDag-Erling Smørgrav ldns_edns_dau2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2216*5afab0e5SDag-Erling Smørgrav {
2217*5afab0e5SDag-Erling Smørgrav 	size_t i;
2218*5afab0e5SDag-Erling Smørgrav 	ldns_lookup_table *lt;
2219*5afab0e5SDag-Erling Smørgrav 
2220*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; DNSSEC Algorithm Understood (DAU):");
2221*5afab0e5SDag-Erling Smørgrav 
2222*5afab0e5SDag-Erling Smørgrav 	for(i = 0; i <len; i++) {
2223*5afab0e5SDag-Erling Smørgrav 		lt = ldns_lookup_by_id(ldns_algorithms, data[i]);
2224*5afab0e5SDag-Erling Smørgrav 		if (lt && lt->name) {
2225*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " %s", lt->name);
2226*5afab0e5SDag-Erling Smørgrav 		} else {
2227*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ALG%u", data[i]);
2228*5afab0e5SDag-Erling Smørgrav 		}
2229*5afab0e5SDag-Erling Smørgrav 	}
2230*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2231*5afab0e5SDag-Erling Smørgrav }
2232*5afab0e5SDag-Erling Smørgrav 
2233*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_dhu2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2234*5afab0e5SDag-Erling Smørgrav ldns_edns_dhu2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2235*5afab0e5SDag-Erling Smørgrav {
2236*5afab0e5SDag-Erling Smørgrav 	size_t i;
2237*5afab0e5SDag-Erling Smørgrav 	ldns_lookup_table *lt;
2238*5afab0e5SDag-Erling Smørgrav 
2239*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; DS Hash Understood (DHU):");
2240*5afab0e5SDag-Erling Smørgrav 
2241*5afab0e5SDag-Erling Smørgrav 	for(i = 0; i < len; i++) {
2242*5afab0e5SDag-Erling Smørgrav 		lt = ldns_lookup_by_id(ldns_hashes, data[i]);
2243*5afab0e5SDag-Erling Smørgrav 		if (lt && lt->name) {
2244*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " %s", lt->name);
2245*5afab0e5SDag-Erling Smørgrav 		} else {
2246*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ALG%u", data[i]);
2247*5afab0e5SDag-Erling Smørgrav 		}
2248*5afab0e5SDag-Erling Smørgrav 	}
2249*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2250*5afab0e5SDag-Erling Smørgrav }
2251*5afab0e5SDag-Erling Smørgrav 
2252*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_d3u2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2253*5afab0e5SDag-Erling Smørgrav ldns_edns_d3u2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2254*5afab0e5SDag-Erling Smørgrav {
2255*5afab0e5SDag-Erling Smørgrav 	size_t i;
2256*5afab0e5SDag-Erling Smørgrav 
2257*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; NSEC3 Hash Understood (N3U):");
2258*5afab0e5SDag-Erling Smørgrav 
2259*5afab0e5SDag-Erling Smørgrav 	for(i=0; i<len; i++) {
2260*5afab0e5SDag-Erling Smørgrav 		if(data[i] == 1) {
2261*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " SHA1");
2262*5afab0e5SDag-Erling Smørgrav 		} else {
2263*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " %d", (int)data[i]);
2264*5afab0e5SDag-Erling Smørgrav 		}
2265*5afab0e5SDag-Erling Smørgrav 	}
2266*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2267*5afab0e5SDag-Erling Smørgrav }
2268*5afab0e5SDag-Erling Smørgrav 
2269*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_subnet2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2270*5afab0e5SDag-Erling Smørgrav ldns_edns_subnet2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2271*5afab0e5SDag-Erling Smørgrav {
2272*5afab0e5SDag-Erling Smørgrav 	uint16_t family;
2273*5afab0e5SDag-Erling Smørgrav 	uint8_t source, scope;
2274*5afab0e5SDag-Erling Smørgrav 	if(len < 4) {
2275*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed subnet ");
2276*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2277*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2278*5afab0e5SDag-Erling Smørgrav 	}
2279*5afab0e5SDag-Erling Smørgrav 	family = ldns_read_uint16(data);
2280*5afab0e5SDag-Erling Smørgrav 	source = data[2];
2281*5afab0e5SDag-Erling Smørgrav 	scope = data[3];
2282*5afab0e5SDag-Erling Smørgrav 	if(family == 1) {
2283*5afab0e5SDag-Erling Smørgrav 		/* IPv4 */
2284*5afab0e5SDag-Erling Smørgrav 		char buf[64];
2285*5afab0e5SDag-Erling Smørgrav 		uint8_t ip4[4];
2286*5afab0e5SDag-Erling Smørgrav 		memset(ip4, 0, sizeof(ip4));
2287*5afab0e5SDag-Erling Smørgrav 		if(len-4 > 4) {
2288*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "trailingdata:");
2289*5afab0e5SDag-Erling Smørgrav 			ldns_edns_hex_data2buffer_str(output, data+4+4, len-4-4);
2290*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ");
2291*5afab0e5SDag-Erling Smørgrav 			len = 4+4;
2292*5afab0e5SDag-Erling Smørgrav 		}
2293*5afab0e5SDag-Erling Smørgrav 		memmove(ip4, data+4, len-4);
2294*5afab0e5SDag-Erling Smørgrav 		if(!inet_ntop(AF_INET, ip4, buf, (socklen_t) sizeof(buf))) {
2295*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "ip4ntoperror ");
2296*5afab0e5SDag-Erling Smørgrav 			ldns_edns_hex_data2buffer_str(output, data+4+4, len-4-4);
2297*5afab0e5SDag-Erling Smørgrav 		} else {
2298*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%s", buf);
2299*5afab0e5SDag-Erling Smørgrav 		}
2300*5afab0e5SDag-Erling Smørgrav 	} else if(family == 2) {
2301*5afab0e5SDag-Erling Smørgrav 		/* IPv6 */
2302*5afab0e5SDag-Erling Smørgrav 		char buf[64];
2303*5afab0e5SDag-Erling Smørgrav 		uint8_t ip6[16];
2304*5afab0e5SDag-Erling Smørgrav 		memset(ip6, 0, sizeof(ip6));
2305*5afab0e5SDag-Erling Smørgrav 		if(len-4 > 16) {
2306*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "trailingdata:");
2307*5afab0e5SDag-Erling Smørgrav 			ldns_edns_hex_data2buffer_str(output, data+4+16, len-4-16);
2308*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ");
2309*5afab0e5SDag-Erling Smørgrav 			len = 4+16;
2310*5afab0e5SDag-Erling Smørgrav 		}
2311*5afab0e5SDag-Erling Smørgrav 		memmove(ip6, data+4, len-4);
2312*5afab0e5SDag-Erling Smørgrav #ifdef AF_INET6
2313*5afab0e5SDag-Erling Smørgrav 		if(!inet_ntop(AF_INET6, ip6, buf, (socklen_t) sizeof(buf))) {
2314*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "ip6ntoperror ");
2315*5afab0e5SDag-Erling Smørgrav 			ldns_edns_hex_data2buffer_str(output, data+4+4, len-4-4);
2316*5afab0e5SDag-Erling Smørgrav 		} else {
2317*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "%s", buf);
2318*5afab0e5SDag-Erling Smørgrav 		}
2319*5afab0e5SDag-Erling Smørgrav #else
2320*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output,  data+4+4, len-4-4);
2321*5afab0e5SDag-Erling Smørgrav #endif
2322*5afab0e5SDag-Erling Smørgrav 	} else {
2323*5afab0e5SDag-Erling Smørgrav 		/* unknown */
2324*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "family %d ", (int)family);
2325*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2326*5afab0e5SDag-Erling Smørgrav 	}
2327*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "/%d scope /%d", (int)source, (int)scope);
2328*5afab0e5SDag-Erling Smørgrav 
2329*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2330*5afab0e5SDag-Erling Smørgrav }
2331*5afab0e5SDag-Erling Smørgrav 
2332*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_expire2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2333*5afab0e5SDag-Erling Smørgrav ldns_edns_expire2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2334*5afab0e5SDag-Erling Smørgrav {
2335*5afab0e5SDag-Erling Smørgrav 
2336*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; EXPIRE:");
2337*5afab0e5SDag-Erling Smørgrav 
2338*5afab0e5SDag-Erling Smørgrav 	if (!(len == 0) || len == 4) {
2339*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed expire ");
2340*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2341*5afab0e5SDag-Erling Smørgrav 
2342*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2343*5afab0e5SDag-Erling Smørgrav 	}
2344*5afab0e5SDag-Erling Smørgrav 
2345*5afab0e5SDag-Erling Smørgrav 	// TODO can this output be more accurate?
2346*5afab0e5SDag-Erling Smørgrav 	ldns_edns_hex_data2buffer_str(output, data, len);
2347*5afab0e5SDag-Erling Smørgrav 
2348*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2349*5afab0e5SDag-Erling Smørgrav }
2350*5afab0e5SDag-Erling Smørgrav 
2351*5afab0e5SDag-Erling Smørgrav 
2352*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_cookie2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2353*5afab0e5SDag-Erling Smørgrav ldns_edns_cookie2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2354*5afab0e5SDag-Erling Smørgrav {
2355*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; COOKIE:");
2356*5afab0e5SDag-Erling Smørgrav 
2357*5afab0e5SDag-Erling Smørgrav 	/* the size of an EDNS cookie is restricted by RFC 7873 */
2358*5afab0e5SDag-Erling Smørgrav 	if (!(len == 8 || (len >= 16 && len < 40))) {
2359*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed cookie ");
2360*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2361*5afab0e5SDag-Erling Smørgrav 	}
2362*5afab0e5SDag-Erling Smørgrav 	ldns_edns_hex_data2buffer_str(output, data, len);
2363*5afab0e5SDag-Erling Smørgrav 
2364*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2365*5afab0e5SDag-Erling Smørgrav }
2366*5afab0e5SDag-Erling Smørgrav 
2367*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_keepalive2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2368*5afab0e5SDag-Erling Smørgrav ldns_edns_keepalive2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2369*5afab0e5SDag-Erling Smørgrav {
2370*5afab0e5SDag-Erling Smørgrav 	uint16_t timeout;
2371*5afab0e5SDag-Erling Smørgrav 
2372*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; KEEPALIVE:");
2373*5afab0e5SDag-Erling Smørgrav 
2374*5afab0e5SDag-Erling Smørgrav 	if(!(len == 0 || len == 2)) {
2375*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed keepalive ");
2376*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2377*5afab0e5SDag-Erling Smørgrav 
2378*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2379*5afab0e5SDag-Erling Smørgrav 	}
2380*5afab0e5SDag-Erling Smørgrav 
2381*5afab0e5SDag-Erling Smørgrav 	if(len == 0) {
2382*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "no timeout value (only valid for client option)");
2383*5afab0e5SDag-Erling Smørgrav 	} else {
2384*5afab0e5SDag-Erling Smørgrav 		timeout = ldns_read_uint16(data);
2385*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "timeout value in units of 100ms %u", (int)timeout);
2386*5afab0e5SDag-Erling Smørgrav 	}
2387*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2388*5afab0e5SDag-Erling Smørgrav }
2389*5afab0e5SDag-Erling Smørgrav 
2390*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_padding2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2391*5afab0e5SDag-Erling Smørgrav ldns_edns_padding2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2392*5afab0e5SDag-Erling Smørgrav {
2393*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; PADDING: ");
2394*5afab0e5SDag-Erling Smørgrav 	ldns_edns_hex_data2buffer_str(output, data, len);
2395*5afab0e5SDag-Erling Smørgrav 
2396*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2397*5afab0e5SDag-Erling Smørgrav }
2398*5afab0e5SDag-Erling Smørgrav 
2399*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_chain2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2400*5afab0e5SDag-Erling Smørgrav ldns_edns_chain2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2401*5afab0e5SDag-Erling Smørgrav {
2402*5afab0e5SDag-Erling Smørgrav 	ldns_rdf** temp = NULL;
2403*5afab0e5SDag-Erling Smørgrav 
2404*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; CHAIN: ");
2405*5afab0e5SDag-Erling Smørgrav 
2406*5afab0e5SDag-Erling Smørgrav 	if (ldns_str2rdf_dname(temp, (char*) data) != LDNS_STATUS_OK) {
2407*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed chain ");
2408*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2409*5afab0e5SDag-Erling Smørgrav 
2410*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2411*5afab0e5SDag-Erling Smørgrav 	}
2412*5afab0e5SDag-Erling Smørgrav 
2413*5afab0e5SDag-Erling Smørgrav 	ldns_characters2buffer_str(output, len, data);
2414*5afab0e5SDag-Erling Smørgrav 
2415*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2416*5afab0e5SDag-Erling Smørgrav }
2417*5afab0e5SDag-Erling Smørgrav 
2418*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_key_tag2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2419*5afab0e5SDag-Erling Smørgrav ldns_edns_key_tag2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2420*5afab0e5SDag-Erling Smørgrav {
2421*5afab0e5SDag-Erling Smørgrav 	size_t i;
2422*5afab0e5SDag-Erling Smørgrav 
2423*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; KEY TAG: ");
2424*5afab0e5SDag-Erling Smørgrav 
2425*5afab0e5SDag-Erling Smørgrav 	if(len < 2 || len % 2 != 0) {
2426*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed key tag ");
2427*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2428*5afab0e5SDag-Erling Smørgrav 
2429*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2430*5afab0e5SDag-Erling Smørgrav 	}
2431*5afab0e5SDag-Erling Smørgrav 
2432*5afab0e5SDag-Erling Smørgrav 	for (i = 0; i < len; i += 2) {
2433*5afab0e5SDag-Erling Smørgrav 		uint16_t tag = ldns_read_uint16(data);
2434*5afab0e5SDag-Erling Smørgrav 
2435*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " %hu", tag);
2436*5afab0e5SDag-Erling Smørgrav 	}
2437*5afab0e5SDag-Erling Smørgrav 
2438*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2439*5afab0e5SDag-Erling Smørgrav }
2440*5afab0e5SDag-Erling Smørgrav 
2441*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_ede2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2442*5afab0e5SDag-Erling Smørgrav ldns_edns_ede2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2443*5afab0e5SDag-Erling Smørgrav {
2444*5afab0e5SDag-Erling Smørgrav 	size_t i;
2445*5afab0e5SDag-Erling Smørgrav 	uint16_t ede;
2446*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; EDE:");
2447*5afab0e5SDag-Erling Smørgrav 
2448*5afab0e5SDag-Erling Smørgrav 	if(len < 2) {
2449*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed ede ");
2450*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2451*5afab0e5SDag-Erling Smørgrav 
2452*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2453*5afab0e5SDag-Erling Smørgrav 	}
2454*5afab0e5SDag-Erling Smørgrav 
2455*5afab0e5SDag-Erling Smørgrav 	ede = ldns_read_uint16(data);
2456*5afab0e5SDag-Erling Smørgrav 
2457*5afab0e5SDag-Erling Smørgrav 	switch (ede) {
2458*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_OTHER:
2459*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 0 (Other): ");
2460*5afab0e5SDag-Erling Smørgrav 		break;
2461*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_UNSUPPORTED_DNSKEY_ALG:
2462*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 1 (Unsupported DNSKEY Algorithm)");
2463*5afab0e5SDag-Erling Smørgrav 		break;
2464*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_UNSUPPORTED_DS_DIGEST:
2465*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 2 (Unsupported DS Digest type)");
2466*5afab0e5SDag-Erling Smørgrav 		break;
2467*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_STALE_ANSWER:
2468*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 3 (Stale Answer)");
2469*5afab0e5SDag-Erling Smørgrav 		break;
2470*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_FORGED_ANSWER:
2471*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 4 (Forged Answer)");
2472*5afab0e5SDag-Erling Smørgrav 		break;
2473*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_DNSSEC_INDETERMINATE:
2474*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 5 (DNSSEC Indeterminate)");
2475*5afab0e5SDag-Erling Smørgrav 		break;
2476*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_DNSSEC_BOGUS:
2477*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 6 (DNSSEC Bogus)");
2478*5afab0e5SDag-Erling Smørgrav 		break;
2479*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_SIGNATURE_EXPIRED:
2480*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 7 (Signature Expired)");
2481*5afab0e5SDag-Erling Smørgrav 		break;
2482*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_SIGNATURE_NOT_YET_VALID:
2483*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 8 (Signature Not Yet Valid)");
2484*5afab0e5SDag-Erling Smørgrav 		break;
2485*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_DNSKEY_MISSING:
2486*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 9 (DNSKEY Missing)");
2487*5afab0e5SDag-Erling Smørgrav 		break;
2488*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_RRSIGS_MISSING:
2489*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 10 (RRSIGs Missing)");
2490*5afab0e5SDag-Erling Smørgrav 		break;
2491*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NO_ZONE_KEY_BIT_SET:
2492*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 11 (No Zone Key Bit Set)");
2493*5afab0e5SDag-Erling Smørgrav 		break;
2494*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NSEC_MISSING:
2495*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 12 (NSEC Missing)");
2496*5afab0e5SDag-Erling Smørgrav 		break;
2497*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_CACHED_ERROR:
2498*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 13 (Cached Error)");
2499*5afab0e5SDag-Erling Smørgrav 		break;
2500*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NOT_READY:
2501*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 14 (Not Ready)");
2502*5afab0e5SDag-Erling Smørgrav 		break;
2503*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_BLOCKED:
2504*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 15 (Blocked)");
2505*5afab0e5SDag-Erling Smørgrav 		break;
2506*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_CENSORED:
2507*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 16 (Censored)");
2508*5afab0e5SDag-Erling Smørgrav 		break;
2509*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_FILTERED:
2510*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 17 (Filtered)");
2511*5afab0e5SDag-Erling Smørgrav 		break;
2512*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_PROHIBITED:
2513*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 18 (Prohibited)");
2514*5afab0e5SDag-Erling Smørgrav 		break;
2515*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_STALE_NXDOMAIN_ANSWER:
2516*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 19 (NXDOMAIN Answer)");
2517*5afab0e5SDag-Erling Smørgrav 		break;
2518*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NOT_AUTHORITATIVE:
2519*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 20 (Not Authoritative)");
2520*5afab0e5SDag-Erling Smørgrav 		break;
2521*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NOT_SUPPORTED:
2522*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 21 (Not Supported)");
2523*5afab0e5SDag-Erling Smørgrav 		break;
2524*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NO_REACHABLE_AUTHORITY:
2525*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 22 (No Reachable Authority)");
2526*5afab0e5SDag-Erling Smørgrav 		break;
2527*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_NETWORK_ERROR:
2528*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 23 (Network Error)");
2529*5afab0e5SDag-Erling Smørgrav 		break;
2530*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_INVALID_DATA:
2531*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 24 (Invalid Data)");
2532*5afab0e5SDag-Erling Smørgrav 		break;
2533*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_SIGNATURE_EXPIRED_BEFORE_VALID:
2534*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 25 (Signature Expired Before Valid)");
2535*5afab0e5SDag-Erling Smørgrav 		break;
2536*5afab0e5SDag-Erling Smørgrav 	case LDNS_EDE_TOO_EARLY:
2537*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " 26 (Too Early)");
2538*5afab0e5SDag-Erling Smørgrav 		break;
2539*5afab0e5SDag-Erling Smørgrav 	default:
2540*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " %02x", data[0]);
2541*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " %02x", data[1]);
2542*5afab0e5SDag-Erling Smørgrav 		break;
2543*5afab0e5SDag-Erling Smørgrav 	}
2544*5afab0e5SDag-Erling Smørgrav 
2545*5afab0e5SDag-Erling Smørgrav 	/* skip the EDE code in the output */
2546*5afab0e5SDag-Erling Smørgrav 	data += 2;
2547*5afab0e5SDag-Erling Smørgrav 	len -= 2;
2548*5afab0e5SDag-Erling Smørgrav 
2549*5afab0e5SDag-Erling Smørgrav 	if (len > 2) {
2550*5afab0e5SDag-Erling Smørgrav 		/* format the hex bytes */
2551*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, ":");
2552*5afab0e5SDag-Erling Smørgrav 		for (i = 0; i < len; i++) {
2553*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, " %02x", data[i]);
2554*5afab0e5SDag-Erling Smørgrav 		}
2555*5afab0e5SDag-Erling Smørgrav 
2556*5afab0e5SDag-Erling Smørgrav 		/* format the human-readable string */
2557*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, " (");
2558*5afab0e5SDag-Erling Smørgrav 		ldns_characters2buffer_str(output, len, data);
2559*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, ")");
2560*5afab0e5SDag-Erling Smørgrav 	}
2561*5afab0e5SDag-Erling Smørgrav 
2562*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2563*5afab0e5SDag-Erling Smørgrav }
2564*5afab0e5SDag-Erling Smørgrav 
2565*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_client_tag2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2566*5afab0e5SDag-Erling Smørgrav ldns_edns_client_tag2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2567*5afab0e5SDag-Erling Smørgrav {
2568*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; CLIENT-TAG:");
2569*5afab0e5SDag-Erling Smørgrav 
2570*5afab0e5SDag-Erling Smørgrav 	if (len > 2) {
2571*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed client-tag ");
2572*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2573*5afab0e5SDag-Erling Smørgrav 
2574*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2575*5afab0e5SDag-Erling Smørgrav 	}
2576*5afab0e5SDag-Erling Smørgrav 
2577*5afab0e5SDag-Erling Smørgrav 	ldns_edns_hex_data2buffer_str(output, data, len);
2578*5afab0e5SDag-Erling Smørgrav 
2579*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2580*5afab0e5SDag-Erling Smørgrav }
2581*5afab0e5SDag-Erling Smørgrav 
2582*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_edns_server_tag2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2583*5afab0e5SDag-Erling Smørgrav ldns_edns_server_tag2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2584*5afab0e5SDag-Erling Smørgrav {
2585*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "; SERVER-TAG:");
2586*5afab0e5SDag-Erling Smørgrav 
2587*5afab0e5SDag-Erling Smørgrav 	if (len > 2) {
2588*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "malformed server-tag ");
2589*5afab0e5SDag-Erling Smørgrav 		ldns_edns_hex_data2buffer_str(output, data, len);
2590*5afab0e5SDag-Erling Smørgrav 
2591*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2592*5afab0e5SDag-Erling Smørgrav 	}
2593*5afab0e5SDag-Erling Smørgrav 
2594*5afab0e5SDag-Erling Smørgrav 	ldns_edns_hex_data2buffer_str(output, data, len);
2595*5afab0e5SDag-Erling Smørgrav 
2596*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2597*5afab0e5SDag-Erling Smørgrav }
2598*5afab0e5SDag-Erling Smørgrav 
2599*5afab0e5SDag-Erling Smørgrav ldns_status
ldns_edns_option_list2buffer_str(ldns_buffer * output,ldns_edns_option_list * edns_list)2600*5afab0e5SDag-Erling Smørgrav ldns_edns_option_list2buffer_str(ldns_buffer *output, ldns_edns_option_list* edns_list)
2601*5afab0e5SDag-Erling Smørgrav {
2602*5afab0e5SDag-Erling Smørgrav 	size_t count = ldns_edns_option_list_get_count(edns_list);
2603*5afab0e5SDag-Erling Smørgrav 	size_t i, size;
2604*5afab0e5SDag-Erling Smørgrav 	uint8_t* data;
2605*5afab0e5SDag-Erling Smørgrav 
2606*5afab0e5SDag-Erling Smørgrav 	for (i = 0; i < count; i++) {
2607*5afab0e5SDag-Erling Smørgrav 		ldns_edns_option_code code;
2608*5afab0e5SDag-Erling Smørgrav 		ldns_edns_option* edns = ldns_edns_option_list_get_option(edns_list, i);
2609*5afab0e5SDag-Erling Smørgrav 
2610*5afab0e5SDag-Erling Smørgrav 		if (!edns) {
2611*5afab0e5SDag-Erling Smørgrav 			break;
2612*5afab0e5SDag-Erling Smørgrav 		}
2613*5afab0e5SDag-Erling Smørgrav 
2614*5afab0e5SDag-Erling Smørgrav 		code = ldns_edns_get_code(edns);
2615*5afab0e5SDag-Erling Smørgrav 		size = ldns_edns_get_size(edns);
2616*5afab0e5SDag-Erling Smørgrav 		data = ldns_edns_get_data(edns);
2617*5afab0e5SDag-Erling Smørgrav 
2618*5afab0e5SDag-Erling Smørgrav 		switch(code) {
2619*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_LLQ:
2620*5afab0e5SDag-Erling Smørgrav 			ldns_edns_llq2buffer_str(output, data, size);
2621*5afab0e5SDag-Erling Smørgrav 			break;
2622*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_UL:
2623*5afab0e5SDag-Erling Smørgrav 			ldns_edns_ul2buffer_str(output, data, size);
2624*5afab0e5SDag-Erling Smørgrav 			break;
2625*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_NSID:
2626*5afab0e5SDag-Erling Smørgrav 			ldns_edns_nsid2buffer_str(output, data, size);
2627*5afab0e5SDag-Erling Smørgrav 			break;
2628*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_DAU:
2629*5afab0e5SDag-Erling Smørgrav 			ldns_edns_dau2buffer_str(output, data, size);
2630*5afab0e5SDag-Erling Smørgrav 			break;
2631*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_DHU:
2632*5afab0e5SDag-Erling Smørgrav 			ldns_edns_dhu2buffer_str(output, data, size);
2633*5afab0e5SDag-Erling Smørgrav 			break;
2634*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_N3U:
2635*5afab0e5SDag-Erling Smørgrav 			ldns_edns_d3u2buffer_str(output, data, size);
2636*5afab0e5SDag-Erling Smørgrav 			break;
2637*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_CLIENT_SUBNET:
2638*5afab0e5SDag-Erling Smørgrav 			ldns_edns_subnet2buffer_str(output, data, size);
2639*5afab0e5SDag-Erling Smørgrav 			break;
2640*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_EXPIRE:
2641*5afab0e5SDag-Erling Smørgrav 			ldns_edns_expire2buffer_str(output, data, size);
2642*5afab0e5SDag-Erling Smørgrav 			break;
2643*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_COOKIE:
2644*5afab0e5SDag-Erling Smørgrav 			ldns_edns_cookie2buffer_str(output, data, size);
2645*5afab0e5SDag-Erling Smørgrav 			break;
2646*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_KEEPALIVE:
2647*5afab0e5SDag-Erling Smørgrav 			ldns_edns_keepalive2buffer_str(output, data, size);
2648*5afab0e5SDag-Erling Smørgrav 			break;
2649*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_PADDING:
2650*5afab0e5SDag-Erling Smørgrav 			ldns_edns_padding2buffer_str(output, data, size);
2651*5afab0e5SDag-Erling Smørgrav 			break;
2652*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_CHAIN:
2653*5afab0e5SDag-Erling Smørgrav 			ldns_edns_chain2buffer_str(output, data, size);
2654*5afab0e5SDag-Erling Smørgrav 			break;
2655*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_KEY_TAG:
2656*5afab0e5SDag-Erling Smørgrav 			ldns_edns_key_tag2buffer_str(output, data, size);
2657*5afab0e5SDag-Erling Smørgrav 			break;
2658*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_EDE:
2659*5afab0e5SDag-Erling Smørgrav 			ldns_edns_ede2buffer_str(output, data, size);
2660*5afab0e5SDag-Erling Smørgrav 			break;
2661*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_CLIENT_TAG:
2662*5afab0e5SDag-Erling Smørgrav 			ldns_edns_client_tag2buffer_str(output, data, size);
2663*5afab0e5SDag-Erling Smørgrav 			break;
2664*5afab0e5SDag-Erling Smørgrav 		case LDNS_EDNS_SERVER_TAG:
2665*5afab0e5SDag-Erling Smørgrav 			ldns_edns_server_tag2buffer_str(output, data, size);
2666*5afab0e5SDag-Erling Smørgrav 			break;
2667*5afab0e5SDag-Erling Smørgrav 		default:
2668*5afab0e5SDag-Erling Smørgrav 			ldns_buffer_printf(output, "; OPT=%d:", code);
2669*5afab0e5SDag-Erling Smørgrav 			ldns_edns_hex_data2buffer_str(output, data, size);
2670*5afab0e5SDag-Erling Smørgrav 			break;
2671*5afab0e5SDag-Erling Smørgrav 		}
2672*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
2673*5afab0e5SDag-Erling Smørgrav 	}
2674*5afab0e5SDag-Erling Smørgrav 
2675*5afab0e5SDag-Erling Smørgrav 	return ldns_buffer_status(output);
2676*5afab0e5SDag-Erling Smørgrav }
2677*5afab0e5SDag-Erling Smørgrav 
2678*5afab0e5SDag-Erling Smørgrav 
26797b5038d7SDag-Erling Smørgrav ldns_status
ldns_pkt2buffer_str_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_pkt * pkt)26807b5038d7SDag-Erling Smørgrav ldns_pkt2buffer_str_fmt(ldns_buffer *output,
26817b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_pkt *pkt)
26827b5038d7SDag-Erling Smørgrav {
26837b5038d7SDag-Erling Smørgrav 	uint16_t i;
26847b5038d7SDag-Erling Smørgrav 	ldns_status status = LDNS_STATUS_OK;
26857b5038d7SDag-Erling Smørgrav 	char *tmp;
26867b5038d7SDag-Erling Smørgrav 	struct timeval time;
26877b5038d7SDag-Erling Smørgrav 	time_t time_tt;
2688*5afab0e5SDag-Erling Smørgrav 	int short_fmt = fmt && (fmt->flags & LDNS_FMT_SHORT);
26897b5038d7SDag-Erling Smørgrav 
26907b5038d7SDag-Erling Smørgrav 	if (!pkt) {
26917b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "null");
26927b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_OK;
26937b5038d7SDag-Erling Smørgrav 	}
26947b5038d7SDag-Erling Smørgrav 
2695*5afab0e5SDag-Erling Smørgrav 	if (!ldns_buffer_status_ok(output)) {
2696*5afab0e5SDag-Erling Smørgrav 		return ldns_buffer_status(output);
2697*5afab0e5SDag-Erling Smørgrav 	}
2698*5afab0e5SDag-Erling Smørgrav 
2699*5afab0e5SDag-Erling Smørgrav 	if (!short_fmt) {
27007b5038d7SDag-Erling Smørgrav 		status = ldns_pktheader2buffer_str(output, pkt);
27017b5038d7SDag-Erling Smørgrav 		if (status != LDNS_STATUS_OK) {
27027b5038d7SDag-Erling Smørgrav 			return status;
27037b5038d7SDag-Erling Smørgrav 		}
27047b5038d7SDag-Erling Smørgrav 
27057b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
27067b5038d7SDag-Erling Smørgrav 
27077b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; ");
27087b5038d7SDag-Erling Smørgrav 
27097b5038d7SDag-Erling Smørgrav 
27107b5038d7SDag-Erling Smørgrav 		for (i = 0; i < ldns_pkt_qdcount(pkt); i++) {
27117b5038d7SDag-Erling Smørgrav 			status = ldns_rr2buffer_str_fmt(output, fmt,
27127b5038d7SDag-Erling Smørgrav 				       ldns_rr_list_rr(
27137b5038d7SDag-Erling Smørgrav 					       ldns_pkt_question(pkt), i));
27147b5038d7SDag-Erling Smørgrav 			if (status != LDNS_STATUS_OK) {
27157b5038d7SDag-Erling Smørgrav 				return status;
27167b5038d7SDag-Erling Smørgrav 			}
27177b5038d7SDag-Erling Smørgrav 		}
27187b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
27197b5038d7SDag-Erling Smørgrav 
27207b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; ANSWER SECTION:\n");
2721*5afab0e5SDag-Erling Smørgrav 	}
27227b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_pkt_ancount(pkt); i++) {
27237b5038d7SDag-Erling Smørgrav 		status = ldns_rr2buffer_str_fmt(output, fmt,
27247b5038d7SDag-Erling Smørgrav 			       ldns_rr_list_rr(
27257b5038d7SDag-Erling Smørgrav 				       ldns_pkt_answer(pkt), i));
27267b5038d7SDag-Erling Smørgrav 		if (status != LDNS_STATUS_OK) {
27277b5038d7SDag-Erling Smørgrav 			return status;
27287b5038d7SDag-Erling Smørgrav 		}
27297b5038d7SDag-Erling Smørgrav 	}
2730*5afab0e5SDag-Erling Smørgrav 	if (!short_fmt) {
27317b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
27327b5038d7SDag-Erling Smørgrav 
27337b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n");
27347b5038d7SDag-Erling Smørgrav 
27357b5038d7SDag-Erling Smørgrav 		for (i = 0; i < ldns_pkt_nscount(pkt); i++) {
27367b5038d7SDag-Erling Smørgrav 			status = ldns_rr2buffer_str_fmt(output, fmt,
27377b5038d7SDag-Erling Smørgrav 				       ldns_rr_list_rr(
27387b5038d7SDag-Erling Smørgrav 					       ldns_pkt_authority(pkt), i));
27397b5038d7SDag-Erling Smørgrav 			if (status != LDNS_STATUS_OK) {
27407b5038d7SDag-Erling Smørgrav 				return status;
27417b5038d7SDag-Erling Smørgrav 			}
27427b5038d7SDag-Erling Smørgrav 		}
27437b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
27447b5038d7SDag-Erling Smørgrav 
27457b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n");
27467b5038d7SDag-Erling Smørgrav 		for (i = 0; i < ldns_pkt_arcount(pkt); i++) {
27477b5038d7SDag-Erling Smørgrav 			status = ldns_rr2buffer_str_fmt(output, fmt,
27487b5038d7SDag-Erling Smørgrav 				       ldns_rr_list_rr(
27497b5038d7SDag-Erling Smørgrav 					       ldns_pkt_additional(pkt), i));
27507b5038d7SDag-Erling Smørgrav 			if (status != LDNS_STATUS_OK) {
27517b5038d7SDag-Erling Smørgrav 				return status;
27527b5038d7SDag-Erling Smørgrav 			}
27537b5038d7SDag-Erling Smørgrav 
27547b5038d7SDag-Erling Smørgrav 		}
27557b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
2756*5afab0e5SDag-Erling Smørgrav 		/* add some further fields */
27577b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; Query time: %d msec\n",
27587b5038d7SDag-Erling Smørgrav 				ldns_pkt_querytime(pkt));
27597b5038d7SDag-Erling Smørgrav 		if (ldns_pkt_edns(pkt)) {
27607b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output,
27617b5038d7SDag-Erling Smørgrav 				   ";; EDNS: version %u; flags:",
27627b5038d7SDag-Erling Smørgrav 				   ldns_pkt_edns_version(pkt));
27637b5038d7SDag-Erling Smørgrav 			if (ldns_pkt_edns_do(pkt)) {
27647b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, " do");
27657b5038d7SDag-Erling Smørgrav 			}
27667b5038d7SDag-Erling Smørgrav 			/* the extended rcode is the value set, shifted four bits,
27677b5038d7SDag-Erling Smørgrav 			 * and or'd with the original rcode */
27687b5038d7SDag-Erling Smørgrav 			if (ldns_pkt_edns_extended_rcode(pkt)) {
27697b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, " ; ext-rcode: %d",
27707b5038d7SDag-Erling Smørgrav 					(ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt)));
27717b5038d7SDag-Erling Smørgrav 			}
27727b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, " ; udp: %u\n",
27737b5038d7SDag-Erling Smørgrav 					   ldns_pkt_edns_udp_size(pkt));
27747b5038d7SDag-Erling Smørgrav 
2775*5afab0e5SDag-Erling Smørgrav 			if (pkt->_edns_list)
2776*5afab0e5SDag-Erling Smørgrav 				ldns_edns_option_list2buffer_str(output, pkt->_edns_list);
2777*5afab0e5SDag-Erling Smørgrav 
2778*5afab0e5SDag-Erling Smørgrav 			else if (ldns_pkt_edns_data(pkt)) {
2779*5afab0e5SDag-Erling Smørgrav 				ldns_edns_option_list* edns_list;
2780*5afab0e5SDag-Erling Smørgrav 				/* parse the EDNS data into separate EDNS options
2781*5afab0e5SDag-Erling Smørgrav 				 * and add them to the list */
2782*5afab0e5SDag-Erling Smørgrav 				if ((edns_list = pkt_edns_data2edns_option_list(ldns_pkt_edns_data(pkt)))) {
2783*5afab0e5SDag-Erling Smørgrav 					ldns_edns_option_list2buffer_str(output, edns_list);
2784*5afab0e5SDag-Erling Smørgrav 					ldns_edns_option_list_deep_free(edns_list);
2785*5afab0e5SDag-Erling Smørgrav 				} else {
27867b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output, ";; Data: ");
2787*5afab0e5SDag-Erling Smørgrav 					(void)ldns_rdf2buffer_str(output, ldns_pkt_edns_data(pkt));
2788*5afab0e5SDag-Erling Smørgrav 				}
27897b5038d7SDag-Erling Smørgrav 			}
27907b5038d7SDag-Erling Smørgrav 		}
27917b5038d7SDag-Erling Smørgrav 		if (ldns_pkt_tsig(pkt)) {
27927b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, ";; TSIG:\n;; ");
27937b5038d7SDag-Erling Smørgrav 			(void) ldns_rr2buffer_str_fmt(
27947b5038d7SDag-Erling Smørgrav 					output, fmt, ldns_pkt_tsig(pkt));
27957b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, "\n");
27967b5038d7SDag-Erling Smørgrav 		}
27977b5038d7SDag-Erling Smørgrav 		if (ldns_pkt_answerfrom(pkt)) {
27987b5038d7SDag-Erling Smørgrav 			tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt));
27997b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(output, ";; SERVER: %s\n", tmp);
28007b5038d7SDag-Erling Smørgrav 			LDNS_FREE(tmp);
28017b5038d7SDag-Erling Smørgrav 		}
28027b5038d7SDag-Erling Smørgrav 		time = ldns_pkt_timestamp(pkt);
28037b5038d7SDag-Erling Smørgrav 		time_tt = (time_t)time.tv_sec;
28047b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; WHEN: %s",
28057b5038d7SDag-Erling Smørgrav 				(char*)ctime(&time_tt));
28067b5038d7SDag-Erling Smørgrav 
28077b5038d7SDag-Erling Smørgrav 		ldns_buffer_printf(output, ";; MSG SIZE  rcvd: %d\n",
28087b5038d7SDag-Erling Smørgrav 				(int)ldns_pkt_size(pkt));
28097b5038d7SDag-Erling Smørgrav 	}
28107b5038d7SDag-Erling Smørgrav 	return status;
28117b5038d7SDag-Erling Smørgrav }
28127b5038d7SDag-Erling Smørgrav 
28137b5038d7SDag-Erling Smørgrav ldns_status
ldns_pkt2buffer_str(ldns_buffer * output,const ldns_pkt * pkt)28147b5038d7SDag-Erling Smørgrav ldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
28157b5038d7SDag-Erling Smørgrav {
28167b5038d7SDag-Erling Smørgrav 	return ldns_pkt2buffer_str_fmt(output, ldns_output_format_default, pkt);
28177b5038d7SDag-Erling Smørgrav }
28187b5038d7SDag-Erling Smørgrav 
28197b5038d7SDag-Erling Smørgrav 
28207b5038d7SDag-Erling Smørgrav #ifdef HAVE_SSL
28217b5038d7SDag-Erling Smørgrav static ldns_status
ldns_hmac_key2buffer_str(ldns_buffer * output,const ldns_key * k)28227b5038d7SDag-Erling Smørgrav ldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k)
28237b5038d7SDag-Erling Smørgrav {
28247b5038d7SDag-Erling Smørgrav 	ldns_status status;
28257b5038d7SDag-Erling Smørgrav 	size_t i;
28267b5038d7SDag-Erling Smørgrav 	ldns_rdf *b64_bignum;
28277b5038d7SDag-Erling Smørgrav 
28287b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "Key: ");
28297b5038d7SDag-Erling Smørgrav 
28307b5038d7SDag-Erling Smørgrav  	i = ldns_key_hmac_size(k);
28317b5038d7SDag-Erling Smørgrav 	b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k));
28327b5038d7SDag-Erling Smørgrav 	status = ldns_rdf2buffer_str(output, b64_bignum);
28337b5038d7SDag-Erling Smørgrav 	ldns_rdf_deep_free(b64_bignum);
28347b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\n");
28357b5038d7SDag-Erling Smørgrav 	return status;
28367b5038d7SDag-Erling Smørgrav }
28377b5038d7SDag-Erling Smørgrav #endif
28387b5038d7SDag-Erling Smørgrav 
28397b5038d7SDag-Erling Smørgrav #if defined(HAVE_SSL) && defined(USE_GOST)
28407b5038d7SDag-Erling Smørgrav static ldns_status
ldns_gost_key2buffer_str(ldns_buffer * output,EVP_PKEY * p)28417b5038d7SDag-Erling Smørgrav ldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
28427b5038d7SDag-Erling Smørgrav {
28437b5038d7SDag-Erling Smørgrav 	unsigned char* pp = NULL;
28447b5038d7SDag-Erling Smørgrav 	int ret;
28457b5038d7SDag-Erling Smørgrav 	ldns_rdf *b64_bignum;
28467b5038d7SDag-Erling Smørgrav 	ldns_status status;
28477b5038d7SDag-Erling Smørgrav 
28487b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "GostAsn1: ");
28497b5038d7SDag-Erling Smørgrav 
28507b5038d7SDag-Erling Smørgrav 	ret = i2d_PrivateKey(p, &pp);
28517b5038d7SDag-Erling Smørgrav 	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp);
28527b5038d7SDag-Erling Smørgrav 	status = ldns_rdf2buffer_str(output, b64_bignum);
28537b5038d7SDag-Erling Smørgrav 
28547b5038d7SDag-Erling Smørgrav 	ldns_rdf_deep_free(b64_bignum);
28557b5038d7SDag-Erling Smørgrav 	OPENSSL_free(pp);
28567b5038d7SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\n");
28577b5038d7SDag-Erling Smørgrav 	return status;
28587b5038d7SDag-Erling Smørgrav }
28597b5038d7SDag-Erling Smørgrav #endif
28607b5038d7SDag-Erling Smørgrav 
2861*5afab0e5SDag-Erling Smørgrav #if defined(HAVE_SSL) && defined(USE_ED25519)
2862*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_ed25519_key2buffer_str(ldns_buffer * output,EVP_PKEY * p)2863*5afab0e5SDag-Erling Smørgrav ldns_ed25519_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
2864*5afab0e5SDag-Erling Smørgrav {
2865*5afab0e5SDag-Erling Smørgrav 	unsigned char* pp = NULL;
2866*5afab0e5SDag-Erling Smørgrav 	int ret;
2867*5afab0e5SDag-Erling Smørgrav 	ldns_rdf *b64_bignum;
2868*5afab0e5SDag-Erling Smørgrav 	ldns_status status;
2869*5afab0e5SDag-Erling Smørgrav 
2870*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "PrivateKey: ");
2871*5afab0e5SDag-Erling Smørgrav 
2872*5afab0e5SDag-Erling Smørgrav 	ret = i2d_PrivateKey(p, &pp);
2873*5afab0e5SDag-Erling Smørgrav 	/* 16 byte asn (302e020100300506032b657004220420) + 32byte key */
2874*5afab0e5SDag-Erling Smørgrav 	if(ret != 16 + 32) {
2875*5afab0e5SDag-Erling Smørgrav 		OPENSSL_free(pp);
2876*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_ERR;
2877*5afab0e5SDag-Erling Smørgrav 	}
2878*5afab0e5SDag-Erling Smørgrav 	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64,
2879*5afab0e5SDag-Erling Smørgrav 		(size_t)ret-16, pp+16);
2880*5afab0e5SDag-Erling Smørgrav 	status = ldns_rdf2buffer_str(output, b64_bignum);
2881*5afab0e5SDag-Erling Smørgrav 
2882*5afab0e5SDag-Erling Smørgrav 	ldns_rdf_deep_free(b64_bignum);
2883*5afab0e5SDag-Erling Smørgrav 	OPENSSL_free(pp);
2884*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\n");
2885*5afab0e5SDag-Erling Smørgrav 	return status;
2886*5afab0e5SDag-Erling Smørgrav }
2887*5afab0e5SDag-Erling Smørgrav #endif
2888*5afab0e5SDag-Erling Smørgrav 
2889*5afab0e5SDag-Erling Smørgrav #if defined(HAVE_SSL) && defined(USE_ED448)
2890*5afab0e5SDag-Erling Smørgrav static ldns_status
ldns_ed448_key2buffer_str(ldns_buffer * output,EVP_PKEY * p)2891*5afab0e5SDag-Erling Smørgrav ldns_ed448_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
2892*5afab0e5SDag-Erling Smørgrav {
2893*5afab0e5SDag-Erling Smørgrav 	unsigned char* pp = NULL;
2894*5afab0e5SDag-Erling Smørgrav 	int ret;
2895*5afab0e5SDag-Erling Smørgrav 	ldns_rdf *b64_bignum;
2896*5afab0e5SDag-Erling Smørgrav 	ldns_status status;
2897*5afab0e5SDag-Erling Smørgrav 
2898*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "PrivateKey: ");
2899*5afab0e5SDag-Erling Smørgrav 
2900*5afab0e5SDag-Erling Smørgrav 	ret = i2d_PrivateKey(p, &pp);
2901*5afab0e5SDag-Erling Smørgrav 	/* some-ASN + 57byte key */
2902*5afab0e5SDag-Erling Smørgrav 	if(ret != 16 + 57) {
2903*5afab0e5SDag-Erling Smørgrav 		OPENSSL_free(pp);
2904*5afab0e5SDag-Erling Smørgrav 		return LDNS_STATUS_ERR;
2905*5afab0e5SDag-Erling Smørgrav 	}
2906*5afab0e5SDag-Erling Smørgrav 	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64,
2907*5afab0e5SDag-Erling Smørgrav 		(size_t)ret-16, pp+16);
2908*5afab0e5SDag-Erling Smørgrav 	status = ldns_rdf2buffer_str(output, b64_bignum);
2909*5afab0e5SDag-Erling Smørgrav 
2910*5afab0e5SDag-Erling Smørgrav 	ldns_rdf_deep_free(b64_bignum);
2911*5afab0e5SDag-Erling Smørgrav 	OPENSSL_free(pp);
2912*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_printf(output, "\n");
2913*5afab0e5SDag-Erling Smørgrav 	return status;
2914*5afab0e5SDag-Erling Smørgrav }
2915*5afab0e5SDag-Erling Smørgrav #endif
2916*5afab0e5SDag-Erling Smørgrav 
2917*5afab0e5SDag-Erling Smørgrav #if defined(HAVE_SSL)
2918986ba33cSDag-Erling Smørgrav /** print one b64 encoded bignum to a line in the keybuffer */
2919986ba33cSDag-Erling Smørgrav static int
ldns_print_bignum_b64_line(ldns_buffer * output,const char * label,const BIGNUM * num)2920986ba33cSDag-Erling Smørgrav ldns_print_bignum_b64_line(ldns_buffer* output, const char* label, const BIGNUM* num)
2921986ba33cSDag-Erling Smørgrav {
2922986ba33cSDag-Erling Smørgrav 	unsigned char  *bignumbuf = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
2923986ba33cSDag-Erling Smørgrav 	if(!bignumbuf) return 0;
2924986ba33cSDag-Erling Smørgrav 
2925986ba33cSDag-Erling Smørgrav 	ldns_buffer_printf(output, "%s: ", label);
2926986ba33cSDag-Erling Smørgrav 	if(num) {
2927986ba33cSDag-Erling Smørgrav 		ldns_rdf *b64_bignum = NULL;
2928986ba33cSDag-Erling Smørgrav 		int i = BN_bn2bin(num, bignumbuf);
2929986ba33cSDag-Erling Smørgrav 		if (i > LDNS_MAX_KEYLEN) {
2930986ba33cSDag-Erling Smørgrav 			LDNS_FREE(bignumbuf);
2931986ba33cSDag-Erling Smørgrav 			return 0;
2932986ba33cSDag-Erling Smørgrav 		}
2933986ba33cSDag-Erling Smørgrav 		b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)i, bignumbuf);
2934986ba33cSDag-Erling Smørgrav 		if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
2935986ba33cSDag-Erling Smørgrav 			ldns_rdf_deep_free(b64_bignum);
2936986ba33cSDag-Erling Smørgrav 			LDNS_FREE(bignumbuf);
2937986ba33cSDag-Erling Smørgrav 			return 0;
2938986ba33cSDag-Erling Smørgrav 		}
2939986ba33cSDag-Erling Smørgrav 		ldns_rdf_deep_free(b64_bignum);
2940986ba33cSDag-Erling Smørgrav 		ldns_buffer_printf(output, "\n");
2941986ba33cSDag-Erling Smørgrav 	} else {
2942986ba33cSDag-Erling Smørgrav 		ldns_buffer_printf(output, "(Not available)\n");
2943986ba33cSDag-Erling Smørgrav 	}
2944986ba33cSDag-Erling Smørgrav 	LDNS_FREE(bignumbuf);
2945986ba33cSDag-Erling Smørgrav 	return 1;
2946986ba33cSDag-Erling Smørgrav }
2947*5afab0e5SDag-Erling Smørgrav #endif
2948986ba33cSDag-Erling Smørgrav 
29497b5038d7SDag-Erling Smørgrav ldns_status
ldns_key2buffer_str(ldns_buffer * output,const ldns_key * k)29507b5038d7SDag-Erling Smørgrav ldns_key2buffer_str(ldns_buffer *output, const ldns_key *k)
29517b5038d7SDag-Erling Smørgrav {
29527b5038d7SDag-Erling Smørgrav 	ldns_status status = LDNS_STATUS_OK;
29537b5038d7SDag-Erling Smørgrav 	unsigned char  *bignum;
29542787e39aSDag-Erling Smørgrav #ifdef HAVE_SSL
29557b5038d7SDag-Erling Smørgrav 	RSA *rsa;
2956*5afab0e5SDag-Erling Smørgrav #ifdef USE_DSA
29577b5038d7SDag-Erling Smørgrav 	DSA *dsa;
2958*5afab0e5SDag-Erling Smørgrav #endif /* USE_DSA */
29597b5038d7SDag-Erling Smørgrav #endif /* HAVE_SSL */
29607b5038d7SDag-Erling Smørgrav 
29617b5038d7SDag-Erling Smørgrav 	if (!k) {
29627b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_ERR;
29637b5038d7SDag-Erling Smørgrav 	}
29647b5038d7SDag-Erling Smørgrav 
29657b5038d7SDag-Erling Smørgrav 	bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
29667b5038d7SDag-Erling Smørgrav 	if (!bignum) {
29677b5038d7SDag-Erling Smørgrav 		return LDNS_STATUS_ERR;
29687b5038d7SDag-Erling Smørgrav 	}
29697b5038d7SDag-Erling Smørgrav 
29707b5038d7SDag-Erling Smørgrav 	if (ldns_buffer_status_ok(output)) {
29717b5038d7SDag-Erling Smørgrav #ifdef HAVE_SSL
29727b5038d7SDag-Erling Smørgrav 		switch(ldns_key_algorithm(k)) {
29737b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_RSASHA1:
29747b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_RSASHA1_NSEC3:
29757b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_RSASHA256:
29767b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_RSASHA512:
29777b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_RSAMD5:
29787b5038d7SDag-Erling Smørgrav 				/* copied by looking at dnssec-keygen output */
29797b5038d7SDag-Erling Smørgrav 				/* header */
29807b5038d7SDag-Erling Smørgrav 				rsa = ldns_key_rsa_key(k);
29817b5038d7SDag-Erling Smørgrav 
29827b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output,"Private-key-format: v1.2\n");
29837b5038d7SDag-Erling Smørgrav 				switch(ldns_key_algorithm(k)) {
29847b5038d7SDag-Erling Smørgrav 				case LDNS_SIGN_RSAMD5:
29857b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
29867b5038d7SDag-Erling Smørgrav 								    "Algorithm: %u (RSA)\n",
29877b5038d7SDag-Erling Smørgrav 								    LDNS_RSAMD5);
29887b5038d7SDag-Erling Smørgrav 					break;
29897b5038d7SDag-Erling Smørgrav 				case LDNS_SIGN_RSASHA1:
29907b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
29917b5038d7SDag-Erling Smørgrav 								    "Algorithm: %u (RSASHA1)\n",
29927b5038d7SDag-Erling Smørgrav 								    LDNS_RSASHA1);
29937b5038d7SDag-Erling Smørgrav 					break;
29947b5038d7SDag-Erling Smørgrav 				case LDNS_SIGN_RSASHA1_NSEC3:
29957b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
29967b5038d7SDag-Erling Smørgrav 								    "Algorithm: %u (RSASHA1_NSEC3)\n",
29977b5038d7SDag-Erling Smørgrav 								    LDNS_RSASHA1_NSEC3);
29987b5038d7SDag-Erling Smørgrav 					break;
29997b5038d7SDag-Erling Smørgrav #ifdef USE_SHA2
30007b5038d7SDag-Erling Smørgrav 				case LDNS_SIGN_RSASHA256:
30017b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
30027b5038d7SDag-Erling Smørgrav 								    "Algorithm: %u (RSASHA256)\n",
30037b5038d7SDag-Erling Smørgrav 								    LDNS_RSASHA256);
30047b5038d7SDag-Erling Smørgrav 					break;
30057b5038d7SDag-Erling Smørgrav 				case LDNS_SIGN_RSASHA512:
30067b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
30077b5038d7SDag-Erling Smørgrav 								    "Algorithm: %u (RSASHA512)\n",
30087b5038d7SDag-Erling Smørgrav 								    LDNS_RSASHA512);
30097b5038d7SDag-Erling Smørgrav 					break;
30107b5038d7SDag-Erling Smørgrav #endif
30117b5038d7SDag-Erling Smørgrav 				default:
301217d15b25SDag-Erling Smørgrav #ifdef STDERR_MSGS
30137b5038d7SDag-Erling Smørgrav 					fprintf(stderr, "Warning: unknown signature ");
30147b5038d7SDag-Erling Smørgrav 					fprintf(stderr,
30157b5038d7SDag-Erling Smørgrav 						   "algorithm type %u\n",
30167b5038d7SDag-Erling Smørgrav 						   ldns_key_algorithm(k));
301717d15b25SDag-Erling Smørgrav #endif
30187b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,
30197b5038d7SDag-Erling Smørgrav 								    "Algorithm: %u (Unknown)\n",
30207b5038d7SDag-Erling Smørgrav 								    ldns_key_algorithm(k));
30217b5038d7SDag-Erling Smørgrav 					break;
30227b5038d7SDag-Erling Smørgrav 				}
30237b5038d7SDag-Erling Smørgrav 
30247b5038d7SDag-Erling Smørgrav 				/* print to buf, convert to bin, convert to b64,
30257b5038d7SDag-Erling Smørgrav 				 * print to buf */
3026986ba33cSDag-Erling Smørgrav 
30277b5038d7SDag-Erling Smørgrav #ifndef S_SPLINT_S
3028986ba33cSDag-Erling Smørgrav 				if(1) {
3029986ba33cSDag-Erling Smørgrav 					const BIGNUM *n=NULL, *e=NULL, *d=NULL,
3030986ba33cSDag-Erling Smørgrav 						*p=NULL, *q=NULL, *dmp1=NULL,
3031986ba33cSDag-Erling Smørgrav 						*dmq1=NULL, *iqmp=NULL;
3032*5afab0e5SDag-Erling Smørgrav #if OPENSSL_VERSION_NUMBER < 0x10100000 || (defined(HAVE_LIBRESSL) && LIBRESSL_VERSION_NUMBER < 0x20700000)
3033986ba33cSDag-Erling Smørgrav 					n = rsa->n;
3034986ba33cSDag-Erling Smørgrav 					e = rsa->e;
3035986ba33cSDag-Erling Smørgrav 					d = rsa->d;
3036986ba33cSDag-Erling Smørgrav 					p = rsa->p;
3037986ba33cSDag-Erling Smørgrav 					q = rsa->q;
3038986ba33cSDag-Erling Smørgrav 					dmp1 = rsa->dmp1;
3039986ba33cSDag-Erling Smørgrav 					dmq1 = rsa->dmq1;
3040986ba33cSDag-Erling Smørgrav 					iqmp = rsa->iqmp;
3041986ba33cSDag-Erling Smørgrav #else
3042986ba33cSDag-Erling Smørgrav 					RSA_get0_key(rsa, &n, &e, &d);
3043986ba33cSDag-Erling Smørgrav 					RSA_get0_factors(rsa, &p, &q);
3044986ba33cSDag-Erling Smørgrav 					RSA_get0_crt_params(rsa, &dmp1,
3045986ba33cSDag-Erling Smørgrav 						&dmq1, &iqmp);
3046986ba33cSDag-Erling Smørgrav #endif
3047986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Modulus", n))
30487b5038d7SDag-Erling Smørgrav 						goto error;
3049986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "PublicExponent", e))
30507b5038d7SDag-Erling Smørgrav 						goto error;
3051986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "PrivateExponent", d))
30527b5038d7SDag-Erling Smørgrav 						goto error;
3053986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Prime1", p))
30547b5038d7SDag-Erling Smørgrav 						goto error;
3055986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Prime2", q))
30567b5038d7SDag-Erling Smørgrav 						goto error;
3057986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Exponent1", dmp1))
30587b5038d7SDag-Erling Smørgrav 						goto error;
3059986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Exponent2", dmq1))
30607b5038d7SDag-Erling Smørgrav 						goto error;
3061986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Coefficient", iqmp))
30627b5038d7SDag-Erling Smørgrav 						goto error;
30637b5038d7SDag-Erling Smørgrav 				}
30647b5038d7SDag-Erling Smørgrav #endif /* splint */
30657b5038d7SDag-Erling Smørgrav 
30667b5038d7SDag-Erling Smørgrav 				RSA_free(rsa);
30677b5038d7SDag-Erling Smørgrav 				break;
3068*5afab0e5SDag-Erling Smørgrav #ifdef USE_DSA
30697b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_DSA:
30707b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_DSA_NSEC3:
30717b5038d7SDag-Erling Smørgrav 				dsa = ldns_key_dsa_key(k);
30727b5038d7SDag-Erling Smørgrav 
30737b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output,"Private-key-format: v1.2\n");
30747b5038d7SDag-Erling Smørgrav 				if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) {
30757b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n");
30767b5038d7SDag-Erling Smørgrav 				} else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) {
30777b5038d7SDag-Erling Smørgrav 					ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n");
30787b5038d7SDag-Erling Smørgrav 				}
30797b5038d7SDag-Erling Smørgrav 
30807b5038d7SDag-Erling Smørgrav 				/* print to buf, convert to bin, convert to b64,
30817b5038d7SDag-Erling Smørgrav 				 * print to buf */
3082986ba33cSDag-Erling Smørgrav 				if(1) {
3083986ba33cSDag-Erling Smørgrav 					const BIGNUM *p=NULL, *q=NULL, *g=NULL,
3084986ba33cSDag-Erling Smørgrav 						*priv_key=NULL, *pub_key=NULL;
3085*5afab0e5SDag-Erling Smørgrav #if OPENSSL_VERSION_NUMBER < 0x10100000 || (defined(HAVE_LIBRESSL) && LIBRESSL_VERSION_NUMBER < 0x20700000)
30867b5038d7SDag-Erling Smørgrav #ifndef S_SPLINT_S
3087986ba33cSDag-Erling Smørgrav 					p = dsa->p;
3088986ba33cSDag-Erling Smørgrav 					q = dsa->q;
3089986ba33cSDag-Erling Smørgrav 					g = dsa->g;
3090986ba33cSDag-Erling Smørgrav 					priv_key = dsa->priv_key;
3091986ba33cSDag-Erling Smørgrav 					pub_key = dsa->pub_key;
30927b5038d7SDag-Erling Smørgrav #endif /* splint */
3093986ba33cSDag-Erling Smørgrav #else
3094986ba33cSDag-Erling Smørgrav 					DSA_get0_pqg(dsa, &p, &q, &g);
3095986ba33cSDag-Erling Smørgrav 					DSA_get0_key(dsa, &pub_key, &priv_key);
3096986ba33cSDag-Erling Smørgrav #endif
3097986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Prime(p)", p))
3098986ba33cSDag-Erling Smørgrav 						goto error;
3099986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Subprime(q)", q))
3100986ba33cSDag-Erling Smørgrav 						goto error;
3101986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Base(g)", g))
3102986ba33cSDag-Erling Smørgrav 						goto error;
3103986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Private_value(x)", priv_key))
3104986ba33cSDag-Erling Smørgrav 						goto error;
3105986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "Public_value(y)", pub_key))
3106986ba33cSDag-Erling Smørgrav 						goto error;
3107986ba33cSDag-Erling Smørgrav 				}
31087b5038d7SDag-Erling Smørgrav 				break;
3109*5afab0e5SDag-Erling Smørgrav #endif /* USE_DSA */
31107b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_ECC_GOST:
31117b5038d7SDag-Erling Smørgrav 				/* no format defined, use blob */
31127b5038d7SDag-Erling Smørgrav #if defined(HAVE_SSL) && defined(USE_GOST)
31137b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31147b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST);
31157b5038d7SDag-Erling Smørgrav 				status = ldns_gost_key2buffer_str(output,
31167b5038d7SDag-Erling Smørgrav #ifndef S_SPLINT_S
31177b5038d7SDag-Erling Smørgrav 					k->_key.key
31187b5038d7SDag-Erling Smørgrav #else
31197b5038d7SDag-Erling Smørgrav 					NULL
31207b5038d7SDag-Erling Smørgrav #endif
31217b5038d7SDag-Erling Smørgrav 				);
31227b5038d7SDag-Erling Smørgrav #else
31237b5038d7SDag-Erling Smørgrav 				goto error;
31247b5038d7SDag-Erling Smørgrav #endif /* GOST */
31257b5038d7SDag-Erling Smørgrav 				break;
31267b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_ECDSAP256SHA256:
31277b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_ECDSAP384SHA384:
31287b5038d7SDag-Erling Smørgrav #ifdef USE_ECDSA
31297b5038d7SDag-Erling Smørgrav                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31307b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
31317b5038d7SDag-Erling Smørgrav                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
31327b5038d7SDag-Erling Smørgrav #ifndef S_SPLINT_S
31337b5038d7SDag-Erling Smørgrav 				ldns_buffer_printf(output, ")\n");
31347b5038d7SDag-Erling Smørgrav                                 if(k->_key.key) {
31357b5038d7SDag-Erling Smørgrav                                         EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key);
31367b5038d7SDag-Erling Smørgrav                                         const BIGNUM* b = EC_KEY_get0_private_key(ec);
3137986ba33cSDag-Erling Smørgrav 					if(!ldns_print_bignum_b64_line(output, "PrivateKey", b))
31387b5038d7SDag-Erling Smørgrav 						goto error;
31397b5038d7SDag-Erling Smørgrav                                         /* down reference count in EC_KEY
31407b5038d7SDag-Erling Smørgrav                                          * its still assigned to the PKEY */
31417b5038d7SDag-Erling Smørgrav                                         EC_KEY_free(ec);
31427b5038d7SDag-Erling Smørgrav                                 }
31437b5038d7SDag-Erling Smørgrav #endif /* splint */
31447b5038d7SDag-Erling Smørgrav #else
31457b5038d7SDag-Erling Smørgrav 				goto error;
31467b5038d7SDag-Erling Smørgrav #endif /* ECDSA */
31477b5038d7SDag-Erling Smørgrav                                 break;
3148986ba33cSDag-Erling Smørgrav #ifdef USE_ED25519
3149986ba33cSDag-Erling Smørgrav 			case LDNS_SIGN_ED25519:
3150986ba33cSDag-Erling Smørgrav                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3151986ba33cSDag-Erling Smørgrav 				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
3152986ba33cSDag-Erling Smørgrav                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
3153986ba33cSDag-Erling Smørgrav 				ldns_buffer_printf(output, ")\n");
3154*5afab0e5SDag-Erling Smørgrav 				if (status) break;
3155*5afab0e5SDag-Erling Smørgrav 				status = ldns_ed25519_key2buffer_str(output,
3156*5afab0e5SDag-Erling Smørgrav 					k->_key.key);
3157986ba33cSDag-Erling Smørgrav 				break;
3158986ba33cSDag-Erling Smørgrav #endif /* USE_ED25519 */
3159986ba33cSDag-Erling Smørgrav #ifdef USE_ED448
3160986ba33cSDag-Erling Smørgrav 			case LDNS_SIGN_ED448:
3161986ba33cSDag-Erling Smørgrav                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3162986ba33cSDag-Erling Smørgrav 				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
3163986ba33cSDag-Erling Smørgrav                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
3164986ba33cSDag-Erling Smørgrav 				ldns_buffer_printf(output, ")\n");
3165*5afab0e5SDag-Erling Smørgrav 				if (status) break;
3166*5afab0e5SDag-Erling Smørgrav 				status = ldns_ed448_key2buffer_str(output,
3167*5afab0e5SDag-Erling Smørgrav 					k->_key.key);
3168986ba33cSDag-Erling Smørgrav 				break;
3169986ba33cSDag-Erling Smørgrav #endif /* USE_ED448 */
31707b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_HMACMD5:
31717b5038d7SDag-Erling Smørgrav 				/* there's not much of a format defined for TSIG */
31727b5038d7SDag-Erling Smørgrav 				/* It's just a binary blob, Same for all algorithms */
31737b5038d7SDag-Erling Smørgrav                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31747b5038d7SDag-Erling Smørgrav                 ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n");
31757b5038d7SDag-Erling Smørgrav 				status = ldns_hmac_key2buffer_str(output, k);
31767b5038d7SDag-Erling Smørgrav 				break;
31777b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_HMACSHA1:
31787b5038d7SDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31797b5038d7SDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n");
31807b5038d7SDag-Erling Smørgrav 				status = ldns_hmac_key2buffer_str(output, k);
31817b5038d7SDag-Erling Smørgrav 				break;
3182986ba33cSDag-Erling Smørgrav 			case LDNS_SIGN_HMACSHA224:
3183986ba33cSDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3184986ba33cSDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Algorithm: 162 (HMAC_SHA224)\n");
3185986ba33cSDag-Erling Smørgrav 				status = ldns_hmac_key2buffer_str(output, k);
3186986ba33cSDag-Erling Smørgrav 				break;
31877b5038d7SDag-Erling Smørgrav 			case LDNS_SIGN_HMACSHA256:
31887b5038d7SDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31897b5038d7SDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n");
31907b5038d7SDag-Erling Smørgrav 				status = ldns_hmac_key2buffer_str(output, k);
31917b5038d7SDag-Erling Smørgrav 				break;
3192986ba33cSDag-Erling Smørgrav 			case LDNS_SIGN_HMACSHA384:
3193986ba33cSDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3194986ba33cSDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Algorithm: 164 (HMAC_SHA384)\n");
3195986ba33cSDag-Erling Smørgrav 				status = ldns_hmac_key2buffer_str(output, k);
3196986ba33cSDag-Erling Smørgrav 				break;
3197986ba33cSDag-Erling Smørgrav 			case LDNS_SIGN_HMACSHA512:
3198986ba33cSDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3199986ba33cSDag-Erling Smørgrav 		        ldns_buffer_printf(output, "Algorithm: 165 (HMAC_SHA512)\n");
3200986ba33cSDag-Erling Smørgrav 				status = ldns_hmac_key2buffer_str(output, k);
3201986ba33cSDag-Erling Smørgrav 				break;
32027b5038d7SDag-Erling Smørgrav 		}
32037b5038d7SDag-Erling Smørgrav #endif /* HAVE_SSL */
32047b5038d7SDag-Erling Smørgrav 	} else {
32057b5038d7SDag-Erling Smørgrav 		LDNS_FREE(bignum);
32067b5038d7SDag-Erling Smørgrav 		return ldns_buffer_status(output);
32077b5038d7SDag-Erling Smørgrav 	}
32087b5038d7SDag-Erling Smørgrav 	LDNS_FREE(bignum);
32097b5038d7SDag-Erling Smørgrav 	return status;
32107b5038d7SDag-Erling Smørgrav 
32117b5038d7SDag-Erling Smørgrav #ifdef HAVE_SSL
32127b5038d7SDag-Erling Smørgrav 	/* compiles warn the label isn't used */
32137b5038d7SDag-Erling Smørgrav error:
32147b5038d7SDag-Erling Smørgrav 	LDNS_FREE(bignum);
32157b5038d7SDag-Erling Smørgrav 	return LDNS_STATUS_ERR;
32167b5038d7SDag-Erling Smørgrav #endif /* HAVE_SSL */
32177b5038d7SDag-Erling Smørgrav 
32187b5038d7SDag-Erling Smørgrav }
32197b5038d7SDag-Erling Smørgrav 
32207b5038d7SDag-Erling Smørgrav /*
32212787e39aSDag-Erling Smørgrav  * Zero terminate the buffer and copy data.
32227b5038d7SDag-Erling Smørgrav  */
32237b5038d7SDag-Erling Smørgrav char *
ldns_buffer2str(ldns_buffer * buffer)32247b5038d7SDag-Erling Smørgrav ldns_buffer2str(ldns_buffer *buffer)
32257b5038d7SDag-Erling Smørgrav {
32267b5038d7SDag-Erling Smørgrav 	char *str;
32277b5038d7SDag-Erling Smørgrav 
32287b5038d7SDag-Erling Smørgrav 	/* check if buffer ends with \0, if not, and
32297b5038d7SDag-Erling Smørgrav 	   if there is space, add it */
32307b5038d7SDag-Erling Smørgrav 	if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
32317b5038d7SDag-Erling Smørgrav 		if (!ldns_buffer_reserve(buffer, 1)) {
32327b5038d7SDag-Erling Smørgrav 			return NULL;
32337b5038d7SDag-Erling Smørgrav 		}
3234*5afab0e5SDag-Erling Smørgrav 		ldns_buffer_write_char(buffer, (uint8_t) '\0');
32357b5038d7SDag-Erling Smørgrav 		if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
32367b5038d7SDag-Erling Smørgrav 			return NULL;
32377b5038d7SDag-Erling Smørgrav 		}
32387b5038d7SDag-Erling Smørgrav 	}
32397b5038d7SDag-Erling Smørgrav 
32402787e39aSDag-Erling Smørgrav 	str = strdup((const char *)ldns_buffer_begin(buffer));
32417b5038d7SDag-Erling Smørgrav         if(!str) {
32427b5038d7SDag-Erling Smørgrav                 return NULL;
32437b5038d7SDag-Erling Smørgrav         }
32447b5038d7SDag-Erling Smørgrav 	return str;
32457b5038d7SDag-Erling Smørgrav }
32467b5038d7SDag-Erling Smørgrav 
32472787e39aSDag-Erling Smørgrav /*
32482787e39aSDag-Erling Smørgrav  * Zero terminate the buffer and export data.
32492787e39aSDag-Erling Smørgrav  */
32502787e39aSDag-Erling Smørgrav char *
ldns_buffer_export2str(ldns_buffer * buffer)32512787e39aSDag-Erling Smørgrav ldns_buffer_export2str(ldns_buffer *buffer)
32522787e39aSDag-Erling Smørgrav {
32532787e39aSDag-Erling Smørgrav 	/* Append '\0' as string terminator */
32542787e39aSDag-Erling Smørgrav 	if (! ldns_buffer_reserve(buffer, 1)) {
32552787e39aSDag-Erling Smørgrav 		return NULL;
32562787e39aSDag-Erling Smørgrav 	}
3257*5afab0e5SDag-Erling Smørgrav 	ldns_buffer_write_char(buffer, 0);
32582787e39aSDag-Erling Smørgrav 
32592787e39aSDag-Erling Smørgrav 	/* reallocate memory to the size of the string and export */
32602787e39aSDag-Erling Smørgrav 	ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer));
32612787e39aSDag-Erling Smørgrav 	return ldns_buffer_export(buffer);
32622787e39aSDag-Erling Smørgrav }
32632787e39aSDag-Erling Smørgrav 
32647b5038d7SDag-Erling Smørgrav char *
ldns_rdf2str(const ldns_rdf * rdf)32657b5038d7SDag-Erling Smørgrav ldns_rdf2str(const ldns_rdf *rdf)
32667b5038d7SDag-Erling Smørgrav {
32677b5038d7SDag-Erling Smørgrav 	char *result = NULL;
32687b5038d7SDag-Erling Smørgrav 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
32697b5038d7SDag-Erling Smørgrav 
32707b5038d7SDag-Erling Smørgrav 	if (!tmp_buffer) {
32717b5038d7SDag-Erling Smørgrav 		return NULL;
32727b5038d7SDag-Erling Smørgrav 	}
32737b5038d7SDag-Erling Smørgrav 	if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
32747b5038d7SDag-Erling Smørgrav 		/* export and return string, destroy rest */
32752787e39aSDag-Erling Smørgrav 		result = ldns_buffer_export2str(tmp_buffer);
32767b5038d7SDag-Erling Smørgrav 	}
32777b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(tmp_buffer);
32787b5038d7SDag-Erling Smørgrav 	return result;
32797b5038d7SDag-Erling Smørgrav }
32807b5038d7SDag-Erling Smørgrav 
32817b5038d7SDag-Erling Smørgrav char *
ldns_rr2str_fmt(const ldns_output_format * fmt,const ldns_rr * rr)32827b5038d7SDag-Erling Smørgrav ldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr)
32837b5038d7SDag-Erling Smørgrav {
32847b5038d7SDag-Erling Smørgrav 	char *result = NULL;
32857b5038d7SDag-Erling Smørgrav 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
32867b5038d7SDag-Erling Smørgrav 
32877b5038d7SDag-Erling Smørgrav 	if (!tmp_buffer) {
32887b5038d7SDag-Erling Smørgrav 		return NULL;
32897b5038d7SDag-Erling Smørgrav 	}
32907b5038d7SDag-Erling Smørgrav 	if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr)
32917b5038d7SDag-Erling Smørgrav 		       	== LDNS_STATUS_OK) {
32927b5038d7SDag-Erling Smørgrav 		/* export and return string, destroy rest */
32932787e39aSDag-Erling Smørgrav 		result = ldns_buffer_export2str(tmp_buffer);
32947b5038d7SDag-Erling Smørgrav 	}
32957b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(tmp_buffer);
32967b5038d7SDag-Erling Smørgrav 	return result;
32977b5038d7SDag-Erling Smørgrav }
32987b5038d7SDag-Erling Smørgrav 
32997b5038d7SDag-Erling Smørgrav char *
ldns_rr2str(const ldns_rr * rr)33007b5038d7SDag-Erling Smørgrav ldns_rr2str(const ldns_rr *rr)
33017b5038d7SDag-Erling Smørgrav {
33027b5038d7SDag-Erling Smørgrav 	return ldns_rr2str_fmt(ldns_output_format_default, rr);
33037b5038d7SDag-Erling Smørgrav }
33047b5038d7SDag-Erling Smørgrav 
33057b5038d7SDag-Erling Smørgrav char *
ldns_pkt2str_fmt(const ldns_output_format * fmt,const ldns_pkt * pkt)33067b5038d7SDag-Erling Smørgrav ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
33077b5038d7SDag-Erling Smørgrav {
33087b5038d7SDag-Erling Smørgrav 	char *result = NULL;
33097b5038d7SDag-Erling Smørgrav 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
33107b5038d7SDag-Erling Smørgrav 
33117b5038d7SDag-Erling Smørgrav 	if (!tmp_buffer) {
33127b5038d7SDag-Erling Smørgrav 		return NULL;
33137b5038d7SDag-Erling Smørgrav 	}
33147b5038d7SDag-Erling Smørgrav 	if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
33157b5038d7SDag-Erling Smørgrav 		       	== LDNS_STATUS_OK) {
33167b5038d7SDag-Erling Smørgrav 		/* export and return string, destroy rest */
33172787e39aSDag-Erling Smørgrav 		result = ldns_buffer_export2str(tmp_buffer);
33187b5038d7SDag-Erling Smørgrav 	}
33197b5038d7SDag-Erling Smørgrav 
33207b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(tmp_buffer);
33217b5038d7SDag-Erling Smørgrav 	return result;
33227b5038d7SDag-Erling Smørgrav }
33237b5038d7SDag-Erling Smørgrav 
33247b5038d7SDag-Erling Smørgrav char *
ldns_pkt2str(const ldns_pkt * pkt)33257b5038d7SDag-Erling Smørgrav ldns_pkt2str(const ldns_pkt *pkt)
33267b5038d7SDag-Erling Smørgrav {
33277b5038d7SDag-Erling Smørgrav 	return ldns_pkt2str_fmt(ldns_output_format_default, pkt);
33287b5038d7SDag-Erling Smørgrav }
33297b5038d7SDag-Erling Smørgrav 
33307b5038d7SDag-Erling Smørgrav char *
ldns_key2str(const ldns_key * k)33317b5038d7SDag-Erling Smørgrav ldns_key2str(const ldns_key *k)
33327b5038d7SDag-Erling Smørgrav {
33337b5038d7SDag-Erling Smørgrav 	char *result = NULL;
33347b5038d7SDag-Erling Smørgrav 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
33357b5038d7SDag-Erling Smørgrav 
33367b5038d7SDag-Erling Smørgrav 	if (!tmp_buffer) {
33377b5038d7SDag-Erling Smørgrav 		return NULL;
33387b5038d7SDag-Erling Smørgrav 	}
33397b5038d7SDag-Erling Smørgrav 	if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
33407b5038d7SDag-Erling Smørgrav 		/* export and return string, destroy rest */
33412787e39aSDag-Erling Smørgrav 		result = ldns_buffer_export2str(tmp_buffer);
33427b5038d7SDag-Erling Smørgrav 	}
33437b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(tmp_buffer);
33447b5038d7SDag-Erling Smørgrav 	return result;
33457b5038d7SDag-Erling Smørgrav }
33467b5038d7SDag-Erling Smørgrav 
33477b5038d7SDag-Erling Smørgrav char *
ldns_rr_list2str_fmt(const ldns_output_format * fmt,const ldns_rr_list * list)33487b5038d7SDag-Erling Smørgrav ldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list)
33497b5038d7SDag-Erling Smørgrav {
33507b5038d7SDag-Erling Smørgrav 	char *result = NULL;
33517b5038d7SDag-Erling Smørgrav 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
33527b5038d7SDag-Erling Smørgrav 
33537b5038d7SDag-Erling Smørgrav 	if (!tmp_buffer) {
33547b5038d7SDag-Erling Smørgrav 		return NULL;
33557b5038d7SDag-Erling Smørgrav 	}
33567b5038d7SDag-Erling Smørgrav 	if (list) {
33577b5038d7SDag-Erling Smørgrav 		if (ldns_rr_list2buffer_str_fmt(
33587b5038d7SDag-Erling Smørgrav 				   tmp_buffer, fmt, list)
33597b5038d7SDag-Erling Smørgrav 			       	== LDNS_STATUS_OK) {
33607b5038d7SDag-Erling Smørgrav 		}
33617b5038d7SDag-Erling Smørgrav 	} else {
33627b5038d7SDag-Erling Smørgrav 		if (fmt == NULL) {
33637b5038d7SDag-Erling Smørgrav 			fmt = ldns_output_format_default;
33647b5038d7SDag-Erling Smørgrav 		}
33657b5038d7SDag-Erling Smørgrav 		if (fmt->flags & LDNS_COMMENT_NULLS) {
33667b5038d7SDag-Erling Smørgrav 			ldns_buffer_printf(tmp_buffer, "; (null)\n");
33677b5038d7SDag-Erling Smørgrav 		}
33687b5038d7SDag-Erling Smørgrav 	}
33697b5038d7SDag-Erling Smørgrav 
33707b5038d7SDag-Erling Smørgrav 	/* export and return string, destroy rest */
33712787e39aSDag-Erling Smørgrav 	result = ldns_buffer_export2str(tmp_buffer);
33727b5038d7SDag-Erling Smørgrav 	ldns_buffer_free(tmp_buffer);
33737b5038d7SDag-Erling Smørgrav 	return result;
33747b5038d7SDag-Erling Smørgrav }
33757b5038d7SDag-Erling Smørgrav 
33767b5038d7SDag-Erling Smørgrav char *
ldns_rr_list2str(const ldns_rr_list * list)33777b5038d7SDag-Erling Smørgrav ldns_rr_list2str(const ldns_rr_list *list)
33787b5038d7SDag-Erling Smørgrav {
33797b5038d7SDag-Erling Smørgrav 	return ldns_rr_list2str_fmt(ldns_output_format_default, list);
33807b5038d7SDag-Erling Smørgrav }
33817b5038d7SDag-Erling Smørgrav 
33827b5038d7SDag-Erling Smørgrav void
ldns_rdf_print(FILE * output,const ldns_rdf * rdf)33837b5038d7SDag-Erling Smørgrav ldns_rdf_print(FILE *output, const ldns_rdf *rdf)
33847b5038d7SDag-Erling Smørgrav {
33857b5038d7SDag-Erling Smørgrav 	char *str = ldns_rdf2str(rdf);
33867b5038d7SDag-Erling Smørgrav 	if (str) {
33877b5038d7SDag-Erling Smørgrav 		fprintf(output, "%s", str);
33887b5038d7SDag-Erling Smørgrav 	} else {
33892787e39aSDag-Erling Smørgrav 		fprintf(output, ";Unable to convert rdf to string\n");
33907b5038d7SDag-Erling Smørgrav 	}
33917b5038d7SDag-Erling Smørgrav 	LDNS_FREE(str);
33927b5038d7SDag-Erling Smørgrav }
33937b5038d7SDag-Erling Smørgrav 
33947b5038d7SDag-Erling Smørgrav void
ldns_rr_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_rr * rr)33957b5038d7SDag-Erling Smørgrav ldns_rr_print_fmt(FILE *output,
33967b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_rr *rr)
33977b5038d7SDag-Erling Smørgrav {
33987b5038d7SDag-Erling Smørgrav 	char *str = ldns_rr2str_fmt(fmt, rr);
33997b5038d7SDag-Erling Smørgrav 	if (str) {
34007b5038d7SDag-Erling Smørgrav 		fprintf(output, "%s", str);
34017b5038d7SDag-Erling Smørgrav 	} else {
34022787e39aSDag-Erling Smørgrav 		fprintf(output, ";Unable to convert rr to string\n");
34037b5038d7SDag-Erling Smørgrav 	}
34047b5038d7SDag-Erling Smørgrav 	LDNS_FREE(str);
34057b5038d7SDag-Erling Smørgrav }
34067b5038d7SDag-Erling Smørgrav 
34077b5038d7SDag-Erling Smørgrav void
ldns_rr_print(FILE * output,const ldns_rr * rr)34087b5038d7SDag-Erling Smørgrav ldns_rr_print(FILE *output, const ldns_rr *rr)
34097b5038d7SDag-Erling Smørgrav {
34107b5038d7SDag-Erling Smørgrav 	ldns_rr_print_fmt(output, ldns_output_format_default, rr);
34117b5038d7SDag-Erling Smørgrav }
34127b5038d7SDag-Erling Smørgrav 
34137b5038d7SDag-Erling Smørgrav void
ldns_pkt_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_pkt * pkt)34147b5038d7SDag-Erling Smørgrav ldns_pkt_print_fmt(FILE *output,
34157b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_pkt *pkt)
34167b5038d7SDag-Erling Smørgrav {
34177b5038d7SDag-Erling Smørgrav 	char *str = ldns_pkt2str_fmt(fmt, pkt);
34187b5038d7SDag-Erling Smørgrav 	if (str) {
34197b5038d7SDag-Erling Smørgrav 		fprintf(output, "%s", str);
34207b5038d7SDag-Erling Smørgrav 	} else {
34212787e39aSDag-Erling Smørgrav 		fprintf(output, ";Unable to convert packet to string\n");
34227b5038d7SDag-Erling Smørgrav 	}
34237b5038d7SDag-Erling Smørgrav 	LDNS_FREE(str);
34247b5038d7SDag-Erling Smørgrav }
34257b5038d7SDag-Erling Smørgrav 
34267b5038d7SDag-Erling Smørgrav void
ldns_pkt_print(FILE * output,const ldns_pkt * pkt)34277b5038d7SDag-Erling Smørgrav ldns_pkt_print(FILE *output, const ldns_pkt *pkt)
34287b5038d7SDag-Erling Smørgrav {
34297b5038d7SDag-Erling Smørgrav 	ldns_pkt_print_fmt(output, ldns_output_format_default, pkt);
34307b5038d7SDag-Erling Smørgrav }
34317b5038d7SDag-Erling Smørgrav 
34327b5038d7SDag-Erling Smørgrav void
ldns_rr_list_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_rr_list * lst)34337b5038d7SDag-Erling Smørgrav ldns_rr_list_print_fmt(FILE *output,
34347b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_rr_list *lst)
34357b5038d7SDag-Erling Smørgrav {
34367b5038d7SDag-Erling Smørgrav 	size_t i;
34377b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_rr_list_rr_count(lst); i++) {
34387b5038d7SDag-Erling Smørgrav 		ldns_rr_print_fmt(output, fmt, ldns_rr_list_rr(lst, i));
34397b5038d7SDag-Erling Smørgrav 	}
34407b5038d7SDag-Erling Smørgrav }
34417b5038d7SDag-Erling Smørgrav 
34427b5038d7SDag-Erling Smørgrav void
ldns_rr_list_print(FILE * output,const ldns_rr_list * lst)34437b5038d7SDag-Erling Smørgrav ldns_rr_list_print(FILE *output, const ldns_rr_list *lst)
34447b5038d7SDag-Erling Smørgrav {
34457b5038d7SDag-Erling Smørgrav 	ldns_rr_list_print_fmt(output, ldns_output_format_default, lst);
34467b5038d7SDag-Erling Smørgrav }
34477b5038d7SDag-Erling Smørgrav 
34487b5038d7SDag-Erling Smørgrav void
ldns_resolver_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_resolver * r)34497b5038d7SDag-Erling Smørgrav ldns_resolver_print_fmt(FILE *output,
34507b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_resolver *r)
34517b5038d7SDag-Erling Smørgrav {
34527b5038d7SDag-Erling Smørgrav 	uint16_t i;
34537b5038d7SDag-Erling Smørgrav 	ldns_rdf **n;
34547b5038d7SDag-Erling Smørgrav 	ldns_rdf **s;
34557b5038d7SDag-Erling Smørgrav 	size_t *rtt;
34567b5038d7SDag-Erling Smørgrav 	if (!r) {
34577b5038d7SDag-Erling Smørgrav 		return;
34587b5038d7SDag-Erling Smørgrav 	}
34597b5038d7SDag-Erling Smørgrav 	n = ldns_resolver_nameservers(r);
34607b5038d7SDag-Erling Smørgrav 	s = ldns_resolver_searchlist(r);
34617b5038d7SDag-Erling Smørgrav 	rtt = ldns_resolver_rtt(r);
34627b5038d7SDag-Erling Smørgrav 
34637b5038d7SDag-Erling Smørgrav 	fprintf(output, "port: %d\n", (int)ldns_resolver_port(r));
34647b5038d7SDag-Erling Smørgrav 	fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r));
34657b5038d7SDag-Erling Smørgrav 	fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r));
34667b5038d7SDag-Erling Smørgrav 
34677b5038d7SDag-Erling Smørgrav 	fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r));
34687b5038d7SDag-Erling Smørgrav 	fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r));
34697b5038d7SDag-Erling Smørgrav 	fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r));
34707b5038d7SDag-Erling Smørgrav 	fprintf(output, "fail: %d\n", ldns_resolver_fail(r));
34717b5038d7SDag-Erling Smørgrav 	fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r));
34727b5038d7SDag-Erling Smørgrav 	fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r));
34737b5038d7SDag-Erling Smørgrav 	fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r));
34747b5038d7SDag-Erling Smørgrav 	fprintf(output, "random: %d\n", ldns_resolver_random(r));
34757b5038d7SDag-Erling Smørgrav 	fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec);
34767b5038d7SDag-Erling Smørgrav 	fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r));
34777b5038d7SDag-Erling Smørgrav 	fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r));
34787b5038d7SDag-Erling Smørgrav 	fprintf(output, "trust anchors (%d listed):\n",
34797b5038d7SDag-Erling Smørgrav 		(int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r)));
34807b5038d7SDag-Erling Smørgrav 	ldns_rr_list_print_fmt(output, fmt, ldns_resolver_dnssec_anchors(r));
34817b5038d7SDag-Erling Smørgrav 	fprintf(output, "tsig: %s %s\n",
34827b5038d7SDag-Erling Smørgrav                 ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-",
34837b5038d7SDag-Erling Smørgrav                 ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-");
34847b5038d7SDag-Erling Smørgrav 	fprintf(output, "debug: %d\n", ldns_resolver_debug(r));
34857b5038d7SDag-Erling Smørgrav 
34867b5038d7SDag-Erling Smørgrav 	fprintf(output, "default domain: ");
34877b5038d7SDag-Erling Smørgrav 	ldns_rdf_print(output, ldns_resolver_domain(r));
34887b5038d7SDag-Erling Smørgrav 	fprintf(output, "\n");
34897b5038d7SDag-Erling Smørgrav 	fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r));
34907b5038d7SDag-Erling Smørgrav 
34917b5038d7SDag-Erling Smørgrav 	fprintf(output, "searchlist (%d listed):\n",  (int)ldns_resolver_searchlist_count(r));
34927b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_resolver_searchlist_count(r); i++) {
34937b5038d7SDag-Erling Smørgrav 		fprintf(output, "\t");
34947b5038d7SDag-Erling Smørgrav 		ldns_rdf_print(output, s[i]);
34957b5038d7SDag-Erling Smørgrav 		fprintf(output, "\n");
34967b5038d7SDag-Erling Smørgrav 	}
34977b5038d7SDag-Erling Smørgrav 	fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r));
34987b5038d7SDag-Erling Smørgrav 
34997b5038d7SDag-Erling Smørgrav 	fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r));
35007b5038d7SDag-Erling Smørgrav 	for (i = 0; i < ldns_resolver_nameserver_count(r); i++) {
35017b5038d7SDag-Erling Smørgrav 		fprintf(output, "\t");
35027b5038d7SDag-Erling Smørgrav 		ldns_rdf_print(output, n[i]);
35037b5038d7SDag-Erling Smørgrav 
35047b5038d7SDag-Erling Smørgrav 		switch ((int)rtt[i]) {
35057b5038d7SDag-Erling Smørgrav 			case LDNS_RESOLV_RTT_MIN:
35067b5038d7SDag-Erling Smørgrav 			fprintf(output, " - reachable\n");
35077b5038d7SDag-Erling Smørgrav 			break;
35087b5038d7SDag-Erling Smørgrav 			case LDNS_RESOLV_RTT_INF:
35097b5038d7SDag-Erling Smørgrav 			fprintf(output, " - unreachable\n");
35107b5038d7SDag-Erling Smørgrav 			break;
35117b5038d7SDag-Erling Smørgrav 		}
35127b5038d7SDag-Erling Smørgrav 	}
35137b5038d7SDag-Erling Smørgrav }
35147b5038d7SDag-Erling Smørgrav 
35157b5038d7SDag-Erling Smørgrav void
ldns_resolver_print(FILE * output,const ldns_resolver * r)35167b5038d7SDag-Erling Smørgrav ldns_resolver_print(FILE *output, const ldns_resolver *r)
35177b5038d7SDag-Erling Smørgrav {
35187b5038d7SDag-Erling Smørgrav 	ldns_resolver_print_fmt(output, ldns_output_format_default, r);
35197b5038d7SDag-Erling Smørgrav }
35207b5038d7SDag-Erling Smørgrav 
35217b5038d7SDag-Erling Smørgrav void
ldns_zone_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_zone * z)35227b5038d7SDag-Erling Smørgrav ldns_zone_print_fmt(FILE *output,
35237b5038d7SDag-Erling Smørgrav 		const ldns_output_format *fmt, const ldns_zone *z)
35247b5038d7SDag-Erling Smørgrav {
35257b5038d7SDag-Erling Smørgrav 	if(ldns_zone_soa(z))
35267b5038d7SDag-Erling Smørgrav 		ldns_rr_print_fmt(output, fmt, ldns_zone_soa(z));
35277b5038d7SDag-Erling Smørgrav 	ldns_rr_list_print_fmt(output, fmt, ldns_zone_rrs(z));
35287b5038d7SDag-Erling Smørgrav }
35297b5038d7SDag-Erling Smørgrav void
ldns_zone_print(FILE * output,const ldns_zone * z)35307b5038d7SDag-Erling Smørgrav ldns_zone_print(FILE *output, const ldns_zone *z)
35317b5038d7SDag-Erling Smørgrav {
35327b5038d7SDag-Erling Smørgrav 	ldns_zone_print_fmt(output, ldns_output_format_default, z);
35337b5038d7SDag-Erling Smørgrav }
3534