xref: /dflybsd-src/contrib/ldns/host2str.c (revision 7733acb50455a11cc2ee36edd926ff0fa3361e9a)
1825eb42bSJan Lentfer /*
2825eb42bSJan Lentfer  * host2str.c
3825eb42bSJan Lentfer  *
4825eb42bSJan Lentfer  * conversion routines from the host format
5825eb42bSJan Lentfer  * to the presentation format (strings)
6825eb42bSJan Lentfer  *
7825eb42bSJan Lentfer  * a Net::DNS like library for C
8825eb42bSJan Lentfer  *
9825eb42bSJan Lentfer  * (c) NLnet Labs, 2004-2006
10825eb42bSJan Lentfer  *
11825eb42bSJan Lentfer  * See the file LICENSE for the license
12825eb42bSJan Lentfer  */
13825eb42bSJan Lentfer #include <ldns/config.h>
14825eb42bSJan Lentfer 
15825eb42bSJan Lentfer #include <ldns/ldns.h>
16825eb42bSJan Lentfer 
17825eb42bSJan Lentfer #include <limits.h>
18825eb42bSJan Lentfer 
19825eb42bSJan Lentfer #ifdef HAVE_SYS_SOCKET_H
20825eb42bSJan Lentfer #include <sys/socket.h>
21825eb42bSJan Lentfer #endif
22825eb42bSJan Lentfer #ifdef HAVE_ARPA_INET_H
23825eb42bSJan Lentfer #include <arpa/inet.h>
24825eb42bSJan Lentfer #endif
25825eb42bSJan Lentfer #ifdef HAVE_NETDB_H
26825eb42bSJan Lentfer #include <netdb.h>
27825eb42bSJan Lentfer #endif
28825eb42bSJan Lentfer #include <time.h>
29825eb42bSJan Lentfer #include <sys/time.h>
30825eb42bSJan Lentfer 
31819dec71SDaniel Fojt #ifdef HAVE_SSL
32819dec71SDaniel Fojt #include <openssl/bn.h>
33819dec71SDaniel Fojt #include <openssl/rsa.h>
34819dec71SDaniel Fojt #ifdef USE_DSA
35819dec71SDaniel Fojt #include <openssl/dsa.h>
36819dec71SDaniel Fojt #endif
37819dec71SDaniel Fojt #endif
38819dec71SDaniel Fojt 
39825eb42bSJan Lentfer #ifndef INET_ADDRSTRLEN
40825eb42bSJan Lentfer #define INET_ADDRSTRLEN 16
41825eb42bSJan Lentfer #endif
42825eb42bSJan Lentfer #ifndef INET6_ADDRSTRLEN
43825eb42bSJan Lentfer #define INET6_ADDRSTRLEN 46
44825eb42bSJan Lentfer #endif
45825eb42bSJan Lentfer 
46*ee791febSAntonio Huete Jimenez /* Internal helper function */
47*ee791febSAntonio Huete Jimenez ldns_edns_option_list*
48*ee791febSAntonio Huete Jimenez pkt_edns_data2edns_option_list(const ldns_rdf *edns_data);
49*ee791febSAntonio Huete Jimenez 
50825eb42bSJan Lentfer /* lookup tables for standard DNS stuff  */
51825eb42bSJan Lentfer 
52825eb42bSJan Lentfer /* Taken from RFC 2535, section 7.  */
53825eb42bSJan Lentfer ldns_lookup_table ldns_algorithms[] = {
54825eb42bSJan Lentfer         { LDNS_RSAMD5, "RSAMD5" },
55825eb42bSJan Lentfer         { LDNS_DH, "DH" },
56825eb42bSJan Lentfer         { LDNS_DSA, "DSA" },
57825eb42bSJan Lentfer         { LDNS_ECC, "ECC" },
58825eb42bSJan Lentfer         { LDNS_RSASHA1, "RSASHA1" },
59825eb42bSJan Lentfer         { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" },
60825eb42bSJan Lentfer         { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" },
61825eb42bSJan Lentfer 	{ LDNS_RSASHA256, "RSASHA256"},
62825eb42bSJan Lentfer 	{ LDNS_RSASHA512, "RSASHA512"},
63ac996e71SJan Lentfer 	{ LDNS_ECC_GOST, "ECC-GOST"},
64ac996e71SJan Lentfer         { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"},
65ac996e71SJan Lentfer         { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"},
665340022aSzrj 	{ LDNS_ED25519, "ED25519"},
675340022aSzrj 	{ LDNS_ED448, "ED448"},
68825eb42bSJan Lentfer         { LDNS_INDIRECT, "INDIRECT" },
69825eb42bSJan Lentfer         { LDNS_PRIVATEDNS, "PRIVATEDNS" },
70825eb42bSJan Lentfer         { LDNS_PRIVATEOID, "PRIVATEOID" },
71825eb42bSJan Lentfer         { 0, NULL }
72825eb42bSJan Lentfer };
73825eb42bSJan Lentfer 
74*ee791febSAntonio Huete Jimenez /* Hashing algorithms used in the DS record */
75*ee791febSAntonio Huete Jimenez ldns_lookup_table ldns_hashes[] = {
76*ee791febSAntonio Huete Jimenez         {LDNS_SHA1     , "SHA1" },      /* RFC 4034 */
77*ee791febSAntonio Huete Jimenez         {LDNS_SHA256   , "SHA256" },    /* RFC 4509 */
78*ee791febSAntonio Huete Jimenez         {LDNS_HASH_GOST, "HASH-GOST" }, /* RFC 5933 */
79*ee791febSAntonio Huete Jimenez         {LDNS_SHA384   , "SHA384" },    /* RFC 6605 */
80*ee791febSAntonio Huete Jimenez         { 0, NULL }
81*ee791febSAntonio Huete Jimenez };
82*ee791febSAntonio Huete Jimenez 
83fd185f4dSJan Lentfer /* Taken from RFC 4398  */
84825eb42bSJan Lentfer ldns_lookup_table ldns_cert_algorithms[] = {
85825eb42bSJan Lentfer         { LDNS_CERT_PKIX, "PKIX" },
86825eb42bSJan Lentfer         { LDNS_CERT_SPKI, "SPKI" },
87825eb42bSJan Lentfer         { LDNS_CERT_PGP, "PGP" },
88fd185f4dSJan Lentfer         { LDNS_CERT_IPKIX, "IPKIX" },
89fd185f4dSJan Lentfer         { LDNS_CERT_ISPKI, "ISPKI" },
90fd185f4dSJan Lentfer         { LDNS_CERT_IPGP, "IPGP" },
91fd185f4dSJan Lentfer         { LDNS_CERT_ACPKIX, "ACPKIX" },
92fd185f4dSJan Lentfer         { LDNS_CERT_IACPKIX, "IACPKIX" },
93825eb42bSJan Lentfer         { LDNS_CERT_URI, "URI" },
94825eb42bSJan Lentfer         { LDNS_CERT_OID, "OID" },
95825eb42bSJan Lentfer         { 0, NULL }
96825eb42bSJan Lentfer };
97825eb42bSJan Lentfer 
98825eb42bSJan Lentfer /* classes  */
99825eb42bSJan Lentfer ldns_lookup_table ldns_rr_classes[] = {
100825eb42bSJan Lentfer         { LDNS_RR_CLASS_IN, "IN" },
101825eb42bSJan Lentfer         { LDNS_RR_CLASS_CH, "CH" },
102825eb42bSJan Lentfer         { LDNS_RR_CLASS_HS, "HS" },
103825eb42bSJan Lentfer         { LDNS_RR_CLASS_NONE, "NONE" },
104825eb42bSJan Lentfer         { LDNS_RR_CLASS_ANY, "ANY" },
105825eb42bSJan Lentfer         { 0, NULL }
106825eb42bSJan Lentfer };
107825eb42bSJan Lentfer 
108825eb42bSJan Lentfer /* if these are used elsewhere */
109825eb42bSJan Lentfer ldns_lookup_table ldns_rcodes[] = {
110825eb42bSJan Lentfer         { LDNS_RCODE_NOERROR, "NOERROR" },
111825eb42bSJan Lentfer         { LDNS_RCODE_FORMERR, "FORMERR" },
112825eb42bSJan Lentfer         { LDNS_RCODE_SERVFAIL, "SERVFAIL" },
113825eb42bSJan Lentfer         { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" },
114825eb42bSJan Lentfer         { LDNS_RCODE_NOTIMPL, "NOTIMPL" },
115825eb42bSJan Lentfer         { LDNS_RCODE_REFUSED, "REFUSED" },
116825eb42bSJan Lentfer         { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" },
117825eb42bSJan Lentfer         { LDNS_RCODE_YXRRSET, "YXRRSET" },
118825eb42bSJan Lentfer         { LDNS_RCODE_NXRRSET, "NXRRSET" },
119825eb42bSJan Lentfer         { LDNS_RCODE_NOTAUTH, "NOTAUTH" },
120825eb42bSJan Lentfer         { LDNS_RCODE_NOTZONE, "NOTZONE" },
121825eb42bSJan Lentfer         { 0, NULL }
122825eb42bSJan Lentfer };
123825eb42bSJan Lentfer 
124825eb42bSJan Lentfer ldns_lookup_table ldns_opcodes[] = {
125825eb42bSJan Lentfer         { LDNS_PACKET_QUERY, "QUERY" },
126825eb42bSJan Lentfer         { LDNS_PACKET_IQUERY, "IQUERY" },
127825eb42bSJan Lentfer         { LDNS_PACKET_STATUS, "STATUS" },
128825eb42bSJan Lentfer 	{ LDNS_PACKET_NOTIFY, "NOTIFY" },
129825eb42bSJan Lentfer 	{ LDNS_PACKET_UPDATE, "UPDATE" },
130825eb42bSJan Lentfer         { 0, NULL }
131825eb42bSJan Lentfer };
132825eb42bSJan Lentfer 
133b5dedccaSJan Lentfer const ldns_output_format   ldns_output_format_nocomments_record = { 0, NULL };
134b5dedccaSJan Lentfer const ldns_output_format  *ldns_output_format_nocomments
135b5dedccaSJan Lentfer 			= &ldns_output_format_nocomments_record;
136b5dedccaSJan Lentfer const ldns_output_format   ldns_output_format_onlykeyids_record = {
137b5dedccaSJan Lentfer 	LDNS_COMMENT_KEY, NULL
138b5dedccaSJan Lentfer };
139b5dedccaSJan Lentfer const ldns_output_format  *ldns_output_format_onlykeyids
140b5dedccaSJan Lentfer 			= &ldns_output_format_onlykeyids_record;
141b5dedccaSJan Lentfer const ldns_output_format  *ldns_output_format_default
142b5dedccaSJan Lentfer 			= &ldns_output_format_onlykeyids_record;
143d1b2b5caSJohn Marino 
144b5dedccaSJan Lentfer const ldns_output_format   ldns_output_format_bubblebabble_record = {
145b5dedccaSJan Lentfer 	LDNS_COMMENT_KEY | LDNS_COMMENT_BUBBLEBABBLE | LDNS_COMMENT_FLAGS, NULL
146b5dedccaSJan Lentfer };
147b5dedccaSJan Lentfer const ldns_output_format  *ldns_output_format_bubblebabble
148b5dedccaSJan Lentfer 			= &ldns_output_format_bubblebabble_record;
149b5dedccaSJan Lentfer 
1505340022aSzrj static bool
ldns_output_format_covers_type(const ldns_output_format * fmt,ldns_rr_type t)1515340022aSzrj ldns_output_format_covers_type(const ldns_output_format* fmt, ldns_rr_type t)
1525340022aSzrj {
1535340022aSzrj 	return fmt && (fmt->flags & LDNS_FMT_RFC3597) &&
1545340022aSzrj 		((ldns_output_format_storage*)fmt)->bitmap &&
1555340022aSzrj 		ldns_nsec_bitmap_covers_type(
1565340022aSzrj 				((ldns_output_format_storage*)fmt)->bitmap, t);
1575340022aSzrj }
1585340022aSzrj 
1595340022aSzrj ldns_status
ldns_output_format_set_type(ldns_output_format * fmt,ldns_rr_type t)1605340022aSzrj ldns_output_format_set_type(ldns_output_format* fmt, ldns_rr_type t)
1615340022aSzrj {
1625340022aSzrj 	ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt;
1635340022aSzrj 	ldns_status s;
1645340022aSzrj 
1655340022aSzrj 	assert(fmt != NULL);
1665340022aSzrj 
1675340022aSzrj 	if (!(fmt_st->flags & LDNS_FMT_RFC3597)) {
1685340022aSzrj 		ldns_output_format_set(fmt, LDNS_FMT_RFC3597);
1695340022aSzrj 	}
1705340022aSzrj 	if (! fmt_st->bitmap) {
1715340022aSzrj 		s = ldns_rdf_bitmap_known_rr_types_space(&fmt_st->bitmap);
1725340022aSzrj 		if (s != LDNS_STATUS_OK) {
1735340022aSzrj 			return s;
1745340022aSzrj 		}
1755340022aSzrj 	}
1765340022aSzrj 	return ldns_nsec_bitmap_set_type(fmt_st->bitmap, t);
1775340022aSzrj }
1785340022aSzrj 
1795340022aSzrj ldns_status
ldns_output_format_clear_type(ldns_output_format * fmt,ldns_rr_type t)1805340022aSzrj ldns_output_format_clear_type(ldns_output_format* fmt, ldns_rr_type t)
1815340022aSzrj {
1825340022aSzrj 	ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt;
1835340022aSzrj 	ldns_status s;
1845340022aSzrj 
1855340022aSzrj 	assert(fmt != NULL);
1865340022aSzrj 
1875340022aSzrj 	if (!(fmt_st->flags & LDNS_FMT_RFC3597)) {
1885340022aSzrj 		ldns_output_format_set(fmt, LDNS_FMT_RFC3597);
1895340022aSzrj 	}
1905340022aSzrj 	if (! fmt_st->bitmap) {
1915340022aSzrj 		s = ldns_rdf_bitmap_known_rr_types(&fmt_st->bitmap);
1925340022aSzrj 		if (s != LDNS_STATUS_OK) {
1935340022aSzrj 			return s;
1945340022aSzrj 		}
1955340022aSzrj 	}
1965340022aSzrj 	return ldns_nsec_bitmap_clear_type(fmt_st->bitmap, t);
1975340022aSzrj }
1985340022aSzrj 
199825eb42bSJan Lentfer ldns_status
ldns_pkt_opcode2buffer_str(ldns_buffer * output,ldns_pkt_opcode opcode)200825eb42bSJan Lentfer ldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode)
201825eb42bSJan Lentfer {
202825eb42bSJan Lentfer 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode);
203825eb42bSJan Lentfer 	if (lt && lt->name) {
204825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", lt->name);
205825eb42bSJan Lentfer 	} else {
206825eb42bSJan Lentfer 		ldns_buffer_printf(output, "OPCODE%u", opcode);
207825eb42bSJan Lentfer 	}
208825eb42bSJan Lentfer 	return ldns_buffer_status(output);
209825eb42bSJan Lentfer }
210825eb42bSJan Lentfer 
211825eb42bSJan Lentfer ldns_status
ldns_pkt_rcode2buffer_str(ldns_buffer * output,ldns_pkt_rcode rcode)212825eb42bSJan Lentfer ldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode)
213825eb42bSJan Lentfer {
214825eb42bSJan Lentfer 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode);
215825eb42bSJan Lentfer 	if (lt && lt->name) {
216825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", lt->name);
217825eb42bSJan Lentfer 	} else {
218825eb42bSJan Lentfer 		ldns_buffer_printf(output, "RCODE%u", rcode);
219825eb42bSJan Lentfer 	}
220825eb42bSJan Lentfer 	return ldns_buffer_status(output);
221825eb42bSJan Lentfer }
222825eb42bSJan Lentfer 
223825eb42bSJan Lentfer ldns_status
ldns_algorithm2buffer_str(ldns_buffer * output,ldns_algorithm algorithm)224825eb42bSJan Lentfer ldns_algorithm2buffer_str(ldns_buffer *output,
225825eb42bSJan Lentfer                           ldns_algorithm algorithm)
226825eb42bSJan Lentfer {
227825eb42bSJan Lentfer 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms,
228825eb42bSJan Lentfer 	                                          algorithm);
229825eb42bSJan Lentfer 	if (lt && lt->name) {
230825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", lt->name);
231825eb42bSJan Lentfer 	} else {
232825eb42bSJan Lentfer 		ldns_buffer_printf(output, "ALG%u", algorithm);
233825eb42bSJan Lentfer 	}
234825eb42bSJan Lentfer 	return ldns_buffer_status(output);
235825eb42bSJan Lentfer }
236825eb42bSJan Lentfer 
237825eb42bSJan Lentfer ldns_status
ldns_cert_algorithm2buffer_str(ldns_buffer * output,ldns_cert_algorithm cert_algorithm)238825eb42bSJan Lentfer ldns_cert_algorithm2buffer_str(ldns_buffer *output,
239825eb42bSJan Lentfer                                ldns_cert_algorithm cert_algorithm)
240825eb42bSJan Lentfer {
241825eb42bSJan Lentfer 	ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms,
242825eb42bSJan Lentfer 	                                          cert_algorithm);
243825eb42bSJan Lentfer 	if (lt && lt->name) {
244825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", lt->name);
245825eb42bSJan Lentfer 	} else {
246825eb42bSJan Lentfer 		ldns_buffer_printf(output, "CERT_ALG%u",
247825eb42bSJan Lentfer 		                   cert_algorithm);
248825eb42bSJan Lentfer 	}
249825eb42bSJan Lentfer 	return ldns_buffer_status(output);
250825eb42bSJan Lentfer }
251825eb42bSJan Lentfer 
252825eb42bSJan Lentfer char *
ldns_pkt_opcode2str(ldns_pkt_opcode opcode)253825eb42bSJan Lentfer ldns_pkt_opcode2str(ldns_pkt_opcode opcode)
254825eb42bSJan Lentfer {
255825eb42bSJan Lentfer 	char *str;
256825eb42bSJan Lentfer 	ldns_buffer *buf;
257825eb42bSJan Lentfer 
258825eb42bSJan Lentfer 	buf = ldns_buffer_new(12);
259fd185f4dSJan Lentfer 	if (!buf) {
260fd185f4dSJan Lentfer 		return NULL;
261fd185f4dSJan Lentfer 	}
262825eb42bSJan Lentfer 
263fd185f4dSJan Lentfer 	str = NULL;
264825eb42bSJan Lentfer 	if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
265d1b2b5caSJohn Marino 		str = ldns_buffer_export2str(buf);
266825eb42bSJan Lentfer 	}
267825eb42bSJan Lentfer 
268825eb42bSJan Lentfer 	ldns_buffer_free(buf);
269825eb42bSJan Lentfer 	return str;
270825eb42bSJan Lentfer }
271825eb42bSJan Lentfer 
272825eb42bSJan Lentfer char *
ldns_pkt_rcode2str(ldns_pkt_rcode rcode)273825eb42bSJan Lentfer ldns_pkt_rcode2str(ldns_pkt_rcode rcode)
274825eb42bSJan Lentfer {
275825eb42bSJan Lentfer 	char *str;
276825eb42bSJan Lentfer 	ldns_buffer *buf;
277825eb42bSJan Lentfer 
278825eb42bSJan Lentfer 	buf = ldns_buffer_new(10);
279fd185f4dSJan Lentfer 	if (!buf) {
280fd185f4dSJan Lentfer 		return NULL;
281fd185f4dSJan Lentfer 	}
282825eb42bSJan Lentfer 
283fd185f4dSJan Lentfer 	str = NULL;
284825eb42bSJan Lentfer 	if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
285d1b2b5caSJohn Marino 		str = ldns_buffer_export2str(buf);
286825eb42bSJan Lentfer 	}
287825eb42bSJan Lentfer 
288825eb42bSJan Lentfer 	ldns_buffer_free(buf);
289825eb42bSJan Lentfer 	return str;
290825eb42bSJan Lentfer }
291825eb42bSJan Lentfer 
292825eb42bSJan Lentfer char *
ldns_pkt_algorithm2str(ldns_algorithm algorithm)293825eb42bSJan Lentfer ldns_pkt_algorithm2str(ldns_algorithm algorithm)
294825eb42bSJan Lentfer {
295825eb42bSJan Lentfer 	char *str;
296825eb42bSJan Lentfer 	ldns_buffer *buf;
297825eb42bSJan Lentfer 
298825eb42bSJan Lentfer 	buf = ldns_buffer_new(10);
299fd185f4dSJan Lentfer 	if (!buf) {
300fd185f4dSJan Lentfer 		return NULL;
301fd185f4dSJan Lentfer 	}
302825eb42bSJan Lentfer 
303fd185f4dSJan Lentfer 	str = NULL;
304825eb42bSJan Lentfer 	if (ldns_algorithm2buffer_str(buf, algorithm)
305825eb42bSJan Lentfer 	    == LDNS_STATUS_OK) {
306d1b2b5caSJohn Marino 		str = ldns_buffer_export2str(buf);
307825eb42bSJan Lentfer 	}
308825eb42bSJan Lentfer 
309825eb42bSJan Lentfer 	ldns_buffer_free(buf);
310825eb42bSJan Lentfer 	return str;
311825eb42bSJan Lentfer }
312825eb42bSJan Lentfer 
313825eb42bSJan Lentfer char *
ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)314825eb42bSJan Lentfer ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)
315825eb42bSJan Lentfer {
316825eb42bSJan Lentfer 	char *str;
317825eb42bSJan Lentfer 	ldns_buffer *buf;
318825eb42bSJan Lentfer 
319825eb42bSJan Lentfer 	buf = ldns_buffer_new(10);
320fd185f4dSJan Lentfer 	if (!buf) {
321fd185f4dSJan Lentfer 		return NULL;
322fd185f4dSJan Lentfer 	}
323825eb42bSJan Lentfer 
324fd185f4dSJan Lentfer 	str = NULL;
325825eb42bSJan Lentfer 	if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
326825eb42bSJan Lentfer 	    == LDNS_STATUS_OK) {
327d1b2b5caSJohn Marino 		str = ldns_buffer_export2str(buf);
328825eb42bSJan Lentfer 	}
329825eb42bSJan Lentfer 
330825eb42bSJan Lentfer 	ldns_buffer_free(buf);
331825eb42bSJan Lentfer 	return str;
332825eb42bSJan Lentfer }
333825eb42bSJan Lentfer 
334825eb42bSJan Lentfer 
335825eb42bSJan Lentfer /* do NOT pass compressed data here :p */
336825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_dname(ldns_buffer * output,const ldns_rdf * dname)337825eb42bSJan Lentfer ldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname)
338825eb42bSJan Lentfer {
339825eb42bSJan Lentfer 	/* can we do with 1 pos var? or without at all? */
340825eb42bSJan Lentfer 	uint8_t src_pos = 0;
341825eb42bSJan Lentfer 	uint8_t len;
342825eb42bSJan Lentfer 	uint8_t *data;
343825eb42bSJan Lentfer 	uint8_t i;
344fd185f4dSJan Lentfer 	unsigned char c;
345825eb42bSJan Lentfer 
346825eb42bSJan Lentfer 	data = (uint8_t*)ldns_rdf_data(dname);
347825eb42bSJan Lentfer 	len = data[src_pos];
348825eb42bSJan Lentfer 
349825eb42bSJan Lentfer 	if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) {
350825eb42bSJan Lentfer 		/* too large, return */
351825eb42bSJan Lentfer 		return LDNS_STATUS_DOMAINNAME_OVERFLOW;
352825eb42bSJan Lentfer 	}
353825eb42bSJan Lentfer 
354825eb42bSJan Lentfer 	/* special case: root label */
355825eb42bSJan Lentfer 	if (1 == ldns_rdf_size(dname)) {
356825eb42bSJan Lentfer 		ldns_buffer_printf(output, ".");
357825eb42bSJan Lentfer 	} else {
358825eb42bSJan Lentfer 		while ((len > 0) && src_pos < ldns_rdf_size(dname)) {
359825eb42bSJan Lentfer 			src_pos++;
360825eb42bSJan Lentfer 			for(i = 0; i < len; i++) {
361825eb42bSJan Lentfer 				/* paranoia check for various 'strange'
362825eb42bSJan Lentfer 				   characters in dnames
363825eb42bSJan Lentfer 				*/
364fd185f4dSJan Lentfer 				c = (unsigned char) data[src_pos];
365fd185f4dSJan Lentfer 				if(c == '.' || c == ';' ||
366fd185f4dSJan Lentfer 				   c == '(' || c == ')' ||
367fd185f4dSJan Lentfer 				   c == '\\') {
368825eb42bSJan Lentfer 					ldns_buffer_printf(output, "\\%c",
369825eb42bSJan Lentfer 							data[src_pos]);
370fd185f4dSJan Lentfer 				} else if (!(isascii(c) && isgraph(c))) {
371825eb42bSJan Lentfer 					ldns_buffer_printf(output, "\\%03u",
372825eb42bSJan Lentfer 						        data[src_pos]);
373825eb42bSJan Lentfer 				} else {
374825eb42bSJan Lentfer 					ldns_buffer_printf(output, "%c", data[src_pos]);
375825eb42bSJan Lentfer 				}
376825eb42bSJan Lentfer 				src_pos++;
377825eb42bSJan Lentfer 			}
378825eb42bSJan Lentfer 
379ac996e71SJan Lentfer 			if (src_pos < ldns_rdf_size(dname)) {
380825eb42bSJan Lentfer 				ldns_buffer_printf(output, ".");
381825eb42bSJan Lentfer 			}
382ac996e71SJan Lentfer 			len = data[src_pos];
383ac996e71SJan Lentfer 		}
384825eb42bSJan Lentfer 	}
385825eb42bSJan Lentfer 	return ldns_buffer_status(output);
386825eb42bSJan Lentfer }
387825eb42bSJan Lentfer 
388825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_int8(ldns_buffer * output,const ldns_rdf * rdf)389825eb42bSJan Lentfer ldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf)
390825eb42bSJan Lentfer {
391825eb42bSJan Lentfer 	uint8_t data = ldns_rdf_data(rdf)[0];
392825eb42bSJan Lentfer 	ldns_buffer_printf(output, "%lu", (unsigned long) data);
393825eb42bSJan Lentfer 	return ldns_buffer_status(output);
394825eb42bSJan Lentfer }
395825eb42bSJan Lentfer 
396825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_int16(ldns_buffer * output,const ldns_rdf * rdf)397825eb42bSJan Lentfer ldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf)
398825eb42bSJan Lentfer {
399825eb42bSJan Lentfer 	uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
400825eb42bSJan Lentfer 	ldns_buffer_printf(output, "%lu", (unsigned long) data);
401825eb42bSJan Lentfer 	return ldns_buffer_status(output);
402825eb42bSJan Lentfer }
403825eb42bSJan Lentfer 
404825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_int32(ldns_buffer * output,const ldns_rdf * rdf)405825eb42bSJan Lentfer ldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf)
406825eb42bSJan Lentfer {
407825eb42bSJan Lentfer 	uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf));
408825eb42bSJan Lentfer 	ldns_buffer_printf(output, "%lu", (unsigned long) data);
409825eb42bSJan Lentfer 	return ldns_buffer_status(output);
410825eb42bSJan Lentfer }
411825eb42bSJan Lentfer 
412825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_time(ldns_buffer * output,const ldns_rdf * rdf)413825eb42bSJan Lentfer ldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf)
414825eb42bSJan Lentfer {
415825eb42bSJan Lentfer 	/* create a YYYYMMDDHHMMSS string if possible */
416825eb42bSJan Lentfer 	struct tm tm;
417825eb42bSJan Lentfer 	char date_buf[16];
418825eb42bSJan Lentfer 
419825eb42bSJan Lentfer 	memset(&tm, 0, sizeof(tm));
420*ee791febSAntonio Huete Jimenez 	if (ldns_serial_arithmetics_gmtime_r(ldns_rdf2native_int32(rdf), time(NULL), &tm)
421b5dedccaSJan Lentfer 	    && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) {
422825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", date_buf);
423825eb42bSJan Lentfer 	}
424825eb42bSJan Lentfer 	return ldns_buffer_status(output);
425825eb42bSJan Lentfer }
426825eb42bSJan Lentfer 
427825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_a(ldns_buffer * output,const ldns_rdf * rdf)428825eb42bSJan Lentfer ldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf)
429825eb42bSJan Lentfer {
430825eb42bSJan Lentfer 	char str[INET_ADDRSTRLEN];
431825eb42bSJan Lentfer 
432825eb42bSJan Lentfer 	if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) {
433825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", str);
434825eb42bSJan Lentfer 	}
435825eb42bSJan Lentfer 	return ldns_buffer_status(output);
436825eb42bSJan Lentfer }
437825eb42bSJan Lentfer 
438825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_aaaa(ldns_buffer * output,const ldns_rdf * rdf)439825eb42bSJan Lentfer ldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf)
440825eb42bSJan Lentfer {
441825eb42bSJan Lentfer 	char str[INET6_ADDRSTRLEN];
442825eb42bSJan Lentfer 
443825eb42bSJan Lentfer 	if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) {
444825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", str);
445825eb42bSJan Lentfer 	}
446825eb42bSJan Lentfer 
447825eb42bSJan Lentfer 	return ldns_buffer_status(output);
448825eb42bSJan Lentfer }
449825eb42bSJan Lentfer 
4505340022aSzrj static void
ldns_characters2buffer_str(ldns_buffer * output,size_t amount,const uint8_t * characters)4515340022aSzrj ldns_characters2buffer_str(ldns_buffer* output,
4525340022aSzrj 		size_t amount, const uint8_t* characters)
453825eb42bSJan Lentfer {
4545340022aSzrj 	uint8_t ch;
4555340022aSzrj 	while (amount > 0) {
4565340022aSzrj 		ch = *characters++;
457825eb42bSJan Lentfer 		if (isprint((int)ch) || ch == '\t') {
458825eb42bSJan Lentfer 			if (ch == '\"' || ch == '\\')
459825eb42bSJan Lentfer 				ldns_buffer_printf(output, "\\%c", ch);
460825eb42bSJan Lentfer 			else
461825eb42bSJan Lentfer 				ldns_buffer_printf(output, "%c", ch);
462825eb42bSJan Lentfer 		} else {
463fd185f4dSJan Lentfer 			ldns_buffer_printf(output, "\\%03u",
464fd185f4dSJan Lentfer                                 (unsigned)(uint8_t) ch);
465825eb42bSJan Lentfer 		}
4665340022aSzrj 		amount--;
467825eb42bSJan Lentfer 	}
4685340022aSzrj }
4695340022aSzrj 
4705340022aSzrj ldns_status
ldns_rdf2buffer_str_str(ldns_buffer * output,const ldns_rdf * rdf)4715340022aSzrj ldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf)
4725340022aSzrj {
4735340022aSzrj         if(ldns_rdf_size(rdf) < 1) {
4745340022aSzrj                 return LDNS_STATUS_WIRE_RDATA_ERR;
4755340022aSzrj         }
4765340022aSzrj         if((int)ldns_rdf_size(rdf) < (int)ldns_rdf_data(rdf)[0] + 1) {
4775340022aSzrj                 return LDNS_STATUS_WIRE_RDATA_ERR;
4785340022aSzrj         }
4795340022aSzrj 	ldns_buffer_printf(output, "\"");
4805340022aSzrj 	ldns_characters2buffer_str(output,
4815340022aSzrj 			ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf) + 1);
482825eb42bSJan Lentfer 	ldns_buffer_printf(output, "\"");
483825eb42bSJan Lentfer 	return ldns_buffer_status(output);
484825eb42bSJan Lentfer }
485825eb42bSJan Lentfer 
486825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_b64(ldns_buffer * output,const ldns_rdf * rdf)487825eb42bSJan Lentfer ldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf)
488825eb42bSJan Lentfer {
489819dec71SDaniel Fojt 	size_t size;
490819dec71SDaniel Fojt 	char *b64;
491819dec71SDaniel Fojt 
492819dec71SDaniel Fojt 	if (ldns_rdf_size(rdf) == 0) {
493819dec71SDaniel Fojt 		ldns_buffer_printf(output, "0");
494819dec71SDaniel Fojt 		return ldns_buffer_status(output);
495819dec71SDaniel Fojt 	} else
496819dec71SDaniel Fojt 		size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf));
497819dec71SDaniel Fojt 
498819dec71SDaniel Fojt 	if (!(b64 = LDNS_XMALLOC(char, size)))
499819dec71SDaniel Fojt 		return LDNS_STATUS_MEM_ERR;
500819dec71SDaniel Fojt 
501825eb42bSJan Lentfer 	if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) {
502825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", b64);
503825eb42bSJan Lentfer 	}
504825eb42bSJan Lentfer 	LDNS_FREE(b64);
505825eb42bSJan Lentfer 	return ldns_buffer_status(output);
506825eb42bSJan Lentfer }
507825eb42bSJan Lentfer 
508825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_b32_ext(ldns_buffer * output,const ldns_rdf * rdf)509825eb42bSJan Lentfer ldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf)
510825eb42bSJan Lentfer {
511ac996e71SJan Lentfer 	size_t size;
512ac996e71SJan Lentfer 	char *b32;
513ac996e71SJan Lentfer 	if(ldns_rdf_size(rdf) == 0)
514ac996e71SJan Lentfer 		return LDNS_STATUS_OK;
515ac996e71SJan Lentfer         /* remove -1 for the b32-hash-len octet */
516ac996e71SJan Lentfer 	size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
517ac996e71SJan Lentfer         /* add one for the end nul for the string */
518ac996e71SJan Lentfer 	b32 = LDNS_XMALLOC(char, size + 1);
519ac996e71SJan Lentfer 	if(!b32) return LDNS_STATUS_MEM_ERR;
520825eb42bSJan Lentfer 	size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
521ac996e71SJan Lentfer 		ldns_rdf_size(rdf) - 1, b32, size+1);
522825eb42bSJan Lentfer 	if (size > 0) {
523825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", b32);
524825eb42bSJan Lentfer 	}
525825eb42bSJan Lentfer 	LDNS_FREE(b32);
526825eb42bSJan Lentfer 	return ldns_buffer_status(output);
527825eb42bSJan Lentfer }
528825eb42bSJan Lentfer 
529825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_hex(ldns_buffer * output,const ldns_rdf * rdf)530825eb42bSJan Lentfer ldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf)
531825eb42bSJan Lentfer {
532825eb42bSJan Lentfer 	size_t i;
533825eb42bSJan Lentfer 	for (i = 0; i < ldns_rdf_size(rdf); i++) {
534825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]);
535825eb42bSJan Lentfer 	}
536825eb42bSJan Lentfer 
537825eb42bSJan Lentfer 	return ldns_buffer_status(output);
538825eb42bSJan Lentfer }
539825eb42bSJan Lentfer 
5405340022aSzrj static ldns_status
ldns_rdf2buffer_str_type_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rdf * rdf)5415340022aSzrj ldns_rdf2buffer_str_type_fmt(ldns_buffer *output,
5425340022aSzrj 		const ldns_output_format* fmt, const ldns_rdf *rdf)
543825eb42bSJan Lentfer {
544825eb42bSJan Lentfer         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
545825eb42bSJan Lentfer 
5465340022aSzrj 	if (! ldns_output_format_covers_type(fmt, data) &&
5475340022aSzrj 			ldns_rr_descript(data) &&
5485340022aSzrj 			ldns_rr_descript(data)->_name) {
5495340022aSzrj 
5505340022aSzrj 		ldns_buffer_printf(output, "%s",ldns_rr_descript(data)->_name);
551825eb42bSJan Lentfer 	} else {
552825eb42bSJan Lentfer 		ldns_buffer_printf(output, "TYPE%u", data);
553825eb42bSJan Lentfer 	}
554825eb42bSJan Lentfer 	return  ldns_buffer_status(output);
555825eb42bSJan Lentfer }
556825eb42bSJan Lentfer 
557825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_type(ldns_buffer * output,const ldns_rdf * rdf)5585340022aSzrj ldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf)
5595340022aSzrj {
5605340022aSzrj 	return ldns_rdf2buffer_str_type_fmt(output,
5615340022aSzrj 			ldns_output_format_default, rdf);
5625340022aSzrj }
5635340022aSzrj 
5645340022aSzrj ldns_status
ldns_rdf2buffer_str_class(ldns_buffer * output,const ldns_rdf * rdf)565825eb42bSJan Lentfer ldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf)
566825eb42bSJan Lentfer {
567825eb42bSJan Lentfer 	uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
568825eb42bSJan Lentfer 	ldns_lookup_table *lt;
569825eb42bSJan Lentfer 
570825eb42bSJan Lentfer  	lt = ldns_lookup_by_id(ldns_rr_classes, (int) data);
571825eb42bSJan Lentfer 	if (lt) {
572825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\t%s", lt->name);
573825eb42bSJan Lentfer 	} else {
574825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\tCLASS%d", data);
575825eb42bSJan Lentfer 	}
576825eb42bSJan Lentfer 	return ldns_buffer_status(output);
577825eb42bSJan Lentfer }
578825eb42bSJan Lentfer 
579825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_cert_alg(ldns_buffer * output,const ldns_rdf * rdf)580825eb42bSJan Lentfer ldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf)
581825eb42bSJan Lentfer {
582825eb42bSJan Lentfer         uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
583825eb42bSJan Lentfer 	ldns_lookup_table *lt;
584825eb42bSJan Lentfer  	lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data);
585825eb42bSJan Lentfer 	if (lt) {
586825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", lt->name);
587825eb42bSJan Lentfer 	} else {
588825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%d", data);
589825eb42bSJan Lentfer 	}
590825eb42bSJan Lentfer 	return ldns_buffer_status(output);
591825eb42bSJan Lentfer }
592825eb42bSJan Lentfer 
593825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_alg(ldns_buffer * output,const ldns_rdf * rdf)594825eb42bSJan Lentfer ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf)
595825eb42bSJan Lentfer {
5965340022aSzrj 	return ldns_rdf2buffer_str_int8(output, rdf);
597825eb42bSJan Lentfer }
598825eb42bSJan Lentfer 
599825eb42bSJan Lentfer static void
loc_cm_print(ldns_buffer * output,uint8_t mantissa,uint8_t exponent)600825eb42bSJan Lentfer loc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent)
601825eb42bSJan Lentfer {
602825eb42bSJan Lentfer 	uint8_t i;
603825eb42bSJan Lentfer 	/* is it 0.<two digits> ? */
604825eb42bSJan Lentfer 	if(exponent < 2) {
605825eb42bSJan Lentfer 		if(exponent == 1)
606825eb42bSJan Lentfer 			mantissa *= 10;
607825eb42bSJan Lentfer 		ldns_buffer_printf(output, "0.%02ld", (long)mantissa);
608825eb42bSJan Lentfer 		return;
609825eb42bSJan Lentfer 	}
610825eb42bSJan Lentfer 	/* always <digit><string of zeros> */
611825eb42bSJan Lentfer 	ldns_buffer_printf(output, "%d", (int)mantissa);
612825eb42bSJan Lentfer 	for(i=0; i<exponent-2; i++)
613825eb42bSJan Lentfer 		ldns_buffer_printf(output, "0");
614825eb42bSJan Lentfer }
615825eb42bSJan Lentfer 
616825eb42bSJan Lentfer ldns_status
ldns_rr_type2buffer_str(ldns_buffer * output,const ldns_rr_type type)617825eb42bSJan Lentfer ldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type)
618825eb42bSJan Lentfer {
619825eb42bSJan Lentfer 	const ldns_rr_descriptor *descriptor;
620825eb42bSJan Lentfer 
621825eb42bSJan Lentfer 	descriptor = ldns_rr_descript(type);
622825eb42bSJan Lentfer 
623825eb42bSJan Lentfer 	switch (type) {
624825eb42bSJan Lentfer 		case LDNS_RR_TYPE_IXFR:
625825eb42bSJan Lentfer 			ldns_buffer_printf(output, "IXFR");
626825eb42bSJan Lentfer 			break;
627825eb42bSJan Lentfer 		case LDNS_RR_TYPE_AXFR:
628825eb42bSJan Lentfer 			ldns_buffer_printf(output, "AXFR");
629825eb42bSJan Lentfer 			break;
630825eb42bSJan Lentfer 		case LDNS_RR_TYPE_MAILA:
631825eb42bSJan Lentfer 			ldns_buffer_printf(output, "MAILA");
632825eb42bSJan Lentfer 			break;
633825eb42bSJan Lentfer 		case LDNS_RR_TYPE_MAILB:
634825eb42bSJan Lentfer 			ldns_buffer_printf(output, "MAILB");
635825eb42bSJan Lentfer 			break;
636825eb42bSJan Lentfer 		case LDNS_RR_TYPE_ANY:
637825eb42bSJan Lentfer 			ldns_buffer_printf(output, "ANY");
638825eb42bSJan Lentfer 			break;
639825eb42bSJan Lentfer 		default:
6405340022aSzrj 			if (descriptor && descriptor->_name) {
6415340022aSzrj 				ldns_buffer_printf(output, "%s", descriptor->_name);
6425340022aSzrj 			} else {
643825eb42bSJan Lentfer 				ldns_buffer_printf(output, "TYPE%u", type);
644825eb42bSJan Lentfer 			}
645825eb42bSJan Lentfer 	}
646825eb42bSJan Lentfer 	return ldns_buffer_status(output);
647825eb42bSJan Lentfer }
648825eb42bSJan Lentfer 
649825eb42bSJan Lentfer char *
ldns_rr_type2str(const ldns_rr_type type)650825eb42bSJan Lentfer ldns_rr_type2str(const ldns_rr_type type)
651825eb42bSJan Lentfer {
652825eb42bSJan Lentfer 	char *str;
653825eb42bSJan Lentfer 	ldns_buffer *buf;
654825eb42bSJan Lentfer 
655825eb42bSJan Lentfer 	buf = ldns_buffer_new(10);
656fd185f4dSJan Lentfer 	if (!buf) {
657fd185f4dSJan Lentfer 		return NULL;
658fd185f4dSJan Lentfer 	}
659825eb42bSJan Lentfer 
660fd185f4dSJan Lentfer 	str = NULL;
661825eb42bSJan Lentfer 	if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
662d1b2b5caSJohn Marino 		str = ldns_buffer_export2str(buf);
663825eb42bSJan Lentfer 	}
664825eb42bSJan Lentfer 
665825eb42bSJan Lentfer 	ldns_buffer_free(buf);
666825eb42bSJan Lentfer 	return str;
667825eb42bSJan Lentfer }
668825eb42bSJan Lentfer 
669825eb42bSJan Lentfer 
670825eb42bSJan Lentfer ldns_status
ldns_rr_class2buffer_str(ldns_buffer * output,const ldns_rr_class klass)671825eb42bSJan Lentfer ldns_rr_class2buffer_str(ldns_buffer *output,
672825eb42bSJan Lentfer                          const ldns_rr_class klass)
673825eb42bSJan Lentfer {
674825eb42bSJan Lentfer 	ldns_lookup_table *lt;
675825eb42bSJan Lentfer 
676825eb42bSJan Lentfer 	lt = ldns_lookup_by_id(ldns_rr_classes, klass);
677825eb42bSJan Lentfer 	if (lt) {
678825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s", lt->name);
679825eb42bSJan Lentfer 	} else {
680825eb42bSJan Lentfer 		ldns_buffer_printf(output, "CLASS%d", klass);
681825eb42bSJan Lentfer 	}
682825eb42bSJan Lentfer 	return ldns_buffer_status(output);
683825eb42bSJan Lentfer }
684825eb42bSJan Lentfer 
685825eb42bSJan Lentfer char *
ldns_rr_class2str(const ldns_rr_class klass)686825eb42bSJan Lentfer ldns_rr_class2str(const ldns_rr_class klass)
687825eb42bSJan Lentfer {
688825eb42bSJan Lentfer 	ldns_buffer *buf;
689825eb42bSJan Lentfer 	char *str;
690825eb42bSJan Lentfer 
691825eb42bSJan Lentfer 	buf = ldns_buffer_new(10);
692fd185f4dSJan Lentfer 	if (!buf) {
693fd185f4dSJan Lentfer 		return NULL;
694fd185f4dSJan Lentfer 	}
695fd185f4dSJan Lentfer 
696fd185f4dSJan Lentfer 	str = NULL;
697825eb42bSJan Lentfer 	if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
698d1b2b5caSJohn Marino 		str = ldns_buffer_export2str(buf);
699825eb42bSJan Lentfer 	}
700825eb42bSJan Lentfer 	ldns_buffer_free(buf);
701825eb42bSJan Lentfer 	return str;
702825eb42bSJan Lentfer }
703825eb42bSJan Lentfer 
704825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_loc(ldns_buffer * output,const ldns_rdf * rdf)705825eb42bSJan Lentfer ldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf)
706825eb42bSJan Lentfer {
707825eb42bSJan Lentfer 	/* we could do checking (ie degrees < 90 etc)? */
7085340022aSzrj 	uint8_t version;
709825eb42bSJan Lentfer 	uint8_t size;
710825eb42bSJan Lentfer 	uint8_t horizontal_precision;
711825eb42bSJan Lentfer 	uint8_t vertical_precision;
712825eb42bSJan Lentfer 	uint32_t longitude;
713825eb42bSJan Lentfer 	uint32_t latitude;
714825eb42bSJan Lentfer 	uint32_t altitude;
715*ee791febSAntonio Huete Jimenez 	char latitude_hemisphere;
716*ee791febSAntonio Huete Jimenez 	char longitude_hemisphere;
717825eb42bSJan Lentfer 	uint32_t h;
718825eb42bSJan Lentfer 	uint32_t m;
719825eb42bSJan Lentfer 	double s;
720825eb42bSJan Lentfer 
721825eb42bSJan Lentfer 	uint32_t equator = (uint32_t) ldns_power(2, 31);
722825eb42bSJan Lentfer 
7235340022aSzrj         if(ldns_rdf_size(rdf) < 1) {
7245340022aSzrj                 return LDNS_STATUS_WIRE_RDATA_ERR;
7255340022aSzrj         }
7265340022aSzrj        	version = ldns_rdf_data(rdf)[0];
727825eb42bSJan Lentfer 	if (version == 0) {
7285340022aSzrj 		if(ldns_rdf_size(rdf) < 16) {
7295340022aSzrj 			return LDNS_STATUS_WIRE_RDATA_ERR;
7305340022aSzrj 		}
731825eb42bSJan Lentfer 		size = ldns_rdf_data(rdf)[1];
732825eb42bSJan Lentfer 		horizontal_precision = ldns_rdf_data(rdf)[2];
733825eb42bSJan Lentfer 		vertical_precision = ldns_rdf_data(rdf)[3];
734825eb42bSJan Lentfer 
735825eb42bSJan Lentfer 		latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]);
736825eb42bSJan Lentfer 		longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]);
737825eb42bSJan Lentfer 		altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]);
738825eb42bSJan Lentfer 
739825eb42bSJan Lentfer 		if (latitude > equator) {
740*ee791febSAntonio Huete Jimenez 			latitude_hemisphere = 'N';
741825eb42bSJan Lentfer 			latitude = latitude - equator;
742825eb42bSJan Lentfer 		} else {
743*ee791febSAntonio Huete Jimenez 			latitude_hemisphere = 'S';
744825eb42bSJan Lentfer 			latitude = equator - latitude;
745825eb42bSJan Lentfer 		}
746825eb42bSJan Lentfer 		h = latitude / (1000 * 60 * 60);
747825eb42bSJan Lentfer 		latitude = latitude % (1000 * 60 * 60);
748825eb42bSJan Lentfer 		m = latitude / (1000 * 60);
749825eb42bSJan Lentfer 		latitude = latitude % (1000 * 60);
750825eb42bSJan Lentfer 		s = (double) latitude / 1000.0;
751825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
752*ee791febSAntonio Huete Jimenez 			h, m, s, latitude_hemisphere);
753825eb42bSJan Lentfer 
754825eb42bSJan Lentfer 		if (longitude > equator) {
755*ee791febSAntonio Huete Jimenez 			longitude_hemisphere = 'E';
756825eb42bSJan Lentfer 			longitude = longitude - equator;
757825eb42bSJan Lentfer 		} else {
758*ee791febSAntonio Huete Jimenez 			longitude_hemisphere = 'W';
759825eb42bSJan Lentfer 			longitude = equator - longitude;
760825eb42bSJan Lentfer 		}
761825eb42bSJan Lentfer 		h = longitude / (1000 * 60 * 60);
762825eb42bSJan Lentfer 		longitude = longitude % (1000 * 60 * 60);
763825eb42bSJan Lentfer 		m = longitude / (1000 * 60);
764825eb42bSJan Lentfer 		longitude = longitude % (1000 * 60);
765825eb42bSJan Lentfer 		s = (double) longitude / (1000.0);
766825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
767*ee791febSAntonio Huete Jimenez 			h, m, s, longitude_hemisphere);
768825eb42bSJan Lentfer 
769825eb42bSJan Lentfer 		s = ((double) altitude) / 100;
770825eb42bSJan Lentfer 		s -= 100000;
771825eb42bSJan Lentfer 
772825eb42bSJan Lentfer 		if(altitude%100 != 0)
773825eb42bSJan Lentfer 			ldns_buffer_printf(output, "%.2f", s);
774825eb42bSJan Lentfer 		else
775825eb42bSJan Lentfer 			ldns_buffer_printf(output, "%.0f", s);
776825eb42bSJan Lentfer 
777825eb42bSJan Lentfer 		ldns_buffer_printf(output, "m ");
778825eb42bSJan Lentfer 
779825eb42bSJan Lentfer 		loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f);
780825eb42bSJan Lentfer 		ldns_buffer_printf(output, "m ");
781825eb42bSJan Lentfer 
782825eb42bSJan Lentfer 		loc_cm_print(output, (horizontal_precision & 0xf0) >> 4,
783825eb42bSJan Lentfer 			horizontal_precision & 0x0f);
784825eb42bSJan Lentfer 		ldns_buffer_printf(output, "m ");
785825eb42bSJan Lentfer 
786825eb42bSJan Lentfer 		loc_cm_print(output, (vertical_precision & 0xf0) >> 4,
787825eb42bSJan Lentfer 			vertical_precision & 0x0f);
788825eb42bSJan Lentfer 		ldns_buffer_printf(output, "m");
789825eb42bSJan Lentfer 
790825eb42bSJan Lentfer 		return ldns_buffer_status(output);
791825eb42bSJan Lentfer 	} else {
792825eb42bSJan Lentfer 		return ldns_rdf2buffer_str_hex(output, rdf);
793825eb42bSJan Lentfer 	}
794825eb42bSJan Lentfer }
795825eb42bSJan Lentfer 
796825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_unknown(ldns_buffer * output,const ldns_rdf * rdf)797825eb42bSJan Lentfer ldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf)
798825eb42bSJan Lentfer {
799825eb42bSJan Lentfer 	ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf));
800825eb42bSJan Lentfer 	return ldns_rdf2buffer_str_hex(output, rdf);
801825eb42bSJan Lentfer }
802825eb42bSJan Lentfer 
803825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_nsap(ldns_buffer * output,const ldns_rdf * rdf)804825eb42bSJan Lentfer ldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf)
805825eb42bSJan Lentfer {
806825eb42bSJan Lentfer 	ldns_buffer_printf(output, "0x");
807825eb42bSJan Lentfer 	return ldns_rdf2buffer_str_hex(output, rdf);
808825eb42bSJan Lentfer }
809825eb42bSJan Lentfer 
810825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_atma(ldns_buffer * output,const ldns_rdf * rdf)811825eb42bSJan Lentfer ldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf)
812825eb42bSJan Lentfer {
813825eb42bSJan Lentfer 	return ldns_rdf2buffer_str_hex(output, rdf);
814825eb42bSJan Lentfer }
815825eb42bSJan Lentfer 
816825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_wks(ldns_buffer * output,const ldns_rdf * rdf)817825eb42bSJan Lentfer ldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf)
818825eb42bSJan Lentfer {
819825eb42bSJan Lentfer 	/* protocol, followed by bitmap of services */
820825eb42bSJan Lentfer 	struct protoent *protocol;
821825eb42bSJan Lentfer 	char *proto_name = NULL;
822825eb42bSJan Lentfer 	uint8_t protocol_nr;
823825eb42bSJan Lentfer 	struct servent *service;
824825eb42bSJan Lentfer 	uint16_t current_service;
825825eb42bSJan Lentfer 
8265340022aSzrj         if(ldns_rdf_size(rdf) < 1) {
8275340022aSzrj                 return LDNS_STATUS_WIRE_RDATA_ERR;
8285340022aSzrj         }
829825eb42bSJan Lentfer 	protocol_nr = ldns_rdf_data(rdf)[0];
830825eb42bSJan Lentfer 	protocol = getprotobynumber((int) protocol_nr);
831825eb42bSJan Lentfer 	if (protocol && (protocol->p_name != NULL)) {
832825eb42bSJan Lentfer 		proto_name = protocol->p_name;
833825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%s ", protocol->p_name);
834825eb42bSJan Lentfer 	} else {
835825eb42bSJan Lentfer 		ldns_buffer_printf(output, "%u ", protocol_nr);
836825eb42bSJan Lentfer 	}
837825eb42bSJan Lentfer 
838825eb42bSJan Lentfer #ifdef HAVE_ENDPROTOENT
839825eb42bSJan Lentfer 	endprotoent();
840825eb42bSJan Lentfer #endif
841825eb42bSJan Lentfer 
842825eb42bSJan Lentfer 	for (current_service = 0;
8435340022aSzrj 	     current_service < (ldns_rdf_size(rdf)-1)*8; current_service++) {
844825eb42bSJan Lentfer 		if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) {
845825eb42bSJan Lentfer 			service = getservbyport((int) htons(current_service),
846825eb42bSJan Lentfer 			                        proto_name);
847825eb42bSJan Lentfer 			if (service && service->s_name) {
848825eb42bSJan Lentfer 				ldns_buffer_printf(output, "%s ", service->s_name);
849825eb42bSJan Lentfer 			} else {
850825eb42bSJan Lentfer 				ldns_buffer_printf(output, "%u ", current_service);
851825eb42bSJan Lentfer 			}
852825eb42bSJan Lentfer #ifdef HAVE_ENDSERVENT
853825eb42bSJan Lentfer 			endservent();
854825eb42bSJan Lentfer #endif
855825eb42bSJan Lentfer 		}
856*ee791febSAntonio Huete Jimenez 		/* exit from loop before integer overflow */
857*ee791febSAntonio Huete Jimenez 		if(current_service == 65535) { break; }
858825eb42bSJan Lentfer 	}
859825eb42bSJan Lentfer 	return ldns_buffer_status(output);
860825eb42bSJan Lentfer }
861825eb42bSJan Lentfer 
8625340022aSzrj static ldns_status
ldns_rdf2buffer_str_nsec_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rdf * rdf)8635340022aSzrj ldns_rdf2buffer_str_nsec_fmt(ldns_buffer *output,
8645340022aSzrj 		const ldns_output_format* fmt, const ldns_rdf *rdf)
865825eb42bSJan Lentfer {
866825eb42bSJan Lentfer 	/* Note: this code is duplicated in higher.c in
867825eb42bSJan Lentfer 	 * ldns_nsec_type_check() function
868825eb42bSJan Lentfer 	 */
869825eb42bSJan Lentfer 	uint8_t window_block_nr;
870825eb42bSJan Lentfer 	uint8_t bitmap_length;
871825eb42bSJan Lentfer 	uint16_t type;
872825eb42bSJan Lentfer 	uint16_t pos = 0;
873825eb42bSJan Lentfer 	uint16_t bit_pos;
874825eb42bSJan Lentfer 	uint8_t *data = ldns_rdf_data(rdf);
875825eb42bSJan Lentfer 
8765340022aSzrj 	while((size_t)(pos + 2) < ldns_rdf_size(rdf)) {
877825eb42bSJan Lentfer 		window_block_nr = data[pos];
878825eb42bSJan Lentfer 		bitmap_length = data[pos + 1];
879825eb42bSJan Lentfer 		pos += 2;
8805340022aSzrj 		if (ldns_rdf_size(rdf) < pos + bitmap_length) {
8815340022aSzrj 			return LDNS_STATUS_WIRE_RDATA_ERR;
8825340022aSzrj 		}
883825eb42bSJan Lentfer 		for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) {
8845340022aSzrj 			if (! ldns_get_bit(&data[pos], bit_pos)) {
8855340022aSzrj 				continue;
8865340022aSzrj 			}
887825eb42bSJan Lentfer 			type = 256 * (uint16_t) window_block_nr + bit_pos;
888825eb42bSJan Lentfer 
8895340022aSzrj 			if (! ldns_output_format_covers_type(fmt, type) &&
8905340022aSzrj 					ldns_rr_descript(type) &&
8915340022aSzrj 					ldns_rr_descript(type)->_name){
8925340022aSzrj 
893825eb42bSJan Lentfer 				ldns_buffer_printf(output, "%s ",
8945340022aSzrj 						ldns_rr_descript(type)->_name);
895825eb42bSJan Lentfer 			} else {
896825eb42bSJan Lentfer 				ldns_buffer_printf(output, "TYPE%u ", type);
897825eb42bSJan Lentfer 			}
898825eb42bSJan Lentfer 		}
899825eb42bSJan Lentfer 		pos += (uint16_t) bitmap_length;
900825eb42bSJan Lentfer 	}
901825eb42bSJan Lentfer 	return ldns_buffer_status(output);
902825eb42bSJan Lentfer }
903825eb42bSJan Lentfer 
904825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_nsec(ldns_buffer * output,const ldns_rdf * rdf)9055340022aSzrj ldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf)
9065340022aSzrj {
9075340022aSzrj 	return ldns_rdf2buffer_str_nsec_fmt(output,
9085340022aSzrj 			ldns_output_format_default, rdf);
9095340022aSzrj }
9105340022aSzrj 
9115340022aSzrj ldns_status
ldns_rdf2buffer_str_nsec3_salt(ldns_buffer * output,const ldns_rdf * rdf)912825eb42bSJan Lentfer ldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf)
913825eb42bSJan Lentfer {
914825eb42bSJan Lentfer 	uint8_t salt_length;
915825eb42bSJan Lentfer 	uint8_t salt_pos;
916825eb42bSJan Lentfer 
917825eb42bSJan Lentfer 	uint8_t *data = ldns_rdf_data(rdf);
918825eb42bSJan Lentfer 
9195340022aSzrj         if(ldns_rdf_size(rdf) < 1) {
9205340022aSzrj                 return LDNS_STATUS_WIRE_RDATA_ERR;
921fd185f4dSJan Lentfer         }
922825eb42bSJan Lentfer 	salt_length = data[0];
923825eb42bSJan Lentfer 	/* from now there are variable length entries so remember pos */
924ac996e71SJan Lentfer 	if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) {
925825eb42bSJan Lentfer 		ldns_buffer_printf(output, "- ");
926825eb42bSJan Lentfer 	} else {
927825eb42bSJan Lentfer 		for (salt_pos = 0; salt_pos < salt_length; salt_pos++) {
928825eb42bSJan Lentfer 			ldns_buffer_printf(output, "%02x", data[1 + salt_pos]);
929825eb42bSJan Lentfer 		}
930825eb42bSJan Lentfer 		ldns_buffer_printf(output, " ");
931825eb42bSJan Lentfer 	}
932825eb42bSJan Lentfer 
933825eb42bSJan Lentfer 	return ldns_buffer_status(output);
934825eb42bSJan Lentfer }
935825eb42bSJan Lentfer 
936825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_period(ldns_buffer * output,const ldns_rdf * rdf)937825eb42bSJan Lentfer ldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf)
938825eb42bSJan Lentfer {
939825eb42bSJan Lentfer 	/* period is the number of seconds */
9405340022aSzrj 	if (ldns_rdf_size(rdf) != 4) {
9415340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
9425340022aSzrj 	}
9435340022aSzrj 	ldns_buffer_printf(output, "%u", ldns_read_uint32(ldns_rdf_data(rdf)));
944825eb42bSJan Lentfer 	return ldns_buffer_status(output);
945825eb42bSJan Lentfer }
946825eb42bSJan Lentfer 
947825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_tsigtime(ldns_buffer * output,const ldns_rdf * rdf)948825eb42bSJan Lentfer ldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const  ldns_rdf *rdf)
949825eb42bSJan Lentfer {
950825eb42bSJan Lentfer 	/* tsigtime is 48 bits network order unsigned integer */
951825eb42bSJan Lentfer 	uint64_t tsigtime = 0;
952825eb42bSJan Lentfer 	uint8_t *data = ldns_rdf_data(rdf);
9535340022aSzrj 	uint64_t d0, d1, d2, d3, d4, d5;
954825eb42bSJan Lentfer 
9555340022aSzrj 	if (ldns_rdf_size(rdf) < 6) {
9565340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
957825eb42bSJan Lentfer 	}
9585340022aSzrj 	d0 = data[0]; /* cast to uint64 for shift operations */
9595340022aSzrj 	d1 = data[1];
9605340022aSzrj 	d2 = data[2];
9615340022aSzrj 	d3 = data[3];
9625340022aSzrj 	d4 = data[4];
9635340022aSzrj 	d5 = data[5];
9645340022aSzrj 	tsigtime = (d0<<40) | (d1<<32) | (d2<<24) | (d3<<16) | (d4<<8) | d5;
965825eb42bSJan Lentfer 
9665340022aSzrj 	ldns_buffer_printf(output, "%llu ", (long long)tsigtime);
967825eb42bSJan Lentfer 
968825eb42bSJan Lentfer 	return ldns_buffer_status(output);
969825eb42bSJan Lentfer }
970825eb42bSJan Lentfer 
971825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_apl(ldns_buffer * output,const ldns_rdf * rdf)972825eb42bSJan Lentfer ldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf)
973825eb42bSJan Lentfer {
974825eb42bSJan Lentfer 	uint8_t *data = ldns_rdf_data(rdf);
975ac996e71SJan Lentfer 	uint16_t address_family;
976ac996e71SJan Lentfer 	uint8_t prefix;
977825eb42bSJan Lentfer 	bool negation;
978825eb42bSJan Lentfer 	uint8_t adf_length;
979fd185f4dSJan Lentfer 	size_t i;
980fd185f4dSJan Lentfer 	size_t pos = 0;
981825eb42bSJan Lentfer 
982825eb42bSJan Lentfer 	while (pos < (unsigned int) ldns_rdf_size(rdf)) {
983fd185f4dSJan Lentfer                 if(pos + 3 >= (unsigned)ldns_rdf_size(rdf))
9845340022aSzrj                         return LDNS_STATUS_WIRE_RDATA_ERR;
985825eb42bSJan Lentfer 		address_family = ldns_read_uint16(&data[pos]);
986825eb42bSJan Lentfer 		prefix = data[pos + 2];
987825eb42bSJan Lentfer 		negation = data[pos + 3] & LDNS_APL_NEGATION;
988825eb42bSJan Lentfer 		adf_length = data[pos + 3] & LDNS_APL_MASK;
989825eb42bSJan Lentfer 		if (address_family == LDNS_APL_IP4) {
990825eb42bSJan Lentfer 			/* check if prefix < 32? */
991825eb42bSJan Lentfer 			if (negation) {
992825eb42bSJan Lentfer 				ldns_buffer_printf(output, "!");
993825eb42bSJan Lentfer 			}
994825eb42bSJan Lentfer 			ldns_buffer_printf(output, "%u:", address_family);
995825eb42bSJan Lentfer 			/* address is variable length 0 - 4 */
996825eb42bSJan Lentfer 			for (i = 0; i < 4; i++) {
997825eb42bSJan Lentfer 				if (i > 0) {
998825eb42bSJan Lentfer 					ldns_buffer_printf(output, ".");
999825eb42bSJan Lentfer 				}
1000825eb42bSJan Lentfer 				if (i < (unsigned short) adf_length) {
1001ac996e71SJan Lentfer                                         if(pos+i+4 >= ldns_rdf_size(rdf))
10025340022aSzrj 					    return LDNS_STATUS_WIRE_RDATA_ERR;
1003825eb42bSJan Lentfer 					ldns_buffer_printf(output, "%d",
1004825eb42bSJan Lentfer 					                   data[pos + i + 4]);
1005825eb42bSJan Lentfer 				} else {
1006825eb42bSJan Lentfer 					ldns_buffer_printf(output, "0");
1007825eb42bSJan Lentfer 				}
1008825eb42bSJan Lentfer 			}
1009825eb42bSJan Lentfer 			ldns_buffer_printf(output, "/%u ", prefix);
1010825eb42bSJan Lentfer 		} else if (address_family == LDNS_APL_IP6) {
1011825eb42bSJan Lentfer 			/* check if prefix < 128? */
1012825eb42bSJan Lentfer 			if (negation) {
1013825eb42bSJan Lentfer 				ldns_buffer_printf(output, "!");
1014825eb42bSJan Lentfer 			}
1015825eb42bSJan Lentfer 			ldns_buffer_printf(output, "%u:", address_family);
1016825eb42bSJan Lentfer 			/* address is variable length 0 - 16 */
1017825eb42bSJan Lentfer 			for (i = 0; i < 16; i++) {
1018825eb42bSJan Lentfer 				if (i % 2 == 0 && i > 0) {
1019825eb42bSJan Lentfer 					ldns_buffer_printf(output, ":");
1020825eb42bSJan Lentfer 				}
1021825eb42bSJan Lentfer 				if (i < (unsigned short) adf_length) {
1022ac996e71SJan Lentfer                                         if(pos+i+4 >= ldns_rdf_size(rdf))
10235340022aSzrj 					    return LDNS_STATUS_WIRE_RDATA_ERR;
1024825eb42bSJan Lentfer 					ldns_buffer_printf(output, "%02x",
1025825eb42bSJan Lentfer 					                   data[pos + i + 4]);
1026825eb42bSJan Lentfer 				} else {
1027825eb42bSJan Lentfer 					ldns_buffer_printf(output, "00");
1028825eb42bSJan Lentfer 				}
1029825eb42bSJan Lentfer 			}
1030825eb42bSJan Lentfer 			ldns_buffer_printf(output, "/%u ", prefix);
1031825eb42bSJan Lentfer 
1032825eb42bSJan Lentfer 		} else {
1033825eb42bSJan Lentfer 			/* unknown address family */
10345340022aSzrj 			ldns_buffer_printf(output,
10355340022aSzrj 					"Unknown address family: %u data: ",
1036825eb42bSJan Lentfer 					address_family);
1037825eb42bSJan Lentfer 			for (i = 1; i < (unsigned short) (4 + adf_length); i++) {
1038ac996e71SJan Lentfer                                 if(pos+i >= ldns_rdf_size(rdf))
10395340022aSzrj                                         return LDNS_STATUS_WIRE_RDATA_ERR;
1040825eb42bSJan Lentfer 				ldns_buffer_printf(output, "%02x", data[i]);
1041825eb42bSJan Lentfer 			}
1042825eb42bSJan Lentfer 		}
1043825eb42bSJan Lentfer 		pos += 4 + adf_length;
1044825eb42bSJan Lentfer 	}
1045825eb42bSJan Lentfer 	return ldns_buffer_status(output);
1046825eb42bSJan Lentfer }
1047825eb42bSJan Lentfer 
1048825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_int16_data(ldns_buffer * output,const ldns_rdf * rdf)1049825eb42bSJan Lentfer ldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf)
1050825eb42bSJan Lentfer {
10515340022aSzrj 	size_t size;
10525340022aSzrj 	char *b64;
10535340022aSzrj 	if (ldns_rdf_size(rdf) < 2) {
10545340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
10555340022aSzrj 	}
1056825eb42bSJan Lentfer 	/* Subtract the size (2) of the number that specifies the length */
10575340022aSzrj 	size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2);
10585340022aSzrj 	ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2);
10595340022aSzrj 	if (ldns_rdf_size(rdf) > 2) {
10605340022aSzrj 		b64 = LDNS_XMALLOC(char, size);
1061fd185f4dSJan Lentfer 		if(!b64)
1062fd185f4dSJan Lentfer 			return LDNS_STATUS_MEM_ERR;
1063825eb42bSJan Lentfer 
1064825eb42bSJan Lentfer 		if (ldns_rdf_size(rdf) > 2 &&
1065825eb42bSJan Lentfer 		ldns_b64_ntop(ldns_rdf_data(rdf) + 2,
1066825eb42bSJan Lentfer 					ldns_rdf_size(rdf) - 2,
1067825eb42bSJan Lentfer 					b64, size)) {
1068825eb42bSJan Lentfer 			ldns_buffer_printf(output, "%s", b64);
1069825eb42bSJan Lentfer 		}
1070825eb42bSJan Lentfer 		LDNS_FREE(b64);
10715340022aSzrj 	}
1072825eb42bSJan Lentfer 	return ldns_buffer_status(output);
1073825eb42bSJan Lentfer }
1074825eb42bSJan Lentfer 
1075825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_ipseckey(ldns_buffer * output,const ldns_rdf * rdf)1076825eb42bSJan Lentfer ldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf)
1077825eb42bSJan Lentfer {
1078825eb42bSJan Lentfer 	/* wire format from
1079825eb42bSJan Lentfer 	   http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt
1080825eb42bSJan Lentfer 	*/
1081825eb42bSJan Lentfer 	uint8_t *data = ldns_rdf_data(rdf);
1082825eb42bSJan Lentfer 	uint8_t precedence;
1083825eb42bSJan Lentfer 	uint8_t gateway_type;
1084825eb42bSJan Lentfer 	uint8_t algorithm;
1085825eb42bSJan Lentfer 
1086825eb42bSJan Lentfer 	ldns_rdf *gateway = NULL;
1087825eb42bSJan Lentfer 	uint8_t *gateway_data;
1088825eb42bSJan Lentfer 
1089825eb42bSJan Lentfer 	size_t public_key_size;
1090825eb42bSJan Lentfer 	uint8_t *public_key_data;
1091825eb42bSJan Lentfer 	ldns_rdf *public_key;
1092825eb42bSJan Lentfer 
1093825eb42bSJan Lentfer 	size_t offset = 0;
1094825eb42bSJan Lentfer 	ldns_status status;
1095825eb42bSJan Lentfer 
10965340022aSzrj 	if (ldns_rdf_size(rdf) < 3) {
10975340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
10985340022aSzrj 	}
1099825eb42bSJan Lentfer 	precedence = data[0];
1100825eb42bSJan Lentfer 	gateway_type = data[1];
1101825eb42bSJan Lentfer 	algorithm = data[2];
1102825eb42bSJan Lentfer 	offset = 3;
1103825eb42bSJan Lentfer 
1104825eb42bSJan Lentfer 	switch (gateway_type) {
1105825eb42bSJan Lentfer 		case 0:
1106825eb42bSJan Lentfer 			/* no gateway */
1107825eb42bSJan Lentfer 			break;
1108825eb42bSJan Lentfer 		case 1:
11095340022aSzrj 			if (ldns_rdf_size(rdf) < offset + LDNS_IP4ADDRLEN) {
11105340022aSzrj 				return LDNS_STATUS_ERR;
11115340022aSzrj 			}
1112819dec71SDaniel Fojt 			gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
1113819dec71SDaniel Fojt                         if(!gateway_data)
1114819dec71SDaniel Fojt                                 return LDNS_STATUS_MEM_ERR;
1115825eb42bSJan Lentfer 			memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN);
11165340022aSzrj 			gateway = ldns_rdf_new(LDNS_RDF_TYPE_A,
11175340022aSzrj 					LDNS_IP4ADDRLEN , gateway_data);
1118825eb42bSJan Lentfer 			offset += LDNS_IP4ADDRLEN;
1119fd185f4dSJan Lentfer                         if(!gateway) {
1120fd185f4dSJan Lentfer                                 LDNS_FREE(gateway_data);
1121fd185f4dSJan Lentfer                                 return LDNS_STATUS_MEM_ERR;
1122fd185f4dSJan Lentfer                         }
1123825eb42bSJan Lentfer 			break;
1124825eb42bSJan Lentfer 		case 2:
11255340022aSzrj 			if (ldns_rdf_size(rdf) < offset + LDNS_IP6ADDRLEN) {
11265340022aSzrj 				return LDNS_STATUS_ERR;
11275340022aSzrj 			}
1128819dec71SDaniel Fojt 			gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
1129819dec71SDaniel Fojt                         if(!gateway_data)
1130819dec71SDaniel Fojt                                 return LDNS_STATUS_MEM_ERR;
1131825eb42bSJan Lentfer 			memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN);
1132825eb42bSJan Lentfer 			offset += LDNS_IP6ADDRLEN;
1133825eb42bSJan Lentfer 			gateway =
11345340022aSzrj 				ldns_rdf_new(LDNS_RDF_TYPE_AAAA,
11355340022aSzrj 						LDNS_IP6ADDRLEN, gateway_data);
1136fd185f4dSJan Lentfer                         if(!gateway) {
1137fd185f4dSJan Lentfer                                 LDNS_FREE(gateway_data);
1138fd185f4dSJan Lentfer                                 return LDNS_STATUS_MEM_ERR;
1139fd185f4dSJan Lentfer                         }
1140825eb42bSJan Lentfer 			break;
1141825eb42bSJan Lentfer 		case 3:
11425340022aSzrj 			status = ldns_wire2dname(&gateway, data,
11435340022aSzrj 					ldns_rdf_size(rdf), &offset);
1144ac996e71SJan Lentfer                         if(status != LDNS_STATUS_OK)
1145ac996e71SJan Lentfer                                 return status;
1146825eb42bSJan Lentfer 			break;
1147825eb42bSJan Lentfer 		default:
1148825eb42bSJan Lentfer 			/* error? */
1149825eb42bSJan Lentfer 			break;
1150825eb42bSJan Lentfer 	}
1151825eb42bSJan Lentfer 
11525340022aSzrj 	if (ldns_rdf_size(rdf) <= offset) {
1153819dec71SDaniel Fojt                 ldns_rdf_deep_free(gateway);
11545340022aSzrj 		return LDNS_STATUS_ERR;
11555340022aSzrj 	}
1156825eb42bSJan Lentfer 	public_key_size = ldns_rdf_size(rdf) - offset;
1157825eb42bSJan Lentfer 	public_key_data = LDNS_XMALLOC(uint8_t, public_key_size);
1158fd185f4dSJan Lentfer         if(!public_key_data) {
11595340022aSzrj                 ldns_rdf_deep_free(gateway);
1160fd185f4dSJan Lentfer                 return LDNS_STATUS_MEM_ERR;
1161fd185f4dSJan Lentfer         }
1162825eb42bSJan Lentfer 	memcpy(public_key_data, &data[offset], public_key_size);
11635340022aSzrj 	public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64,
11645340022aSzrj 			public_key_size, public_key_data);
1165fd185f4dSJan Lentfer         if(!public_key) {
1166fd185f4dSJan Lentfer                 LDNS_FREE(public_key_data);
11675340022aSzrj                 ldns_rdf_deep_free(gateway);
1168fd185f4dSJan Lentfer                 return LDNS_STATUS_MEM_ERR;
1169fd185f4dSJan Lentfer         }
1170825eb42bSJan Lentfer 
1171825eb42bSJan Lentfer 	ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm);
1172825eb42bSJan Lentfer 	if (gateway)
1173825eb42bSJan Lentfer 	  	(void) ldns_rdf2buffer_str(output, gateway);
1174825eb42bSJan Lentfer 	else
1175825eb42bSJan Lentfer 		ldns_buffer_printf(output, ".");
1176825eb42bSJan Lentfer 	ldns_buffer_printf(output, " ");
1177825eb42bSJan Lentfer 	(void) ldns_rdf2buffer_str(output, public_key);
1178825eb42bSJan Lentfer 
11795340022aSzrj 	ldns_rdf_deep_free(gateway);
11805340022aSzrj 	ldns_rdf_deep_free(public_key);
1181825eb42bSJan Lentfer 
1182825eb42bSJan Lentfer 	return ldns_buffer_status(output);
1183825eb42bSJan Lentfer }
1184825eb42bSJan Lentfer 
1185825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_ilnp64(ldns_buffer * output,const ldns_rdf * rdf)11865340022aSzrj ldns_rdf2buffer_str_ilnp64(ldns_buffer *output, const ldns_rdf *rdf)
1187825eb42bSJan Lentfer {
11885340022aSzrj 	if (ldns_rdf_size(rdf) != 8) {
11895340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
11905340022aSzrj 	}
11915340022aSzrj 	ldns_buffer_printf(output,"%.4x:%.4x:%.4x:%.4x",
11925340022aSzrj 				ldns_read_uint16(ldns_rdf_data(rdf)),
11935340022aSzrj 				ldns_read_uint16(ldns_rdf_data(rdf)+2),
11945340022aSzrj 				ldns_read_uint16(ldns_rdf_data(rdf)+4),
11955340022aSzrj 				ldns_read_uint16(ldns_rdf_data(rdf)+6));
11965340022aSzrj 	return ldns_buffer_status(output);
1197825eb42bSJan Lentfer }
1198825eb42bSJan Lentfer 
11995340022aSzrj ldns_status
ldns_rdf2buffer_str_eui48(ldns_buffer * output,const ldns_rdf * rdf)12005340022aSzrj ldns_rdf2buffer_str_eui48(ldns_buffer *output, const ldns_rdf *rdf)
12015340022aSzrj {
12025340022aSzrj 	if (ldns_rdf_size(rdf) != 6) {
12035340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
12045340022aSzrj 	}
12055340022aSzrj 	ldns_buffer_printf(output,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",
12065340022aSzrj 				ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf)[1],
12075340022aSzrj 				ldns_rdf_data(rdf)[2], ldns_rdf_data(rdf)[3],
12085340022aSzrj 				ldns_rdf_data(rdf)[4], ldns_rdf_data(rdf)[5]);
12095340022aSzrj 	return ldns_buffer_status(output);
12105340022aSzrj }
1211825eb42bSJan Lentfer 
1212825eb42bSJan Lentfer ldns_status
ldns_rdf2buffer_str_eui64(ldns_buffer * output,const ldns_rdf * rdf)12135340022aSzrj ldns_rdf2buffer_str_eui64(ldns_buffer *output, const ldns_rdf *rdf)
12145340022aSzrj {
12155340022aSzrj 	if (ldns_rdf_size(rdf) != 8) {
12165340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
12175340022aSzrj 	}
12185340022aSzrj 	ldns_buffer_printf(output,"%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x-%.2x",
12195340022aSzrj 				ldns_rdf_data(rdf)[0], ldns_rdf_data(rdf)[1],
12205340022aSzrj 				ldns_rdf_data(rdf)[2], ldns_rdf_data(rdf)[3],
12215340022aSzrj 				ldns_rdf_data(rdf)[4], ldns_rdf_data(rdf)[5],
12225340022aSzrj 				ldns_rdf_data(rdf)[6], ldns_rdf_data(rdf)[7]);
12235340022aSzrj 	return ldns_buffer_status(output);
12245340022aSzrj }
12255340022aSzrj 
12265340022aSzrj ldns_status
ldns_rdf2buffer_str_tag(ldns_buffer * output,const ldns_rdf * rdf)12275340022aSzrj ldns_rdf2buffer_str_tag(ldns_buffer *output, const ldns_rdf *rdf)
12285340022aSzrj {
12295340022aSzrj 	size_t nchars;
12305340022aSzrj 	const uint8_t* chars;
12315340022aSzrj 	char ch;
12325340022aSzrj 	if (ldns_rdf_size(rdf) < 2) {
12335340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
12345340022aSzrj 	}
12355340022aSzrj 	nchars = ldns_rdf_data(rdf)[0];
12365340022aSzrj 	if (nchars >= ldns_rdf_size(rdf) || /* should be rdf_size - 1 */
12375340022aSzrj 			nchars < 1) {
12385340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
12395340022aSzrj 	}
12405340022aSzrj 	chars = ldns_rdf_data(rdf) + 1;
12415340022aSzrj 	while (nchars > 0) {
12425340022aSzrj 		ch = (char)*chars++;
12435340022aSzrj 		if (! isalnum((unsigned char)ch)) {
12445340022aSzrj 			return LDNS_STATUS_WIRE_RDATA_ERR;
12455340022aSzrj 		}
12465340022aSzrj 		ldns_buffer_printf(output, "%c", ch);
12475340022aSzrj 		nchars--;
12485340022aSzrj 	}
12495340022aSzrj 	return ldns_buffer_status(output);
12505340022aSzrj }
12515340022aSzrj 
12525340022aSzrj ldns_status
ldns_rdf2buffer_str_long_str(ldns_buffer * output,const ldns_rdf * rdf)12535340022aSzrj ldns_rdf2buffer_str_long_str(ldns_buffer *output, const ldns_rdf *rdf)
12545340022aSzrj {
12555340022aSzrj 
12565340022aSzrj 	ldns_buffer_printf(output, "\"");
12575340022aSzrj 	ldns_characters2buffer_str(output,
12585340022aSzrj 			ldns_rdf_size(rdf), ldns_rdf_data(rdf));
12595340022aSzrj 	ldns_buffer_printf(output, "\"");
12605340022aSzrj 	return ldns_buffer_status(output);
12615340022aSzrj }
12625340022aSzrj 
12635340022aSzrj ldns_status
ldns_rdf2buffer_str_hip(ldns_buffer * output,const ldns_rdf * rdf)12645340022aSzrj ldns_rdf2buffer_str_hip(ldns_buffer *output, const ldns_rdf *rdf)
12655340022aSzrj {
12665340022aSzrj 	uint8_t *data = ldns_rdf_data(rdf);
12675340022aSzrj 	size_t rdf_size = ldns_rdf_size(rdf);
12685340022aSzrj 	uint8_t hit_size;
12695340022aSzrj 	uint16_t pk_size;
12705340022aSzrj 	int written;
12715340022aSzrj 
12725340022aSzrj 	if (rdf_size < 6) {
12735340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
12745340022aSzrj 	}
12755340022aSzrj 	if ((hit_size = data[0]) == 0 ||
12765340022aSzrj 			(pk_size = ldns_read_uint16(data + 2)) == 0 ||
12775340022aSzrj 			rdf_size < (size_t) hit_size + pk_size + 4) {
12785340022aSzrj 
12795340022aSzrj 		return LDNS_STATUS_WIRE_RDATA_ERR;
12805340022aSzrj 	}
12815340022aSzrj 
12825340022aSzrj 	ldns_buffer_printf(output, "%d ", (int) data[1]);
12835340022aSzrj 
12845340022aSzrj 	for (data += 4; hit_size > 0; hit_size--, data++) {
12855340022aSzrj 
12865340022aSzrj 		ldns_buffer_printf(output, "%02x", (int) *data);
12875340022aSzrj 	}
1288*ee791febSAntonio Huete Jimenez 	ldns_buffer_write_char(output, (uint8_t) ' ');
12895340022aSzrj 
12905340022aSzrj 	if (ldns_buffer_reserve(output,
12915340022aSzrj 				ldns_b64_ntop_calculate_size(pk_size))) {
12925340022aSzrj 
12935340022aSzrj 		written = ldns_b64_ntop(data, pk_size,
12945340022aSzrj 				(char *) ldns_buffer_current(output),
12955340022aSzrj 				ldns_buffer_remaining(output));
12965340022aSzrj 
12975340022aSzrj 		if (written > 0 &&
12985340022aSzrj 				written < (int) ldns_buffer_remaining(output)) {
12995340022aSzrj 
13005340022aSzrj 			output->_position += written;
13015340022aSzrj 		}
13025340022aSzrj 	}
13035340022aSzrj 	return ldns_buffer_status(output);
13045340022aSzrj }
13055340022aSzrj 
1306*ee791febSAntonio Huete Jimenez /* implementation mimicked from ldns_rdf2buffer_str_ipseckey */
1307819dec71SDaniel Fojt ldns_status
ldns_rdf2buffer_str_amtrelay(ldns_buffer * output,const ldns_rdf * rdf)1308819dec71SDaniel Fojt ldns_rdf2buffer_str_amtrelay(ldns_buffer *output, const ldns_rdf *rdf)
1309819dec71SDaniel Fojt {
1310819dec71SDaniel Fojt 	/* wire format from
1311819dec71SDaniel Fojt 	 * draft-ietf-mboned-driad-amt-discovery Section 4.2
1312819dec71SDaniel Fojt 	 */
1313819dec71SDaniel Fojt 	uint8_t *data = ldns_rdf_data(rdf);
1314819dec71SDaniel Fojt 	uint8_t precedence;
1315819dec71SDaniel Fojt 	uint8_t discovery_optional;
1316819dec71SDaniel Fojt 	uint8_t relay_type;
1317819dec71SDaniel Fojt 
1318819dec71SDaniel Fojt 	ldns_rdf *relay = NULL;
1319819dec71SDaniel Fojt 	uint8_t *relay_data;
1320819dec71SDaniel Fojt 
1321819dec71SDaniel Fojt 	size_t offset = 0;
1322819dec71SDaniel Fojt 	ldns_status status;
1323819dec71SDaniel Fojt 
1324819dec71SDaniel Fojt 	if (ldns_rdf_size(rdf) < 2) {
1325819dec71SDaniel Fojt 		return LDNS_STATUS_WIRE_RDATA_ERR;
1326819dec71SDaniel Fojt 	}
1327819dec71SDaniel Fojt 	precedence = data[0];
1328819dec71SDaniel Fojt 	discovery_optional = ((data[1] & 0x80) >> 7);
1329819dec71SDaniel Fojt 	relay_type = data[1] & 0x7F;
1330819dec71SDaniel Fojt 	offset = 2;
1331819dec71SDaniel Fojt 
1332819dec71SDaniel Fojt 	switch (relay_type) {
1333819dec71SDaniel Fojt 		case 0:
1334819dec71SDaniel Fojt 			/* no relay */
1335819dec71SDaniel Fojt 			break;
1336819dec71SDaniel Fojt 		case 1:
1337819dec71SDaniel Fojt 			if (ldns_rdf_size(rdf) < offset + LDNS_IP4ADDRLEN) {
1338819dec71SDaniel Fojt 				return LDNS_STATUS_ERR;
1339819dec71SDaniel Fojt 			}
1340819dec71SDaniel Fojt 			relay_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
1341819dec71SDaniel Fojt                         if(!relay_data)
1342819dec71SDaniel Fojt                                 return LDNS_STATUS_MEM_ERR;
1343819dec71SDaniel Fojt 			memcpy(relay_data, &data[offset], LDNS_IP4ADDRLEN);
1344819dec71SDaniel Fojt 			relay = ldns_rdf_new(LDNS_RDF_TYPE_A,
1345819dec71SDaniel Fojt 					LDNS_IP4ADDRLEN , relay_data);
1346819dec71SDaniel Fojt 			offset += LDNS_IP4ADDRLEN;
1347819dec71SDaniel Fojt                         if(!relay) {
1348819dec71SDaniel Fojt                                 LDNS_FREE(relay_data);
1349819dec71SDaniel Fojt                                 return LDNS_STATUS_MEM_ERR;
1350819dec71SDaniel Fojt                         }
1351819dec71SDaniel Fojt 			break;
1352819dec71SDaniel Fojt 		case 2:
1353819dec71SDaniel Fojt 			if (ldns_rdf_size(rdf) < offset + LDNS_IP6ADDRLEN) {
1354819dec71SDaniel Fojt 				return LDNS_STATUS_ERR;
1355819dec71SDaniel Fojt 			}
1356819dec71SDaniel Fojt 			relay_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
1357819dec71SDaniel Fojt                         if(!relay_data)
1358819dec71SDaniel Fojt                                 return LDNS_STATUS_MEM_ERR;
1359819dec71SDaniel Fojt 			memcpy(relay_data, &data[offset], LDNS_IP6ADDRLEN);
1360819dec71SDaniel Fojt 			offset += LDNS_IP6ADDRLEN;
1361819dec71SDaniel Fojt 			relay =
1362819dec71SDaniel Fojt 				ldns_rdf_new(LDNS_RDF_TYPE_AAAA,
1363819dec71SDaniel Fojt 						LDNS_IP6ADDRLEN, relay_data);
1364819dec71SDaniel Fojt                         if(!relay) {
1365819dec71SDaniel Fojt                                 LDNS_FREE(relay_data);
1366819dec71SDaniel Fojt                                 return LDNS_STATUS_MEM_ERR;
1367819dec71SDaniel Fojt                         }
1368819dec71SDaniel Fojt 			break;
1369819dec71SDaniel Fojt 		case 3:
1370819dec71SDaniel Fojt 			status = ldns_wire2dname(&relay, data,
1371819dec71SDaniel Fojt 					ldns_rdf_size(rdf), &offset);
1372819dec71SDaniel Fojt                         if(status != LDNS_STATUS_OK)
1373819dec71SDaniel Fojt                                 return status;
1374819dec71SDaniel Fojt 			break;
1375819dec71SDaniel Fojt 		default:
1376819dec71SDaniel Fojt 			/* error? */
1377819dec71SDaniel Fojt 			break;
1378819dec71SDaniel Fojt 	}
1379819dec71SDaniel Fojt 
1380819dec71SDaniel Fojt 	if (ldns_rdf_size(rdf) != offset) {
1381819dec71SDaniel Fojt                 ldns_rdf_deep_free(relay);
1382819dec71SDaniel Fojt 		return LDNS_STATUS_ERR;
1383819dec71SDaniel Fojt 	}
1384819dec71SDaniel Fojt 	ldns_buffer_printf(output, "%u %u %u ",
1385819dec71SDaniel Fojt 			precedence, discovery_optional, relay_type);
1386819dec71SDaniel Fojt 	if (relay)
1387819dec71SDaniel Fojt 	  	(void) ldns_rdf2buffer_str(output, relay);
1388819dec71SDaniel Fojt 
1389819dec71SDaniel Fojt 	ldns_rdf_deep_free(relay);
1390819dec71SDaniel Fojt 	return ldns_buffer_status(output);
1391819dec71SDaniel Fojt }
1392819dec71SDaniel Fojt 
1393*ee791febSAntonio Huete Jimenez #ifdef RRTYPE_SVCB_HTTPS
1394*ee791febSAntonio Huete Jimenez ldns_status svcparam_key2buffer_str(ldns_buffer *output, uint16_t key);
1395*ee791febSAntonio Huete Jimenez 
1396*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_mandatory2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1397*ee791febSAntonio Huete Jimenez svcparam_mandatory2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1398*ee791febSAntonio Huete Jimenez {
1399*ee791febSAntonio Huete Jimenez 	if (sz % 2)
1400*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1401*ee791febSAntonio Huete Jimenez 
1402*ee791febSAntonio Huete Jimenez 	svcparam_key2buffer_str(output, ldns_read_uint16(data));
1403*ee791febSAntonio Huete Jimenez 	for (data += 2, sz -= 2; sz; data += 2, sz -= 2) {
1404*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, ',');
1405*ee791febSAntonio Huete Jimenez 		svcparam_key2buffer_str(output, ldns_read_uint16(data));
1406*ee791febSAntonio Huete Jimenez 	}
1407*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1408*ee791febSAntonio Huete Jimenez }
1409*ee791febSAntonio Huete Jimenez 
1410*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_alpn2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1411*ee791febSAntonio Huete Jimenez svcparam_alpn2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1412*ee791febSAntonio Huete Jimenez {
1413*ee791febSAntonio Huete Jimenez 	uint8_t *eod = data + sz, *dp;
1414*ee791febSAntonio Huete Jimenez 	bool quote = false;
1415*ee791febSAntonio Huete Jimenez 	size_t i;
1416*ee791febSAntonio Huete Jimenez 
1417*ee791febSAntonio Huete Jimenez 	for (dp = data; dp < eod && !quote; dp += 1 + *dp) {
1418*ee791febSAntonio Huete Jimenez 		if (dp + 1 + *dp > eod)
1419*ee791febSAntonio Huete Jimenez 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1420*ee791febSAntonio Huete Jimenez 
1421*ee791febSAntonio Huete Jimenez 		for (i = 0; i < *dp; i++)
1422*ee791febSAntonio Huete Jimenez 			if (isspace(dp[i + 1]))
1423*ee791febSAntonio Huete Jimenez 				break;
1424*ee791febSAntonio Huete Jimenez 		quote = i < *dp;
1425*ee791febSAntonio Huete Jimenez 	}
1426*ee791febSAntonio Huete Jimenez 	if (quote)
1427*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, '"');
1428*ee791febSAntonio Huete Jimenez 	while (data < eod) {
1429*ee791febSAntonio Huete Jimenez 		uint8_t *eot = data + 1 + *data;
1430*ee791febSAntonio Huete Jimenez 
1431*ee791febSAntonio Huete Jimenez 		if (eot > eod)
1432*ee791febSAntonio Huete Jimenez 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1433*ee791febSAntonio Huete Jimenez 
1434*ee791febSAntonio Huete Jimenez 		if (eod - data < (int)sz)
1435*ee791febSAntonio Huete Jimenez 			ldns_buffer_write_char(output, ',');
1436*ee791febSAntonio Huete Jimenez 
1437*ee791febSAntonio Huete Jimenez 		for (data += 1; data < eot; data += 1) {
1438*ee791febSAntonio Huete Jimenez 			uint8_t ch = *data;
1439*ee791febSAntonio Huete Jimenez 
1440*ee791febSAntonio Huete Jimenez 			if (isprint(ch) || ch == '\t') {
1441*ee791febSAntonio Huete Jimenez 				if (ch == '"' ||  ch == ',' || ch == '\\')
1442*ee791febSAntonio Huete Jimenez 					ldns_buffer_write_char(output, '\\');
1443*ee791febSAntonio Huete Jimenez 				ldns_buffer_write_char(output, ch);
1444*ee791febSAntonio Huete Jimenez 			} else
1445*ee791febSAntonio Huete Jimenez 				ldns_buffer_printf(output, "\\%03u"
1446*ee791febSAntonio Huete Jimenez 				                         , (unsigned)ch);
1447*ee791febSAntonio Huete Jimenez 		}
1448*ee791febSAntonio Huete Jimenez 	}
1449*ee791febSAntonio Huete Jimenez 	if (quote)
1450*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, '"');
1451*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1452*ee791febSAntonio Huete Jimenez }
1453*ee791febSAntonio Huete Jimenez 
1454*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_port2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1455*ee791febSAntonio Huete Jimenez svcparam_port2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1456*ee791febSAntonio Huete Jimenez {
1457*ee791febSAntonio Huete Jimenez 	if (sz != 2)
1458*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1459*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "%d", (int)ldns_read_uint16(data));
1460*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1461*ee791febSAntonio Huete Jimenez }
1462*ee791febSAntonio Huete Jimenez 
1463*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_ipv4hint2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1464*ee791febSAntonio Huete Jimenez svcparam_ipv4hint2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1465*ee791febSAntonio Huete Jimenez {
1466*ee791febSAntonio Huete Jimenez 	char str[INET_ADDRSTRLEN];
1467*ee791febSAntonio Huete Jimenez 
1468*ee791febSAntonio Huete Jimenez 	if (sz % 4 || !inet_ntop(AF_INET, data, str, INET_ADDRSTRLEN))
1469*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1470*ee791febSAntonio Huete Jimenez 
1471*ee791febSAntonio Huete Jimenez 	ldns_buffer_write_chars(output, str);
1472*ee791febSAntonio Huete Jimenez 
1473*ee791febSAntonio Huete Jimenez 	for (data += 4, sz -= 4; sz ; data += 4, sz -= 4 ) {
1474*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, ',');
1475*ee791febSAntonio Huete Jimenez 		if (!inet_ntop(AF_INET, data, str, INET_ADDRSTRLEN))
1476*ee791febSAntonio Huete Jimenez 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1477*ee791febSAntonio Huete Jimenez 
1478*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_chars(output, str);
1479*ee791febSAntonio Huete Jimenez 	}
1480*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1481*ee791febSAntonio Huete Jimenez }
1482*ee791febSAntonio Huete Jimenez 
1483*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_ech2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1484*ee791febSAntonio Huete Jimenez svcparam_ech2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1485*ee791febSAntonio Huete Jimenez {
1486*ee791febSAntonio Huete Jimenez 	size_t str_sz = ldns_b64_ntop_calculate_size(sz);
1487*ee791febSAntonio Huete Jimenez 	int written;
1488*ee791febSAntonio Huete Jimenez 
1489*ee791febSAntonio Huete Jimenez 	if (!ldns_buffer_reserve(output, str_sz))
1490*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_MEM_ERR;
1491*ee791febSAntonio Huete Jimenez 
1492*ee791febSAntonio Huete Jimenez 	written = ldns_b64_ntop( data, sz
1493*ee791febSAntonio Huete Jimenez 	                       , (char *)ldns_buffer_current(output), str_sz);
1494*ee791febSAntonio Huete Jimenez 	if (written > 0)
1495*ee791febSAntonio Huete Jimenez 		ldns_buffer_skip(output, written);
1496*ee791febSAntonio Huete Jimenez 	else
1497*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1498*ee791febSAntonio Huete Jimenez 
1499*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1500*ee791febSAntonio Huete Jimenez }
1501*ee791febSAntonio Huete Jimenez 
1502*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_ipv6hint2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1503*ee791febSAntonio Huete Jimenez svcparam_ipv6hint2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1504*ee791febSAntonio Huete Jimenez {
1505*ee791febSAntonio Huete Jimenez 	char str[INET6_ADDRSTRLEN];
1506*ee791febSAntonio Huete Jimenez 
1507*ee791febSAntonio Huete Jimenez 	if (sz % 16 || !inet_ntop(AF_INET6, data, str, INET6_ADDRSTRLEN))
1508*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1509*ee791febSAntonio Huete Jimenez 
1510*ee791febSAntonio Huete Jimenez 	ldns_buffer_write_chars(output, str);
1511*ee791febSAntonio Huete Jimenez 
1512*ee791febSAntonio Huete Jimenez 	for (data += 16, sz -= 16; sz ; data += 16, sz -= 16) {
1513*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, ',');
1514*ee791febSAntonio Huete Jimenez 		if (!inet_ntop(AF_INET6, data, str, INET6_ADDRSTRLEN))
1515*ee791febSAntonio Huete Jimenez 			return LDNS_STATUS_INVALID_SVCPARAM_VALUE;
1516*ee791febSAntonio Huete Jimenez 
1517*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_chars(output, str);
1518*ee791febSAntonio Huete Jimenez 	}
1519*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1520*ee791febSAntonio Huete Jimenez }
1521*ee791febSAntonio Huete Jimenez 
1522*ee791febSAntonio Huete Jimenez static ldns_status
svcparam_value2buffer_str(ldns_buffer * output,size_t sz,uint8_t * data)1523*ee791febSAntonio Huete Jimenez svcparam_value2buffer_str(ldns_buffer *output, size_t sz, uint8_t *data)
1524*ee791febSAntonio Huete Jimenez {
1525*ee791febSAntonio Huete Jimenez 	uint8_t *eod = data + sz, *dp;
1526*ee791febSAntonio Huete Jimenez 	bool quote = false;
1527*ee791febSAntonio Huete Jimenez 
1528*ee791febSAntonio Huete Jimenez 	for (dp = data; dp < eod && !isspace(*dp); dp++)
1529*ee791febSAntonio Huete Jimenez 		; /* pass */
1530*ee791febSAntonio Huete Jimenez 
1531*ee791febSAntonio Huete Jimenez 	if ((quote = dp < eod))
1532*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, '"');
1533*ee791febSAntonio Huete Jimenez 
1534*ee791febSAntonio Huete Jimenez 	for (dp = data; dp < eod; dp++) {
1535*ee791febSAntonio Huete Jimenez 		uint8_t ch = *dp;
1536*ee791febSAntonio Huete Jimenez 
1537*ee791febSAntonio Huete Jimenez 		if (isprint(ch) || ch == '\t') {
1538*ee791febSAntonio Huete Jimenez 			if (ch == '"' ||  ch == '\\')
1539*ee791febSAntonio Huete Jimenez 				ldns_buffer_write_char(output, '\\');
1540*ee791febSAntonio Huete Jimenez 			ldns_buffer_write_char(output, ch);
1541*ee791febSAntonio Huete Jimenez 		} else
1542*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "\\%03u", (unsigned)ch);
1543*ee791febSAntonio Huete Jimenez 	}
1544*ee791febSAntonio Huete Jimenez 	if (quote)
1545*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, '"');
1546*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1547*ee791febSAntonio Huete Jimenez }
1548*ee791febSAntonio Huete Jimenez 
1549*ee791febSAntonio Huete Jimenez ldns_status
ldns_rdf2buffer_str_svcparams(ldns_buffer * output,const ldns_rdf * rdf)1550*ee791febSAntonio Huete Jimenez ldns_rdf2buffer_str_svcparams(ldns_buffer *output, const ldns_rdf *rdf)
1551*ee791febSAntonio Huete Jimenez {
1552*ee791febSAntonio Huete Jimenez 	uint8_t    *data, *dp, *next_dp = NULL;
1553*ee791febSAntonio Huete Jimenez 	size_t      sz;
1554*ee791febSAntonio Huete Jimenez 	ldns_status st;
1555*ee791febSAntonio Huete Jimenez 
1556*ee791febSAntonio Huete Jimenez 	if (!output)
1557*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_NULL;
1558*ee791febSAntonio Huete Jimenez 
1559*ee791febSAntonio Huete Jimenez 	if (!rdf || !(data = ldns_rdf_data(rdf)) || !(sz = ldns_rdf_size(rdf)))
1560*ee791febSAntonio Huete Jimenez 		/* No svcparams is just fine. Just nothing to print. */
1561*ee791febSAntonio Huete Jimenez 		return LDNS_STATUS_OK;
1562*ee791febSAntonio Huete Jimenez 
1563*ee791febSAntonio Huete Jimenez 	for (dp = data; dp + 4 <= data + sz; dp = next_dp) {
1564*ee791febSAntonio Huete Jimenez 		ldns_svcparam_key key    = ldns_read_uint16(dp);
1565*ee791febSAntonio Huete Jimenez 		uint16_t          val_sz = ldns_read_uint16(dp + 2);
1566*ee791febSAntonio Huete Jimenez 
1567*ee791febSAntonio Huete Jimenez 		if ((next_dp = dp + 4 + val_sz) > data + sz)
1568*ee791febSAntonio Huete Jimenez 			return LDNS_STATUS_RDATA_OVERFLOW;
1569*ee791febSAntonio Huete Jimenez 
1570*ee791febSAntonio Huete Jimenez 		if (dp > data)
1571*ee791febSAntonio Huete Jimenez 			ldns_buffer_write_char(output, ' ');
1572*ee791febSAntonio Huete Jimenez 
1573*ee791febSAntonio Huete Jimenez 		if ((st = svcparam_key2buffer_str(output, key)))
1574*ee791febSAntonio Huete Jimenez 			return st;
1575*ee791febSAntonio Huete Jimenez 
1576*ee791febSAntonio Huete Jimenez 		if (val_sz == 0)
1577*ee791febSAntonio Huete Jimenez 			continue;
1578*ee791febSAntonio Huete Jimenez 		dp += 4;
1579*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(output, '=');
1580*ee791febSAntonio Huete Jimenez 		switch (key) {
1581*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_MANDATORY:
1582*ee791febSAntonio Huete Jimenez 			st = svcparam_mandatory2buffer_str(output, val_sz, dp);
1583*ee791febSAntonio Huete Jimenez 			break;
1584*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_ALPN:
1585*ee791febSAntonio Huete Jimenez 			st = svcparam_alpn2buffer_str(output, val_sz, dp);
1586*ee791febSAntonio Huete Jimenez 			break;
1587*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_NO_DEFAULT_ALPN:
1588*ee791febSAntonio Huete Jimenez 			return LDNS_STATUS_NO_SVCPARAM_VALUE_EXPECTED;
1589*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_PORT:
1590*ee791febSAntonio Huete Jimenez 			st = svcparam_port2buffer_str(output, val_sz, dp);
1591*ee791febSAntonio Huete Jimenez 			break;
1592*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_IPV4HINT:
1593*ee791febSAntonio Huete Jimenez 			st = svcparam_ipv4hint2buffer_str(output, val_sz, dp);
1594*ee791febSAntonio Huete Jimenez 			break;
1595*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_ECH:
1596*ee791febSAntonio Huete Jimenez 			st = svcparam_ech2buffer_str(output, val_sz, dp);
1597*ee791febSAntonio Huete Jimenez 			break;
1598*ee791febSAntonio Huete Jimenez 		case LDNS_SVCPARAM_KEY_IPV6HINT:
1599*ee791febSAntonio Huete Jimenez 			st = svcparam_ipv6hint2buffer_str(output, val_sz, dp);
1600*ee791febSAntonio Huete Jimenez 			break;
1601*ee791febSAntonio Huete Jimenez 		default:
1602*ee791febSAntonio Huete Jimenez 			st = svcparam_value2buffer_str(output, val_sz, dp);
1603*ee791febSAntonio Huete Jimenez 			break;
1604*ee791febSAntonio Huete Jimenez 		}
1605*ee791febSAntonio Huete Jimenez 		if (st)
1606*ee791febSAntonio Huete Jimenez 			return st;
1607*ee791febSAntonio Huete Jimenez 	}
1608*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
1609*ee791febSAntonio Huete Jimenez }
1610*ee791febSAntonio Huete Jimenez #else	/* #ifdef RRTYPE_SVCB_HTTPS */
1611*ee791febSAntonio Huete Jimenez ldns_status
ldns_rdf2buffer_str_svcparams(ldns_buffer * output,const ldns_rdf * rdf)1612*ee791febSAntonio Huete Jimenez ldns_rdf2buffer_str_svcparams(ldns_buffer *output, const ldns_rdf *rdf)
1613*ee791febSAntonio Huete Jimenez {
1614*ee791febSAntonio Huete Jimenez 	(void)output; (void)rdf;
1615*ee791febSAntonio Huete Jimenez 	return LDNS_STATUS_NOT_IMPL;
1616*ee791febSAntonio Huete Jimenez }
1617*ee791febSAntonio Huete Jimenez #endif	/* #ifdef RRTYPE_SVCB_HTTPS */
1618819dec71SDaniel Fojt 
16195340022aSzrj static ldns_status
ldns_rdf2buffer_str_fmt(ldns_buffer * buffer,const ldns_output_format * fmt,const ldns_rdf * rdf)16205340022aSzrj ldns_rdf2buffer_str_fmt(ldns_buffer *buffer,
16215340022aSzrj 		const ldns_output_format* fmt, const ldns_rdf *rdf)
1622825eb42bSJan Lentfer {
1623ac996e71SJan Lentfer 	ldns_status res = LDNS_STATUS_OK;
1624825eb42bSJan Lentfer 
1625825eb42bSJan Lentfer 	/*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/
1626825eb42bSJan Lentfer 	if (rdf) {
1627825eb42bSJan Lentfer 		switch(ldns_rdf_get_type(rdf)) {
1628825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_NONE:
1629825eb42bSJan Lentfer 			break;
1630825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_DNAME:
1631825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_dname(buffer, rdf);
1632825eb42bSJan Lentfer 			break;
16335340022aSzrj 		case LDNS_RDF_TYPE_INT8: /* Don't output mnemonics for these */
16345340022aSzrj 		case LDNS_RDF_TYPE_ALG:
16355340022aSzrj 		case LDNS_RDF_TYPE_CERTIFICATE_USAGE:
16365340022aSzrj 		case LDNS_RDF_TYPE_SELECTOR:
16375340022aSzrj 		case LDNS_RDF_TYPE_MATCHING_TYPE:
1638825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_int8(buffer, rdf);
1639825eb42bSJan Lentfer 			break;
1640825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_INT16:
1641825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_int16(buffer, rdf);
1642825eb42bSJan Lentfer 			break;
1643825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_INT32:
1644825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_int32(buffer, rdf);
1645825eb42bSJan Lentfer 			break;
1646825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_PERIOD:
1647825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_period(buffer, rdf);
1648825eb42bSJan Lentfer 			break;
1649825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_TSIGTIME:
1650825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_tsigtime(buffer, rdf);
1651825eb42bSJan Lentfer 			break;
1652825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_A:
1653825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_a(buffer, rdf);
1654825eb42bSJan Lentfer 			break;
1655825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_AAAA:
1656825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_aaaa(buffer, rdf);
1657825eb42bSJan Lentfer 			break;
1658825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_STR:
1659825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_str(buffer, rdf);
1660825eb42bSJan Lentfer 			break;
1661825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_APL:
1662825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_apl(buffer, rdf);
1663825eb42bSJan Lentfer 			break;
1664825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_B32_EXT:
1665825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1666825eb42bSJan Lentfer 			break;
1667825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_B64:
1668825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_b64(buffer, rdf);
1669825eb42bSJan Lentfer 			break;
1670825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_HEX:
1671825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_hex(buffer, rdf);
1672825eb42bSJan Lentfer 			break;
1673825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_NSEC:
16745340022aSzrj 			res = ldns_rdf2buffer_str_nsec_fmt(buffer, fmt, rdf);
1675825eb42bSJan Lentfer 			break;
1676825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_NSEC3_SALT:
1677825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf);
1678825eb42bSJan Lentfer 			break;
1679825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_TYPE:
16805340022aSzrj 			res = ldns_rdf2buffer_str_type_fmt(buffer, fmt, rdf);
1681825eb42bSJan Lentfer 			break;
1682825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_CLASS:
1683825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_class(buffer, rdf);
1684825eb42bSJan Lentfer 			break;
1685825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_CERT_ALG:
1686825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_cert_alg(buffer, rdf);
1687825eb42bSJan Lentfer 			break;
1688825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_UNKNOWN:
1689825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_unknown(buffer, rdf);
1690825eb42bSJan Lentfer 			break;
1691825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_TIME:
1692825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_time(buffer, rdf);
1693825eb42bSJan Lentfer 			break;
16945340022aSzrj 		case LDNS_RDF_TYPE_HIP:
16955340022aSzrj 			res = ldns_rdf2buffer_str_hip(buffer, rdf);
16965340022aSzrj 			break;
1697825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_LOC:
1698825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_loc(buffer, rdf);
1699825eb42bSJan Lentfer 			break;
1700825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_WKS:
1701825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_SERVICE:
1702825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_wks(buffer, rdf);
1703825eb42bSJan Lentfer 			break;
1704825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_NSAP:
1705825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_nsap(buffer, rdf);
1706825eb42bSJan Lentfer 			break;
1707825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_ATMA:
1708825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_atma(buffer, rdf);
1709825eb42bSJan Lentfer 			break;
1710825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_IPSECKEY:
1711825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_ipseckey(buffer, rdf);
1712825eb42bSJan Lentfer 			break;
1713825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_INT16_DATA:
1714825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_int16_data(buffer, rdf);
1715825eb42bSJan Lentfer 			break;
1716825eb42bSJan Lentfer 		case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER:
1717825eb42bSJan Lentfer 			res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1718825eb42bSJan Lentfer 			break;
17195340022aSzrj 		case LDNS_RDF_TYPE_ILNP64:
17205340022aSzrj 			res = ldns_rdf2buffer_str_ilnp64(buffer, rdf);
17215340022aSzrj 			break;
17225340022aSzrj 		case LDNS_RDF_TYPE_EUI48:
17235340022aSzrj 			res = ldns_rdf2buffer_str_eui48(buffer, rdf);
17245340022aSzrj 			break;
17255340022aSzrj 		case LDNS_RDF_TYPE_EUI64:
17265340022aSzrj 			res = ldns_rdf2buffer_str_eui64(buffer, rdf);
17275340022aSzrj 			break;
17285340022aSzrj 		case LDNS_RDF_TYPE_TAG:
17295340022aSzrj 			res = ldns_rdf2buffer_str_tag(buffer, rdf);
17305340022aSzrj 			break;
17315340022aSzrj 		case LDNS_RDF_TYPE_LONG_STR:
17325340022aSzrj 			res = ldns_rdf2buffer_str_long_str(buffer, rdf);
17335340022aSzrj 			break;
1734819dec71SDaniel Fojt 		case LDNS_RDF_TYPE_AMTRELAY:
1735819dec71SDaniel Fojt 			res = ldns_rdf2buffer_str_amtrelay(buffer, rdf);
1736819dec71SDaniel Fojt 			break;
1737*ee791febSAntonio Huete Jimenez 		case LDNS_RDF_TYPE_SVCPARAMS:
1738*ee791febSAntonio Huete Jimenez 			res = ldns_rdf2buffer_str_svcparams(buffer, rdf);
1739*ee791febSAntonio Huete Jimenez 			break;
1740825eb42bSJan Lentfer 		}
1741825eb42bSJan Lentfer 	} else {
1742d1b2b5caSJohn Marino 		/** This will write mangled RRs */
1743825eb42bSJan Lentfer 		ldns_buffer_printf(buffer, "(null) ");
1744d1b2b5caSJohn Marino 		res = LDNS_STATUS_ERR;
1745825eb42bSJan Lentfer 	}
1746ac996e71SJan Lentfer 	return res;
1747825eb42bSJan Lentfer }
1748825eb42bSJan Lentfer 
17495340022aSzrj ldns_status
ldns_rdf2buffer_str(ldns_buffer * buffer,const ldns_rdf * rdf)17505340022aSzrj ldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf)
17515340022aSzrj {
17525340022aSzrj 	return ldns_rdf2buffer_str_fmt(buffer,ldns_output_format_default,rdf);
17535340022aSzrj }
17545340022aSzrj 
17555340022aSzrj static ldns_rdf *
ldns_b32_ext2dname(const ldns_rdf * rdf)1756b5dedccaSJan Lentfer ldns_b32_ext2dname(const ldns_rdf *rdf)
1757b5dedccaSJan Lentfer {
1758b5dedccaSJan Lentfer 	size_t size;
1759b5dedccaSJan Lentfer 	char *b32;
1760b5dedccaSJan Lentfer 	ldns_rdf *out;
1761b5dedccaSJan Lentfer 	if(ldns_rdf_size(rdf) == 0)
1762b5dedccaSJan Lentfer 		return NULL;
1763b5dedccaSJan Lentfer         /* remove -1 for the b32-hash-len octet */
1764b5dedccaSJan Lentfer 	size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
1765b5dedccaSJan Lentfer         /* add one for the end nul for the string */
1766b5dedccaSJan Lentfer 	b32 = LDNS_XMALLOC(char, size + 2);
1767b5dedccaSJan Lentfer 	if (b32) {
1768b5dedccaSJan Lentfer 		if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
1769b5dedccaSJan Lentfer 				ldns_rdf_size(rdf) - 1, b32, size+1) > 0) {
1770b5dedccaSJan Lentfer 			b32[size] = '.';
1771b5dedccaSJan Lentfer 			b32[size+1] = '\0';
1772b5dedccaSJan Lentfer 			if (ldns_str2rdf_dname(&out, b32) == LDNS_STATUS_OK) {
1773b5dedccaSJan Lentfer 				LDNS_FREE(b32);
1774b5dedccaSJan Lentfer 				return out;
1775b5dedccaSJan Lentfer 			}
1776b5dedccaSJan Lentfer 		}
1777b5dedccaSJan Lentfer 		LDNS_FREE(b32);
1778b5dedccaSJan Lentfer 	}
1779b5dedccaSJan Lentfer 	return NULL;
1780b5dedccaSJan Lentfer }
1781b5dedccaSJan Lentfer 
17825340022aSzrj static ldns_status
ldns_rr2buffer_str_rfc3597(ldns_buffer * output,const ldns_rr * rr)17835340022aSzrj ldns_rr2buffer_str_rfc3597(ldns_buffer *output, const ldns_rr *rr)
17845340022aSzrj {
17855340022aSzrj 	size_t total_rdfsize = 0;
17865340022aSzrj 	size_t i, j;
17875340022aSzrj 
17885340022aSzrj 	ldns_buffer_printf(output, "TYPE%u\t", ldns_rr_get_type(rr));
17895340022aSzrj 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
17905340022aSzrj 		total_rdfsize += ldns_rdf_size(ldns_rr_rdf(rr, i));
17915340022aSzrj 	}
17925340022aSzrj 	if (total_rdfsize == 0) {
17935340022aSzrj 		ldns_buffer_printf(output, "\\# 0\n");
17945340022aSzrj 		return ldns_buffer_status(output);
17955340022aSzrj 	}
17965340022aSzrj 	ldns_buffer_printf(output, "\\# %d ", total_rdfsize);
17975340022aSzrj 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
17985340022aSzrj 		for (j = 0; j < ldns_rdf_size(ldns_rr_rdf(rr, i)); j++) {
17995340022aSzrj 			ldns_buffer_printf(output, "%.2x",
18005340022aSzrj 					ldns_rdf_data(ldns_rr_rdf(rr, i))[j]);
18015340022aSzrj 		}
18025340022aSzrj 	}
18035340022aSzrj 	ldns_buffer_printf(output, "\n");
18045340022aSzrj 	return ldns_buffer_status(output);
18055340022aSzrj }
18065340022aSzrj 
1807825eb42bSJan Lentfer ldns_status
ldns_rr2buffer_str_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rr * rr)1808b5dedccaSJan Lentfer ldns_rr2buffer_str_fmt(ldns_buffer *output,
1809b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_rr *rr)
1810825eb42bSJan Lentfer {
1811825eb42bSJan Lentfer 	uint16_t i, flags;
1812825eb42bSJan Lentfer 	ldns_status status = LDNS_STATUS_OK;
18135340022aSzrj 	ldns_output_format_storage* fmt_st = (ldns_output_format_storage*)fmt;
1814b5dedccaSJan Lentfer 
18155340022aSzrj 	if (fmt_st == NULL) {
18165340022aSzrj 		fmt_st = (ldns_output_format_storage*)
18175340022aSzrj 			  ldns_output_format_default;
1818b5dedccaSJan Lentfer 	}
1819*ee791febSAntonio Huete Jimenez 	if (!(fmt_st->flags & LDNS_FMT_SHORT)) {
1820825eb42bSJan Lentfer 		if (!rr) {
18215340022aSzrj 			if (LDNS_COMMENT_NULLS & fmt_st->flags) {
1822b5dedccaSJan Lentfer 				ldns_buffer_printf(output, "; (null)\n");
1823b5dedccaSJan Lentfer 			}
1824b5dedccaSJan Lentfer 			return ldns_buffer_status(output);
1825b5dedccaSJan Lentfer 		}
1826825eb42bSJan Lentfer 		if (ldns_rr_owner(rr)) {
1827825eb42bSJan Lentfer 			status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr));
1828825eb42bSJan Lentfer 		}
1829825eb42bSJan Lentfer 		if (status != LDNS_STATUS_OK) {
1830825eb42bSJan Lentfer 			return status;
1831825eb42bSJan Lentfer 		}
1832825eb42bSJan Lentfer 
1833825eb42bSJan Lentfer 		/* TTL should NOT be printed if it is a question */
1834825eb42bSJan Lentfer 		if (!ldns_rr_is_question(rr)) {
1835*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "\t%u", (unsigned)ldns_rr_ttl(rr));
1836825eb42bSJan Lentfer 		}
1837825eb42bSJan Lentfer 
1838825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\t");
1839825eb42bSJan Lentfer 		status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr));
1840825eb42bSJan Lentfer 		if (status != LDNS_STATUS_OK) {
1841825eb42bSJan Lentfer 			return status;
1842825eb42bSJan Lentfer 		}
1843825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\t");
1844825eb42bSJan Lentfer 
18455340022aSzrj 		if (ldns_output_format_covers_type(fmt, ldns_rr_get_type(rr))) {
18465340022aSzrj 			return ldns_rr2buffer_str_rfc3597(output, rr);
18475340022aSzrj 		}
1848825eb42bSJan Lentfer 		status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr));
1849825eb42bSJan Lentfer 		if (status != LDNS_STATUS_OK) {
1850825eb42bSJan Lentfer 			return status;
1851825eb42bSJan Lentfer 		}
1852825eb42bSJan Lentfer 
1853825eb42bSJan Lentfer 		if (ldns_rr_rd_count(rr) > 0) {
1854825eb42bSJan Lentfer 			ldns_buffer_printf(output, "\t");
1855825eb42bSJan Lentfer 		} else if (!ldns_rr_is_question(rr)) {
1856825eb42bSJan Lentfer 			ldns_buffer_printf(output, "\t\\# 0");
1857825eb42bSJan Lentfer 		}
1858*ee791febSAntonio Huete Jimenez 	} else if (ldns_rr_rd_count(rr) == 0) {
1859*ee791febSAntonio Huete Jimenez 		/* assert(fmt_st->flags & LDNS_FMT_SHORT); */
1860825eb42bSJan Lentfer 
1861*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "# 0");
1862*ee791febSAntonio Huete Jimenez 	}
1863825eb42bSJan Lentfer 	for (i = 0; i < ldns_rr_rd_count(rr); i++) {
1864b5dedccaSJan Lentfer 		/* ldns_rdf2buffer_str handles NULL input fine! */
18655340022aSzrj 		if ((fmt_st->flags & LDNS_FMT_ZEROIZE_RRSIGS) &&
1866d1b2b5caSJohn Marino 				(ldns_rr_get_type(rr) == LDNS_RR_TYPE_RRSIG) &&
1867d1b2b5caSJohn Marino 				((/* inception  */ i == 4 &&
1868d1b2b5caSJohn Marino 				  ldns_rdf_get_type(ldns_rr_rdf(rr, 4)) ==
1869d1b2b5caSJohn Marino 							LDNS_RDF_TYPE_TIME) ||
1870d1b2b5caSJohn Marino 				  (/* expiration */ i == 5 &&
1871d1b2b5caSJohn Marino 				   ldns_rdf_get_type(ldns_rr_rdf(rr, 5)) ==
1872d1b2b5caSJohn Marino 				   			LDNS_RDF_TYPE_TIME) ||
1873d1b2b5caSJohn Marino 				  (/* signature  */ i == 8 &&
1874d1b2b5caSJohn Marino 				   ldns_rdf_get_type(ldns_rr_rdf(rr, 8)) ==
1875d1b2b5caSJohn Marino 				   			LDNS_RDF_TYPE_B64))) {
1876d1b2b5caSJohn Marino 
1877d1b2b5caSJohn Marino 			ldns_buffer_printf(output, "(null)");
1878d1b2b5caSJohn Marino 			status = ldns_buffer_status(output);
18795340022aSzrj 		} else if ((fmt_st->flags & LDNS_FMT_PAD_SOA_SERIAL) &&
1880d1b2b5caSJohn Marino 				(ldns_rr_get_type(rr) == LDNS_RR_TYPE_SOA) &&
1881d1b2b5caSJohn Marino 				/* serial */ i == 2 &&
1882d1b2b5caSJohn Marino 			 	ldns_rdf_get_type(ldns_rr_rdf(rr, 2)) ==
1883d1b2b5caSJohn Marino 			 				LDNS_RDF_TYPE_INT32) {
1884d1b2b5caSJohn Marino 			ldns_buffer_printf(output, "%10lu",
1885d1b2b5caSJohn Marino 				(unsigned long) ldns_read_uint32(
1886d1b2b5caSJohn Marino 					ldns_rdf_data(ldns_rr_rdf(rr, 2))));
1887d1b2b5caSJohn Marino 			status = ldns_buffer_status(output);
1888d1b2b5caSJohn Marino 		} else {
18895340022aSzrj 			status = ldns_rdf2buffer_str_fmt(output,
18905340022aSzrj 					fmt, ldns_rr_rdf(rr, i));
1891d1b2b5caSJohn Marino 		}
1892ac996e71SJan Lentfer 		if(status != LDNS_STATUS_OK)
1893ac996e71SJan Lentfer 			return status;
1894825eb42bSJan Lentfer 		if (i < ldns_rr_rd_count(rr) - 1) {
1895825eb42bSJan Lentfer 			ldns_buffer_printf(output, " ");
1896825eb42bSJan Lentfer 		}
1897825eb42bSJan Lentfer 	}
1898825eb42bSJan Lentfer 	/* per RR special comments - handy for DNSSEC types */
1899825eb42bSJan Lentfer 	/* check to prevent question sec. rr from
1900825eb42bSJan Lentfer 	 * getting here */
1901825eb42bSJan Lentfer 	if (ldns_rr_rd_count(rr) > 0) {
1902825eb42bSJan Lentfer 		switch (ldns_rr_get_type(rr)) {
1903825eb42bSJan Lentfer 		case LDNS_RR_TYPE_DNSKEY:
1904b5dedccaSJan Lentfer 			/* if ldns_rr_rd_count(rr) > 0
1905b5dedccaSJan Lentfer 				then ldns_rr_rdf(rr, 0) exists! */
19065340022aSzrj 			if (! (fmt_st->flags & LDNS_COMMENT_KEY)) {
1907825eb42bSJan Lentfer 				break;
1908825eb42bSJan Lentfer 			}
19095340022aSzrj 			flags = ldns_rdf2native_int16(ldns_rr_rdf(rr, 0));
1910b5dedccaSJan Lentfer 			ldns_buffer_printf(output, " ;{");
19115340022aSzrj 			if (fmt_st->flags & LDNS_COMMENT_KEY_ID) {
1912b5dedccaSJan Lentfer 				ldns_buffer_printf(output, "id = %u",
19135340022aSzrj 					(unsigned int) ldns_calc_keytag(rr));
1914825eb42bSJan Lentfer 			}
19155340022aSzrj 			if ((fmt_st->flags & LDNS_COMMENT_KEY_TYPE) &&
19165340022aSzrj 					(flags & LDNS_KEY_ZONE_KEY)){
19175340022aSzrj 
1918b5dedccaSJan Lentfer 				if (flags & LDNS_KEY_SEP_KEY) {
19195340022aSzrj 					ldns_buffer_printf(output, " (ksk)");
19205340022aSzrj 				} else {
19215340022aSzrj 					ldns_buffer_printf(output, " (zsk)");
1922b5dedccaSJan Lentfer 				}
19235340022aSzrj 				if (fmt_st->flags & LDNS_COMMENT_KEY_SIZE){
19245340022aSzrj 					ldns_buffer_printf(output, ", ");
1925b5dedccaSJan Lentfer 				}
19265340022aSzrj 			} else if (fmt_st->flags
1927b5dedccaSJan Lentfer 					& (LDNS_COMMENT_KEY_ID
1928b5dedccaSJan Lentfer 						|LDNS_COMMENT_KEY_SIZE)) {
1929b5dedccaSJan Lentfer 				ldns_buffer_printf( output, ", ");
1930b5dedccaSJan Lentfer 			}
19315340022aSzrj 			if (fmt_st->flags & LDNS_COMMENT_KEY_SIZE) {
1932b5dedccaSJan Lentfer 				ldns_buffer_printf(output, "size = %db",
1933825eb42bSJan Lentfer 					ldns_rr_dnskey_key_size(rr));
1934825eb42bSJan Lentfer 			}
1935b5dedccaSJan Lentfer 			ldns_buffer_printf(output, "}");
1936825eb42bSJan Lentfer 			break;
1937825eb42bSJan Lentfer 		case LDNS_RR_TYPE_RRSIG:
19385340022aSzrj 			if ((fmt_st->flags & LDNS_COMMENT_KEY)
19395340022aSzrj 					&& (fmt_st->flags& LDNS_COMMENT_RRSIGS)
1940b5dedccaSJan Lentfer 					&& ldns_rr_rdf(rr, 6) != NULL) {
19415340022aSzrj 				ldns_buffer_printf(output, " ;{id = %d}",
19425340022aSzrj 						ldns_rdf2native_int16(
1943b5dedccaSJan Lentfer 							ldns_rr_rdf(rr, 6)));
1944b5dedccaSJan Lentfer 			}
1945825eb42bSJan Lentfer 			break;
1946825eb42bSJan Lentfer 		case LDNS_RR_TYPE_DS:
19475340022aSzrj 			if ((fmt_st->flags & LDNS_COMMENT_BUBBLEBABBLE) &&
19485340022aSzrj 					ldns_rr_rdf(rr, 3) != NULL) {
19495340022aSzrj 
1950b5dedccaSJan Lentfer 				uint8_t *data = ldns_rdf_data(
1951b5dedccaSJan Lentfer 						ldns_rr_rdf(rr, 3));
19525340022aSzrj 				size_t len = ldns_rdf_size(ldns_rr_rdf(rr, 3));
19535340022aSzrj 				char *babble = ldns_bubblebabble(data, len);
1954b5dedccaSJan Lentfer 				if(babble) {
19555340022aSzrj 					ldns_buffer_printf(output,
19565340022aSzrj 							" ;{%s}", babble);
1957b5dedccaSJan Lentfer 				}
1958825eb42bSJan Lentfer 				LDNS_FREE(babble);
1959825eb42bSJan Lentfer 			}
1960825eb42bSJan Lentfer 			break;
1961825eb42bSJan Lentfer 		case LDNS_RR_TYPE_NSEC3:
19625340022aSzrj 			if (! (fmt_st->flags & LDNS_COMMENT_FLAGS) &&
19635340022aSzrj 				! (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN)) {
1964b5dedccaSJan Lentfer 				break;
1965825eb42bSJan Lentfer 			}
1966b5dedccaSJan Lentfer 			ldns_buffer_printf(output, " ;{");
19675340022aSzrj 			if ((fmt_st->flags & LDNS_COMMENT_FLAGS)) {
1968b5dedccaSJan Lentfer 				if (ldns_nsec3_optout(rr)) {
1969b5dedccaSJan Lentfer 					ldns_buffer_printf(output,
1970b5dedccaSJan Lentfer 						" flags: optout");
1971b5dedccaSJan Lentfer 				} else {
19725340022aSzrj 					ldns_buffer_printf(output," flags: -");
1973b5dedccaSJan Lentfer 				}
19745340022aSzrj 				if (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN &&
19755340022aSzrj 						fmt_st->hashmap != NULL) {
1976b5dedccaSJan Lentfer 					ldns_buffer_printf(output, ", ");
1977b5dedccaSJan Lentfer 				}
1978b5dedccaSJan Lentfer 			}
19795340022aSzrj 			if (fmt_st->flags & LDNS_COMMENT_NSEC3_CHAIN &&
19805340022aSzrj 					fmt_st->hashmap != NULL) {
1981b5dedccaSJan Lentfer 				ldns_rbnode_t *node;
1982b5dedccaSJan Lentfer 				ldns_rdf *key = ldns_dname_label(
1983b5dedccaSJan Lentfer 						ldns_rr_owner(rr), 0);
1984b5dedccaSJan Lentfer 				if (key) {
1985b5dedccaSJan Lentfer 					node = ldns_rbtree_search(
19865340022aSzrj 						fmt_st->hashmap,
1987b5dedccaSJan Lentfer 						(void *) key);
1988b5dedccaSJan Lentfer 					if (node->data) {
19895340022aSzrj 						ldns_buffer_printf(output,
1990b5dedccaSJan Lentfer 							"from: ");
19915340022aSzrj 						(void) ldns_rdf2buffer_str(
1992b5dedccaSJan Lentfer 							output,
19935340022aSzrj 							ldns_dnssec_name_name(
19945340022aSzrj 							   (ldns_dnssec_name*)
19955340022aSzrj 							   node->data
19965340022aSzrj 							));
1997b5dedccaSJan Lentfer 					}
1998*ee791febSAntonio Huete Jimenez 					ldns_rdf_deep_free(key);
1999b5dedccaSJan Lentfer 				}
2000b5dedccaSJan Lentfer 				key = ldns_b32_ext2dname(
2001b5dedccaSJan Lentfer 						ldns_nsec3_next_owner(rr));
2002b5dedccaSJan Lentfer 				if (key) {
2003b5dedccaSJan Lentfer 					node = ldns_rbtree_search(
20045340022aSzrj 						fmt_st->hashmap,
2005b5dedccaSJan Lentfer 						(void *) key);
2006b5dedccaSJan Lentfer 					if (node->data) {
20075340022aSzrj 						ldns_buffer_printf(output,
2008b5dedccaSJan Lentfer 							" to: ");
20095340022aSzrj 						(void) ldns_rdf2buffer_str(
2010b5dedccaSJan Lentfer 							output,
20115340022aSzrj 							ldns_dnssec_name_name(
20125340022aSzrj 							   (ldns_dnssec_name*)
20135340022aSzrj 							   node->data
20145340022aSzrj 							));
2015b5dedccaSJan Lentfer 					}
2016*ee791febSAntonio Huete Jimenez 					ldns_rdf_deep_free(key);
2017b5dedccaSJan Lentfer 				}
2018b5dedccaSJan Lentfer 			}
2019b5dedccaSJan Lentfer 			ldns_buffer_printf(output, "}");
2020825eb42bSJan Lentfer 			break;
2021825eb42bSJan Lentfer 		default:
2022825eb42bSJan Lentfer 			break;
2023825eb42bSJan Lentfer 
2024825eb42bSJan Lentfer 		}
2025825eb42bSJan Lentfer 	}
2026825eb42bSJan Lentfer 	/* last */
2027825eb42bSJan Lentfer 	ldns_buffer_printf(output, "\n");
2028b5dedccaSJan Lentfer 	return ldns_buffer_status(output);
2029b5dedccaSJan Lentfer }
2030b5dedccaSJan Lentfer 
2031b5dedccaSJan Lentfer ldns_status
ldns_rr2buffer_str(ldns_buffer * output,const ldns_rr * rr)2032b5dedccaSJan Lentfer ldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr)
2033b5dedccaSJan Lentfer {
2034b5dedccaSJan Lentfer 	return ldns_rr2buffer_str_fmt(output, ldns_output_format_default, rr);
2035b5dedccaSJan Lentfer }
2036b5dedccaSJan Lentfer 
2037b5dedccaSJan Lentfer ldns_status
ldns_rr_list2buffer_str_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_rr_list * list)2038b5dedccaSJan Lentfer ldns_rr_list2buffer_str_fmt(ldns_buffer *output,
2039b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_rr_list *list)
2040b5dedccaSJan Lentfer {
2041b5dedccaSJan Lentfer 	uint16_t i;
2042b5dedccaSJan Lentfer 
2043b5dedccaSJan Lentfer 	for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
2044b5dedccaSJan Lentfer 		(void) ldns_rr2buffer_str_fmt(output, fmt,
2045b5dedccaSJan Lentfer 				ldns_rr_list_rr(list, i));
2046825eb42bSJan Lentfer 	}
2047825eb42bSJan Lentfer 	return ldns_buffer_status(output);
2048825eb42bSJan Lentfer }
2049825eb42bSJan Lentfer 
2050825eb42bSJan Lentfer ldns_status
ldns_rr_list2buffer_str(ldns_buffer * output,const ldns_rr_list * list)2051825eb42bSJan Lentfer ldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list)
2052825eb42bSJan Lentfer {
2053b5dedccaSJan Lentfer 	return ldns_rr_list2buffer_str_fmt(
2054b5dedccaSJan Lentfer 			output, ldns_output_format_default, list);
2055825eb42bSJan Lentfer }
2056825eb42bSJan Lentfer 
2057825eb42bSJan Lentfer ldns_status
ldns_pktheader2buffer_str(ldns_buffer * output,const ldns_pkt * pkt)2058825eb42bSJan Lentfer ldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
2059825eb42bSJan Lentfer {
2060825eb42bSJan Lentfer 	ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes,
2061825eb42bSJan Lentfer 			                    (int) ldns_pkt_get_opcode(pkt));
2062825eb42bSJan Lentfer 	ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes,
2063825eb42bSJan Lentfer 			                    (int) ldns_pkt_get_rcode(pkt));
2064825eb42bSJan Lentfer 
2065825eb42bSJan Lentfer 	ldns_buffer_printf(output, ";; ->>HEADER<<- ");
2066825eb42bSJan Lentfer 	if (opcode) {
2067825eb42bSJan Lentfer 		ldns_buffer_printf(output, "opcode: %s, ", opcode->name);
2068825eb42bSJan Lentfer 	} else {
2069825eb42bSJan Lentfer 		ldns_buffer_printf(output, "opcode: ?? (%u), ",
2070825eb42bSJan Lentfer 				ldns_pkt_get_opcode(pkt));
2071825eb42bSJan Lentfer 	}
2072825eb42bSJan Lentfer 	if (rcode) {
2073825eb42bSJan Lentfer 		ldns_buffer_printf(output, "rcode: %s, ", rcode->name);
2074825eb42bSJan Lentfer 	} else {
2075825eb42bSJan Lentfer 		ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt));
2076825eb42bSJan Lentfer 	}
2077825eb42bSJan Lentfer 	ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt));
2078825eb42bSJan Lentfer 	ldns_buffer_printf(output, ";; flags: ");
2079825eb42bSJan Lentfer 
2080825eb42bSJan Lentfer 	if (ldns_pkt_qr(pkt)) {
2081825eb42bSJan Lentfer 		ldns_buffer_printf(output, "qr ");
2082825eb42bSJan Lentfer 	}
2083825eb42bSJan Lentfer 	if (ldns_pkt_aa(pkt)) {
2084825eb42bSJan Lentfer 		ldns_buffer_printf(output, "aa ");
2085825eb42bSJan Lentfer 	}
2086825eb42bSJan Lentfer 	if (ldns_pkt_tc(pkt)) {
2087825eb42bSJan Lentfer 		ldns_buffer_printf(output, "tc ");
2088825eb42bSJan Lentfer 	}
2089825eb42bSJan Lentfer 	if (ldns_pkt_rd(pkt)) {
2090825eb42bSJan Lentfer 		ldns_buffer_printf(output, "rd ");
2091825eb42bSJan Lentfer 	}
2092825eb42bSJan Lentfer 	if (ldns_pkt_cd(pkt)) {
2093825eb42bSJan Lentfer 		ldns_buffer_printf(output, "cd ");
2094825eb42bSJan Lentfer 	}
2095825eb42bSJan Lentfer 	if (ldns_pkt_ra(pkt)) {
2096825eb42bSJan Lentfer 		ldns_buffer_printf(output, "ra ");
2097825eb42bSJan Lentfer 	}
2098825eb42bSJan Lentfer 	if (ldns_pkt_ad(pkt)) {
2099825eb42bSJan Lentfer 		ldns_buffer_printf(output, "ad ");
2100825eb42bSJan Lentfer 	}
2101825eb42bSJan Lentfer 	ldns_buffer_printf(output, "; ");
2102825eb42bSJan Lentfer 	ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt));
2103825eb42bSJan Lentfer 	ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt));
2104825eb42bSJan Lentfer 	ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt));
2105825eb42bSJan Lentfer 	ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt));
2106825eb42bSJan Lentfer 	return ldns_buffer_status(output);
2107825eb42bSJan Lentfer }
2108825eb42bSJan Lentfer 
2109*ee791febSAntonio Huete Jimenez 
2110*ee791febSAntonio Huete Jimenez /* print EDNS option data in the Dig format: 76 61 6c 69 ... */
2111*ee791febSAntonio Huete Jimenez static void
ldns_edns_hex_data2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2112*ee791febSAntonio Huete Jimenez ldns_edns_hex_data2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2113*ee791febSAntonio Huete Jimenez {
2114*ee791febSAntonio Huete Jimenez 	size_t j;
2115*ee791febSAntonio Huete Jimenez 	for (j = 0; j < len; j++) {
2116*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " %02x", data[j]);
2117*ee791febSAntonio Huete Jimenez 	}
2118*ee791febSAntonio Huete Jimenez }
2119*ee791febSAntonio Huete Jimenez 
2120*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_llq2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2121*ee791febSAntonio Huete Jimenez ldns_edns_llq2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2122*ee791febSAntonio Huete Jimenez {
2123*ee791febSAntonio Huete Jimenez 	/* LLQ constants */
2124*ee791febSAntonio Huete Jimenez 	const char* llq_errors[] = {"NO-ERROR", "SERV-FULL", "STATIC",
2125*ee791febSAntonio Huete Jimenez 		"FORMAT-ERR", "NO-SUCH-LLQ", "BAD-VERS", "UNKNOWN_ERR"};
2126*ee791febSAntonio Huete Jimenez 	const unsigned int llq_errors_num = 7;
2127*ee791febSAntonio Huete Jimenez 	const char* llq_opcodes[] = {"LLQ-SETUP", "LLQ-REFRESH", "LLQ-EVENT"};
2128*ee791febSAntonio Huete Jimenez 	const unsigned int llq_opcodes_num = 3;
2129*ee791febSAntonio Huete Jimenez 
2130*ee791febSAntonio Huete Jimenez 	uint16_t version, llq_opcode, error_code;
2131*ee791febSAntonio Huete Jimenez 	uint64_t llq_id;
2132*ee791febSAntonio Huete Jimenez 	uint32_t lease_life; /* Requested or granted life of LLQ, in seconds */
2133*ee791febSAntonio Huete Jimenez 
2134*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; Long-Lived Query:");
2135*ee791febSAntonio Huete Jimenez 
2136*ee791febSAntonio Huete Jimenez 	/* read the record */
2137*ee791febSAntonio Huete Jimenez 	if(len != 18) {
2138*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " malformed LLQ ");
2139*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2140*ee791febSAntonio Huete Jimenez 
2141*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2142*ee791febSAntonio Huete Jimenez 	}
2143*ee791febSAntonio Huete Jimenez 	version = ldns_read_uint16(data);
2144*ee791febSAntonio Huete Jimenez 	llq_opcode = ldns_read_uint16(data+2);
2145*ee791febSAntonio Huete Jimenez 	error_code = ldns_read_uint16(data+4);
2146*ee791febSAntonio Huete Jimenez 	memmove(&llq_id, data+6, sizeof(uint64_t));
2147*ee791febSAntonio Huete Jimenez 	lease_life = ldns_read_uint32(data+14);
2148*ee791febSAntonio Huete Jimenez 
2149*ee791febSAntonio Huete Jimenez 	/* print option field entires */
2150*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "v%d ", (int)version);
2151*ee791febSAntonio Huete Jimenez 
2152*ee791febSAntonio Huete Jimenez 	if(llq_opcode < llq_opcodes_num) {
2153*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "%s", llq_opcodes[llq_opcode]);
2154*ee791febSAntonio Huete Jimenez 	} else {
2155*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "opcode %d", (int)llq_opcode);
2156*ee791febSAntonio Huete Jimenez 	}
2157*ee791febSAntonio Huete Jimenez 
2158*ee791febSAntonio Huete Jimenez 	if(error_code < llq_errors_num)
2159*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " %s", llq_errors[error_code]);
2160*ee791febSAntonio Huete Jimenez 	else {
2161*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " error %d", (int)error_code);
2162*ee791febSAntonio Huete Jimenez 	}
2163*ee791febSAntonio Huete Jimenez 
2164*ee791febSAntonio Huete Jimenez #ifndef USE_WINSOCK
2165*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, " id %llx lease-life %lu",
2166*ee791febSAntonio Huete Jimenez 		(unsigned long long)llq_id, (unsigned long)lease_life);
2167*ee791febSAntonio Huete Jimenez #else
2168*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, " id %I64x lease-life %lu",
2169*ee791febSAntonio Huete Jimenez 		(unsigned long long)llq_id, (unsigned long)lease_life);
2170*ee791febSAntonio Huete Jimenez #endif
2171*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2172*ee791febSAntonio Huete Jimenez }
2173*ee791febSAntonio Huete Jimenez 
2174*ee791febSAntonio Huete Jimenez 
2175*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_ul2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2176*ee791febSAntonio Huete Jimenez ldns_edns_ul2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2177*ee791febSAntonio Huete Jimenez {
2178*ee791febSAntonio Huete Jimenez 	uint32_t lease;
2179*ee791febSAntonio Huete Jimenez 
2180*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; Update Lease:");
2181*ee791febSAntonio Huete Jimenez 
2182*ee791febSAntonio Huete Jimenez 	if(len != 4) {
2183*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " malformed UL ");
2184*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2185*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2186*ee791febSAntonio Huete Jimenez 	}
2187*ee791febSAntonio Huete Jimenez 	lease = ldns_read_uint32(data);
2188*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "lease %lu", (unsigned long)lease);
2189*ee791febSAntonio Huete Jimenez 
2190*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2191*ee791febSAntonio Huete Jimenez }
2192*ee791febSAntonio Huete Jimenez 
2193*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_nsid2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2194*ee791febSAntonio Huete Jimenez ldns_edns_nsid2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2195*ee791febSAntonio Huete Jimenez {
2196*ee791febSAntonio Huete Jimenez 	size_t i, printed=0;
2197*ee791febSAntonio Huete Jimenez 
2198*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; NSID:");
2199*ee791febSAntonio Huete Jimenez 	ldns_edns_hex_data2buffer_str(output, data, len);
2200*ee791febSAntonio Huete Jimenez 
2201*ee791febSAntonio Huete Jimenez 	/* print the human-readable text string */
2202*ee791febSAntonio Huete Jimenez 	for(i = 0; i < len; i++) {
2203*ee791febSAntonio Huete Jimenez 		if(isprint((unsigned char)data[i]) || data[i] == '\t') {
2204*ee791febSAntonio Huete Jimenez 			if(!printed) {
2205*ee791febSAntonio Huete Jimenez 				ldns_buffer_printf(output, " (");
2206*ee791febSAntonio Huete Jimenez 				printed = 1;
2207*ee791febSAntonio Huete Jimenez 			}
2208*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "%c", (char)data[i]);
2209*ee791febSAntonio Huete Jimenez 		}
2210*ee791febSAntonio Huete Jimenez 	}
2211*ee791febSAntonio Huete Jimenez 	if(printed)
2212*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, ")");
2213*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2214*ee791febSAntonio Huete Jimenez }
2215*ee791febSAntonio Huete Jimenez 
2216*ee791febSAntonio Huete Jimenez 
2217*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_dau2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2218*ee791febSAntonio Huete Jimenez ldns_edns_dau2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2219*ee791febSAntonio Huete Jimenez {
2220*ee791febSAntonio Huete Jimenez 	size_t i;
2221*ee791febSAntonio Huete Jimenez 	ldns_lookup_table *lt;
2222*ee791febSAntonio Huete Jimenez 
2223*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; DNSSEC Algorithm Understood (DAU):");
2224*ee791febSAntonio Huete Jimenez 
2225*ee791febSAntonio Huete Jimenez 	for(i = 0; i <len; i++) {
2226*ee791febSAntonio Huete Jimenez 		lt = ldns_lookup_by_id(ldns_algorithms, data[i]);
2227*ee791febSAntonio Huete Jimenez 		if (lt && lt->name) {
2228*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " %s", lt->name);
2229*ee791febSAntonio Huete Jimenez 		} else {
2230*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " ALG%u", data[i]);
2231*ee791febSAntonio Huete Jimenez 		}
2232*ee791febSAntonio Huete Jimenez 	}
2233*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2234*ee791febSAntonio Huete Jimenez }
2235*ee791febSAntonio Huete Jimenez 
2236*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_dhu2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2237*ee791febSAntonio Huete Jimenez ldns_edns_dhu2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2238*ee791febSAntonio Huete Jimenez {
2239*ee791febSAntonio Huete Jimenez 	size_t i;
2240*ee791febSAntonio Huete Jimenez 	ldns_lookup_table *lt;
2241*ee791febSAntonio Huete Jimenez 
2242*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; DS Hash Understood (DHU):");
2243*ee791febSAntonio Huete Jimenez 
2244*ee791febSAntonio Huete Jimenez 	for(i = 0; i < len; i++) {
2245*ee791febSAntonio Huete Jimenez 		lt = ldns_lookup_by_id(ldns_hashes, data[i]);
2246*ee791febSAntonio Huete Jimenez 		if (lt && lt->name) {
2247*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " %s", lt->name);
2248*ee791febSAntonio Huete Jimenez 		} else {
2249*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " ALG%u", data[i]);
2250*ee791febSAntonio Huete Jimenez 		}
2251*ee791febSAntonio Huete Jimenez 	}
2252*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2253*ee791febSAntonio Huete Jimenez }
2254*ee791febSAntonio Huete Jimenez 
2255*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_d3u2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2256*ee791febSAntonio Huete Jimenez ldns_edns_d3u2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2257*ee791febSAntonio Huete Jimenez {
2258*ee791febSAntonio Huete Jimenez 	size_t i;
2259*ee791febSAntonio Huete Jimenez 
2260*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; NSEC3 Hash Understood (N3U):");
2261*ee791febSAntonio Huete Jimenez 
2262*ee791febSAntonio Huete Jimenez 	for(i=0; i<len; i++) {
2263*ee791febSAntonio Huete Jimenez 		if(data[i] == 1) {
2264*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " SHA1");
2265*ee791febSAntonio Huete Jimenez 		} else {
2266*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " %d", (int)data[i]);
2267*ee791febSAntonio Huete Jimenez 		}
2268*ee791febSAntonio Huete Jimenez 	}
2269*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2270*ee791febSAntonio Huete Jimenez }
2271*ee791febSAntonio Huete Jimenez 
2272*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_subnet2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2273*ee791febSAntonio Huete Jimenez ldns_edns_subnet2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2274*ee791febSAntonio Huete Jimenez {
2275*ee791febSAntonio Huete Jimenez 	uint16_t family;
2276*ee791febSAntonio Huete Jimenez 	uint8_t source, scope;
2277*ee791febSAntonio Huete Jimenez 	if(len < 4) {
2278*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed subnet ");
2279*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2280*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2281*ee791febSAntonio Huete Jimenez 	}
2282*ee791febSAntonio Huete Jimenez 	family = ldns_read_uint16(data);
2283*ee791febSAntonio Huete Jimenez 	source = data[2];
2284*ee791febSAntonio Huete Jimenez 	scope = data[3];
2285*ee791febSAntonio Huete Jimenez 	if(family == 1) {
2286*ee791febSAntonio Huete Jimenez 		/* IPv4 */
2287*ee791febSAntonio Huete Jimenez 		char buf[64];
2288*ee791febSAntonio Huete Jimenez 		uint8_t ip4[4];
2289*ee791febSAntonio Huete Jimenez 		memset(ip4, 0, sizeof(ip4));
2290*ee791febSAntonio Huete Jimenez 		if(len-4 > 4) {
2291*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "trailingdata:");
2292*ee791febSAntonio Huete Jimenez 			ldns_edns_hex_data2buffer_str(output, data+4+4, len-4-4);
2293*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " ");
2294*ee791febSAntonio Huete Jimenez 			len = 4+4;
2295*ee791febSAntonio Huete Jimenez 		}
2296*ee791febSAntonio Huete Jimenez 		memmove(ip4, data+4, len-4);
2297*ee791febSAntonio Huete Jimenez 		if(!inet_ntop(AF_INET, ip4, buf, (socklen_t) sizeof(buf))) {
2298*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "ip4ntoperror ");
2299*ee791febSAntonio Huete Jimenez 			ldns_edns_hex_data2buffer_str(output, data+4+4, len-4-4);
2300*ee791febSAntonio Huete Jimenez 		} else {
2301*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "%s", buf);
2302*ee791febSAntonio Huete Jimenez 		}
2303*ee791febSAntonio Huete Jimenez 	} else if(family == 2) {
2304*ee791febSAntonio Huete Jimenez 		/* IPv6 */
2305*ee791febSAntonio Huete Jimenez 		char buf[64];
2306*ee791febSAntonio Huete Jimenez 		uint8_t ip6[16];
2307*ee791febSAntonio Huete Jimenez 		memset(ip6, 0, sizeof(ip6));
2308*ee791febSAntonio Huete Jimenez 		if(len-4 > 16) {
2309*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "trailingdata:");
2310*ee791febSAntonio Huete Jimenez 			ldns_edns_hex_data2buffer_str(output, data+4+16, len-4-16);
2311*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " ");
2312*ee791febSAntonio Huete Jimenez 			len = 4+16;
2313*ee791febSAntonio Huete Jimenez 		}
2314*ee791febSAntonio Huete Jimenez 		memmove(ip6, data+4, len-4);
2315*ee791febSAntonio Huete Jimenez #ifdef AF_INET6
2316*ee791febSAntonio Huete Jimenez 		if(!inet_ntop(AF_INET6, ip6, buf, (socklen_t) sizeof(buf))) {
2317*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "ip6ntoperror ");
2318*ee791febSAntonio Huete Jimenez 			ldns_edns_hex_data2buffer_str(output, data+4+4, len-4-4);
2319*ee791febSAntonio Huete Jimenez 		} else {
2320*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "%s", buf);
2321*ee791febSAntonio Huete Jimenez 		}
2322*ee791febSAntonio Huete Jimenez #else
2323*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output,  data+4+4, len-4-4);
2324*ee791febSAntonio Huete Jimenez #endif
2325*ee791febSAntonio Huete Jimenez 	} else {
2326*ee791febSAntonio Huete Jimenez 		/* unknown */
2327*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "family %d ", (int)family);
2328*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2329*ee791febSAntonio Huete Jimenez 	}
2330*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "/%d scope /%d", (int)source, (int)scope);
2331*ee791febSAntonio Huete Jimenez 
2332*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2333*ee791febSAntonio Huete Jimenez }
2334*ee791febSAntonio Huete Jimenez 
2335*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_expire2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2336*ee791febSAntonio Huete Jimenez ldns_edns_expire2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2337*ee791febSAntonio Huete Jimenez {
2338*ee791febSAntonio Huete Jimenez 
2339*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; EXPIRE:");
2340*ee791febSAntonio Huete Jimenez 
2341*ee791febSAntonio Huete Jimenez 	if (!(len == 0) || len == 4) {
2342*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed expire ");
2343*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2344*ee791febSAntonio Huete Jimenez 
2345*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2346*ee791febSAntonio Huete Jimenez 	}
2347*ee791febSAntonio Huete Jimenez 
2348*ee791febSAntonio Huete Jimenez 	// TODO can this output be more accurate?
2349*ee791febSAntonio Huete Jimenez 	ldns_edns_hex_data2buffer_str(output, data, len);
2350*ee791febSAntonio Huete Jimenez 
2351*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2352*ee791febSAntonio Huete Jimenez }
2353*ee791febSAntonio Huete Jimenez 
2354*ee791febSAntonio Huete Jimenez 
2355*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_cookie2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2356*ee791febSAntonio Huete Jimenez ldns_edns_cookie2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2357*ee791febSAntonio Huete Jimenez {
2358*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; COOKIE:");
2359*ee791febSAntonio Huete Jimenez 
2360*ee791febSAntonio Huete Jimenez 	/* the size of an EDNS cookie is restricted by RFC 7873 */
2361*ee791febSAntonio Huete Jimenez 	if (!(len == 8 || (len >= 16 && len < 40))) {
2362*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed cookie ");
2363*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2364*ee791febSAntonio Huete Jimenez 	}
2365*ee791febSAntonio Huete Jimenez 	ldns_edns_hex_data2buffer_str(output, data, len);
2366*ee791febSAntonio Huete Jimenez 
2367*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2368*ee791febSAntonio Huete Jimenez }
2369*ee791febSAntonio Huete Jimenez 
2370*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_keepalive2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2371*ee791febSAntonio Huete Jimenez ldns_edns_keepalive2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2372*ee791febSAntonio Huete Jimenez {
2373*ee791febSAntonio Huete Jimenez 	uint16_t timeout;
2374*ee791febSAntonio Huete Jimenez 
2375*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; KEEPALIVE:");
2376*ee791febSAntonio Huete Jimenez 
2377*ee791febSAntonio Huete Jimenez 	if(!(len == 0 || len == 2)) {
2378*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed keepalive ");
2379*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2380*ee791febSAntonio Huete Jimenez 
2381*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2382*ee791febSAntonio Huete Jimenez 	}
2383*ee791febSAntonio Huete Jimenez 
2384*ee791febSAntonio Huete Jimenez 	if(len == 0) {
2385*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "no timeout value (only valid for client option)");
2386*ee791febSAntonio Huete Jimenez 	} else {
2387*ee791febSAntonio Huete Jimenez 		timeout = ldns_read_uint16(data);
2388*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "timeout value in units of 100ms %u", (int)timeout);
2389*ee791febSAntonio Huete Jimenez 	}
2390*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2391*ee791febSAntonio Huete Jimenez }
2392*ee791febSAntonio Huete Jimenez 
2393*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_padding2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2394*ee791febSAntonio Huete Jimenez ldns_edns_padding2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2395*ee791febSAntonio Huete Jimenez {
2396*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; PADDING: ");
2397*ee791febSAntonio Huete Jimenez 	ldns_edns_hex_data2buffer_str(output, data, len);
2398*ee791febSAntonio Huete Jimenez 
2399*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2400*ee791febSAntonio Huete Jimenez }
2401*ee791febSAntonio Huete Jimenez 
2402*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_chain2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2403*ee791febSAntonio Huete Jimenez ldns_edns_chain2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2404*ee791febSAntonio Huete Jimenez {
2405*ee791febSAntonio Huete Jimenez 	ldns_rdf** temp = NULL;
2406*ee791febSAntonio Huete Jimenez 
2407*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; CHAIN: ");
2408*ee791febSAntonio Huete Jimenez 
2409*ee791febSAntonio Huete Jimenez 	if (ldns_str2rdf_dname(temp, (char*) data) != LDNS_STATUS_OK) {
2410*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed chain ");
2411*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2412*ee791febSAntonio Huete Jimenez 
2413*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2414*ee791febSAntonio Huete Jimenez 	}
2415*ee791febSAntonio Huete Jimenez 
2416*ee791febSAntonio Huete Jimenez 	ldns_characters2buffer_str(output, len, data);
2417*ee791febSAntonio Huete Jimenez 
2418*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2419*ee791febSAntonio Huete Jimenez }
2420*ee791febSAntonio Huete Jimenez 
2421*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_key_tag2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2422*ee791febSAntonio Huete Jimenez ldns_edns_key_tag2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2423*ee791febSAntonio Huete Jimenez {
2424*ee791febSAntonio Huete Jimenez 	size_t i;
2425*ee791febSAntonio Huete Jimenez 
2426*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; KEY TAG: ");
2427*ee791febSAntonio Huete Jimenez 
2428*ee791febSAntonio Huete Jimenez 	if(len < 2 || len % 2 != 0) {
2429*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed key tag ");
2430*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2431*ee791febSAntonio Huete Jimenez 
2432*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2433*ee791febSAntonio Huete Jimenez 	}
2434*ee791febSAntonio Huete Jimenez 
2435*ee791febSAntonio Huete Jimenez 	for (i = 0; i < len; i += 2) {
2436*ee791febSAntonio Huete Jimenez 		uint16_t tag = ldns_read_uint16(data);
2437*ee791febSAntonio Huete Jimenez 
2438*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " %hu", tag);
2439*ee791febSAntonio Huete Jimenez 	}
2440*ee791febSAntonio Huete Jimenez 
2441*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2442*ee791febSAntonio Huete Jimenez }
2443*ee791febSAntonio Huete Jimenez 
2444*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_ede2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2445*ee791febSAntonio Huete Jimenez ldns_edns_ede2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2446*ee791febSAntonio Huete Jimenez {
2447*ee791febSAntonio Huete Jimenez 	size_t i;
2448*ee791febSAntonio Huete Jimenez 	uint16_t ede;
2449*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; EDE:");
2450*ee791febSAntonio Huete Jimenez 
2451*ee791febSAntonio Huete Jimenez 	if(len < 2) {
2452*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed ede ");
2453*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2454*ee791febSAntonio Huete Jimenez 
2455*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2456*ee791febSAntonio Huete Jimenez 	}
2457*ee791febSAntonio Huete Jimenez 
2458*ee791febSAntonio Huete Jimenez 	ede = ldns_read_uint16(data);
2459*ee791febSAntonio Huete Jimenez 
2460*ee791febSAntonio Huete Jimenez 	switch (ede) {
2461*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_OTHER:
2462*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 0 (Other): ");
2463*ee791febSAntonio Huete Jimenez 		break;
2464*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_UNSUPPORTED_DNSKEY_ALG:
2465*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 1 (Unsupported DNSKEY Algorithm)");
2466*ee791febSAntonio Huete Jimenez 		break;
2467*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_UNSUPPORTED_DS_DIGEST:
2468*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 2 (Unsupported DS Digest type)");
2469*ee791febSAntonio Huete Jimenez 		break;
2470*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_STALE_ANSWER:
2471*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 3 (Stale Answer)");
2472*ee791febSAntonio Huete Jimenez 		break;
2473*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_FORGED_ANSWER:
2474*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 4 (Forged Answer)");
2475*ee791febSAntonio Huete Jimenez 		break;
2476*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_DNSSEC_INDETERMINATE:
2477*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 5 (DNSSEC Indeterminate)");
2478*ee791febSAntonio Huete Jimenez 		break;
2479*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_DNSSEC_BOGUS:
2480*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 6 (DNSSEC Bogus)");
2481*ee791febSAntonio Huete Jimenez 		break;
2482*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_SIGNATURE_EXPIRED:
2483*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 7 (Signature Expired)");
2484*ee791febSAntonio Huete Jimenez 		break;
2485*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_SIGNATURE_NOT_YET_VALID:
2486*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 8 (Signature Not Yet Valid)");
2487*ee791febSAntonio Huete Jimenez 		break;
2488*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_DNSKEY_MISSING:
2489*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 9 (DNSKEY Missing)");
2490*ee791febSAntonio Huete Jimenez 		break;
2491*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_RRSIGS_MISSING:
2492*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 10 (RRSIGs Missing)");
2493*ee791febSAntonio Huete Jimenez 		break;
2494*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NO_ZONE_KEY_BIT_SET:
2495*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 11 (No Zone Key Bit Set)");
2496*ee791febSAntonio Huete Jimenez 		break;
2497*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NSEC_MISSING:
2498*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 12 (NSEC Missing)");
2499*ee791febSAntonio Huete Jimenez 		break;
2500*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_CACHED_ERROR:
2501*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 13 (Cached Error)");
2502*ee791febSAntonio Huete Jimenez 		break;
2503*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NOT_READY:
2504*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 14 (Not Ready)");
2505*ee791febSAntonio Huete Jimenez 		break;
2506*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_BLOCKED:
2507*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 15 (Blocked)");
2508*ee791febSAntonio Huete Jimenez 		break;
2509*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_CENSORED:
2510*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 16 (Censored)");
2511*ee791febSAntonio Huete Jimenez 		break;
2512*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_FILTERED:
2513*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 17 (Filtered)");
2514*ee791febSAntonio Huete Jimenez 		break;
2515*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_PROHIBITED:
2516*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 18 (Prohibited)");
2517*ee791febSAntonio Huete Jimenez 		break;
2518*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_STALE_NXDOMAIN_ANSWER:
2519*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 19 (NXDOMAIN Answer)");
2520*ee791febSAntonio Huete Jimenez 		break;
2521*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NOT_AUTHORITATIVE:
2522*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 20 (Not Authoritative)");
2523*ee791febSAntonio Huete Jimenez 		break;
2524*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NOT_SUPPORTED:
2525*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 21 (Not Supported)");
2526*ee791febSAntonio Huete Jimenez 		break;
2527*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NO_REACHABLE_AUTHORITY:
2528*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 22 (No Reachable Authority)");
2529*ee791febSAntonio Huete Jimenez 		break;
2530*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_NETWORK_ERROR:
2531*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 23 (Network Error)");
2532*ee791febSAntonio Huete Jimenez 		break;
2533*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_INVALID_DATA:
2534*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 24 (Invalid Data)");
2535*ee791febSAntonio Huete Jimenez 		break;
2536*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_SIGNATURE_EXPIRED_BEFORE_VALID:
2537*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 25 (Signature Expired Before Valid)");
2538*ee791febSAntonio Huete Jimenez 		break;
2539*ee791febSAntonio Huete Jimenez 	case LDNS_EDE_TOO_EARLY:
2540*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " 26 (Too Early)");
2541*ee791febSAntonio Huete Jimenez 		break;
2542*ee791febSAntonio Huete Jimenez 	default:
2543*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " %02x", data[0]);
2544*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " %02x", data[1]);
2545*ee791febSAntonio Huete Jimenez 		break;
2546*ee791febSAntonio Huete Jimenez 	}
2547*ee791febSAntonio Huete Jimenez 
2548*ee791febSAntonio Huete Jimenez 	/* skip the EDE code in the output */
2549*ee791febSAntonio Huete Jimenez 	data += 2;
2550*ee791febSAntonio Huete Jimenez 	len -= 2;
2551*ee791febSAntonio Huete Jimenez 
2552*ee791febSAntonio Huete Jimenez 	if (len > 2) {
2553*ee791febSAntonio Huete Jimenez 		/* format the hex bytes */
2554*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, ":");
2555*ee791febSAntonio Huete Jimenez 		for (i = 0; i < len; i++) {
2556*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, " %02x", data[i]);
2557*ee791febSAntonio Huete Jimenez 		}
2558*ee791febSAntonio Huete Jimenez 
2559*ee791febSAntonio Huete Jimenez 		/* format the human-readable string */
2560*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, " (");
2561*ee791febSAntonio Huete Jimenez 		ldns_characters2buffer_str(output, len, data);
2562*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, ")");
2563*ee791febSAntonio Huete Jimenez 	}
2564*ee791febSAntonio Huete Jimenez 
2565*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2566*ee791febSAntonio Huete Jimenez }
2567*ee791febSAntonio Huete Jimenez 
2568*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_client_tag2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2569*ee791febSAntonio Huete Jimenez ldns_edns_client_tag2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2570*ee791febSAntonio Huete Jimenez {
2571*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; CLIENT-TAG:");
2572*ee791febSAntonio Huete Jimenez 
2573*ee791febSAntonio Huete Jimenez 	if (len > 2) {
2574*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed client-tag ");
2575*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2576*ee791febSAntonio Huete Jimenez 
2577*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2578*ee791febSAntonio Huete Jimenez 	}
2579*ee791febSAntonio Huete Jimenez 
2580*ee791febSAntonio Huete Jimenez 	ldns_edns_hex_data2buffer_str(output, data, len);
2581*ee791febSAntonio Huete Jimenez 
2582*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2583*ee791febSAntonio Huete Jimenez }
2584*ee791febSAntonio Huete Jimenez 
2585*ee791febSAntonio Huete Jimenez static ldns_status
ldns_edns_server_tag2buffer_str(ldns_buffer * output,uint8_t * data,size_t len)2586*ee791febSAntonio Huete Jimenez ldns_edns_server_tag2buffer_str(ldns_buffer* output, uint8_t* data, size_t len)
2587*ee791febSAntonio Huete Jimenez {
2588*ee791febSAntonio Huete Jimenez 	ldns_buffer_printf(output, "; SERVER-TAG:");
2589*ee791febSAntonio Huete Jimenez 
2590*ee791febSAntonio Huete Jimenez 	if (len > 2) {
2591*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "malformed server-tag ");
2592*ee791febSAntonio Huete Jimenez 		ldns_edns_hex_data2buffer_str(output, data, len);
2593*ee791febSAntonio Huete Jimenez 
2594*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2595*ee791febSAntonio Huete Jimenez 	}
2596*ee791febSAntonio Huete Jimenez 
2597*ee791febSAntonio Huete Jimenez 	ldns_edns_hex_data2buffer_str(output, data, len);
2598*ee791febSAntonio Huete Jimenez 
2599*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2600*ee791febSAntonio Huete Jimenez }
2601*ee791febSAntonio Huete Jimenez 
2602*ee791febSAntonio Huete Jimenez ldns_status
ldns_edns_option_list2buffer_str(ldns_buffer * output,ldns_edns_option_list * edns_list)2603*ee791febSAntonio Huete Jimenez ldns_edns_option_list2buffer_str(ldns_buffer *output, ldns_edns_option_list* edns_list)
2604*ee791febSAntonio Huete Jimenez {
2605*ee791febSAntonio Huete Jimenez 	size_t count = ldns_edns_option_list_get_count(edns_list);
2606*ee791febSAntonio Huete Jimenez 	size_t i, size;
2607*ee791febSAntonio Huete Jimenez 	uint8_t* data;
2608*ee791febSAntonio Huete Jimenez 
2609*ee791febSAntonio Huete Jimenez 	for (i = 0; i < count; i++) {
2610*ee791febSAntonio Huete Jimenez 		ldns_edns_option_code code;
2611*ee791febSAntonio Huete Jimenez 		ldns_edns_option* edns = ldns_edns_option_list_get_option(edns_list, i);
2612*ee791febSAntonio Huete Jimenez 
2613*ee791febSAntonio Huete Jimenez 		if (!edns) {
2614*ee791febSAntonio Huete Jimenez 			break;
2615*ee791febSAntonio Huete Jimenez 		}
2616*ee791febSAntonio Huete Jimenez 
2617*ee791febSAntonio Huete Jimenez 		code = ldns_edns_get_code(edns);
2618*ee791febSAntonio Huete Jimenez 		size = ldns_edns_get_size(edns);
2619*ee791febSAntonio Huete Jimenez 		data = ldns_edns_get_data(edns);
2620*ee791febSAntonio Huete Jimenez 
2621*ee791febSAntonio Huete Jimenez 		switch(code) {
2622*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_LLQ:
2623*ee791febSAntonio Huete Jimenez 			ldns_edns_llq2buffer_str(output, data, size);
2624*ee791febSAntonio Huete Jimenez 			break;
2625*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_UL:
2626*ee791febSAntonio Huete Jimenez 			ldns_edns_ul2buffer_str(output, data, size);
2627*ee791febSAntonio Huete Jimenez 			break;
2628*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_NSID:
2629*ee791febSAntonio Huete Jimenez 			ldns_edns_nsid2buffer_str(output, data, size);
2630*ee791febSAntonio Huete Jimenez 			break;
2631*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_DAU:
2632*ee791febSAntonio Huete Jimenez 			ldns_edns_dau2buffer_str(output, data, size);
2633*ee791febSAntonio Huete Jimenez 			break;
2634*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_DHU:
2635*ee791febSAntonio Huete Jimenez 			ldns_edns_dhu2buffer_str(output, data, size);
2636*ee791febSAntonio Huete Jimenez 			break;
2637*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_N3U:
2638*ee791febSAntonio Huete Jimenez 			ldns_edns_d3u2buffer_str(output, data, size);
2639*ee791febSAntonio Huete Jimenez 			break;
2640*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_CLIENT_SUBNET:
2641*ee791febSAntonio Huete Jimenez 			ldns_edns_subnet2buffer_str(output, data, size);
2642*ee791febSAntonio Huete Jimenez 			break;
2643*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_EXPIRE:
2644*ee791febSAntonio Huete Jimenez 			ldns_edns_expire2buffer_str(output, data, size);
2645*ee791febSAntonio Huete Jimenez 			break;
2646*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_COOKIE:
2647*ee791febSAntonio Huete Jimenez 			ldns_edns_cookie2buffer_str(output, data, size);
2648*ee791febSAntonio Huete Jimenez 			break;
2649*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_KEEPALIVE:
2650*ee791febSAntonio Huete Jimenez 			ldns_edns_keepalive2buffer_str(output, data, size);
2651*ee791febSAntonio Huete Jimenez 			break;
2652*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_PADDING:
2653*ee791febSAntonio Huete Jimenez 			ldns_edns_padding2buffer_str(output, data, size);
2654*ee791febSAntonio Huete Jimenez 			break;
2655*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_CHAIN:
2656*ee791febSAntonio Huete Jimenez 			ldns_edns_chain2buffer_str(output, data, size);
2657*ee791febSAntonio Huete Jimenez 			break;
2658*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_KEY_TAG:
2659*ee791febSAntonio Huete Jimenez 			ldns_edns_key_tag2buffer_str(output, data, size);
2660*ee791febSAntonio Huete Jimenez 			break;
2661*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_EDE:
2662*ee791febSAntonio Huete Jimenez 			ldns_edns_ede2buffer_str(output, data, size);
2663*ee791febSAntonio Huete Jimenez 			break;
2664*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_CLIENT_TAG:
2665*ee791febSAntonio Huete Jimenez 			ldns_edns_client_tag2buffer_str(output, data, size);
2666*ee791febSAntonio Huete Jimenez 			break;
2667*ee791febSAntonio Huete Jimenez 		case LDNS_EDNS_SERVER_TAG:
2668*ee791febSAntonio Huete Jimenez 			ldns_edns_server_tag2buffer_str(output, data, size);
2669*ee791febSAntonio Huete Jimenez 			break;
2670*ee791febSAntonio Huete Jimenez 		default:
2671*ee791febSAntonio Huete Jimenez 			ldns_buffer_printf(output, "; OPT=%d:", code);
2672*ee791febSAntonio Huete Jimenez 			ldns_edns_hex_data2buffer_str(output, data, size);
2673*ee791febSAntonio Huete Jimenez 			break;
2674*ee791febSAntonio Huete Jimenez 		}
2675*ee791febSAntonio Huete Jimenez 		ldns_buffer_printf(output, "\n");
2676*ee791febSAntonio Huete Jimenez 	}
2677*ee791febSAntonio Huete Jimenez 
2678*ee791febSAntonio Huete Jimenez 	return ldns_buffer_status(output);
2679*ee791febSAntonio Huete Jimenez }
2680*ee791febSAntonio Huete Jimenez 
2681*ee791febSAntonio Huete Jimenez 
2682825eb42bSJan Lentfer ldns_status
ldns_pkt2buffer_str_fmt(ldns_buffer * output,const ldns_output_format * fmt,const ldns_pkt * pkt)2683b5dedccaSJan Lentfer ldns_pkt2buffer_str_fmt(ldns_buffer *output,
2684b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_pkt *pkt)
2685825eb42bSJan Lentfer {
2686825eb42bSJan Lentfer 	uint16_t i;
2687825eb42bSJan Lentfer 	ldns_status status = LDNS_STATUS_OK;
2688825eb42bSJan Lentfer 	char *tmp;
2689825eb42bSJan Lentfer 	struct timeval time;
2690825eb42bSJan Lentfer 	time_t time_tt;
2691*ee791febSAntonio Huete Jimenez 	int short_fmt = fmt && (fmt->flags & LDNS_FMT_SHORT);
2692825eb42bSJan Lentfer 
2693825eb42bSJan Lentfer 	if (!pkt) {
2694825eb42bSJan Lentfer 		ldns_buffer_printf(output, "null");
2695825eb42bSJan Lentfer 		return LDNS_STATUS_OK;
2696825eb42bSJan Lentfer 	}
2697825eb42bSJan Lentfer 
2698*ee791febSAntonio Huete Jimenez 	if (!ldns_buffer_status_ok(output)) {
2699*ee791febSAntonio Huete Jimenez 		return ldns_buffer_status(output);
2700*ee791febSAntonio Huete Jimenez 	}
2701*ee791febSAntonio Huete Jimenez 
2702*ee791febSAntonio Huete Jimenez 	if (!short_fmt) {
2703825eb42bSJan Lentfer 		status = ldns_pktheader2buffer_str(output, pkt);
2704825eb42bSJan Lentfer 		if (status != LDNS_STATUS_OK) {
2705825eb42bSJan Lentfer 			return status;
2706825eb42bSJan Lentfer 		}
2707825eb42bSJan Lentfer 
2708825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\n");
2709825eb42bSJan Lentfer 
2710825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; ");
2711825eb42bSJan Lentfer 
2712825eb42bSJan Lentfer 
2713825eb42bSJan Lentfer 		for (i = 0; i < ldns_pkt_qdcount(pkt); i++) {
2714b5dedccaSJan Lentfer 			status = ldns_rr2buffer_str_fmt(output, fmt,
2715b5dedccaSJan Lentfer 				       ldns_rr_list_rr(
2716b5dedccaSJan Lentfer 					       ldns_pkt_question(pkt), i));
2717825eb42bSJan Lentfer 			if (status != LDNS_STATUS_OK) {
2718825eb42bSJan Lentfer 				return status;
2719825eb42bSJan Lentfer 			}
2720825eb42bSJan Lentfer 		}
2721825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\n");
2722825eb42bSJan Lentfer 
2723825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; ANSWER SECTION:\n");
2724*ee791febSAntonio Huete Jimenez 	}
2725825eb42bSJan Lentfer 	for (i = 0; i < ldns_pkt_ancount(pkt); i++) {
2726b5dedccaSJan Lentfer 		status = ldns_rr2buffer_str_fmt(output, fmt,
2727b5dedccaSJan Lentfer 			       ldns_rr_list_rr(
2728b5dedccaSJan Lentfer 				       ldns_pkt_answer(pkt), i));
2729825eb42bSJan Lentfer 		if (status != LDNS_STATUS_OK) {
2730825eb42bSJan Lentfer 			return status;
2731825eb42bSJan Lentfer 		}
2732825eb42bSJan Lentfer 	}
2733*ee791febSAntonio Huete Jimenez 	if (!short_fmt) {
2734825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\n");
2735825eb42bSJan Lentfer 
2736825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n");
2737825eb42bSJan Lentfer 
2738825eb42bSJan Lentfer 		for (i = 0; i < ldns_pkt_nscount(pkt); i++) {
2739b5dedccaSJan Lentfer 			status = ldns_rr2buffer_str_fmt(output, fmt,
2740b5dedccaSJan Lentfer 				       ldns_rr_list_rr(
2741b5dedccaSJan Lentfer 					       ldns_pkt_authority(pkt), i));
2742825eb42bSJan Lentfer 			if (status != LDNS_STATUS_OK) {
2743825eb42bSJan Lentfer 				return status;
2744825eb42bSJan Lentfer 			}
2745825eb42bSJan Lentfer 		}
2746825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\n");
2747825eb42bSJan Lentfer 
2748825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n");
2749825eb42bSJan Lentfer 		for (i = 0; i < ldns_pkt_arcount(pkt); i++) {
2750b5dedccaSJan Lentfer 			status = ldns_rr2buffer_str_fmt(output, fmt,
2751b5dedccaSJan Lentfer 				       ldns_rr_list_rr(
2752b5dedccaSJan Lentfer 					       ldns_pkt_additional(pkt), i));
2753825eb42bSJan Lentfer 			if (status != LDNS_STATUS_OK) {
2754825eb42bSJan Lentfer 				return status;
2755825eb42bSJan Lentfer 			}
2756825eb42bSJan Lentfer 
2757825eb42bSJan Lentfer 		}
2758825eb42bSJan Lentfer 		ldns_buffer_printf(output, "\n");
2759*ee791febSAntonio Huete Jimenez 		/* add some further fields */
2760825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; Query time: %d msec\n",
2761825eb42bSJan Lentfer 				ldns_pkt_querytime(pkt));
2762825eb42bSJan Lentfer 		if (ldns_pkt_edns(pkt)) {
2763825eb42bSJan Lentfer 			ldns_buffer_printf(output,
2764825eb42bSJan Lentfer 				   ";; EDNS: version %u; flags:",
2765825eb42bSJan Lentfer 				   ldns_pkt_edns_version(pkt));
2766825eb42bSJan Lentfer 			if (ldns_pkt_edns_do(pkt)) {
2767825eb42bSJan Lentfer 				ldns_buffer_printf(output, " do");
2768825eb42bSJan Lentfer 			}
2769825eb42bSJan Lentfer 			/* the extended rcode is the value set, shifted four bits,
2770825eb42bSJan Lentfer 			 * and or'd with the original rcode */
2771825eb42bSJan Lentfer 			if (ldns_pkt_edns_extended_rcode(pkt)) {
2772825eb42bSJan Lentfer 				ldns_buffer_printf(output, " ; ext-rcode: %d",
2773825eb42bSJan Lentfer 					(ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt)));
2774825eb42bSJan Lentfer 			}
2775825eb42bSJan Lentfer 			ldns_buffer_printf(output, " ; udp: %u\n",
2776825eb42bSJan Lentfer 					   ldns_pkt_edns_udp_size(pkt));
2777825eb42bSJan Lentfer 
2778*ee791febSAntonio Huete Jimenez 			if (pkt->_edns_list)
2779*ee791febSAntonio Huete Jimenez 				ldns_edns_option_list2buffer_str(output, pkt->_edns_list);
2780*ee791febSAntonio Huete Jimenez 
2781*ee791febSAntonio Huete Jimenez 			else if (ldns_pkt_edns_data(pkt)) {
2782*ee791febSAntonio Huete Jimenez 				ldns_edns_option_list* edns_list;
2783*ee791febSAntonio Huete Jimenez 				/* parse the EDNS data into separate EDNS options
2784*ee791febSAntonio Huete Jimenez 				 * and add them to the list */
2785*ee791febSAntonio Huete Jimenez 				if ((edns_list = pkt_edns_data2edns_option_list(ldns_pkt_edns_data(pkt)))) {
2786*ee791febSAntonio Huete Jimenez 					ldns_edns_option_list2buffer_str(output, edns_list);
2787*ee791febSAntonio Huete Jimenez 					ldns_edns_option_list_deep_free(edns_list);
2788*ee791febSAntonio Huete Jimenez 				} else {
2789825eb42bSJan Lentfer 					ldns_buffer_printf(output, ";; Data: ");
2790*ee791febSAntonio Huete Jimenez 					(void)ldns_rdf2buffer_str(output, ldns_pkt_edns_data(pkt));
2791*ee791febSAntonio Huete Jimenez 				}
2792825eb42bSJan Lentfer 			}
2793825eb42bSJan Lentfer 		}
2794825eb42bSJan Lentfer 		if (ldns_pkt_tsig(pkt)) {
2795825eb42bSJan Lentfer 			ldns_buffer_printf(output, ";; TSIG:\n;; ");
2796b5dedccaSJan Lentfer 			(void) ldns_rr2buffer_str_fmt(
2797b5dedccaSJan Lentfer 					output, fmt, ldns_pkt_tsig(pkt));
2798825eb42bSJan Lentfer 			ldns_buffer_printf(output, "\n");
2799825eb42bSJan Lentfer 		}
2800825eb42bSJan Lentfer 		if (ldns_pkt_answerfrom(pkt)) {
2801825eb42bSJan Lentfer 			tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt));
2802825eb42bSJan Lentfer 			ldns_buffer_printf(output, ";; SERVER: %s\n", tmp);
2803825eb42bSJan Lentfer 			LDNS_FREE(tmp);
2804825eb42bSJan Lentfer 		}
2805825eb42bSJan Lentfer 		time = ldns_pkt_timestamp(pkt);
2806825eb42bSJan Lentfer 		time_tt = (time_t)time.tv_sec;
2807825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; WHEN: %s",
2808825eb42bSJan Lentfer 				(char*)ctime(&time_tt));
2809825eb42bSJan Lentfer 
2810825eb42bSJan Lentfer 		ldns_buffer_printf(output, ";; MSG SIZE  rcvd: %d\n",
2811825eb42bSJan Lentfer 				(int)ldns_pkt_size(pkt));
2812825eb42bSJan Lentfer 	}
2813825eb42bSJan Lentfer 	return status;
2814825eb42bSJan Lentfer }
2815825eb42bSJan Lentfer 
2816b5dedccaSJan Lentfer ldns_status
ldns_pkt2buffer_str(ldns_buffer * output,const ldns_pkt * pkt)2817b5dedccaSJan Lentfer ldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
2818b5dedccaSJan Lentfer {
2819b5dedccaSJan Lentfer 	return ldns_pkt2buffer_str_fmt(output, ldns_output_format_default, pkt);
2820b5dedccaSJan Lentfer }
2821b5dedccaSJan Lentfer 
2822b5dedccaSJan Lentfer 
2823825eb42bSJan Lentfer #ifdef HAVE_SSL
2824825eb42bSJan Lentfer static ldns_status
ldns_hmac_key2buffer_str(ldns_buffer * output,const ldns_key * k)2825825eb42bSJan Lentfer ldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k)
2826825eb42bSJan Lentfer {
2827825eb42bSJan Lentfer 	ldns_status status;
2828825eb42bSJan Lentfer 	size_t i;
2829825eb42bSJan Lentfer 	ldns_rdf *b64_bignum;
2830825eb42bSJan Lentfer 
2831825eb42bSJan Lentfer 	ldns_buffer_printf(output, "Key: ");
2832825eb42bSJan Lentfer 
2833825eb42bSJan Lentfer  	i = ldns_key_hmac_size(k);
2834825eb42bSJan Lentfer 	b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k));
2835825eb42bSJan Lentfer 	status = ldns_rdf2buffer_str(output, b64_bignum);
2836825eb42bSJan Lentfer 	ldns_rdf_deep_free(b64_bignum);
2837825eb42bSJan Lentfer 	ldns_buffer_printf(output, "\n");
2838825eb42bSJan Lentfer 	return status;
2839825eb42bSJan Lentfer }
2840825eb42bSJan Lentfer #endif
2841825eb42bSJan Lentfer 
2842825eb42bSJan Lentfer #if defined(HAVE_SSL) && defined(USE_GOST)
2843825eb42bSJan Lentfer static ldns_status
ldns_gost_key2buffer_str(ldns_buffer * output,EVP_PKEY * p)2844825eb42bSJan Lentfer ldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
2845825eb42bSJan Lentfer {
2846825eb42bSJan Lentfer 	unsigned char* pp = NULL;
2847825eb42bSJan Lentfer 	int ret;
2848825eb42bSJan Lentfer 	ldns_rdf *b64_bignum;
2849825eb42bSJan Lentfer 	ldns_status status;
2850825eb42bSJan Lentfer 
2851825eb42bSJan Lentfer 	ldns_buffer_printf(output, "GostAsn1: ");
2852825eb42bSJan Lentfer 
2853825eb42bSJan Lentfer 	ret = i2d_PrivateKey(p, &pp);
2854fd185f4dSJan Lentfer 	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp);
2855825eb42bSJan Lentfer 	status = ldns_rdf2buffer_str(output, b64_bignum);
2856825eb42bSJan Lentfer 
2857825eb42bSJan Lentfer 	ldns_rdf_deep_free(b64_bignum);
2858825eb42bSJan Lentfer 	OPENSSL_free(pp);
2859825eb42bSJan Lentfer 	ldns_buffer_printf(output, "\n");
2860825eb42bSJan Lentfer 	return status;
2861825eb42bSJan Lentfer }
2862825eb42bSJan Lentfer #endif
2863825eb42bSJan Lentfer 
2864819dec71SDaniel Fojt #if defined(HAVE_SSL) && defined(USE_ED25519)
2865819dec71SDaniel Fojt static ldns_status
ldns_ed25519_key2buffer_str(ldns_buffer * output,EVP_PKEY * p)2866819dec71SDaniel Fojt ldns_ed25519_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
2867819dec71SDaniel Fojt {
2868819dec71SDaniel Fojt 	unsigned char* pp = NULL;
2869819dec71SDaniel Fojt 	int ret;
2870819dec71SDaniel Fojt 	ldns_rdf *b64_bignum;
2871819dec71SDaniel Fojt 	ldns_status status;
2872819dec71SDaniel Fojt 
2873819dec71SDaniel Fojt 	ldns_buffer_printf(output, "PrivateKey: ");
2874819dec71SDaniel Fojt 
2875819dec71SDaniel Fojt 	ret = i2d_PrivateKey(p, &pp);
2876819dec71SDaniel Fojt 	/* 16 byte asn (302e020100300506032b657004220420) + 32byte key */
2877819dec71SDaniel Fojt 	if(ret != 16 + 32) {
2878819dec71SDaniel Fojt 		OPENSSL_free(pp);
2879819dec71SDaniel Fojt 		return LDNS_STATUS_ERR;
2880819dec71SDaniel Fojt 	}
2881819dec71SDaniel Fojt 	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64,
2882819dec71SDaniel Fojt 		(size_t)ret-16, pp+16);
2883819dec71SDaniel Fojt 	status = ldns_rdf2buffer_str(output, b64_bignum);
2884819dec71SDaniel Fojt 
2885819dec71SDaniel Fojt 	ldns_rdf_deep_free(b64_bignum);
2886819dec71SDaniel Fojt 	OPENSSL_free(pp);
2887819dec71SDaniel Fojt 	ldns_buffer_printf(output, "\n");
2888819dec71SDaniel Fojt 	return status;
2889819dec71SDaniel Fojt }
2890819dec71SDaniel Fojt #endif
2891819dec71SDaniel Fojt 
2892819dec71SDaniel Fojt #if defined(HAVE_SSL) && defined(USE_ED448)
2893819dec71SDaniel Fojt static ldns_status
ldns_ed448_key2buffer_str(ldns_buffer * output,EVP_PKEY * p)2894819dec71SDaniel Fojt ldns_ed448_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
2895819dec71SDaniel Fojt {
2896819dec71SDaniel Fojt 	unsigned char* pp = NULL;
2897819dec71SDaniel Fojt 	int ret;
2898819dec71SDaniel Fojt 	ldns_rdf *b64_bignum;
2899819dec71SDaniel Fojt 	ldns_status status;
2900819dec71SDaniel Fojt 
2901819dec71SDaniel Fojt 	ldns_buffer_printf(output, "PrivateKey: ");
2902819dec71SDaniel Fojt 
2903819dec71SDaniel Fojt 	ret = i2d_PrivateKey(p, &pp);
2904819dec71SDaniel Fojt 	/* some-ASN + 57byte key */
2905819dec71SDaniel Fojt 	if(ret != 16 + 57) {
2906819dec71SDaniel Fojt 		OPENSSL_free(pp);
2907819dec71SDaniel Fojt 		return LDNS_STATUS_ERR;
2908819dec71SDaniel Fojt 	}
2909819dec71SDaniel Fojt 	b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64,
2910819dec71SDaniel Fojt 		(size_t)ret-16, pp+16);
2911819dec71SDaniel Fojt 	status = ldns_rdf2buffer_str(output, b64_bignum);
2912819dec71SDaniel Fojt 
2913819dec71SDaniel Fojt 	ldns_rdf_deep_free(b64_bignum);
2914819dec71SDaniel Fojt 	OPENSSL_free(pp);
2915819dec71SDaniel Fojt 	ldns_buffer_printf(output, "\n");
2916819dec71SDaniel Fojt 	return status;
2917819dec71SDaniel Fojt }
2918819dec71SDaniel Fojt #endif
2919819dec71SDaniel Fojt 
2920819dec71SDaniel Fojt #if defined(HAVE_SSL)
29215340022aSzrj /** print one b64 encoded bignum to a line in the keybuffer */
29225340022aSzrj static int
ldns_print_bignum_b64_line(ldns_buffer * output,const char * label,const BIGNUM * num)29235340022aSzrj ldns_print_bignum_b64_line(ldns_buffer* output, const char* label, const BIGNUM* num)
29245340022aSzrj {
29255340022aSzrj 	unsigned char  *bignumbuf = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
29265340022aSzrj 	if(!bignumbuf) return 0;
29275340022aSzrj 
29285340022aSzrj 	ldns_buffer_printf(output, "%s: ", label);
29295340022aSzrj 	if(num) {
29305340022aSzrj 		ldns_rdf *b64_bignum = NULL;
29315340022aSzrj 		int i = BN_bn2bin(num, bignumbuf);
29325340022aSzrj 		if (i > LDNS_MAX_KEYLEN) {
29335340022aSzrj 			LDNS_FREE(bignumbuf);
29345340022aSzrj 			return 0;
29355340022aSzrj 		}
29365340022aSzrj 		b64_bignum =  ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)i, bignumbuf);
29375340022aSzrj 		if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
29385340022aSzrj 			ldns_rdf_deep_free(b64_bignum);
29395340022aSzrj 			LDNS_FREE(bignumbuf);
29405340022aSzrj 			return 0;
29415340022aSzrj 		}
29425340022aSzrj 		ldns_rdf_deep_free(b64_bignum);
29435340022aSzrj 		ldns_buffer_printf(output, "\n");
29445340022aSzrj 	} else {
29455340022aSzrj 		ldns_buffer_printf(output, "(Not available)\n");
29465340022aSzrj 	}
29475340022aSzrj 	LDNS_FREE(bignumbuf);
29485340022aSzrj 	return 1;
29495340022aSzrj }
2950819dec71SDaniel Fojt #endif
29515340022aSzrj 
2952825eb42bSJan Lentfer ldns_status
ldns_key2buffer_str(ldns_buffer * output,const ldns_key * k)2953825eb42bSJan Lentfer ldns_key2buffer_str(ldns_buffer *output, const ldns_key *k)
2954825eb42bSJan Lentfer {
2955825eb42bSJan Lentfer 	ldns_status status = LDNS_STATUS_OK;
2956825eb42bSJan Lentfer 	unsigned char  *bignum;
2957d1b2b5caSJohn Marino #ifdef HAVE_SSL
2958825eb42bSJan Lentfer 	RSA *rsa;
2959*ee791febSAntonio Huete Jimenez #ifdef USE_DSA
2960825eb42bSJan Lentfer 	DSA *dsa;
2961*ee791febSAntonio Huete Jimenez #endif /* USE_DSA */
2962825eb42bSJan Lentfer #endif /* HAVE_SSL */
2963825eb42bSJan Lentfer 
2964825eb42bSJan Lentfer 	if (!k) {
2965825eb42bSJan Lentfer 		return LDNS_STATUS_ERR;
2966825eb42bSJan Lentfer 	}
2967825eb42bSJan Lentfer 
2968825eb42bSJan Lentfer 	bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
2969825eb42bSJan Lentfer 	if (!bignum) {
2970825eb42bSJan Lentfer 		return LDNS_STATUS_ERR;
2971825eb42bSJan Lentfer 	}
2972825eb42bSJan Lentfer 
2973825eb42bSJan Lentfer 	if (ldns_buffer_status_ok(output)) {
2974825eb42bSJan Lentfer #ifdef HAVE_SSL
2975825eb42bSJan Lentfer 		switch(ldns_key_algorithm(k)) {
2976825eb42bSJan Lentfer 			case LDNS_SIGN_RSASHA1:
2977825eb42bSJan Lentfer 			case LDNS_SIGN_RSASHA1_NSEC3:
2978825eb42bSJan Lentfer 			case LDNS_SIGN_RSASHA256:
2979825eb42bSJan Lentfer 			case LDNS_SIGN_RSASHA512:
2980825eb42bSJan Lentfer 			case LDNS_SIGN_RSAMD5:
2981825eb42bSJan Lentfer 				/* copied by looking at dnssec-keygen output */
2982825eb42bSJan Lentfer 				/* header */
2983825eb42bSJan Lentfer 				rsa = ldns_key_rsa_key(k);
2984825eb42bSJan Lentfer 
2985825eb42bSJan Lentfer 				ldns_buffer_printf(output,"Private-key-format: v1.2\n");
2986825eb42bSJan Lentfer 				switch(ldns_key_algorithm(k)) {
2987825eb42bSJan Lentfer 				case LDNS_SIGN_RSAMD5:
2988825eb42bSJan Lentfer 					ldns_buffer_printf(output,
2989825eb42bSJan Lentfer 								    "Algorithm: %u (RSA)\n",
2990825eb42bSJan Lentfer 								    LDNS_RSAMD5);
2991825eb42bSJan Lentfer 					break;
2992825eb42bSJan Lentfer 				case LDNS_SIGN_RSASHA1:
2993825eb42bSJan Lentfer 					ldns_buffer_printf(output,
2994825eb42bSJan Lentfer 								    "Algorithm: %u (RSASHA1)\n",
2995825eb42bSJan Lentfer 								    LDNS_RSASHA1);
2996825eb42bSJan Lentfer 					break;
2997825eb42bSJan Lentfer 				case LDNS_SIGN_RSASHA1_NSEC3:
2998825eb42bSJan Lentfer 					ldns_buffer_printf(output,
2999825eb42bSJan Lentfer 								    "Algorithm: %u (RSASHA1_NSEC3)\n",
3000825eb42bSJan Lentfer 								    LDNS_RSASHA1_NSEC3);
3001825eb42bSJan Lentfer 					break;
3002825eb42bSJan Lentfer #ifdef USE_SHA2
3003825eb42bSJan Lentfer 				case LDNS_SIGN_RSASHA256:
3004825eb42bSJan Lentfer 					ldns_buffer_printf(output,
3005825eb42bSJan Lentfer 								    "Algorithm: %u (RSASHA256)\n",
3006825eb42bSJan Lentfer 								    LDNS_RSASHA256);
3007825eb42bSJan Lentfer 					break;
3008825eb42bSJan Lentfer 				case LDNS_SIGN_RSASHA512:
3009825eb42bSJan Lentfer 					ldns_buffer_printf(output,
3010825eb42bSJan Lentfer 								    "Algorithm: %u (RSASHA512)\n",
3011825eb42bSJan Lentfer 								    LDNS_RSASHA512);
3012825eb42bSJan Lentfer 					break;
3013825eb42bSJan Lentfer #endif
3014825eb42bSJan Lentfer 				default:
30155340022aSzrj #ifdef STDERR_MSGS
3016825eb42bSJan Lentfer 					fprintf(stderr, "Warning: unknown signature ");
3017825eb42bSJan Lentfer 					fprintf(stderr,
3018825eb42bSJan Lentfer 						   "algorithm type %u\n",
3019825eb42bSJan Lentfer 						   ldns_key_algorithm(k));
30205340022aSzrj #endif
3021825eb42bSJan Lentfer 					ldns_buffer_printf(output,
3022825eb42bSJan Lentfer 								    "Algorithm: %u (Unknown)\n",
3023825eb42bSJan Lentfer 								    ldns_key_algorithm(k));
3024825eb42bSJan Lentfer 					break;
3025825eb42bSJan Lentfer 				}
3026825eb42bSJan Lentfer 
3027825eb42bSJan Lentfer 				/* print to buf, convert to bin, convert to b64,
3028825eb42bSJan Lentfer 				 * print to buf */
30295340022aSzrj 
3030fd185f4dSJan Lentfer #ifndef S_SPLINT_S
30315340022aSzrj 				if(1) {
30325340022aSzrj 					const BIGNUM *n=NULL, *e=NULL, *d=NULL,
30335340022aSzrj 						*p=NULL, *q=NULL, *dmp1=NULL,
30345340022aSzrj 						*dmq1=NULL, *iqmp=NULL;
3035*ee791febSAntonio Huete Jimenez #if OPENSSL_VERSION_NUMBER < 0x10100000 || (defined(HAVE_LIBRESSL) && LIBRESSL_VERSION_NUMBER < 0x20700000)
30365340022aSzrj 					n = rsa->n;
30375340022aSzrj 					e = rsa->e;
30385340022aSzrj 					d = rsa->d;
30395340022aSzrj 					p = rsa->p;
30405340022aSzrj 					q = rsa->q;
30415340022aSzrj 					dmp1 = rsa->dmp1;
30425340022aSzrj 					dmq1 = rsa->dmq1;
30435340022aSzrj 					iqmp = rsa->iqmp;
30445340022aSzrj #else
30455340022aSzrj 					RSA_get0_key(rsa, &n, &e, &d);
30465340022aSzrj 					RSA_get0_factors(rsa, &p, &q);
30475340022aSzrj 					RSA_get0_crt_params(rsa, &dmp1,
30485340022aSzrj 						&dmq1, &iqmp);
30495340022aSzrj #endif
30505340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Modulus", n))
3051825eb42bSJan Lentfer 						goto error;
30525340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "PublicExponent", e))
3053825eb42bSJan Lentfer 						goto error;
30545340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "PrivateExponent", d))
3055825eb42bSJan Lentfer 						goto error;
30565340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Prime1", p))
3057825eb42bSJan Lentfer 						goto error;
30585340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Prime2", q))
3059825eb42bSJan Lentfer 						goto error;
30605340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Exponent1", dmp1))
3061825eb42bSJan Lentfer 						goto error;
30625340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Exponent2", dmq1))
3063825eb42bSJan Lentfer 						goto error;
30645340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Coefficient", iqmp))
3065825eb42bSJan Lentfer 						goto error;
3066825eb42bSJan Lentfer 				}
3067fd185f4dSJan Lentfer #endif /* splint */
3068825eb42bSJan Lentfer 
3069825eb42bSJan Lentfer 				RSA_free(rsa);
3070825eb42bSJan Lentfer 				break;
3071*ee791febSAntonio Huete Jimenez #ifdef USE_DSA
3072825eb42bSJan Lentfer 			case LDNS_SIGN_DSA:
3073825eb42bSJan Lentfer 			case LDNS_SIGN_DSA_NSEC3:
3074825eb42bSJan Lentfer 				dsa = ldns_key_dsa_key(k);
3075825eb42bSJan Lentfer 
3076825eb42bSJan Lentfer 				ldns_buffer_printf(output,"Private-key-format: v1.2\n");
3077825eb42bSJan Lentfer 				if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) {
3078825eb42bSJan Lentfer 					ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n");
3079825eb42bSJan Lentfer 				} else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) {
3080825eb42bSJan Lentfer 					ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n");
3081825eb42bSJan Lentfer 				}
3082825eb42bSJan Lentfer 
3083825eb42bSJan Lentfer 				/* print to buf, convert to bin, convert to b64,
3084825eb42bSJan Lentfer 				 * print to buf */
30855340022aSzrj 				if(1) {
30865340022aSzrj 					const BIGNUM *p=NULL, *q=NULL, *g=NULL,
30875340022aSzrj 						*priv_key=NULL, *pub_key=NULL;
3088*ee791febSAntonio Huete Jimenez #if OPENSSL_VERSION_NUMBER < 0x10100000 || (defined(HAVE_LIBRESSL) && LIBRESSL_VERSION_NUMBER < 0x20700000)
3089fd185f4dSJan Lentfer #ifndef S_SPLINT_S
30905340022aSzrj 					p = dsa->p;
30915340022aSzrj 					q = dsa->q;
30925340022aSzrj 					g = dsa->g;
30935340022aSzrj 					priv_key = dsa->priv_key;
30945340022aSzrj 					pub_key = dsa->pub_key;
3095fd185f4dSJan Lentfer #endif /* splint */
30965340022aSzrj #else
30975340022aSzrj 					DSA_get0_pqg(dsa, &p, &q, &g);
30985340022aSzrj 					DSA_get0_key(dsa, &pub_key, &priv_key);
30995340022aSzrj #endif
31005340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Prime(p)", p))
31015340022aSzrj 						goto error;
31025340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Subprime(q)", q))
31035340022aSzrj 						goto error;
31045340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Base(g)", g))
31055340022aSzrj 						goto error;
31065340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Private_value(x)", priv_key))
31075340022aSzrj 						goto error;
31085340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "Public_value(y)", pub_key))
31095340022aSzrj 						goto error;
31105340022aSzrj 				}
3111825eb42bSJan Lentfer 				break;
3112*ee791febSAntonio Huete Jimenez #endif /* USE_DSA */
3113ac996e71SJan Lentfer 			case LDNS_SIGN_ECC_GOST:
3114825eb42bSJan Lentfer 				/* no format defined, use blob */
3115825eb42bSJan Lentfer #if defined(HAVE_SSL) && defined(USE_GOST)
3116825eb42bSJan Lentfer 				ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3117ac996e71SJan Lentfer 				ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST);
3118fd185f4dSJan Lentfer 				status = ldns_gost_key2buffer_str(output,
3119fd185f4dSJan Lentfer #ifndef S_SPLINT_S
3120fd185f4dSJan Lentfer 					k->_key.key
3121fd185f4dSJan Lentfer #else
3122fd185f4dSJan Lentfer 					NULL
3123fd185f4dSJan Lentfer #endif
3124fd185f4dSJan Lentfer 				);
3125d1b2b5caSJohn Marino #else
3126d1b2b5caSJohn Marino 				goto error;
3127d1b2b5caSJohn Marino #endif /* GOST */
3128825eb42bSJan Lentfer 				break;
3129ac996e71SJan Lentfer 			case LDNS_SIGN_ECDSAP256SHA256:
3130ac996e71SJan Lentfer 			case LDNS_SIGN_ECDSAP384SHA384:
3131d1b2b5caSJohn Marino #ifdef USE_ECDSA
3132ac996e71SJan Lentfer                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3133ac996e71SJan Lentfer 				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
3134fd185f4dSJan Lentfer                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
3135fd185f4dSJan Lentfer #ifndef S_SPLINT_S
3136ac996e71SJan Lentfer 				ldns_buffer_printf(output, ")\n");
3137ac996e71SJan Lentfer                                 if(k->_key.key) {
3138ac996e71SJan Lentfer                                         EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key);
3139ac996e71SJan Lentfer                                         const BIGNUM* b = EC_KEY_get0_private_key(ec);
31405340022aSzrj 					if(!ldns_print_bignum_b64_line(output, "PrivateKey", b))
3141ac996e71SJan Lentfer 						goto error;
3142ac996e71SJan Lentfer                                         /* down reference count in EC_KEY
3143ac996e71SJan Lentfer                                          * its still assigned to the PKEY */
3144ac996e71SJan Lentfer                                         EC_KEY_free(ec);
3145ac996e71SJan Lentfer                                 }
3146fd185f4dSJan Lentfer #endif /* splint */
3147d1b2b5caSJohn Marino #else
3148d1b2b5caSJohn Marino 				goto error;
3149d1b2b5caSJohn Marino #endif /* ECDSA */
3150ac996e71SJan Lentfer                                 break;
31515340022aSzrj #ifdef USE_ED25519
31525340022aSzrj 			case LDNS_SIGN_ED25519:
31535340022aSzrj                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31545340022aSzrj 				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
31555340022aSzrj                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
31565340022aSzrj 				ldns_buffer_printf(output, ")\n");
3157819dec71SDaniel Fojt 				if (status) break;
3158819dec71SDaniel Fojt 				status = ldns_ed25519_key2buffer_str(output,
3159819dec71SDaniel Fojt 					k->_key.key);
31605340022aSzrj 				break;
31615340022aSzrj #endif /* USE_ED25519 */
31625340022aSzrj #ifdef USE_ED448
31635340022aSzrj 			case LDNS_SIGN_ED448:
31645340022aSzrj                                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31655340022aSzrj 				ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
31665340022aSzrj                                 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
31675340022aSzrj 				ldns_buffer_printf(output, ")\n");
3168819dec71SDaniel Fojt 				if (status) break;
3169819dec71SDaniel Fojt 				status = ldns_ed448_key2buffer_str(output,
3170819dec71SDaniel Fojt 					k->_key.key);
31715340022aSzrj 				break;
31725340022aSzrj #endif /* USE_ED448 */
3173825eb42bSJan Lentfer 			case LDNS_SIGN_HMACMD5:
3174825eb42bSJan Lentfer 				/* there's not much of a format defined for TSIG */
3175825eb42bSJan Lentfer 				/* It's just a binary blob, Same for all algorithms */
3176825eb42bSJan Lentfer                 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3177825eb42bSJan Lentfer                 ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n");
3178825eb42bSJan Lentfer 				status = ldns_hmac_key2buffer_str(output, k);
3179825eb42bSJan Lentfer 				break;
3180825eb42bSJan Lentfer 			case LDNS_SIGN_HMACSHA1:
3181825eb42bSJan Lentfer 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3182825eb42bSJan Lentfer 		        ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n");
3183825eb42bSJan Lentfer 				status = ldns_hmac_key2buffer_str(output, k);
3184825eb42bSJan Lentfer 				break;
31855340022aSzrj 			case LDNS_SIGN_HMACSHA224:
31865340022aSzrj 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31875340022aSzrj 		        ldns_buffer_printf(output, "Algorithm: 162 (HMAC_SHA224)\n");
31885340022aSzrj 				status = ldns_hmac_key2buffer_str(output, k);
31895340022aSzrj 				break;
3190825eb42bSJan Lentfer 			case LDNS_SIGN_HMACSHA256:
3191825eb42bSJan Lentfer 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
3192825eb42bSJan Lentfer 		        ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n");
3193825eb42bSJan Lentfer 				status = ldns_hmac_key2buffer_str(output, k);
3194825eb42bSJan Lentfer 				break;
31955340022aSzrj 			case LDNS_SIGN_HMACSHA384:
31965340022aSzrj 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
31975340022aSzrj 		        ldns_buffer_printf(output, "Algorithm: 164 (HMAC_SHA384)\n");
31985340022aSzrj 				status = ldns_hmac_key2buffer_str(output, k);
31995340022aSzrj 				break;
32005340022aSzrj 			case LDNS_SIGN_HMACSHA512:
32015340022aSzrj 		        ldns_buffer_printf(output, "Private-key-format: v1.2\n");
32025340022aSzrj 		        ldns_buffer_printf(output, "Algorithm: 165 (HMAC_SHA512)\n");
32035340022aSzrj 				status = ldns_hmac_key2buffer_str(output, k);
32045340022aSzrj 				break;
3205825eb42bSJan Lentfer 		}
3206825eb42bSJan Lentfer #endif /* HAVE_SSL */
3207825eb42bSJan Lentfer 	} else {
3208825eb42bSJan Lentfer 		LDNS_FREE(bignum);
3209825eb42bSJan Lentfer 		return ldns_buffer_status(output);
3210825eb42bSJan Lentfer 	}
3211825eb42bSJan Lentfer 	LDNS_FREE(bignum);
3212825eb42bSJan Lentfer 	return status;
3213825eb42bSJan Lentfer 
3214825eb42bSJan Lentfer #ifdef HAVE_SSL
3215825eb42bSJan Lentfer 	/* compiles warn the label isn't used */
3216825eb42bSJan Lentfer error:
3217825eb42bSJan Lentfer 	LDNS_FREE(bignum);
3218825eb42bSJan Lentfer 	return LDNS_STATUS_ERR;
3219825eb42bSJan Lentfer #endif /* HAVE_SSL */
3220825eb42bSJan Lentfer 
3221825eb42bSJan Lentfer }
3222825eb42bSJan Lentfer 
3223825eb42bSJan Lentfer /*
3224d1b2b5caSJohn Marino  * Zero terminate the buffer and copy data.
3225825eb42bSJan Lentfer  */
3226825eb42bSJan Lentfer char *
ldns_buffer2str(ldns_buffer * buffer)3227825eb42bSJan Lentfer ldns_buffer2str(ldns_buffer *buffer)
3228825eb42bSJan Lentfer {
3229825eb42bSJan Lentfer 	char *str;
3230825eb42bSJan Lentfer 
3231825eb42bSJan Lentfer 	/* check if buffer ends with \0, if not, and
3232825eb42bSJan Lentfer 	   if there is space, add it */
3233825eb42bSJan Lentfer 	if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
3234825eb42bSJan Lentfer 		if (!ldns_buffer_reserve(buffer, 1)) {
3235825eb42bSJan Lentfer 			return NULL;
3236825eb42bSJan Lentfer 		}
3237*ee791febSAntonio Huete Jimenez 		ldns_buffer_write_char(buffer, (uint8_t) '\0');
3238825eb42bSJan Lentfer 		if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
3239825eb42bSJan Lentfer 			return NULL;
3240825eb42bSJan Lentfer 		}
3241825eb42bSJan Lentfer 	}
3242825eb42bSJan Lentfer 
3243d1b2b5caSJohn Marino 	str = strdup((const char *)ldns_buffer_begin(buffer));
3244fd185f4dSJan Lentfer         if(!str) {
3245fd185f4dSJan Lentfer                 return NULL;
3246fd185f4dSJan Lentfer         }
3247825eb42bSJan Lentfer 	return str;
3248825eb42bSJan Lentfer }
3249825eb42bSJan Lentfer 
3250d1b2b5caSJohn Marino /*
3251d1b2b5caSJohn Marino  * Zero terminate the buffer and export data.
3252d1b2b5caSJohn Marino  */
3253d1b2b5caSJohn Marino char *
ldns_buffer_export2str(ldns_buffer * buffer)3254d1b2b5caSJohn Marino ldns_buffer_export2str(ldns_buffer *buffer)
3255d1b2b5caSJohn Marino {
3256d1b2b5caSJohn Marino 	/* Append '\0' as string terminator */
3257d1b2b5caSJohn Marino 	if (! ldns_buffer_reserve(buffer, 1)) {
3258d1b2b5caSJohn Marino 		return NULL;
3259d1b2b5caSJohn Marino 	}
3260*ee791febSAntonio Huete Jimenez 	ldns_buffer_write_char(buffer, 0);
3261d1b2b5caSJohn Marino 
3262d1b2b5caSJohn Marino 	/* reallocate memory to the size of the string and export */
3263d1b2b5caSJohn Marino 	ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer));
3264d1b2b5caSJohn Marino 	return ldns_buffer_export(buffer);
3265d1b2b5caSJohn Marino }
3266d1b2b5caSJohn Marino 
3267825eb42bSJan Lentfer char *
ldns_rdf2str(const ldns_rdf * rdf)3268825eb42bSJan Lentfer ldns_rdf2str(const ldns_rdf *rdf)
3269825eb42bSJan Lentfer {
3270825eb42bSJan Lentfer 	char *result = NULL;
3271ac996e71SJan Lentfer 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
3272825eb42bSJan Lentfer 
3273fd185f4dSJan Lentfer 	if (!tmp_buffer) {
3274fd185f4dSJan Lentfer 		return NULL;
3275fd185f4dSJan Lentfer 	}
3276825eb42bSJan Lentfer 	if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
3277825eb42bSJan Lentfer 		/* export and return string, destroy rest */
3278d1b2b5caSJohn Marino 		result = ldns_buffer_export2str(tmp_buffer);
3279825eb42bSJan Lentfer 	}
3280825eb42bSJan Lentfer 	ldns_buffer_free(tmp_buffer);
3281825eb42bSJan Lentfer 	return result;
3282825eb42bSJan Lentfer }
3283825eb42bSJan Lentfer 
3284825eb42bSJan Lentfer char *
ldns_rr2str_fmt(const ldns_output_format * fmt,const ldns_rr * rr)3285b5dedccaSJan Lentfer ldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr)
3286825eb42bSJan Lentfer {
3287825eb42bSJan Lentfer 	char *result = NULL;
3288ac996e71SJan Lentfer 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
3289825eb42bSJan Lentfer 
3290fd185f4dSJan Lentfer 	if (!tmp_buffer) {
3291fd185f4dSJan Lentfer 		return NULL;
3292fd185f4dSJan Lentfer 	}
3293b5dedccaSJan Lentfer 	if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr)
3294b5dedccaSJan Lentfer 		       	== LDNS_STATUS_OK) {
3295825eb42bSJan Lentfer 		/* export and return string, destroy rest */
3296d1b2b5caSJohn Marino 		result = ldns_buffer_export2str(tmp_buffer);
3297825eb42bSJan Lentfer 	}
3298825eb42bSJan Lentfer 	ldns_buffer_free(tmp_buffer);
3299825eb42bSJan Lentfer 	return result;
3300825eb42bSJan Lentfer }
3301825eb42bSJan Lentfer 
3302825eb42bSJan Lentfer char *
ldns_rr2str(const ldns_rr * rr)3303b5dedccaSJan Lentfer ldns_rr2str(const ldns_rr *rr)
3304b5dedccaSJan Lentfer {
3305b5dedccaSJan Lentfer 	return ldns_rr2str_fmt(ldns_output_format_default, rr);
3306b5dedccaSJan Lentfer }
3307b5dedccaSJan Lentfer 
3308b5dedccaSJan Lentfer char *
ldns_pkt2str_fmt(const ldns_output_format * fmt,const ldns_pkt * pkt)3309b5dedccaSJan Lentfer ldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt)
3310825eb42bSJan Lentfer {
3311825eb42bSJan Lentfer 	char *result = NULL;
3312825eb42bSJan Lentfer 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
3313825eb42bSJan Lentfer 
3314fd185f4dSJan Lentfer 	if (!tmp_buffer) {
3315fd185f4dSJan Lentfer 		return NULL;
3316fd185f4dSJan Lentfer 	}
3317b5dedccaSJan Lentfer 	if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt)
3318b5dedccaSJan Lentfer 		       	== LDNS_STATUS_OK) {
3319825eb42bSJan Lentfer 		/* export and return string, destroy rest */
3320d1b2b5caSJohn Marino 		result = ldns_buffer_export2str(tmp_buffer);
3321825eb42bSJan Lentfer 	}
3322825eb42bSJan Lentfer 
3323825eb42bSJan Lentfer 	ldns_buffer_free(tmp_buffer);
3324825eb42bSJan Lentfer 	return result;
3325825eb42bSJan Lentfer }
3326825eb42bSJan Lentfer 
3327825eb42bSJan Lentfer char *
ldns_pkt2str(const ldns_pkt * pkt)3328b5dedccaSJan Lentfer ldns_pkt2str(const ldns_pkt *pkt)
3329b5dedccaSJan Lentfer {
3330b5dedccaSJan Lentfer 	return ldns_pkt2str_fmt(ldns_output_format_default, pkt);
3331b5dedccaSJan Lentfer }
3332b5dedccaSJan Lentfer 
3333b5dedccaSJan Lentfer char *
ldns_key2str(const ldns_key * k)3334825eb42bSJan Lentfer ldns_key2str(const ldns_key *k)
3335825eb42bSJan Lentfer {
3336825eb42bSJan Lentfer 	char *result = NULL;
3337ac996e71SJan Lentfer 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
3338fd185f4dSJan Lentfer 
3339fd185f4dSJan Lentfer 	if (!tmp_buffer) {
3340fd185f4dSJan Lentfer 		return NULL;
3341fd185f4dSJan Lentfer 	}
3342825eb42bSJan Lentfer 	if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
3343825eb42bSJan Lentfer 		/* export and return string, destroy rest */
3344d1b2b5caSJohn Marino 		result = ldns_buffer_export2str(tmp_buffer);
3345825eb42bSJan Lentfer 	}
3346825eb42bSJan Lentfer 	ldns_buffer_free(tmp_buffer);
3347825eb42bSJan Lentfer 	return result;
3348825eb42bSJan Lentfer }
3349825eb42bSJan Lentfer 
3350825eb42bSJan Lentfer char *
ldns_rr_list2str_fmt(const ldns_output_format * fmt,const ldns_rr_list * list)3351b5dedccaSJan Lentfer ldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list)
3352825eb42bSJan Lentfer {
3353825eb42bSJan Lentfer 	char *result = NULL;
3354ac996e71SJan Lentfer 	ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
3355825eb42bSJan Lentfer 
3356fd185f4dSJan Lentfer 	if (!tmp_buffer) {
3357fd185f4dSJan Lentfer 		return NULL;
3358fd185f4dSJan Lentfer 	}
3359825eb42bSJan Lentfer 	if (list) {
3360b5dedccaSJan Lentfer 		if (ldns_rr_list2buffer_str_fmt(
3361b5dedccaSJan Lentfer 				   tmp_buffer, fmt, list)
3362b5dedccaSJan Lentfer 			       	== LDNS_STATUS_OK) {
3363825eb42bSJan Lentfer 		}
3364825eb42bSJan Lentfer 	} else {
3365b5dedccaSJan Lentfer 		if (fmt == NULL) {
3366b5dedccaSJan Lentfer 			fmt = ldns_output_format_default;
3367b5dedccaSJan Lentfer 		}
3368b5dedccaSJan Lentfer 		if (fmt->flags & LDNS_COMMENT_NULLS) {
3369b5dedccaSJan Lentfer 			ldns_buffer_printf(tmp_buffer, "; (null)\n");
3370b5dedccaSJan Lentfer 		}
3371825eb42bSJan Lentfer 	}
3372825eb42bSJan Lentfer 
3373825eb42bSJan Lentfer 	/* export and return string, destroy rest */
3374d1b2b5caSJohn Marino 	result = ldns_buffer_export2str(tmp_buffer);
3375825eb42bSJan Lentfer 	ldns_buffer_free(tmp_buffer);
3376825eb42bSJan Lentfer 	return result;
3377825eb42bSJan Lentfer }
3378825eb42bSJan Lentfer 
3379b5dedccaSJan Lentfer char *
ldns_rr_list2str(const ldns_rr_list * list)3380b5dedccaSJan Lentfer ldns_rr_list2str(const ldns_rr_list *list)
3381b5dedccaSJan Lentfer {
3382b5dedccaSJan Lentfer 	return ldns_rr_list2str_fmt(ldns_output_format_default, list);
3383b5dedccaSJan Lentfer }
3384b5dedccaSJan Lentfer 
3385825eb42bSJan Lentfer void
ldns_rdf_print(FILE * output,const ldns_rdf * rdf)3386825eb42bSJan Lentfer ldns_rdf_print(FILE *output, const ldns_rdf *rdf)
3387825eb42bSJan Lentfer {
3388825eb42bSJan Lentfer 	char *str = ldns_rdf2str(rdf);
3389825eb42bSJan Lentfer 	if (str) {
3390825eb42bSJan Lentfer 		fprintf(output, "%s", str);
3391825eb42bSJan Lentfer 	} else {
3392d1b2b5caSJohn Marino 		fprintf(output, ";Unable to convert rdf to string\n");
3393825eb42bSJan Lentfer 	}
3394825eb42bSJan Lentfer 	LDNS_FREE(str);
3395825eb42bSJan Lentfer }
3396825eb42bSJan Lentfer 
3397825eb42bSJan Lentfer void
ldns_rr_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_rr * rr)3398b5dedccaSJan Lentfer ldns_rr_print_fmt(FILE *output,
3399b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_rr *rr)
3400825eb42bSJan Lentfer {
3401b5dedccaSJan Lentfer 	char *str = ldns_rr2str_fmt(fmt, rr);
3402825eb42bSJan Lentfer 	if (str) {
3403825eb42bSJan Lentfer 		fprintf(output, "%s", str);
3404825eb42bSJan Lentfer 	} else {
3405d1b2b5caSJohn Marino 		fprintf(output, ";Unable to convert rr to string\n");
3406825eb42bSJan Lentfer 	}
3407825eb42bSJan Lentfer 	LDNS_FREE(str);
3408825eb42bSJan Lentfer }
3409825eb42bSJan Lentfer 
3410825eb42bSJan Lentfer void
ldns_rr_print(FILE * output,const ldns_rr * rr)3411b5dedccaSJan Lentfer ldns_rr_print(FILE *output, const ldns_rr *rr)
3412825eb42bSJan Lentfer {
3413b5dedccaSJan Lentfer 	ldns_rr_print_fmt(output, ldns_output_format_default, rr);
3414b5dedccaSJan Lentfer }
3415b5dedccaSJan Lentfer 
3416b5dedccaSJan Lentfer void
ldns_pkt_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_pkt * pkt)3417b5dedccaSJan Lentfer ldns_pkt_print_fmt(FILE *output,
3418b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_pkt *pkt)
3419b5dedccaSJan Lentfer {
3420b5dedccaSJan Lentfer 	char *str = ldns_pkt2str_fmt(fmt, pkt);
3421825eb42bSJan Lentfer 	if (str) {
3422825eb42bSJan Lentfer 		fprintf(output, "%s", str);
3423825eb42bSJan Lentfer 	} else {
3424d1b2b5caSJohn Marino 		fprintf(output, ";Unable to convert packet to string\n");
3425825eb42bSJan Lentfer 	}
3426825eb42bSJan Lentfer 	LDNS_FREE(str);
3427825eb42bSJan Lentfer }
3428825eb42bSJan Lentfer 
3429825eb42bSJan Lentfer void
ldns_pkt_print(FILE * output,const ldns_pkt * pkt)3430b5dedccaSJan Lentfer ldns_pkt_print(FILE *output, const ldns_pkt *pkt)
3431b5dedccaSJan Lentfer {
3432b5dedccaSJan Lentfer 	ldns_pkt_print_fmt(output, ldns_output_format_default, pkt);
3433b5dedccaSJan Lentfer }
3434b5dedccaSJan Lentfer 
3435b5dedccaSJan Lentfer void
ldns_rr_list_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_rr_list * lst)3436b5dedccaSJan Lentfer ldns_rr_list_print_fmt(FILE *output,
3437b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_rr_list *lst)
3438825eb42bSJan Lentfer {
3439825eb42bSJan Lentfer 	size_t i;
3440825eb42bSJan Lentfer 	for (i = 0; i < ldns_rr_list_rr_count(lst); i++) {
3441b5dedccaSJan Lentfer 		ldns_rr_print_fmt(output, fmt, ldns_rr_list_rr(lst, i));
3442825eb42bSJan Lentfer 	}
3443825eb42bSJan Lentfer }
3444825eb42bSJan Lentfer 
3445825eb42bSJan Lentfer void
ldns_rr_list_print(FILE * output,const ldns_rr_list * lst)3446b5dedccaSJan Lentfer ldns_rr_list_print(FILE *output, const ldns_rr_list *lst)
3447b5dedccaSJan Lentfer {
3448b5dedccaSJan Lentfer 	ldns_rr_list_print_fmt(output, ldns_output_format_default, lst);
3449b5dedccaSJan Lentfer }
3450b5dedccaSJan Lentfer 
3451b5dedccaSJan Lentfer void
ldns_resolver_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_resolver * r)3452b5dedccaSJan Lentfer ldns_resolver_print_fmt(FILE *output,
3453b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_resolver *r)
3454825eb42bSJan Lentfer {
3455825eb42bSJan Lentfer 	uint16_t i;
3456825eb42bSJan Lentfer 	ldns_rdf **n;
3457825eb42bSJan Lentfer 	ldns_rdf **s;
3458825eb42bSJan Lentfer 	size_t *rtt;
3459825eb42bSJan Lentfer 	if (!r) {
3460825eb42bSJan Lentfer 		return;
3461825eb42bSJan Lentfer 	}
3462825eb42bSJan Lentfer 	n = ldns_resolver_nameservers(r);
3463825eb42bSJan Lentfer 	s = ldns_resolver_searchlist(r);
3464825eb42bSJan Lentfer 	rtt = ldns_resolver_rtt(r);
3465825eb42bSJan Lentfer 
3466825eb42bSJan Lentfer 	fprintf(output, "port: %d\n", (int)ldns_resolver_port(r));
3467825eb42bSJan Lentfer 	fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r));
3468825eb42bSJan Lentfer 	fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r));
3469825eb42bSJan Lentfer 
3470825eb42bSJan Lentfer 	fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r));
3471825eb42bSJan Lentfer 	fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r));
3472825eb42bSJan Lentfer 	fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r));
3473825eb42bSJan Lentfer 	fprintf(output, "fail: %d\n", ldns_resolver_fail(r));
3474825eb42bSJan Lentfer 	fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r));
3475ac996e71SJan Lentfer 	fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r));
3476ac996e71SJan Lentfer 	fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r));
3477ac996e71SJan Lentfer 	fprintf(output, "random: %d\n", ldns_resolver_random(r));
3478825eb42bSJan Lentfer 	fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec);
3479ac996e71SJan Lentfer 	fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r));
3480ac996e71SJan Lentfer 	fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r));
3481ac996e71SJan Lentfer 	fprintf(output, "trust anchors (%d listed):\n",
3482ac996e71SJan Lentfer 		(int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r)));
3483b5dedccaSJan Lentfer 	ldns_rr_list_print_fmt(output, fmt, ldns_resolver_dnssec_anchors(r));
3484fd185f4dSJan Lentfer 	fprintf(output, "tsig: %s %s\n",
3485fd185f4dSJan Lentfer                 ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-",
3486fd185f4dSJan Lentfer                 ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-");
3487ac996e71SJan Lentfer 	fprintf(output, "debug: %d\n", ldns_resolver_debug(r));
3488825eb42bSJan Lentfer 
3489825eb42bSJan Lentfer 	fprintf(output, "default domain: ");
3490825eb42bSJan Lentfer 	ldns_rdf_print(output, ldns_resolver_domain(r));
3491825eb42bSJan Lentfer 	fprintf(output, "\n");
3492ac996e71SJan Lentfer 	fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r));
3493825eb42bSJan Lentfer 
3494ac996e71SJan Lentfer 	fprintf(output, "searchlist (%d listed):\n",  (int)ldns_resolver_searchlist_count(r));
3495825eb42bSJan Lentfer 	for (i = 0; i < ldns_resolver_searchlist_count(r); i++) {
3496825eb42bSJan Lentfer 		fprintf(output, "\t");
3497825eb42bSJan Lentfer 		ldns_rdf_print(output, s[i]);
3498825eb42bSJan Lentfer 		fprintf(output, "\n");
3499825eb42bSJan Lentfer 	}
3500ac996e71SJan Lentfer 	fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r));
3501825eb42bSJan Lentfer 
3502ac996e71SJan Lentfer 	fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r));
3503825eb42bSJan Lentfer 	for (i = 0; i < ldns_resolver_nameserver_count(r); i++) {
3504825eb42bSJan Lentfer 		fprintf(output, "\t");
3505825eb42bSJan Lentfer 		ldns_rdf_print(output, n[i]);
3506825eb42bSJan Lentfer 
3507825eb42bSJan Lentfer 		switch ((int)rtt[i]) {
3508825eb42bSJan Lentfer 			case LDNS_RESOLV_RTT_MIN:
3509825eb42bSJan Lentfer 			fprintf(output, " - reachable\n");
3510825eb42bSJan Lentfer 			break;
3511825eb42bSJan Lentfer 			case LDNS_RESOLV_RTT_INF:
3512825eb42bSJan Lentfer 			fprintf(output, " - unreachable\n");
3513825eb42bSJan Lentfer 			break;
3514825eb42bSJan Lentfer 		}
3515825eb42bSJan Lentfer 	}
3516825eb42bSJan Lentfer }
3517825eb42bSJan Lentfer 
3518825eb42bSJan Lentfer void
ldns_resolver_print(FILE * output,const ldns_resolver * r)3519b5dedccaSJan Lentfer ldns_resolver_print(FILE *output, const ldns_resolver *r)
3520b5dedccaSJan Lentfer {
3521b5dedccaSJan Lentfer 	ldns_resolver_print_fmt(output, ldns_output_format_default, r);
3522b5dedccaSJan Lentfer }
3523b5dedccaSJan Lentfer 
3524b5dedccaSJan Lentfer void
ldns_zone_print_fmt(FILE * output,const ldns_output_format * fmt,const ldns_zone * z)3525b5dedccaSJan Lentfer ldns_zone_print_fmt(FILE *output,
3526b5dedccaSJan Lentfer 		const ldns_output_format *fmt, const ldns_zone *z)
3527825eb42bSJan Lentfer {
3528825eb42bSJan Lentfer 	if(ldns_zone_soa(z))
3529b5dedccaSJan Lentfer 		ldns_rr_print_fmt(output, fmt, ldns_zone_soa(z));
3530b5dedccaSJan Lentfer 	ldns_rr_list_print_fmt(output, fmt, ldns_zone_rrs(z));
3531b5dedccaSJan Lentfer }
3532b5dedccaSJan Lentfer void
ldns_zone_print(FILE * output,const ldns_zone * z)3533b5dedccaSJan Lentfer ldns_zone_print(FILE *output, const ldns_zone *z)
3534b5dedccaSJan Lentfer {
3535b5dedccaSJan Lentfer 	ldns_zone_print_fmt(output, ldns_output_format_default, z);
3536825eb42bSJan Lentfer }
3537