4 * conversion routines from the host format
5 * to the presentation format (strings)
7 * a Net::DNS like library for C
9 * (c) NLnet Labs, 2004-2006
11 * See the file LICENSE for the license
13 #include <ldns/config.h>
15 #include <ldns/ldns.h>
19 #ifdef HAVE_SYS_SOCKET_H
20 #include <sys/socket.h>
22 #ifdef HAVE_ARPA_INET_H
23 #include <arpa/inet.h>
31 #ifndef INET_ADDRSTRLEN
32 #define INET_ADDRSTRLEN 16
34 #ifndef INET6_ADDRSTRLEN
35 #define INET6_ADDRSTRLEN 46
38 /* lookup tables for standard DNS stuff */
40 /* Taken from RFC 2535, section 7. */
41 ldns_lookup_table ldns_algorithms[] = {
42 { LDNS_RSAMD5, "RSAMD5" },
46 { LDNS_RSASHA1, "RSASHA1" },
47 { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" },
48 { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" },
50 { LDNS_RSASHA256, "RSASHA256"},
51 { LDNS_RSASHA512, "RSASHA512"},
54 { LDNS_ECC_GOST, "ECC-GOST"},
57 { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"},
58 { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"},
60 { LDNS_INDIRECT, "INDIRECT" },
61 { LDNS_PRIVATEDNS, "PRIVATEDNS" },
62 { LDNS_PRIVATEOID, "PRIVATEOID" },
66 /* Taken from RFC 4398 */
67 ldns_lookup_table ldns_cert_algorithms[] = {
68 { LDNS_CERT_PKIX, "PKIX" },
69 { LDNS_CERT_SPKI, "SPKI" },
70 { LDNS_CERT_PGP, "PGP" },
71 { LDNS_CERT_IPKIX, "IPKIX" },
72 { LDNS_CERT_ISPKI, "ISPKI" },
73 { LDNS_CERT_IPGP, "IPGP" },
74 { LDNS_CERT_ACPKIX, "ACPKIX" },
75 { LDNS_CERT_IACPKIX, "IACPKIX" },
76 { LDNS_CERT_URI, "URI" },
77 { LDNS_CERT_OID, "OID" },
82 ldns_lookup_table ldns_rr_classes[] = {
83 { LDNS_RR_CLASS_IN, "IN" },
84 { LDNS_RR_CLASS_CH, "CH" },
85 { LDNS_RR_CLASS_HS, "HS" },
86 { LDNS_RR_CLASS_NONE, "NONE" },
87 { LDNS_RR_CLASS_ANY, "ANY" },
91 /* if these are used elsewhere */
92 ldns_lookup_table ldns_rcodes[] = {
93 { LDNS_RCODE_NOERROR, "NOERROR" },
94 { LDNS_RCODE_FORMERR, "FORMERR" },
95 { LDNS_RCODE_SERVFAIL, "SERVFAIL" },
96 { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" },
97 { LDNS_RCODE_NOTIMPL, "NOTIMPL" },
98 { LDNS_RCODE_REFUSED, "REFUSED" },
99 { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" },
100 { LDNS_RCODE_YXRRSET, "YXRRSET" },
101 { LDNS_RCODE_NXRRSET, "NXRRSET" },
102 { LDNS_RCODE_NOTAUTH, "NOTAUTH" },
103 { LDNS_RCODE_NOTZONE, "NOTZONE" },
107 ldns_lookup_table ldns_opcodes[] = {
108 { LDNS_PACKET_QUERY, "QUERY" },
109 { LDNS_PACKET_IQUERY, "IQUERY" },
110 { LDNS_PACKET_STATUS, "STATUS" },
111 { LDNS_PACKET_NOTIFY, "NOTIFY" },
112 { LDNS_PACKET_UPDATE, "UPDATE" },
117 ldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode)
119 ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode);
120 if (lt && lt->name) {
121 ldns_buffer_printf(output, "%s", lt->name);
123 ldns_buffer_printf(output, "OPCODE%u", opcode);
125 return ldns_buffer_status(output);
129 ldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode)
131 ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode);
132 if (lt && lt->name) {
133 ldns_buffer_printf(output, "%s", lt->name);
135 ldns_buffer_printf(output, "RCODE%u", rcode);
137 return ldns_buffer_status(output);
141 ldns_algorithm2buffer_str(ldns_buffer *output,
142 ldns_algorithm algorithm)
144 ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms,
146 if (lt && lt->name) {
147 ldns_buffer_printf(output, "%s", lt->name);
149 ldns_buffer_printf(output, "ALG%u", algorithm);
151 return ldns_buffer_status(output);
155 ldns_cert_algorithm2buffer_str(ldns_buffer *output,
156 ldns_cert_algorithm cert_algorithm)
158 ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms,
160 if (lt && lt->name) {
161 ldns_buffer_printf(output, "%s", lt->name);
163 ldns_buffer_printf(output, "CERT_ALG%u",
166 return ldns_buffer_status(output);
170 ldns_pkt_opcode2str(ldns_pkt_opcode opcode)
175 buf = ldns_buffer_new(12);
181 if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) {
182 str = ldns_buffer2str(buf);
185 ldns_buffer_free(buf);
190 ldns_pkt_rcode2str(ldns_pkt_rcode rcode)
195 buf = ldns_buffer_new(10);
201 if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) {
202 str = ldns_buffer2str(buf);
205 ldns_buffer_free(buf);
210 ldns_pkt_algorithm2str(ldns_algorithm algorithm)
215 buf = ldns_buffer_new(10);
221 if (ldns_algorithm2buffer_str(buf, algorithm)
223 str = ldns_buffer2str(buf);
226 ldns_buffer_free(buf);
231 ldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm)
236 buf = ldns_buffer_new(10);
242 if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm)
244 str = ldns_buffer2str(buf);
247 ldns_buffer_free(buf);
252 /* do NOT pass compressed data here :p */
254 ldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname)
256 /* can we do with 1 pos var? or without at all? */
263 data = (uint8_t*)ldns_rdf_data(dname);
266 if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) {
267 /* too large, return */
268 return LDNS_STATUS_DOMAINNAME_OVERFLOW;
271 /* special case: root label */
272 if (1 == ldns_rdf_size(dname)) {
273 ldns_buffer_printf(output, ".");
275 while ((len > 0) && src_pos < ldns_rdf_size(dname)) {
277 for(i = 0; i < len; i++) {
278 /* paranoia check for various 'strange'
281 c = (unsigned char) data[src_pos];
282 if(c == '.' || c == ';' ||
283 c == '(' || c == ')' ||
285 ldns_buffer_printf(output, "\\%c",
287 } else if (!(isascii(c) && isgraph(c))) {
288 ldns_buffer_printf(output, "\\%03u",
291 ldns_buffer_printf(output, "%c", data[src_pos]);
296 if (src_pos < ldns_rdf_size(dname)) {
297 ldns_buffer_printf(output, ".");
302 return ldns_buffer_status(output);
306 ldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf)
308 uint8_t data = ldns_rdf_data(rdf)[0];
309 ldns_buffer_printf(output, "%lu", (unsigned long) data);
310 return ldns_buffer_status(output);
314 ldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf)
316 uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
317 ldns_buffer_printf(output, "%lu", (unsigned long) data);
318 return ldns_buffer_status(output);
322 ldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf)
324 uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf));
325 ldns_buffer_printf(output, "%lu", (unsigned long) data);
326 return ldns_buffer_status(output);
330 ldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf)
332 /* create a YYYYMMDDHHMMSS string if possible */
333 time_t data_time = (time_t) ldns_read_uint32(ldns_rdf_data(rdf));
337 memset(&tm, 0, sizeof(tm));
339 if (gmtime_r(&data_time, &tm) && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) {
340 ldns_buffer_printf(output, "%s", date_buf);
342 return ldns_buffer_status(output);
346 ldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf)
348 char str[INET_ADDRSTRLEN];
350 if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) {
351 ldns_buffer_printf(output, "%s", str);
353 return ldns_buffer_status(output);
357 ldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf)
359 char str[INET6_ADDRSTRLEN];
361 if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) {
362 ldns_buffer_printf(output, "%s", str);
365 return ldns_buffer_status(output);
369 ldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf)
371 const uint8_t *data = ldns_rdf_data(rdf);
372 uint8_t length = data[0];
375 ldns_buffer_printf(output, "\"");
376 for (i = 1; i <= length; ++i) {
377 char ch = (char) data[i];
378 if (isprint((int)ch) || ch=='\t') {
379 if (ch=='\"'||ch=='\\')
380 ldns_buffer_printf(output, "\\%c", ch);
382 ldns_buffer_printf(output, "%c", ch);
384 ldns_buffer_printf(output, "\\%03u",
385 (unsigned)(uint8_t) ch);
388 ldns_buffer_printf(output, "\"");
389 return ldns_buffer_status(output);
393 ldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf)
395 size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf));
396 char *b64 = LDNS_XMALLOC(char, size);
397 if(!b64) return LDNS_STATUS_MEM_ERR;
398 if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) {
399 ldns_buffer_printf(output, "%s", b64);
402 return ldns_buffer_status(output);
406 ldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf)
410 if(ldns_rdf_size(rdf) == 0)
411 return LDNS_STATUS_OK;
412 /* remove -1 for the b32-hash-len octet */
413 size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1);
414 /* add one for the end nul for the string */
415 b32 = LDNS_XMALLOC(char, size + 1);
416 if(!b32) return LDNS_STATUS_MEM_ERR;
417 size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1,
418 ldns_rdf_size(rdf) - 1, b32, size+1);
420 ldns_buffer_printf(output, "%s", b32);
423 return ldns_buffer_status(output);
427 ldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf)
430 for (i = 0; i < ldns_rdf_size(rdf); i++) {
431 ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]);
434 return ldns_buffer_status(output);
438 ldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf)
440 uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
441 const ldns_rr_descriptor *descriptor;
443 descriptor = ldns_rr_descript(data);
444 if (descriptor && descriptor->_name) {
445 ldns_buffer_printf(output, "%s", descriptor->_name);
447 ldns_buffer_printf(output, "TYPE%u", data);
449 return ldns_buffer_status(output);
453 ldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf)
455 uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
456 ldns_lookup_table *lt;
458 lt = ldns_lookup_by_id(ldns_rr_classes, (int) data);
460 ldns_buffer_printf(output, "\t%s", lt->name);
462 ldns_buffer_printf(output, "\tCLASS%d", data);
464 return ldns_buffer_status(output);
468 ldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf)
470 uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf));
471 ldns_lookup_table *lt;
472 lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data);
474 ldns_buffer_printf(output, "%s", lt->name);
476 ldns_buffer_printf(output, "%d", data);
478 return ldns_buffer_status(output);
482 ldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf)
484 /* don't use algorithm mnemonics in the presentation format
485 this kind of got sneaked into the rfc's */
486 uint8_t data = ldns_rdf_data(rdf)[0];
487 ldns_buffer_printf(output, "%d", data);
488 return ldns_buffer_status(output);
492 loc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent)
495 /* is it 0.<two digits> ? */
499 ldns_buffer_printf(output, "0.%02ld", (long)mantissa);
502 /* always <digit><string of zeros> */
503 ldns_buffer_printf(output, "%d", (int)mantissa);
504 for(i=0; i<exponent-2; i++)
505 ldns_buffer_printf(output, "0");
509 ldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type)
511 const ldns_rr_descriptor *descriptor;
513 descriptor = ldns_rr_descript(type);
515 if (descriptor && descriptor->_name) {
516 ldns_buffer_printf(output, "%s", descriptor->_name);
518 /* exceptions for pseudotypes */
520 case LDNS_RR_TYPE_IXFR:
521 ldns_buffer_printf(output, "IXFR");
523 case LDNS_RR_TYPE_AXFR:
524 ldns_buffer_printf(output, "AXFR");
526 case LDNS_RR_TYPE_MAILA:
527 ldns_buffer_printf(output, "MAILA");
529 case LDNS_RR_TYPE_MAILB:
530 ldns_buffer_printf(output, "MAILB");
532 case LDNS_RR_TYPE_ANY:
533 ldns_buffer_printf(output, "ANY");
536 ldns_buffer_printf(output, "TYPE%u", type);
539 return ldns_buffer_status(output);
543 ldns_rr_type2str(const ldns_rr_type type)
548 buf = ldns_buffer_new(10);
554 if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) {
555 str = ldns_buffer2str(buf);
558 ldns_buffer_free(buf);
564 ldns_rr_class2buffer_str(ldns_buffer *output,
565 const ldns_rr_class klass)
567 ldns_lookup_table *lt;
569 lt = ldns_lookup_by_id(ldns_rr_classes, klass);
571 ldns_buffer_printf(output, "%s", lt->name);
573 ldns_buffer_printf(output, "CLASS%d", klass);
575 return ldns_buffer_status(output);
579 ldns_rr_class2str(const ldns_rr_class klass)
584 buf = ldns_buffer_new(10);
590 if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) {
591 str = ldns_buffer2str(buf);
593 ldns_buffer_free(buf);
598 ldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf)
600 /* we could do checking (ie degrees < 90 etc)? */
601 uint8_t version = ldns_rdf_data(rdf)[0];
603 uint8_t horizontal_precision;
604 uint8_t vertical_precision;
614 uint32_t equator = (uint32_t) ldns_power(2, 31);
617 size = ldns_rdf_data(rdf)[1];
618 horizontal_precision = ldns_rdf_data(rdf)[2];
619 vertical_precision = ldns_rdf_data(rdf)[3];
621 latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]);
622 longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]);
623 altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]);
625 if (latitude > equator) {
627 latitude = latitude - equator;
630 latitude = equator - latitude;
632 h = latitude / (1000 * 60 * 60);
633 latitude = latitude % (1000 * 60 * 60);
634 m = latitude / (1000 * 60);
635 latitude = latitude % (1000 * 60);
636 s = (double) latitude / 1000.0;
637 ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
638 h, m, s, northerness);
640 if (longitude > equator) {
642 longitude = longitude - equator;
645 longitude = equator - longitude;
647 h = longitude / (1000 * 60 * 60);
648 longitude = longitude % (1000 * 60 * 60);
649 m = longitude / (1000 * 60);
650 longitude = longitude % (1000 * 60);
651 s = (double) longitude / (1000.0);
652 ldns_buffer_printf(output, "%02u %02u %0.3f %c ",
653 h, m, s, easterness);
656 s = ((double) altitude) / 100;
659 if(altitude%100 != 0)
660 ldns_buffer_printf(output, "%.2f", s);
662 ldns_buffer_printf(output, "%.0f", s);
664 ldns_buffer_printf(output, "m ");
666 loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f);
667 ldns_buffer_printf(output, "m ");
669 loc_cm_print(output, (horizontal_precision & 0xf0) >> 4,
670 horizontal_precision & 0x0f);
671 ldns_buffer_printf(output, "m ");
673 loc_cm_print(output, (vertical_precision & 0xf0) >> 4,
674 vertical_precision & 0x0f);
675 ldns_buffer_printf(output, "m");
677 return ldns_buffer_status(output);
679 return ldns_rdf2buffer_str_hex(output, rdf);
684 ldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf)
686 ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf));
687 return ldns_rdf2buffer_str_hex(output, rdf);
691 ldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf)
693 ldns_buffer_printf(output, "0x");
694 return ldns_rdf2buffer_str_hex(output, rdf);
698 ldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf)
700 return ldns_rdf2buffer_str_hex(output, rdf);
704 ldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf)
706 /* protocol, followed by bitmap of services */
707 struct protoent *protocol;
708 char *proto_name = NULL;
710 struct servent *service;
711 uint16_t current_service;
713 protocol_nr = ldns_rdf_data(rdf)[0];
714 protocol = getprotobynumber((int) protocol_nr);
715 if (protocol && (protocol->p_name != NULL)) {
716 proto_name = protocol->p_name;
717 ldns_buffer_printf(output, "%s ", protocol->p_name);
719 ldns_buffer_printf(output, "%u ", protocol_nr);
722 #ifdef HAVE_ENDPROTOENT
726 for (current_service = 0;
727 current_service < ldns_rdf_size(rdf) * 7; current_service++) {
728 if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) {
729 service = getservbyport((int) htons(current_service),
731 if (service && service->s_name) {
732 ldns_buffer_printf(output, "%s ", service->s_name);
734 ldns_buffer_printf(output, "%u ", current_service);
736 #ifdef HAVE_ENDSERVENT
741 return ldns_buffer_status(output);
745 ldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf)
747 /* Note: this code is duplicated in higher.c in
748 * ldns_nsec_type_check() function
750 uint8_t window_block_nr;
751 uint8_t bitmap_length;
755 uint8_t *data = ldns_rdf_data(rdf);
756 const ldns_rr_descriptor *descriptor;
758 while(pos < ldns_rdf_size(rdf)) {
759 window_block_nr = data[pos];
760 bitmap_length = data[pos + 1];
763 for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) {
764 if (ldns_get_bit(&data[pos], bit_pos)) {
765 type = 256 * (uint16_t) window_block_nr + bit_pos;
766 descriptor = ldns_rr_descript(type);
768 if (descriptor && descriptor->_name) {
769 ldns_buffer_printf(output, "%s ",
772 ldns_buffer_printf(output, "TYPE%u ", type);
777 pos += (uint16_t) bitmap_length;
780 return ldns_buffer_status(output);
784 ldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf)
789 uint8_t *data = ldns_rdf_data(rdf);
791 if(ldns_rdf_size(rdf) == 0) {
792 output->_status = LDNS_STATUS_ERR;
793 return ldns_buffer_status(output);
795 salt_length = data[0];
796 /* from now there are variable length entries so remember pos */
797 if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) {
798 ldns_buffer_printf(output, "- ");
800 for (salt_pos = 0; salt_pos < salt_length; salt_pos++) {
801 ldns_buffer_printf(output, "%02x", data[1 + salt_pos]);
803 ldns_buffer_printf(output, " ");
806 return ldns_buffer_status(output);
810 ldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf)
812 /* period is the number of seconds */
813 uint32_t p = ldns_read_uint32(ldns_rdf_data(rdf));
814 ldns_buffer_printf(output, "%u", p);
815 return ldns_buffer_status(output);
819 ldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const ldns_rdf *rdf)
821 /* tsigtime is 48 bits network order unsigned integer */
822 uint64_t tsigtime = 0;
823 uint8_t *data = ldns_rdf_data(rdf);
825 if (ldns_rdf_size(rdf) != 6) {
826 return LDNS_STATUS_ERR;
829 tsigtime = ldns_read_uint16(data);
831 tsigtime += ldns_read_uint16(data+2);
834 ldns_buffer_printf(output, "%llu ", tsigtime);
836 return ldns_buffer_status(output);
840 ldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf)
842 uint8_t *data = ldns_rdf_data(rdf);
843 uint16_t address_family;
850 while (pos < (unsigned int) ldns_rdf_size(rdf)) {
851 if(pos + 3 >= (unsigned)ldns_rdf_size(rdf))
852 return LDNS_STATUS_SYNTAX_RDATA_ERR;
853 address_family = ldns_read_uint16(&data[pos]);
854 prefix = data[pos + 2];
855 negation = data[pos + 3] & LDNS_APL_NEGATION;
856 adf_length = data[pos + 3] & LDNS_APL_MASK;
857 if (address_family == LDNS_APL_IP4) {
858 /* check if prefix < 32? */
860 ldns_buffer_printf(output, "!");
862 ldns_buffer_printf(output, "%u:", address_family);
863 /* address is variable length 0 - 4 */
864 for (i = 0; i < 4; i++) {
866 ldns_buffer_printf(output, ".");
868 if (i < (unsigned short) adf_length) {
869 if(pos+i+4 >= ldns_rdf_size(rdf))
870 return LDNS_STATUS_SYNTAX_RDATA_ERR;
871 ldns_buffer_printf(output, "%d",
874 ldns_buffer_printf(output, "0");
877 ldns_buffer_printf(output, "/%u ", prefix);
878 } else if (address_family == LDNS_APL_IP6) {
879 /* check if prefix < 128? */
881 ldns_buffer_printf(output, "!");
883 ldns_buffer_printf(output, "%u:", address_family);
884 /* address is variable length 0 - 16 */
885 for (i = 0; i < 16; i++) {
886 if (i % 2 == 0 && i > 0) {
887 ldns_buffer_printf(output, ":");
889 if (i < (unsigned short) adf_length) {
890 if(pos+i+4 >= ldns_rdf_size(rdf))
891 return LDNS_STATUS_SYNTAX_RDATA_ERR;
892 ldns_buffer_printf(output, "%02x",
895 ldns_buffer_printf(output, "00");
898 ldns_buffer_printf(output, "/%u ", prefix);
901 /* unknown address family */
902 ldns_buffer_printf(output, "Unknown address family: %u data: ",
904 for (i = 1; i < (unsigned short) (4 + adf_length); i++) {
905 if(pos+i >= ldns_rdf_size(rdf))
906 return LDNS_STATUS_SYNTAX_RDATA_ERR;
907 ldns_buffer_printf(output, "%02x", data[i]);
910 pos += 4 + adf_length;
912 return ldns_buffer_status(output);
916 ldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf)
918 /* Subtract the size (2) of the number that specifies the length */
919 size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2);
920 char *b64 = LDNS_XMALLOC(char, size);
922 return LDNS_STATUS_MEM_ERR;
924 ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2);
926 if (ldns_rdf_size(rdf) > 2 &&
927 ldns_b64_ntop(ldns_rdf_data(rdf) + 2,
928 ldns_rdf_size(rdf) - 2,
930 ldns_buffer_printf(output, "%s", b64);
933 return ldns_buffer_status(output);
937 ldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf)
940 http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt
942 uint8_t *data = ldns_rdf_data(rdf);
944 uint8_t gateway_type;
947 ldns_rdf *gateway = NULL;
948 uint8_t *gateway_data;
950 size_t public_key_size;
951 uint8_t *public_key_data;
952 ldns_rdf *public_key;
957 precedence = data[0];
958 gateway_type = data[1];
962 switch (gateway_type) {
967 gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN);
969 return LDNS_STATUS_MEM_ERR;
970 memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN);
971 gateway = ldns_rdf_new(LDNS_RDF_TYPE_A, LDNS_IP4ADDRLEN , gateway_data);
972 offset += LDNS_IP4ADDRLEN;
974 LDNS_FREE(gateway_data);
975 return LDNS_STATUS_MEM_ERR;
979 gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN);
981 return LDNS_STATUS_MEM_ERR;
982 memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN);
983 offset += LDNS_IP6ADDRLEN;
985 ldns_rdf_new(LDNS_RDF_TYPE_AAAA, LDNS_IP6ADDRLEN, gateway_data);
987 LDNS_FREE(gateway_data);
988 return LDNS_STATUS_MEM_ERR;
992 status = ldns_wire2dname(&gateway, data, ldns_rdf_size(rdf), &offset);
993 if(status != LDNS_STATUS_OK)
1001 public_key_size = ldns_rdf_size(rdf) - offset;
1002 public_key_data = LDNS_XMALLOC(uint8_t, public_key_size);
1003 if(!public_key_data) {
1004 ldns_rdf_free(gateway);
1005 return LDNS_STATUS_MEM_ERR;
1007 memcpy(public_key_data, &data[offset], public_key_size);
1008 public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64, public_key_size, public_key_data);
1010 LDNS_FREE(public_key_data);
1011 ldns_rdf_free(gateway);
1012 return LDNS_STATUS_MEM_ERR;
1015 ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm);
1017 (void) ldns_rdf2buffer_str(output, gateway);
1019 ldns_buffer_printf(output, ".");
1020 ldns_buffer_printf(output, " ");
1021 (void) ldns_rdf2buffer_str(output, public_key);
1023 ldns_rdf_free(gateway);
1024 ldns_rdf_free(public_key);
1026 return ldns_buffer_status(output);
1030 ldns_rdf2buffer_str_tsig(ldns_buffer *output, const ldns_rdf *rdf)
1032 /* TSIG RRs have no presentation format, make them #size <data> */
1033 return ldns_rdf2buffer_str_unknown(output, rdf);
1038 ldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf)
1040 ldns_status res = LDNS_STATUS_OK;
1042 /*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/
1044 switch(ldns_rdf_get_type(rdf)) {
1045 case LDNS_RDF_TYPE_NONE:
1047 case LDNS_RDF_TYPE_DNAME:
1048 res = ldns_rdf2buffer_str_dname(buffer, rdf);
1050 case LDNS_RDF_TYPE_INT8:
1051 res = ldns_rdf2buffer_str_int8(buffer, rdf);
1053 case LDNS_RDF_TYPE_INT16:
1054 res = ldns_rdf2buffer_str_int16(buffer, rdf);
1056 case LDNS_RDF_TYPE_INT32:
1057 res = ldns_rdf2buffer_str_int32(buffer, rdf);
1059 case LDNS_RDF_TYPE_PERIOD:
1060 res = ldns_rdf2buffer_str_period(buffer, rdf);
1062 case LDNS_RDF_TYPE_TSIGTIME:
1063 res = ldns_rdf2buffer_str_tsigtime(buffer, rdf);
1065 case LDNS_RDF_TYPE_A:
1066 res = ldns_rdf2buffer_str_a(buffer, rdf);
1068 case LDNS_RDF_TYPE_AAAA:
1069 res = ldns_rdf2buffer_str_aaaa(buffer, rdf);
1071 case LDNS_RDF_TYPE_STR:
1072 res = ldns_rdf2buffer_str_str(buffer, rdf);
1074 case LDNS_RDF_TYPE_APL:
1075 res = ldns_rdf2buffer_str_apl(buffer, rdf);
1077 case LDNS_RDF_TYPE_B32_EXT:
1078 res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1080 case LDNS_RDF_TYPE_B64:
1081 res = ldns_rdf2buffer_str_b64(buffer, rdf);
1083 case LDNS_RDF_TYPE_HEX:
1084 res = ldns_rdf2buffer_str_hex(buffer, rdf);
1086 case LDNS_RDF_TYPE_NSEC:
1087 res = ldns_rdf2buffer_str_nsec(buffer, rdf);
1089 case LDNS_RDF_TYPE_NSEC3_SALT:
1090 res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf);
1092 case LDNS_RDF_TYPE_TYPE:
1093 res = ldns_rdf2buffer_str_type(buffer, rdf);
1095 case LDNS_RDF_TYPE_CLASS:
1096 res = ldns_rdf2buffer_str_class(buffer, rdf);
1098 case LDNS_RDF_TYPE_CERT_ALG:
1099 res = ldns_rdf2buffer_str_cert_alg(buffer, rdf);
1101 case LDNS_RDF_TYPE_ALG:
1102 res = ldns_rdf2buffer_str_alg(buffer, rdf);
1104 case LDNS_RDF_TYPE_UNKNOWN:
1105 res = ldns_rdf2buffer_str_unknown(buffer, rdf);
1107 case LDNS_RDF_TYPE_TIME:
1108 res = ldns_rdf2buffer_str_time(buffer, rdf);
1110 case LDNS_RDF_TYPE_LOC:
1111 res = ldns_rdf2buffer_str_loc(buffer, rdf);
1113 case LDNS_RDF_TYPE_WKS:
1114 case LDNS_RDF_TYPE_SERVICE:
1115 res = ldns_rdf2buffer_str_wks(buffer, rdf);
1117 case LDNS_RDF_TYPE_NSAP:
1118 res = ldns_rdf2buffer_str_nsap(buffer, rdf);
1120 case LDNS_RDF_TYPE_ATMA:
1121 res = ldns_rdf2buffer_str_atma(buffer, rdf);
1123 case LDNS_RDF_TYPE_IPSECKEY:
1124 res = ldns_rdf2buffer_str_ipseckey(buffer, rdf);
1126 case LDNS_RDF_TYPE_TSIG:
1127 res = ldns_rdf2buffer_str_tsig(buffer, rdf);
1129 case LDNS_RDF_TYPE_INT16_DATA:
1130 res = ldns_rdf2buffer_str_int16_data(buffer, rdf);
1132 case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER:
1133 res = ldns_rdf2buffer_str_b32_ext(buffer, rdf);
1137 ldns_buffer_printf(buffer, "(null) ");
1138 res = ldns_buffer_status(buffer);
1144 ldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr)
1147 ldns_status status = LDNS_STATUS_OK;
1149 ldns_buffer_printf(output, "(null)\n");
1151 if (ldns_rr_owner(rr)) {
1152 status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr));
1154 if (status != LDNS_STATUS_OK) {
1158 /* TTL should NOT be printed if it is a question */
1159 if (!ldns_rr_is_question(rr)) {
1160 ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr));
1163 ldns_buffer_printf(output, "\t");
1164 status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr));
1165 if (status != LDNS_STATUS_OK) {
1168 ldns_buffer_printf(output, "\t");
1170 status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr));
1171 if (status != LDNS_STATUS_OK) {
1175 if (ldns_rr_rd_count(rr) > 0) {
1176 ldns_buffer_printf(output, "\t");
1177 } else if (!ldns_rr_is_question(rr)) {
1178 ldns_buffer_printf(output, "\t\\# 0");
1181 for (i = 0; i < ldns_rr_rd_count(rr); i++) {
1182 status = ldns_rdf2buffer_str(output, ldns_rr_rdf(rr, i));
1183 if(status != LDNS_STATUS_OK)
1185 if (i < ldns_rr_rd_count(rr) - 1) {
1186 ldns_buffer_printf(output, " ");
1189 /* per RR special comments - handy for DNSSEC types */
1190 /* check to prevent question sec. rr from
1192 if (ldns_rr_rd_count(rr) > 0) {
1193 switch (ldns_rr_get_type(rr)) {
1194 case LDNS_RR_TYPE_DNSKEY:
1195 if (ldns_rr_rdf(rr, 0)) {
1196 flags = ldns_rdf2native_int16(ldns_rr_rdf(rr, 0));
1197 if (flags == 256 || flags == 384) {
1198 ldns_buffer_printf(output,
1199 " ;{id = %u (zsk), size = %db}",
1200 (unsigned int) ldns_calc_keytag(rr),
1201 ldns_rr_dnskey_key_size(rr));
1204 if (flags == 257 || flags == 385) {
1205 ldns_buffer_printf(output,
1206 " ;{id = %u (ksk), size = %db}",
1207 (unsigned int) ldns_calc_keytag(rr),
1208 ldns_rr_dnskey_key_size(rr));
1211 ldns_buffer_printf(output, " ;{id = %u, size = %db}",
1212 (unsigned int) ldns_calc_keytag(rr),
1213 ldns_rr_dnskey_key_size(rr));
1216 case LDNS_RR_TYPE_RRSIG:
1217 ldns_buffer_printf(output, " ;{id = %d}",
1218 ldns_rdf2native_int16(ldns_rr_rdf(rr, 6)));
1220 case LDNS_RR_TYPE_DS:
1222 uint8_t *data = ldns_rdf_data(ldns_rr_rdf(rr, 3));
1223 size_t len = ldns_rdf_size(ldns_rr_rdf(rr, 3));
1224 char *babble = ldns_bubblebabble(data, len);
1226 ldns_buffer_printf(output, " ; %s", babble);
1230 case LDNS_RR_TYPE_NSEC3:
1231 if (ldns_nsec3_optout(rr)) {
1232 ldns_buffer_printf(output, " ; flags: optout");
1241 ldns_buffer_printf(output, "\n");
1243 return ldns_buffer_status(output);
1247 ldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list)
1251 for(i = 0; i < ldns_rr_list_rr_count(list); i++) {
1252 (void) ldns_rr2buffer_str(output, ldns_rr_list_rr(list, i));
1254 return ldns_buffer_status(output);
1258 ldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
1260 ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes,
1261 (int) ldns_pkt_get_opcode(pkt));
1262 ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes,
1263 (int) ldns_pkt_get_rcode(pkt));
1265 ldns_buffer_printf(output, ";; ->>HEADER<<- ");
1267 ldns_buffer_printf(output, "opcode: %s, ", opcode->name);
1269 ldns_buffer_printf(output, "opcode: ?? (%u), ",
1270 ldns_pkt_get_opcode(pkt));
1273 ldns_buffer_printf(output, "rcode: %s, ", rcode->name);
1275 ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt));
1277 ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt));
1278 ldns_buffer_printf(output, ";; flags: ");
1280 if (ldns_pkt_qr(pkt)) {
1281 ldns_buffer_printf(output, "qr ");
1283 if (ldns_pkt_aa(pkt)) {
1284 ldns_buffer_printf(output, "aa ");
1286 if (ldns_pkt_tc(pkt)) {
1287 ldns_buffer_printf(output, "tc ");
1289 if (ldns_pkt_rd(pkt)) {
1290 ldns_buffer_printf(output, "rd ");
1292 if (ldns_pkt_cd(pkt)) {
1293 ldns_buffer_printf(output, "cd ");
1295 if (ldns_pkt_ra(pkt)) {
1296 ldns_buffer_printf(output, "ra ");
1298 if (ldns_pkt_ad(pkt)) {
1299 ldns_buffer_printf(output, "ad ");
1301 ldns_buffer_printf(output, "; ");
1302 ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt));
1303 ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt));
1304 ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt));
1305 ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt));
1306 return ldns_buffer_status(output);
1310 ldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt)
1313 ldns_status status = LDNS_STATUS_OK;
1315 struct timeval time;
1319 ldns_buffer_printf(output, "null");
1320 return LDNS_STATUS_OK;
1323 if (ldns_buffer_status_ok(output)) {
1324 status = ldns_pktheader2buffer_str(output, pkt);
1325 if (status != LDNS_STATUS_OK) {
1329 ldns_buffer_printf(output, "\n");
1331 ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; ");
1334 for (i = 0; i < ldns_pkt_qdcount(pkt); i++) {
1335 status = ldns_rr2buffer_str(output,
1336 ldns_rr_list_rr(ldns_pkt_question(pkt), i));
1337 if (status != LDNS_STATUS_OK) {
1341 ldns_buffer_printf(output, "\n");
1343 ldns_buffer_printf(output, ";; ANSWER SECTION:\n");
1344 for (i = 0; i < ldns_pkt_ancount(pkt); i++) {
1345 status = ldns_rr2buffer_str(output,
1346 ldns_rr_list_rr(ldns_pkt_answer(pkt), i));
1347 if (status != LDNS_STATUS_OK) {
1352 ldns_buffer_printf(output, "\n");
1354 ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n");
1356 for (i = 0; i < ldns_pkt_nscount(pkt); i++) {
1357 status = ldns_rr2buffer_str(output,
1358 ldns_rr_list_rr(ldns_pkt_authority(pkt), i));
1359 if (status != LDNS_STATUS_OK) {
1363 ldns_buffer_printf(output, "\n");
1365 ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n");
1366 for (i = 0; i < ldns_pkt_arcount(pkt); i++) {
1367 status = ldns_rr2buffer_str(output,
1368 ldns_rr_list_rr(ldns_pkt_additional(pkt), i));
1369 if (status != LDNS_STATUS_OK) {
1374 ldns_buffer_printf(output, "\n");
1375 /* add some futher fields */
1376 ldns_buffer_printf(output, ";; Query time: %d msec\n",
1377 ldns_pkt_querytime(pkt));
1378 if (ldns_pkt_edns(pkt)) {
1379 ldns_buffer_printf(output,
1380 ";; EDNS: version %u; flags:",
1381 ldns_pkt_edns_version(pkt));
1382 if (ldns_pkt_edns_do(pkt)) {
1383 ldns_buffer_printf(output, " do");
1385 /* the extended rcode is the value set, shifted four bits,
1386 * and or'd with the original rcode */
1387 if (ldns_pkt_edns_extended_rcode(pkt)) {
1388 ldns_buffer_printf(output, " ; ext-rcode: %d",
1389 (ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt)));
1391 ldns_buffer_printf(output, " ; udp: %u\n",
1392 ldns_pkt_edns_udp_size(pkt));
1394 if (ldns_pkt_edns_data(pkt)) {
1395 ldns_buffer_printf(output, ";; Data: ");
1396 (void)ldns_rdf2buffer_str(output,
1397 ldns_pkt_edns_data(pkt));
1398 ldns_buffer_printf(output, "\n");
1401 if (ldns_pkt_tsig(pkt)) {
1402 ldns_buffer_printf(output, ";; TSIG:\n;; ");
1403 (void) ldns_rr2buffer_str(output, ldns_pkt_tsig(pkt));
1404 ldns_buffer_printf(output, "\n");
1406 if (ldns_pkt_answerfrom(pkt)) {
1407 tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt));
1408 ldns_buffer_printf(output, ";; SERVER: %s\n", tmp);
1411 time = ldns_pkt_timestamp(pkt);
1412 time_tt = (time_t)time.tv_sec;
1413 ldns_buffer_printf(output, ";; WHEN: %s",
1414 (char*)ctime(&time_tt));
1416 ldns_buffer_printf(output, ";; MSG SIZE rcvd: %d\n",
1417 (int)ldns_pkt_size(pkt));
1419 return ldns_buffer_status(output);
1426 ldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k)
1430 ldns_rdf *b64_bignum;
1432 ldns_buffer_printf(output, "Key: ");
1434 i = ldns_key_hmac_size(k);
1435 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k));
1436 status = ldns_rdf2buffer_str(output, b64_bignum);
1437 ldns_rdf_deep_free(b64_bignum);
1438 ldns_buffer_printf(output, "\n");
1443 #if defined(HAVE_SSL) && defined(USE_GOST)
1445 ldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p)
1447 unsigned char* pp = NULL;
1449 ldns_rdf *b64_bignum;
1452 ldns_buffer_printf(output, "GostAsn1: ");
1454 ret = i2d_PrivateKey(p, &pp);
1455 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp);
1456 status = ldns_rdf2buffer_str(output, b64_bignum);
1458 ldns_rdf_deep_free(b64_bignum);
1460 ldns_buffer_printf(output, "\n");
1466 ldns_key2buffer_str(ldns_buffer *output, const ldns_key *k)
1468 ldns_status status = LDNS_STATUS_OK;
1469 unsigned char *bignum;
1475 /* not used when ssl is not defined */
1476 ldns_rdf *b64_bignum = NULL;
1480 #endif /* HAVE_SSL */
1483 return LDNS_STATUS_ERR;
1486 bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN);
1488 return LDNS_STATUS_ERR;
1491 if (ldns_buffer_status_ok(output)) {
1493 switch(ldns_key_algorithm(k)) {
1494 case LDNS_SIGN_RSASHA1:
1495 case LDNS_SIGN_RSASHA1_NSEC3:
1496 case LDNS_SIGN_RSASHA256:
1497 case LDNS_SIGN_RSASHA512:
1498 case LDNS_SIGN_RSAMD5:
1499 /* copied by looking at dnssec-keygen output */
1501 rsa = ldns_key_rsa_key(k);
1503 ldns_buffer_printf(output,"Private-key-format: v1.2\n");
1504 switch(ldns_key_algorithm(k)) {
1505 case LDNS_SIGN_RSAMD5:
1506 ldns_buffer_printf(output,
1507 "Algorithm: %u (RSA)\n",
1510 case LDNS_SIGN_RSASHA1:
1511 ldns_buffer_printf(output,
1512 "Algorithm: %u (RSASHA1)\n",
1515 case LDNS_SIGN_RSASHA1_NSEC3:
1516 ldns_buffer_printf(output,
1517 "Algorithm: %u (RSASHA1_NSEC3)\n",
1518 LDNS_RSASHA1_NSEC3);
1521 case LDNS_SIGN_RSASHA256:
1522 ldns_buffer_printf(output,
1523 "Algorithm: %u (RSASHA256)\n",
1526 case LDNS_SIGN_RSASHA512:
1527 ldns_buffer_printf(output,
1528 "Algorithm: %u (RSASHA512)\n",
1533 fprintf(stderr, "Warning: unknown signature ");
1535 "algorithm type %u\n",
1536 ldns_key_algorithm(k));
1537 ldns_buffer_printf(output,
1538 "Algorithm: %u (Unknown)\n",
1539 ldns_key_algorithm(k));
1543 /* print to buf, convert to bin, convert to b64,
1545 ldns_buffer_printf(output, "Modulus: ");
1547 i = (uint16_t)BN_bn2bin(rsa->n, bignum);
1548 if (i > LDNS_MAX_KEYLEN) {
1551 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1552 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1555 ldns_rdf_deep_free(b64_bignum);
1556 ldns_buffer_printf(output, "\n");
1557 ldns_buffer_printf(output, "PublicExponent: ");
1558 i = (uint16_t)BN_bn2bin(rsa->e, bignum);
1559 if (i > LDNS_MAX_KEYLEN) {
1562 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1563 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1566 ldns_rdf_deep_free(b64_bignum);
1567 ldns_buffer_printf(output, "\n");
1569 ldns_buffer_printf(output, "PrivateExponent: ");
1571 i = (uint16_t)BN_bn2bin(rsa->d, bignum);
1572 if (i > LDNS_MAX_KEYLEN) {
1575 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1576 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1579 ldns_rdf_deep_free(b64_bignum);
1580 ldns_buffer_printf(output, "\n");
1582 ldns_buffer_printf(output, "(Not available)\n");
1585 ldns_buffer_printf(output, "Prime1: ");
1587 i = (uint16_t)BN_bn2bin(rsa->p, bignum);
1588 if (i > LDNS_MAX_KEYLEN) {
1591 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1592 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1595 ldns_rdf_deep_free(b64_bignum);
1596 ldns_buffer_printf(output, "\n");
1598 ldns_buffer_printf(output, "(Not available)\n");
1601 ldns_buffer_printf(output, "Prime2: ");
1603 i = (uint16_t)BN_bn2bin(rsa->q, bignum);
1604 if (i > LDNS_MAX_KEYLEN) {
1607 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1608 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1611 ldns_rdf_deep_free(b64_bignum);
1612 ldns_buffer_printf(output, "\n");
1614 ldns_buffer_printf(output, "(Not available)\n");
1617 ldns_buffer_printf(output, "Exponent1: ");
1619 i = (uint16_t)BN_bn2bin(rsa->dmp1, bignum);
1620 if (i > LDNS_MAX_KEYLEN) {
1623 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1624 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1627 ldns_rdf_deep_free(b64_bignum);
1628 ldns_buffer_printf(output, "\n");
1630 ldns_buffer_printf(output, "(Not available)\n");
1633 ldns_buffer_printf(output, "Exponent2: ");
1635 i = (uint16_t)BN_bn2bin(rsa->dmq1, bignum);
1636 if (i > LDNS_MAX_KEYLEN) {
1639 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1640 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1643 ldns_rdf_deep_free(b64_bignum);
1644 ldns_buffer_printf(output, "\n");
1646 ldns_buffer_printf(output, "(Not available)\n");
1649 ldns_buffer_printf(output, "Coefficient: ");
1651 i = (uint16_t)BN_bn2bin(rsa->iqmp, bignum);
1652 if (i > LDNS_MAX_KEYLEN) {
1655 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1656 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1659 ldns_rdf_deep_free(b64_bignum);
1660 ldns_buffer_printf(output, "\n");
1662 ldns_buffer_printf(output, "(Not available)\n");
1669 case LDNS_SIGN_DSA_NSEC3:
1670 dsa = ldns_key_dsa_key(k);
1672 ldns_buffer_printf(output,"Private-key-format: v1.2\n");
1673 if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) {
1674 ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n");
1675 } else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) {
1676 ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n");
1679 /* print to buf, convert to bin, convert to b64,
1681 ldns_buffer_printf(output, "Prime(p): ");
1684 i = (uint16_t)BN_bn2bin(dsa->p, bignum);
1685 if (i > LDNS_MAX_KEYLEN) {
1688 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1689 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1692 ldns_rdf_deep_free(b64_bignum);
1693 ldns_buffer_printf(output, "\n");
1695 printf("(Not available)\n");
1698 ldns_buffer_printf(output, "Subprime(q): ");
1700 i = (uint16_t)BN_bn2bin(dsa->q, bignum);
1701 if (i > LDNS_MAX_KEYLEN) {
1704 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1705 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1708 ldns_rdf_deep_free(b64_bignum);
1709 ldns_buffer_printf(output, "\n");
1711 printf("(Not available)\n");
1714 ldns_buffer_printf(output, "Base(g): ");
1716 i = (uint16_t)BN_bn2bin(dsa->g, bignum);
1717 if (i > LDNS_MAX_KEYLEN) {
1720 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1721 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1724 ldns_rdf_deep_free(b64_bignum);
1725 ldns_buffer_printf(output, "\n");
1727 printf("(Not available)\n");
1730 ldns_buffer_printf(output, "Private_value(x): ");
1731 if (dsa->priv_key) {
1732 i = (uint16_t)BN_bn2bin(dsa->priv_key, bignum);
1733 if (i > LDNS_MAX_KEYLEN) {
1736 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1737 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1740 ldns_rdf_deep_free(b64_bignum);
1741 ldns_buffer_printf(output, "\n");
1743 printf("(Not available)\n");
1746 ldns_buffer_printf(output, "Public_value(y): ");
1748 i = (uint16_t)BN_bn2bin(dsa->pub_key, bignum);
1749 if (i > LDNS_MAX_KEYLEN) {
1752 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1753 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1756 ldns_rdf_deep_free(b64_bignum);
1757 ldns_buffer_printf(output, "\n");
1759 printf("(Not available)\n");
1763 case LDNS_SIGN_ECC_GOST:
1764 /* no format defined, use blob */
1765 #if defined(HAVE_SSL) && defined(USE_GOST)
1766 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1767 ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST);
1768 status = ldns_gost_key2buffer_str(output,
1779 case LDNS_SIGN_ECDSAP256SHA256:
1780 case LDNS_SIGN_ECDSAP384SHA384:
1781 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1782 ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k));
1783 status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k));
1785 ldns_buffer_printf(output, ")\n");
1787 EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key);
1788 const BIGNUM* b = EC_KEY_get0_private_key(ec);
1789 ldns_buffer_printf(output, "PrivateKey: ");
1790 i = (uint16_t)BN_bn2bin(b, bignum);
1791 if (i > LDNS_MAX_KEYLEN) {
1794 b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum);
1795 if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) {
1798 ldns_rdf_deep_free(b64_bignum);
1799 ldns_buffer_printf(output, "\n");
1800 /* down reference count in EC_KEY
1801 * its still assigned to the PKEY */
1807 case LDNS_SIGN_HMACMD5:
1808 /* there's not much of a format defined for TSIG */
1809 /* It's just a binary blob, Same for all algorithms */
1810 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1811 ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n");
1812 status = ldns_hmac_key2buffer_str(output, k);
1814 case LDNS_SIGN_HMACSHA1:
1815 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1816 ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n");
1817 status = ldns_hmac_key2buffer_str(output, k);
1819 case LDNS_SIGN_HMACSHA256:
1820 ldns_buffer_printf(output, "Private-key-format: v1.2\n");
1821 ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n");
1822 status = ldns_hmac_key2buffer_str(output, k);
1825 #endif /* HAVE_SSL */
1828 LDNS_FREE(b64_bignum);
1831 return ldns_buffer_status(output);
1837 /* compiles warn the label isn't used */
1840 return LDNS_STATUS_ERR;
1841 #endif /* HAVE_SSL */
1846 * Zero terminate the buffer and fix it to the size of the string.
1849 ldns_buffer2str(ldns_buffer *buffer)
1854 /* check if buffer ends with \0, if not, and
1855 if there is space, add it */
1856 if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) {
1857 if (!ldns_buffer_reserve(buffer, 1)) {
1860 ldns_buffer_write_u8(buffer, (uint8_t) '\0');
1861 if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) {
1866 tmp_str = ldns_buffer_export(buffer);
1867 str = LDNS_XMALLOC(char, strlen(tmp_str) + 1);
1871 memcpy(str, tmp_str, strlen(tmp_str) + 1);
1877 ldns_rdf2str(const ldns_rdf *rdf)
1879 char *result = NULL;
1880 ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1885 if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) {
1886 /* export and return string, destroy rest */
1887 result = ldns_buffer2str(tmp_buffer);
1889 ldns_buffer_free(tmp_buffer);
1894 ldns_rr2str(const ldns_rr *rr)
1896 char *result = NULL;
1897 ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1902 if (ldns_rr2buffer_str(tmp_buffer, rr) == LDNS_STATUS_OK) {
1903 /* export and return string, destroy rest */
1904 result = ldns_buffer2str(tmp_buffer);
1906 ldns_buffer_free(tmp_buffer);
1911 ldns_pkt2str(const ldns_pkt *pkt)
1913 char *result = NULL;
1914 ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1919 if (ldns_pkt2buffer_str(tmp_buffer, pkt) == LDNS_STATUS_OK) {
1920 /* export and return string, destroy rest */
1921 result = ldns_buffer2str(tmp_buffer);
1924 ldns_buffer_free(tmp_buffer);
1929 ldns_key2str(const ldns_key *k)
1931 char *result = NULL;
1932 ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1937 if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) {
1938 /* export and return string, destroy rest */
1939 result = ldns_buffer2str(tmp_buffer);
1941 ldns_buffer_free(tmp_buffer);
1946 ldns_rr_list2str(const ldns_rr_list *list)
1948 char *result = NULL;
1949 ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN);
1955 if (ldns_rr_list2buffer_str(tmp_buffer, list) == LDNS_STATUS_OK) {
1958 ldns_buffer_printf(tmp_buffer, "(null)\n");
1961 /* export and return string, destroy rest */
1962 result = ldns_buffer2str(tmp_buffer);
1963 ldns_buffer_free(tmp_buffer);
1968 ldns_rdf_print(FILE *output, const ldns_rdf *rdf)
1970 char *str = ldns_rdf2str(rdf);
1972 fprintf(output, "%s", str);
1974 fprintf(output, "Unable to convert rdf to string\n");
1980 ldns_rr_print(FILE *output, const ldns_rr *rr)
1982 char *str = ldns_rr2str(rr);
1984 fprintf(output, "%s", str);
1986 fprintf(output, "Unable to convert rr to string\n");
1992 ldns_pkt_print(FILE *output, const ldns_pkt *pkt)
1994 char *str = ldns_pkt2str(pkt);
1996 fprintf(output, "%s", str);
1998 fprintf(output, "Unable to convert packet to string\n");
2004 ldns_rr_list_print(FILE *output, const ldns_rr_list *lst)
2007 for (i = 0; i < ldns_rr_list_rr_count(lst); i++) {
2008 ldns_rr_print(output, ldns_rr_list_rr(lst, i));
2013 ldns_resolver_print(FILE *output, const ldns_resolver *r)
2022 n = ldns_resolver_nameservers(r);
2023 s = ldns_resolver_searchlist(r);
2024 rtt = ldns_resolver_rtt(r);
2026 fprintf(output, "port: %d\n", (int)ldns_resolver_port(r));
2027 fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r));
2028 fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r));
2030 fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r));
2031 fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r));
2032 fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r));
2033 fprintf(output, "fail: %d\n", ldns_resolver_fail(r));
2034 fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r));
2035 fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r));
2036 fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r));
2037 fprintf(output, "random: %d\n", ldns_resolver_random(r));
2038 fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec);
2039 fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r));
2040 fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r));
2041 fprintf(output, "trust anchors (%d listed):\n",
2042 (int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r)));
2043 ldns_rr_list_print(output, ldns_resolver_dnssec_anchors(r));
2044 fprintf(output, "tsig: %s %s\n",
2045 ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-",
2046 ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-");
2047 fprintf(output, "debug: %d\n", ldns_resolver_debug(r));
2049 fprintf(output, "default domain: ");
2050 ldns_rdf_print(output, ldns_resolver_domain(r));
2051 fprintf(output, "\n");
2052 fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r));
2054 fprintf(output, "searchlist (%d listed):\n", (int)ldns_resolver_searchlist_count(r));
2055 for (i = 0; i < ldns_resolver_searchlist_count(r); i++) {
2056 fprintf(output, "\t");
2057 ldns_rdf_print(output, s[i]);
2058 fprintf(output, "\n");
2060 fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r));
2062 fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r));
2063 for (i = 0; i < ldns_resolver_nameserver_count(r); i++) {
2064 fprintf(output, "\t");
2065 ldns_rdf_print(output, n[i]);
2067 switch ((int)rtt[i]) {
2068 case LDNS_RESOLV_RTT_MIN:
2069 fprintf(output, " - reachable\n");
2071 case LDNS_RESOLV_RTT_INF:
2072 fprintf(output, " - unreachable\n");
2079 ldns_zone_print(FILE *output, const ldns_zone *z)
2081 if(ldns_zone_soa(z))
2082 ldns_rr_print(output, ldns_zone_soa(z));
2083 ldns_rr_list_print(output, ldns_zone_rrs(z));