host2str.c revision 246827
1238104Sdes/* 2238104Sdes * host2str.c 3238104Sdes * 4238104Sdes * conversion routines from the host format 5238104Sdes * to the presentation format (strings) 6238104Sdes * 7238104Sdes * a Net::DNS like library for C 8238104Sdes * 9238104Sdes * (c) NLnet Labs, 2004-2006 10238104Sdes * 11238104Sdes * See the file LICENSE for the license 12238104Sdes */ 13238104Sdes#include <ldns/config.h> 14238104Sdes 15238104Sdes#include <ldns/ldns.h> 16238104Sdes 17238104Sdes#include <limits.h> 18238104Sdes 19238104Sdes#ifdef HAVE_SYS_SOCKET_H 20238104Sdes#include <sys/socket.h> 21238104Sdes#endif 22238104Sdes#ifdef HAVE_ARPA_INET_H 23238104Sdes#include <arpa/inet.h> 24238104Sdes#endif 25238104Sdes#ifdef HAVE_NETDB_H 26238104Sdes#include <netdb.h> 27238104Sdes#endif 28238104Sdes#include <time.h> 29238104Sdes#include <sys/time.h> 30238104Sdes 31238104Sdes#ifndef INET_ADDRSTRLEN 32238104Sdes#define INET_ADDRSTRLEN 16 33238104Sdes#endif 34238104Sdes#ifndef INET6_ADDRSTRLEN 35238104Sdes#define INET6_ADDRSTRLEN 46 36238104Sdes#endif 37238104Sdes 38238104Sdes/* lookup tables for standard DNS stuff */ 39238104Sdes 40238104Sdes/* Taken from RFC 2535, section 7. */ 41238104Sdesldns_lookup_table ldns_algorithms[] = { 42238104Sdes { LDNS_RSAMD5, "RSAMD5" }, 43238104Sdes { LDNS_DH, "DH" }, 44238104Sdes { LDNS_DSA, "DSA" }, 45238104Sdes { LDNS_ECC, "ECC" }, 46238104Sdes { LDNS_RSASHA1, "RSASHA1" }, 47238104Sdes { LDNS_DSA_NSEC3, "DSA-NSEC3-SHA1" }, 48238104Sdes { LDNS_RSASHA1_NSEC3, "RSASHA1-NSEC3-SHA1" }, 49238104Sdes#ifdef USE_SHA2 50238104Sdes { LDNS_RSASHA256, "RSASHA256"}, 51238104Sdes { LDNS_RSASHA512, "RSASHA512"}, 52238104Sdes#endif 53238104Sdes#ifdef USE_GOST 54238104Sdes { LDNS_ECC_GOST, "ECC-GOST"}, 55238104Sdes#endif 56238104Sdes#ifdef USE_ECDSA 57238104Sdes { LDNS_ECDSAP256SHA256, "ECDSAP256SHA256"}, 58238104Sdes { LDNS_ECDSAP384SHA384, "ECDSAP384SHA384"}, 59238104Sdes#endif 60238104Sdes { LDNS_INDIRECT, "INDIRECT" }, 61238104Sdes { LDNS_PRIVATEDNS, "PRIVATEDNS" }, 62238104Sdes { LDNS_PRIVATEOID, "PRIVATEOID" }, 63238104Sdes { 0, NULL } 64238104Sdes}; 65238104Sdes 66238104Sdes/* Taken from RFC 4398 */ 67238104Sdesldns_lookup_table ldns_cert_algorithms[] = { 68238104Sdes { LDNS_CERT_PKIX, "PKIX" }, 69238104Sdes { LDNS_CERT_SPKI, "SPKI" }, 70238104Sdes { LDNS_CERT_PGP, "PGP" }, 71238104Sdes { LDNS_CERT_IPKIX, "IPKIX" }, 72238104Sdes { LDNS_CERT_ISPKI, "ISPKI" }, 73238104Sdes { LDNS_CERT_IPGP, "IPGP" }, 74238104Sdes { LDNS_CERT_ACPKIX, "ACPKIX" }, 75238104Sdes { LDNS_CERT_IACPKIX, "IACPKIX" }, 76238104Sdes { LDNS_CERT_URI, "URI" }, 77238104Sdes { LDNS_CERT_OID, "OID" }, 78238104Sdes { 0, NULL } 79238104Sdes}; 80238104Sdes 81238104Sdes/* classes */ 82238104Sdesldns_lookup_table ldns_rr_classes[] = { 83238104Sdes { LDNS_RR_CLASS_IN, "IN" }, 84238104Sdes { LDNS_RR_CLASS_CH, "CH" }, 85238104Sdes { LDNS_RR_CLASS_HS, "HS" }, 86238104Sdes { LDNS_RR_CLASS_NONE, "NONE" }, 87238104Sdes { LDNS_RR_CLASS_ANY, "ANY" }, 88238104Sdes { 0, NULL } 89238104Sdes}; 90238104Sdes 91238104Sdes/* if these are used elsewhere */ 92238104Sdesldns_lookup_table ldns_rcodes[] = { 93238104Sdes { LDNS_RCODE_NOERROR, "NOERROR" }, 94238104Sdes { LDNS_RCODE_FORMERR, "FORMERR" }, 95238104Sdes { LDNS_RCODE_SERVFAIL, "SERVFAIL" }, 96238104Sdes { LDNS_RCODE_NXDOMAIN, "NXDOMAIN" }, 97238104Sdes { LDNS_RCODE_NOTIMPL, "NOTIMPL" }, 98238104Sdes { LDNS_RCODE_REFUSED, "REFUSED" }, 99238104Sdes { LDNS_RCODE_YXDOMAIN, "YXDOMAIN" }, 100238104Sdes { LDNS_RCODE_YXRRSET, "YXRRSET" }, 101238104Sdes { LDNS_RCODE_NXRRSET, "NXRRSET" }, 102238104Sdes { LDNS_RCODE_NOTAUTH, "NOTAUTH" }, 103238104Sdes { LDNS_RCODE_NOTZONE, "NOTZONE" }, 104238104Sdes { 0, NULL } 105238104Sdes}; 106238104Sdes 107238104Sdesldns_lookup_table ldns_opcodes[] = { 108238104Sdes { LDNS_PACKET_QUERY, "QUERY" }, 109238104Sdes { LDNS_PACKET_IQUERY, "IQUERY" }, 110238104Sdes { LDNS_PACKET_STATUS, "STATUS" }, 111238104Sdes { LDNS_PACKET_NOTIFY, "NOTIFY" }, 112238104Sdes { LDNS_PACKET_UPDATE, "UPDATE" }, 113238104Sdes { 0, NULL } 114238104Sdes}; 115238104Sdes 116238104Sdesconst ldns_output_format ldns_output_format_nocomments_record = { 0, NULL }; 117238104Sdesconst ldns_output_format *ldns_output_format_nocomments 118238104Sdes = &ldns_output_format_nocomments_record; 119238104Sdesconst ldns_output_format ldns_output_format_onlykeyids_record = { 120238104Sdes LDNS_COMMENT_KEY, NULL 121238104Sdes}; 122238104Sdesconst ldns_output_format *ldns_output_format_onlykeyids 123238104Sdes = &ldns_output_format_onlykeyids_record; 124238104Sdesconst ldns_output_format *ldns_output_format_default 125238104Sdes = &ldns_output_format_onlykeyids_record; 126238104Sdesconst ldns_output_format ldns_output_format_bubblebabble_record = { 127238104Sdes LDNS_COMMENT_KEY | LDNS_COMMENT_BUBBLEBABBLE | LDNS_COMMENT_FLAGS, NULL 128238104Sdes}; 129238104Sdesconst ldns_output_format *ldns_output_format_bubblebabble 130238104Sdes = &ldns_output_format_bubblebabble_record; 131238104Sdes 132238104Sdesldns_status 133238104Sdesldns_pkt_opcode2buffer_str(ldns_buffer *output, ldns_pkt_opcode opcode) 134238104Sdes{ 135238104Sdes ldns_lookup_table *lt = ldns_lookup_by_id(ldns_opcodes, opcode); 136238104Sdes if (lt && lt->name) { 137238104Sdes ldns_buffer_printf(output, "%s", lt->name); 138238104Sdes } else { 139238104Sdes ldns_buffer_printf(output, "OPCODE%u", opcode); 140238104Sdes } 141238104Sdes return ldns_buffer_status(output); 142238104Sdes} 143238104Sdes 144238104Sdesldns_status 145238104Sdesldns_pkt_rcode2buffer_str(ldns_buffer *output, ldns_pkt_rcode rcode) 146238104Sdes{ 147238104Sdes ldns_lookup_table *lt = ldns_lookup_by_id(ldns_rcodes, rcode); 148238104Sdes if (lt && lt->name) { 149238104Sdes ldns_buffer_printf(output, "%s", lt->name); 150238104Sdes } else { 151238104Sdes ldns_buffer_printf(output, "RCODE%u", rcode); 152238104Sdes } 153238104Sdes return ldns_buffer_status(output); 154238104Sdes} 155238104Sdes 156238104Sdesldns_status 157238104Sdesldns_algorithm2buffer_str(ldns_buffer *output, 158238104Sdes ldns_algorithm algorithm) 159238104Sdes{ 160238104Sdes ldns_lookup_table *lt = ldns_lookup_by_id(ldns_algorithms, 161238104Sdes algorithm); 162238104Sdes if (lt && lt->name) { 163238104Sdes ldns_buffer_printf(output, "%s", lt->name); 164238104Sdes } else { 165238104Sdes ldns_buffer_printf(output, "ALG%u", algorithm); 166238104Sdes } 167238104Sdes return ldns_buffer_status(output); 168238104Sdes} 169238104Sdes 170238104Sdesldns_status 171238104Sdesldns_cert_algorithm2buffer_str(ldns_buffer *output, 172238104Sdes ldns_cert_algorithm cert_algorithm) 173238104Sdes{ 174238104Sdes ldns_lookup_table *lt = ldns_lookup_by_id(ldns_cert_algorithms, 175238104Sdes cert_algorithm); 176238104Sdes if (lt && lt->name) { 177238104Sdes ldns_buffer_printf(output, "%s", lt->name); 178238104Sdes } else { 179238104Sdes ldns_buffer_printf(output, "CERT_ALG%u", 180238104Sdes cert_algorithm); 181238104Sdes } 182238104Sdes return ldns_buffer_status(output); 183238104Sdes} 184238104Sdes 185238104Sdeschar * 186238104Sdesldns_pkt_opcode2str(ldns_pkt_opcode opcode) 187238104Sdes{ 188238104Sdes char *str; 189238104Sdes ldns_buffer *buf; 190238104Sdes 191238104Sdes buf = ldns_buffer_new(12); 192238104Sdes if (!buf) { 193238104Sdes return NULL; 194238104Sdes } 195238104Sdes 196238104Sdes str = NULL; 197238104Sdes if (ldns_pkt_opcode2buffer_str(buf, opcode) == LDNS_STATUS_OK) { 198238104Sdes str = ldns_buffer2str(buf); 199238104Sdes } 200238104Sdes 201238104Sdes ldns_buffer_free(buf); 202238104Sdes return str; 203238104Sdes} 204238104Sdes 205238104Sdeschar * 206238104Sdesldns_pkt_rcode2str(ldns_pkt_rcode rcode) 207238104Sdes{ 208238104Sdes char *str; 209238104Sdes ldns_buffer *buf; 210238104Sdes 211238104Sdes buf = ldns_buffer_new(10); 212238104Sdes if (!buf) { 213238104Sdes return NULL; 214238104Sdes } 215238104Sdes 216238104Sdes str = NULL; 217238104Sdes if (ldns_pkt_rcode2buffer_str(buf, rcode) == LDNS_STATUS_OK) { 218238104Sdes str = ldns_buffer2str(buf); 219238104Sdes } 220238104Sdes 221238104Sdes ldns_buffer_free(buf); 222238104Sdes return str; 223238104Sdes} 224238104Sdes 225238104Sdeschar * 226238104Sdesldns_pkt_algorithm2str(ldns_algorithm algorithm) 227238104Sdes{ 228238104Sdes char *str; 229238104Sdes ldns_buffer *buf; 230238104Sdes 231238104Sdes buf = ldns_buffer_new(10); 232238104Sdes if (!buf) { 233238104Sdes return NULL; 234238104Sdes } 235238104Sdes 236238104Sdes str = NULL; 237238104Sdes if (ldns_algorithm2buffer_str(buf, algorithm) 238238104Sdes == LDNS_STATUS_OK) { 239238104Sdes str = ldns_buffer2str(buf); 240238104Sdes } 241238104Sdes 242238104Sdes ldns_buffer_free(buf); 243238104Sdes return str; 244238104Sdes} 245238104Sdes 246238104Sdeschar * 247238104Sdesldns_pkt_cert_algorithm2str(ldns_cert_algorithm cert_algorithm) 248238104Sdes{ 249238104Sdes char *str; 250238104Sdes ldns_buffer *buf; 251238104Sdes 252238104Sdes buf = ldns_buffer_new(10); 253238104Sdes if (!buf) { 254238104Sdes return NULL; 255238104Sdes } 256238104Sdes 257238104Sdes str = NULL; 258238104Sdes if (ldns_cert_algorithm2buffer_str(buf, cert_algorithm) 259238104Sdes == LDNS_STATUS_OK) { 260238104Sdes str = ldns_buffer2str(buf); 261238104Sdes } 262238104Sdes 263238104Sdes ldns_buffer_free(buf); 264238104Sdes return str; 265238104Sdes} 266238104Sdes 267238104Sdes 268238104Sdes/* do NOT pass compressed data here :p */ 269238104Sdesldns_status 270238104Sdesldns_rdf2buffer_str_dname(ldns_buffer *output, const ldns_rdf *dname) 271238104Sdes{ 272238104Sdes /* can we do with 1 pos var? or without at all? */ 273238104Sdes uint8_t src_pos = 0; 274238104Sdes uint8_t len; 275238104Sdes uint8_t *data; 276238104Sdes uint8_t i; 277238104Sdes unsigned char c; 278238104Sdes 279238104Sdes data = (uint8_t*)ldns_rdf_data(dname); 280238104Sdes len = data[src_pos]; 281238104Sdes 282238104Sdes if (ldns_rdf_size(dname) > LDNS_MAX_DOMAINLEN) { 283238104Sdes /* too large, return */ 284238104Sdes return LDNS_STATUS_DOMAINNAME_OVERFLOW; 285238104Sdes } 286238104Sdes 287238104Sdes /* special case: root label */ 288238104Sdes if (1 == ldns_rdf_size(dname)) { 289238104Sdes ldns_buffer_printf(output, "."); 290238104Sdes } else { 291238104Sdes while ((len > 0) && src_pos < ldns_rdf_size(dname)) { 292238104Sdes src_pos++; 293238104Sdes for(i = 0; i < len; i++) { 294238104Sdes /* paranoia check for various 'strange' 295238104Sdes characters in dnames 296238104Sdes */ 297238104Sdes c = (unsigned char) data[src_pos]; 298238104Sdes if(c == '.' || c == ';' || 299238104Sdes c == '(' || c == ')' || 300238104Sdes c == '\\') { 301238104Sdes ldns_buffer_printf(output, "\\%c", 302238104Sdes data[src_pos]); 303238104Sdes } else if (!(isascii(c) && isgraph(c))) { 304238104Sdes ldns_buffer_printf(output, "\\%03u", 305238104Sdes data[src_pos]); 306238104Sdes } else { 307238104Sdes ldns_buffer_printf(output, "%c", data[src_pos]); 308238104Sdes } 309238104Sdes src_pos++; 310238104Sdes } 311238104Sdes 312238104Sdes if (src_pos < ldns_rdf_size(dname)) { 313238104Sdes ldns_buffer_printf(output, "."); 314238104Sdes } 315238104Sdes len = data[src_pos]; 316238104Sdes } 317238104Sdes } 318238104Sdes return ldns_buffer_status(output); 319238104Sdes} 320238104Sdes 321238104Sdesldns_status 322238104Sdesldns_rdf2buffer_str_int8(ldns_buffer *output, const ldns_rdf *rdf) 323238104Sdes{ 324238104Sdes uint8_t data = ldns_rdf_data(rdf)[0]; 325238104Sdes ldns_buffer_printf(output, "%lu", (unsigned long) data); 326238104Sdes return ldns_buffer_status(output); 327238104Sdes} 328238104Sdes 329238104Sdesldns_status 330238104Sdesldns_rdf2buffer_str_int16(ldns_buffer *output, const ldns_rdf *rdf) 331238104Sdes{ 332238104Sdes uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); 333238104Sdes ldns_buffer_printf(output, "%lu", (unsigned long) data); 334238104Sdes return ldns_buffer_status(output); 335238104Sdes} 336238104Sdes 337238104Sdesldns_status 338238104Sdesldns_rdf2buffer_str_int32(ldns_buffer *output, const ldns_rdf *rdf) 339238104Sdes{ 340238104Sdes uint32_t data = ldns_read_uint32(ldns_rdf_data(rdf)); 341238104Sdes ldns_buffer_printf(output, "%lu", (unsigned long) data); 342238104Sdes return ldns_buffer_status(output); 343238104Sdes} 344238104Sdes 345238104Sdesldns_status 346238104Sdesldns_rdf2buffer_str_time(ldns_buffer *output, const ldns_rdf *rdf) 347238104Sdes{ 348238104Sdes /* create a YYYYMMDDHHMMSS string if possible */ 349238104Sdes struct tm tm; 350238104Sdes char date_buf[16]; 351238104Sdes 352238104Sdes memset(&tm, 0, sizeof(tm)); 353238104Sdes if (ldns_serial_arithmitics_gmtime_r(ldns_rdf2native_int32(rdf), time(NULL), &tm) 354238104Sdes && strftime(date_buf, 15, "%Y%m%d%H%M%S", &tm)) { 355238104Sdes ldns_buffer_printf(output, "%s", date_buf); 356238104Sdes } 357238104Sdes return ldns_buffer_status(output); 358238104Sdes} 359238104Sdes 360238104Sdesldns_status 361238104Sdesldns_rdf2buffer_str_a(ldns_buffer *output, const ldns_rdf *rdf) 362238104Sdes{ 363238104Sdes char str[INET_ADDRSTRLEN]; 364238104Sdes 365238104Sdes if (inet_ntop(AF_INET, ldns_rdf_data(rdf), str, INET_ADDRSTRLEN)) { 366238104Sdes ldns_buffer_printf(output, "%s", str); 367238104Sdes } 368238104Sdes return ldns_buffer_status(output); 369238104Sdes} 370238104Sdes 371238104Sdesldns_status 372238104Sdesldns_rdf2buffer_str_aaaa(ldns_buffer *output, const ldns_rdf *rdf) 373238104Sdes{ 374238104Sdes char str[INET6_ADDRSTRLEN]; 375238104Sdes 376238104Sdes if (inet_ntop(AF_INET6, ldns_rdf_data(rdf), str, INET6_ADDRSTRLEN)) { 377238104Sdes ldns_buffer_printf(output, "%s", str); 378238104Sdes } 379238104Sdes 380238104Sdes return ldns_buffer_status(output); 381238104Sdes} 382238104Sdes 383238104Sdesldns_status 384238104Sdesldns_rdf2buffer_str_str(ldns_buffer *output, const ldns_rdf *rdf) 385238104Sdes{ 386238104Sdes const uint8_t *data = ldns_rdf_data(rdf); 387238104Sdes uint8_t length = data[0]; 388238104Sdes size_t i; 389238104Sdes 390238104Sdes ldns_buffer_printf(output, "\""); 391238104Sdes for (i = 1; i <= length; ++i) { 392238104Sdes char ch = (char) data[i]; 393238104Sdes if (isprint((int)ch) || ch=='\t') { 394238104Sdes if (ch=='\"'||ch=='\\') 395238104Sdes ldns_buffer_printf(output, "\\%c", ch); 396238104Sdes else 397238104Sdes ldns_buffer_printf(output, "%c", ch); 398238104Sdes } else { 399238104Sdes ldns_buffer_printf(output, "\\%03u", 400238104Sdes (unsigned)(uint8_t) ch); 401238104Sdes } 402238104Sdes } 403238104Sdes ldns_buffer_printf(output, "\""); 404238104Sdes return ldns_buffer_status(output); 405238104Sdes} 406238104Sdes 407238104Sdesldns_status 408238104Sdesldns_rdf2buffer_str_b64(ldns_buffer *output, const ldns_rdf *rdf) 409238104Sdes{ 410238104Sdes size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf)); 411238104Sdes char *b64 = LDNS_XMALLOC(char, size); 412238104Sdes if(!b64) return LDNS_STATUS_MEM_ERR; 413238104Sdes if (ldns_b64_ntop(ldns_rdf_data(rdf), ldns_rdf_size(rdf), b64, size)) { 414238104Sdes ldns_buffer_printf(output, "%s", b64); 415238104Sdes } 416238104Sdes LDNS_FREE(b64); 417238104Sdes return ldns_buffer_status(output); 418238104Sdes} 419238104Sdes 420238104Sdesldns_status 421238104Sdesldns_rdf2buffer_str_b32_ext(ldns_buffer *output, const ldns_rdf *rdf) 422238104Sdes{ 423238104Sdes size_t size; 424238104Sdes char *b32; 425238104Sdes if(ldns_rdf_size(rdf) == 0) 426238104Sdes return LDNS_STATUS_OK; 427238104Sdes /* remove -1 for the b32-hash-len octet */ 428238104Sdes size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1); 429238104Sdes /* add one for the end nul for the string */ 430238104Sdes b32 = LDNS_XMALLOC(char, size + 1); 431238104Sdes if(!b32) return LDNS_STATUS_MEM_ERR; 432238104Sdes size = (size_t) ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1, 433238104Sdes ldns_rdf_size(rdf) - 1, b32, size+1); 434238104Sdes if (size > 0) { 435238104Sdes ldns_buffer_printf(output, "%s", b32); 436238104Sdes } 437238104Sdes LDNS_FREE(b32); 438238104Sdes return ldns_buffer_status(output); 439238104Sdes} 440238104Sdes 441238104Sdesldns_status 442238104Sdesldns_rdf2buffer_str_hex(ldns_buffer *output, const ldns_rdf *rdf) 443238104Sdes{ 444238104Sdes size_t i; 445238104Sdes for (i = 0; i < ldns_rdf_size(rdf); i++) { 446238104Sdes ldns_buffer_printf(output, "%02x", ldns_rdf_data(rdf)[i]); 447238104Sdes } 448238104Sdes 449238104Sdes return ldns_buffer_status(output); 450238104Sdes} 451238104Sdes 452238104Sdesldns_status 453238104Sdesldns_rdf2buffer_str_type(ldns_buffer *output, const ldns_rdf *rdf) 454238104Sdes{ 455238104Sdes uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); 456238104Sdes const ldns_rr_descriptor *descriptor; 457238104Sdes 458238104Sdes descriptor = ldns_rr_descript(data); 459238104Sdes if (descriptor && descriptor->_name) { 460238104Sdes ldns_buffer_printf(output, "%s", descriptor->_name); 461238104Sdes } else { 462238104Sdes ldns_buffer_printf(output, "TYPE%u", data); 463238104Sdes } 464238104Sdes return ldns_buffer_status(output); 465238104Sdes} 466238104Sdes 467238104Sdesldns_status 468238104Sdesldns_rdf2buffer_str_class(ldns_buffer *output, const ldns_rdf *rdf) 469238104Sdes{ 470238104Sdes uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); 471238104Sdes ldns_lookup_table *lt; 472238104Sdes 473238104Sdes lt = ldns_lookup_by_id(ldns_rr_classes, (int) data); 474238104Sdes if (lt) { 475238104Sdes ldns_buffer_printf(output, "\t%s", lt->name); 476238104Sdes } else { 477238104Sdes ldns_buffer_printf(output, "\tCLASS%d", data); 478238104Sdes } 479238104Sdes return ldns_buffer_status(output); 480238104Sdes} 481238104Sdes 482238104Sdesldns_status 483238104Sdesldns_rdf2buffer_str_cert_alg(ldns_buffer *output, const ldns_rdf *rdf) 484238104Sdes{ 485238104Sdes uint16_t data = ldns_read_uint16(ldns_rdf_data(rdf)); 486238104Sdes ldns_lookup_table *lt; 487238104Sdes lt = ldns_lookup_by_id(ldns_cert_algorithms, (int) data); 488238104Sdes if (lt) { 489238104Sdes ldns_buffer_printf(output, "%s", lt->name); 490238104Sdes } else { 491238104Sdes ldns_buffer_printf(output, "%d", data); 492238104Sdes } 493238104Sdes return ldns_buffer_status(output); 494238104Sdes} 495238104Sdes 496238104Sdesldns_status 497238104Sdesldns_rdf2buffer_str_alg(ldns_buffer *output, const ldns_rdf *rdf) 498238104Sdes{ 499238104Sdes /* don't use algorithm mnemonics in the presentation format 500238104Sdes this kind of got sneaked into the rfc's */ 501238104Sdes uint8_t data = ldns_rdf_data(rdf)[0]; 502238104Sdes ldns_buffer_printf(output, "%d", data); 503238104Sdes return ldns_buffer_status(output); 504238104Sdes} 505238104Sdes 506238104Sdesstatic void 507238104Sdesloc_cm_print(ldns_buffer *output, uint8_t mantissa, uint8_t exponent) 508238104Sdes{ 509238104Sdes uint8_t i; 510238104Sdes /* is it 0.<two digits> ? */ 511238104Sdes if(exponent < 2) { 512238104Sdes if(exponent == 1) 513238104Sdes mantissa *= 10; 514238104Sdes ldns_buffer_printf(output, "0.%02ld", (long)mantissa); 515238104Sdes return; 516238104Sdes } 517238104Sdes /* always <digit><string of zeros> */ 518238104Sdes ldns_buffer_printf(output, "%d", (int)mantissa); 519238104Sdes for(i=0; i<exponent-2; i++) 520238104Sdes ldns_buffer_printf(output, "0"); 521238104Sdes} 522238104Sdes 523238104Sdesldns_status 524238104Sdesldns_rr_type2buffer_str(ldns_buffer *output, const ldns_rr_type type) 525238104Sdes{ 526238104Sdes const ldns_rr_descriptor *descriptor; 527238104Sdes 528238104Sdes descriptor = ldns_rr_descript(type); 529238104Sdes 530238104Sdes if (descriptor && descriptor->_name) { 531238104Sdes ldns_buffer_printf(output, "%s", descriptor->_name); 532238104Sdes } else { 533238104Sdes /* exceptions for pseudotypes */ 534238104Sdes switch (type) { 535238104Sdes case LDNS_RR_TYPE_IXFR: 536238104Sdes ldns_buffer_printf(output, "IXFR"); 537238104Sdes break; 538238104Sdes case LDNS_RR_TYPE_AXFR: 539238104Sdes ldns_buffer_printf(output, "AXFR"); 540238104Sdes break; 541238104Sdes case LDNS_RR_TYPE_MAILA: 542238104Sdes ldns_buffer_printf(output, "MAILA"); 543238104Sdes break; 544238104Sdes case LDNS_RR_TYPE_MAILB: 545238104Sdes ldns_buffer_printf(output, "MAILB"); 546238104Sdes break; 547238104Sdes case LDNS_RR_TYPE_ANY: 548238104Sdes ldns_buffer_printf(output, "ANY"); 549238104Sdes break; 550238104Sdes default: 551238104Sdes ldns_buffer_printf(output, "TYPE%u", type); 552238104Sdes } 553238104Sdes } 554238104Sdes return ldns_buffer_status(output); 555238104Sdes} 556238104Sdes 557238104Sdeschar * 558238104Sdesldns_rr_type2str(const ldns_rr_type type) 559238104Sdes{ 560238104Sdes char *str; 561238104Sdes ldns_buffer *buf; 562238104Sdes 563238104Sdes buf = ldns_buffer_new(10); 564238104Sdes if (!buf) { 565238104Sdes return NULL; 566238104Sdes } 567238104Sdes 568238104Sdes str = NULL; 569238104Sdes if (ldns_rr_type2buffer_str(buf, type) == LDNS_STATUS_OK) { 570238104Sdes str = ldns_buffer2str(buf); 571238104Sdes } 572238104Sdes 573238104Sdes ldns_buffer_free(buf); 574238104Sdes return str; 575238104Sdes} 576238104Sdes 577238104Sdes 578238104Sdesldns_status 579238104Sdesldns_rr_class2buffer_str(ldns_buffer *output, 580238104Sdes const ldns_rr_class klass) 581238104Sdes{ 582238104Sdes ldns_lookup_table *lt; 583238104Sdes 584238104Sdes lt = ldns_lookup_by_id(ldns_rr_classes, klass); 585238104Sdes if (lt) { 586238104Sdes ldns_buffer_printf(output, "%s", lt->name); 587238104Sdes } else { 588238104Sdes ldns_buffer_printf(output, "CLASS%d", klass); 589238104Sdes } 590238104Sdes return ldns_buffer_status(output); 591238104Sdes} 592238104Sdes 593238104Sdeschar * 594238104Sdesldns_rr_class2str(const ldns_rr_class klass) 595238104Sdes{ 596238104Sdes ldns_buffer *buf; 597238104Sdes char *str; 598238104Sdes 599238104Sdes buf = ldns_buffer_new(10); 600238104Sdes if (!buf) { 601238104Sdes return NULL; 602238104Sdes } 603238104Sdes 604238104Sdes str = NULL; 605238104Sdes if (ldns_rr_class2buffer_str(buf, klass) == LDNS_STATUS_OK) { 606238104Sdes str = ldns_buffer2str(buf); 607238104Sdes } 608238104Sdes ldns_buffer_free(buf); 609238104Sdes return str; 610238104Sdes} 611238104Sdes 612238104Sdesldns_status 613238104Sdesldns_rdf2buffer_str_loc(ldns_buffer *output, const ldns_rdf *rdf) 614238104Sdes{ 615238104Sdes /* we could do checking (ie degrees < 90 etc)? */ 616238104Sdes uint8_t version = ldns_rdf_data(rdf)[0]; 617238104Sdes uint8_t size; 618238104Sdes uint8_t horizontal_precision; 619238104Sdes uint8_t vertical_precision; 620238104Sdes uint32_t longitude; 621238104Sdes uint32_t latitude; 622238104Sdes uint32_t altitude; 623238104Sdes char northerness; 624238104Sdes char easterness; 625238104Sdes uint32_t h; 626238104Sdes uint32_t m; 627238104Sdes double s; 628238104Sdes 629238104Sdes uint32_t equator = (uint32_t) ldns_power(2, 31); 630238104Sdes 631238104Sdes if (version == 0) { 632238104Sdes size = ldns_rdf_data(rdf)[1]; 633238104Sdes horizontal_precision = ldns_rdf_data(rdf)[2]; 634238104Sdes vertical_precision = ldns_rdf_data(rdf)[3]; 635238104Sdes 636238104Sdes latitude = ldns_read_uint32(&ldns_rdf_data(rdf)[4]); 637238104Sdes longitude = ldns_read_uint32(&ldns_rdf_data(rdf)[8]); 638238104Sdes altitude = ldns_read_uint32(&ldns_rdf_data(rdf)[12]); 639238104Sdes 640238104Sdes if (latitude > equator) { 641238104Sdes northerness = 'N'; 642238104Sdes latitude = latitude - equator; 643238104Sdes } else { 644238104Sdes northerness = 'S'; 645238104Sdes latitude = equator - latitude; 646238104Sdes } 647238104Sdes h = latitude / (1000 * 60 * 60); 648238104Sdes latitude = latitude % (1000 * 60 * 60); 649238104Sdes m = latitude / (1000 * 60); 650238104Sdes latitude = latitude % (1000 * 60); 651238104Sdes s = (double) latitude / 1000.0; 652238104Sdes ldns_buffer_printf(output, "%02u %02u %0.3f %c ", 653238104Sdes h, m, s, northerness); 654238104Sdes 655238104Sdes if (longitude > equator) { 656238104Sdes easterness = 'E'; 657238104Sdes longitude = longitude - equator; 658238104Sdes } else { 659238104Sdes easterness = 'W'; 660238104Sdes longitude = equator - longitude; 661238104Sdes } 662238104Sdes h = longitude / (1000 * 60 * 60); 663238104Sdes longitude = longitude % (1000 * 60 * 60); 664238104Sdes m = longitude / (1000 * 60); 665238104Sdes longitude = longitude % (1000 * 60); 666238104Sdes s = (double) longitude / (1000.0); 667238104Sdes ldns_buffer_printf(output, "%02u %02u %0.3f %c ", 668238104Sdes h, m, s, easterness); 669238104Sdes 670238104Sdes 671238104Sdes s = ((double) altitude) / 100; 672238104Sdes s -= 100000; 673238104Sdes 674238104Sdes if(altitude%100 != 0) 675238104Sdes ldns_buffer_printf(output, "%.2f", s); 676238104Sdes else 677238104Sdes ldns_buffer_printf(output, "%.0f", s); 678238104Sdes 679238104Sdes ldns_buffer_printf(output, "m "); 680238104Sdes 681238104Sdes loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f); 682238104Sdes ldns_buffer_printf(output, "m "); 683238104Sdes 684238104Sdes loc_cm_print(output, (horizontal_precision & 0xf0) >> 4, 685238104Sdes horizontal_precision & 0x0f); 686238104Sdes ldns_buffer_printf(output, "m "); 687238104Sdes 688238104Sdes loc_cm_print(output, (vertical_precision & 0xf0) >> 4, 689238104Sdes vertical_precision & 0x0f); 690238104Sdes ldns_buffer_printf(output, "m"); 691238104Sdes 692238104Sdes return ldns_buffer_status(output); 693238104Sdes } else { 694238104Sdes return ldns_rdf2buffer_str_hex(output, rdf); 695238104Sdes } 696238104Sdes} 697238104Sdes 698238104Sdesldns_status 699238104Sdesldns_rdf2buffer_str_unknown(ldns_buffer *output, const ldns_rdf *rdf) 700238104Sdes{ 701238104Sdes ldns_buffer_printf(output, "\\# %u ", ldns_rdf_size(rdf)); 702238104Sdes return ldns_rdf2buffer_str_hex(output, rdf); 703238104Sdes} 704238104Sdes 705238104Sdesldns_status 706238104Sdesldns_rdf2buffer_str_nsap(ldns_buffer *output, const ldns_rdf *rdf) 707238104Sdes{ 708238104Sdes ldns_buffer_printf(output, "0x"); 709238104Sdes return ldns_rdf2buffer_str_hex(output, rdf); 710238104Sdes} 711238104Sdes 712238104Sdesldns_status 713238104Sdesldns_rdf2buffer_str_atma(ldns_buffer *output, const ldns_rdf *rdf) 714238104Sdes{ 715238104Sdes return ldns_rdf2buffer_str_hex(output, rdf); 716238104Sdes} 717238104Sdes 718238104Sdesldns_status 719238104Sdesldns_rdf2buffer_str_wks(ldns_buffer *output, const ldns_rdf *rdf) 720238104Sdes{ 721238104Sdes /* protocol, followed by bitmap of services */ 722238104Sdes struct protoent *protocol; 723238104Sdes char *proto_name = NULL; 724238104Sdes uint8_t protocol_nr; 725238104Sdes struct servent *service; 726238104Sdes uint16_t current_service; 727238104Sdes 728238104Sdes protocol_nr = ldns_rdf_data(rdf)[0]; 729238104Sdes protocol = getprotobynumber((int) protocol_nr); 730238104Sdes if (protocol && (protocol->p_name != NULL)) { 731238104Sdes proto_name = protocol->p_name; 732238104Sdes ldns_buffer_printf(output, "%s ", protocol->p_name); 733238104Sdes } else { 734238104Sdes ldns_buffer_printf(output, "%u ", protocol_nr); 735238104Sdes } 736238104Sdes 737238104Sdes#ifdef HAVE_ENDPROTOENT 738238104Sdes endprotoent(); 739238104Sdes#endif 740238104Sdes 741238104Sdes for (current_service = 0; 742238104Sdes current_service < ldns_rdf_size(rdf) * 7; current_service++) { 743238104Sdes if (ldns_get_bit(&(ldns_rdf_data(rdf)[1]), current_service)) { 744238104Sdes service = getservbyport((int) htons(current_service), 745238104Sdes proto_name); 746238104Sdes if (service && service->s_name) { 747238104Sdes ldns_buffer_printf(output, "%s ", service->s_name); 748238104Sdes } else { 749238104Sdes ldns_buffer_printf(output, "%u ", current_service); 750238104Sdes } 751238104Sdes#ifdef HAVE_ENDSERVENT 752238104Sdes endservent(); 753238104Sdes#endif 754238104Sdes } 755238104Sdes } 756238104Sdes return ldns_buffer_status(output); 757238104Sdes} 758238104Sdes 759238104Sdesldns_status 760238104Sdesldns_rdf2buffer_str_nsec(ldns_buffer *output, const ldns_rdf *rdf) 761238104Sdes{ 762238104Sdes /* Note: this code is duplicated in higher.c in 763238104Sdes * ldns_nsec_type_check() function 764238104Sdes */ 765238104Sdes uint8_t window_block_nr; 766238104Sdes uint8_t bitmap_length; 767238104Sdes uint16_t type; 768238104Sdes uint16_t pos = 0; 769238104Sdes uint16_t bit_pos; 770238104Sdes uint8_t *data = ldns_rdf_data(rdf); 771238104Sdes const ldns_rr_descriptor *descriptor; 772238104Sdes 773238104Sdes while(pos < ldns_rdf_size(rdf)) { 774238104Sdes window_block_nr = data[pos]; 775238104Sdes bitmap_length = data[pos + 1]; 776238104Sdes pos += 2; 777238104Sdes 778238104Sdes for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) { 779238104Sdes if (ldns_get_bit(&data[pos], bit_pos)) { 780238104Sdes type = 256 * (uint16_t) window_block_nr + bit_pos; 781238104Sdes descriptor = ldns_rr_descript(type); 782238104Sdes 783238104Sdes if (descriptor && descriptor->_name) { 784238104Sdes ldns_buffer_printf(output, "%s ", 785238104Sdes descriptor->_name); 786238104Sdes } else { 787238104Sdes ldns_buffer_printf(output, "TYPE%u ", type); 788238104Sdes } 789238104Sdes } 790238104Sdes } 791238104Sdes 792238104Sdes pos += (uint16_t) bitmap_length; 793238104Sdes } 794238104Sdes 795238104Sdes return ldns_buffer_status(output); 796238104Sdes} 797238104Sdes 798238104Sdesldns_status 799238104Sdesldns_rdf2buffer_str_nsec3_salt(ldns_buffer *output, const ldns_rdf *rdf) 800238104Sdes{ 801238104Sdes uint8_t salt_length; 802238104Sdes uint8_t salt_pos; 803238104Sdes 804238104Sdes uint8_t *data = ldns_rdf_data(rdf); 805238104Sdes 806238104Sdes if(ldns_rdf_size(rdf) == 0) { 807238104Sdes output->_status = LDNS_STATUS_ERR; 808238104Sdes return ldns_buffer_status(output); 809238104Sdes } 810238104Sdes salt_length = data[0]; 811238104Sdes /* from now there are variable length entries so remember pos */ 812238104Sdes if (salt_length == 0 || ((size_t)salt_length)+1 > ldns_rdf_size(rdf)) { 813238104Sdes ldns_buffer_printf(output, "- "); 814238104Sdes } else { 815238104Sdes for (salt_pos = 0; salt_pos < salt_length; salt_pos++) { 816238104Sdes ldns_buffer_printf(output, "%02x", data[1 + salt_pos]); 817238104Sdes } 818238104Sdes ldns_buffer_printf(output, " "); 819238104Sdes } 820238104Sdes 821238104Sdes return ldns_buffer_status(output); 822238104Sdes} 823238104Sdes 824238104Sdesldns_status 825238104Sdesldns_rdf2buffer_str_period(ldns_buffer *output, const ldns_rdf *rdf) 826238104Sdes{ 827238104Sdes /* period is the number of seconds */ 828238104Sdes uint32_t p = ldns_read_uint32(ldns_rdf_data(rdf)); 829238104Sdes ldns_buffer_printf(output, "%u", p); 830238104Sdes return ldns_buffer_status(output); 831238104Sdes} 832238104Sdes 833238104Sdesldns_status 834238104Sdesldns_rdf2buffer_str_tsigtime(ldns_buffer *output,const ldns_rdf *rdf) 835238104Sdes{ 836238104Sdes /* tsigtime is 48 bits network order unsigned integer */ 837238104Sdes uint64_t tsigtime = 0; 838238104Sdes uint8_t *data = ldns_rdf_data(rdf); 839238104Sdes 840238104Sdes if (ldns_rdf_size(rdf) != 6) { 841238104Sdes return LDNS_STATUS_ERR; 842238104Sdes } 843238104Sdes 844238104Sdes tsigtime = ldns_read_uint16(data); 845238104Sdes tsigtime *= 65536; 846238104Sdes tsigtime += ldns_read_uint16(data+2); 847238104Sdes tsigtime *= 65536; 848238104Sdes 849238104Sdes ldns_buffer_printf(output, "%llu ", tsigtime); 850238104Sdes 851238104Sdes return ldns_buffer_status(output); 852238104Sdes} 853238104Sdes 854238104Sdesldns_status 855238104Sdesldns_rdf2buffer_str_apl(ldns_buffer *output, const ldns_rdf *rdf) 856238104Sdes{ 857238104Sdes uint8_t *data = ldns_rdf_data(rdf); 858238104Sdes uint16_t address_family; 859238104Sdes uint8_t prefix; 860238104Sdes bool negation; 861238104Sdes uint8_t adf_length; 862238104Sdes size_t i; 863238104Sdes size_t pos = 0; 864238104Sdes 865238104Sdes while (pos < (unsigned int) ldns_rdf_size(rdf)) { 866238104Sdes if(pos + 3 >= (unsigned)ldns_rdf_size(rdf)) 867238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 868238104Sdes address_family = ldns_read_uint16(&data[pos]); 869238104Sdes prefix = data[pos + 2]; 870238104Sdes negation = data[pos + 3] & LDNS_APL_NEGATION; 871238104Sdes adf_length = data[pos + 3] & LDNS_APL_MASK; 872238104Sdes if (address_family == LDNS_APL_IP4) { 873238104Sdes /* check if prefix < 32? */ 874238104Sdes if (negation) { 875238104Sdes ldns_buffer_printf(output, "!"); 876238104Sdes } 877238104Sdes ldns_buffer_printf(output, "%u:", address_family); 878238104Sdes /* address is variable length 0 - 4 */ 879238104Sdes for (i = 0; i < 4; i++) { 880238104Sdes if (i > 0) { 881238104Sdes ldns_buffer_printf(output, "."); 882238104Sdes } 883238104Sdes if (i < (unsigned short) adf_length) { 884238104Sdes if(pos+i+4 >= ldns_rdf_size(rdf)) 885238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 886238104Sdes ldns_buffer_printf(output, "%d", 887238104Sdes data[pos + i + 4]); 888238104Sdes } else { 889238104Sdes ldns_buffer_printf(output, "0"); 890238104Sdes } 891238104Sdes } 892238104Sdes ldns_buffer_printf(output, "/%u ", prefix); 893238104Sdes } else if (address_family == LDNS_APL_IP6) { 894238104Sdes /* check if prefix < 128? */ 895238104Sdes if (negation) { 896238104Sdes ldns_buffer_printf(output, "!"); 897238104Sdes } 898238104Sdes ldns_buffer_printf(output, "%u:", address_family); 899238104Sdes /* address is variable length 0 - 16 */ 900238104Sdes for (i = 0; i < 16; i++) { 901238104Sdes if (i % 2 == 0 && i > 0) { 902238104Sdes ldns_buffer_printf(output, ":"); 903238104Sdes } 904238104Sdes if (i < (unsigned short) adf_length) { 905238104Sdes if(pos+i+4 >= ldns_rdf_size(rdf)) 906238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 907238104Sdes ldns_buffer_printf(output, "%02x", 908238104Sdes data[pos + i + 4]); 909238104Sdes } else { 910238104Sdes ldns_buffer_printf(output, "00"); 911238104Sdes } 912238104Sdes } 913238104Sdes ldns_buffer_printf(output, "/%u ", prefix); 914238104Sdes 915238104Sdes } else { 916238104Sdes /* unknown address family */ 917238104Sdes ldns_buffer_printf(output, "Unknown address family: %u data: ", 918238104Sdes address_family); 919238104Sdes for (i = 1; i < (unsigned short) (4 + adf_length); i++) { 920238104Sdes if(pos+i >= ldns_rdf_size(rdf)) 921238104Sdes return LDNS_STATUS_SYNTAX_RDATA_ERR; 922238104Sdes ldns_buffer_printf(output, "%02x", data[i]); 923238104Sdes } 924238104Sdes } 925238104Sdes pos += 4 + adf_length; 926238104Sdes } 927238104Sdes return ldns_buffer_status(output); 928238104Sdes} 929238104Sdes 930238104Sdesldns_status 931238104Sdesldns_rdf2buffer_str_int16_data(ldns_buffer *output, const ldns_rdf *rdf) 932238104Sdes{ 933238104Sdes /* Subtract the size (2) of the number that specifies the length */ 934238104Sdes size_t size = ldns_b64_ntop_calculate_size(ldns_rdf_size(rdf) - 2); 935238104Sdes char *b64 = LDNS_XMALLOC(char, size); 936238104Sdes if(!b64) 937238104Sdes return LDNS_STATUS_MEM_ERR; 938238104Sdes 939238104Sdes ldns_buffer_printf(output, "%u ", ldns_rdf_size(rdf) - 2); 940238104Sdes 941238104Sdes if (ldns_rdf_size(rdf) > 2 && 942238104Sdes ldns_b64_ntop(ldns_rdf_data(rdf) + 2, 943238104Sdes ldns_rdf_size(rdf) - 2, 944238104Sdes b64, size)) { 945238104Sdes ldns_buffer_printf(output, "%s", b64); 946238104Sdes } 947238104Sdes LDNS_FREE(b64); 948238104Sdes return ldns_buffer_status(output); 949238104Sdes} 950238104Sdes 951238104Sdesldns_status 952238104Sdesldns_rdf2buffer_str_ipseckey(ldns_buffer *output, const ldns_rdf *rdf) 953238104Sdes{ 954238104Sdes /* wire format from 955238104Sdes http://www.ietf.org/internet-drafts/draft-ietf-ipseckey-rr-12.txt 956238104Sdes */ 957238104Sdes uint8_t *data = ldns_rdf_data(rdf); 958238104Sdes uint8_t precedence; 959238104Sdes uint8_t gateway_type; 960238104Sdes uint8_t algorithm; 961238104Sdes 962238104Sdes ldns_rdf *gateway = NULL; 963238104Sdes uint8_t *gateway_data; 964238104Sdes 965238104Sdes size_t public_key_size; 966238104Sdes uint8_t *public_key_data; 967238104Sdes ldns_rdf *public_key; 968238104Sdes 969238104Sdes size_t offset = 0; 970238104Sdes ldns_status status; 971238104Sdes 972238104Sdes precedence = data[0]; 973238104Sdes gateway_type = data[1]; 974238104Sdes algorithm = data[2]; 975238104Sdes offset = 3; 976238104Sdes 977238104Sdes switch (gateway_type) { 978238104Sdes case 0: 979238104Sdes /* no gateway */ 980238104Sdes break; 981238104Sdes case 1: 982238104Sdes gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP4ADDRLEN); 983238104Sdes if(!gateway_data) 984238104Sdes return LDNS_STATUS_MEM_ERR; 985238104Sdes memcpy(gateway_data, &data[offset], LDNS_IP4ADDRLEN); 986238104Sdes gateway = ldns_rdf_new(LDNS_RDF_TYPE_A, LDNS_IP4ADDRLEN , gateway_data); 987238104Sdes offset += LDNS_IP4ADDRLEN; 988238104Sdes if(!gateway) { 989238104Sdes LDNS_FREE(gateway_data); 990238104Sdes return LDNS_STATUS_MEM_ERR; 991238104Sdes } 992238104Sdes break; 993238104Sdes case 2: 994238104Sdes gateway_data = LDNS_XMALLOC(uint8_t, LDNS_IP6ADDRLEN); 995238104Sdes if(!gateway_data) 996238104Sdes return LDNS_STATUS_MEM_ERR; 997238104Sdes memcpy(gateway_data, &data[offset], LDNS_IP6ADDRLEN); 998238104Sdes offset += LDNS_IP6ADDRLEN; 999238104Sdes gateway = 1000238104Sdes ldns_rdf_new(LDNS_RDF_TYPE_AAAA, LDNS_IP6ADDRLEN, gateway_data); 1001238104Sdes if(!gateway) { 1002238104Sdes LDNS_FREE(gateway_data); 1003238104Sdes return LDNS_STATUS_MEM_ERR; 1004238104Sdes } 1005238104Sdes break; 1006238104Sdes case 3: 1007238104Sdes status = ldns_wire2dname(&gateway, data, ldns_rdf_size(rdf), &offset); 1008238104Sdes if(status != LDNS_STATUS_OK) 1009238104Sdes return status; 1010238104Sdes break; 1011238104Sdes default: 1012238104Sdes /* error? */ 1013238104Sdes break; 1014238104Sdes } 1015238104Sdes 1016238104Sdes public_key_size = ldns_rdf_size(rdf) - offset; 1017238104Sdes public_key_data = LDNS_XMALLOC(uint8_t, public_key_size); 1018238104Sdes if(!public_key_data) { 1019238104Sdes ldns_rdf_free(gateway); 1020238104Sdes return LDNS_STATUS_MEM_ERR; 1021238104Sdes } 1022238104Sdes memcpy(public_key_data, &data[offset], public_key_size); 1023238104Sdes public_key = ldns_rdf_new(LDNS_RDF_TYPE_B64, public_key_size, public_key_data); 1024238104Sdes if(!public_key) { 1025238104Sdes LDNS_FREE(public_key_data); 1026238104Sdes ldns_rdf_free(gateway); 1027238104Sdes return LDNS_STATUS_MEM_ERR; 1028238104Sdes } 1029238104Sdes 1030238104Sdes ldns_buffer_printf(output, "%u %u %u ", precedence, gateway_type, algorithm); 1031238104Sdes if (gateway) 1032238104Sdes (void) ldns_rdf2buffer_str(output, gateway); 1033238104Sdes else 1034238104Sdes ldns_buffer_printf(output, "."); 1035238104Sdes ldns_buffer_printf(output, " "); 1036238104Sdes (void) ldns_rdf2buffer_str(output, public_key); 1037238104Sdes 1038238104Sdes ldns_rdf_free(gateway); 1039238104Sdes ldns_rdf_free(public_key); 1040238104Sdes 1041238104Sdes return ldns_buffer_status(output); 1042238104Sdes} 1043238104Sdes 1044238104Sdesldns_status 1045238104Sdesldns_rdf2buffer_str_tsig(ldns_buffer *output, const ldns_rdf *rdf) 1046238104Sdes{ 1047238104Sdes /* TSIG RRs have no presentation format, make them #size <data> */ 1048238104Sdes return ldns_rdf2buffer_str_unknown(output, rdf); 1049238104Sdes} 1050238104Sdes 1051238104Sdes 1052238104Sdesldns_status 1053238104Sdesldns_rdf2buffer_str(ldns_buffer *buffer, const ldns_rdf *rdf) 1054238104Sdes{ 1055238104Sdes ldns_status res = LDNS_STATUS_OK; 1056238104Sdes 1057238104Sdes /*ldns_buffer_printf(buffer, "%u:", ldns_rdf_get_type(rdf));*/ 1058238104Sdes if (rdf) { 1059238104Sdes switch(ldns_rdf_get_type(rdf)) { 1060238104Sdes case LDNS_RDF_TYPE_NONE: 1061238104Sdes break; 1062238104Sdes case LDNS_RDF_TYPE_DNAME: 1063238104Sdes res = ldns_rdf2buffer_str_dname(buffer, rdf); 1064238104Sdes break; 1065238104Sdes case LDNS_RDF_TYPE_INT8: 1066238104Sdes res = ldns_rdf2buffer_str_int8(buffer, rdf); 1067238104Sdes break; 1068238104Sdes case LDNS_RDF_TYPE_INT16: 1069238104Sdes res = ldns_rdf2buffer_str_int16(buffer, rdf); 1070238104Sdes break; 1071238104Sdes case LDNS_RDF_TYPE_INT32: 1072238104Sdes res = ldns_rdf2buffer_str_int32(buffer, rdf); 1073238104Sdes break; 1074238104Sdes case LDNS_RDF_TYPE_PERIOD: 1075238104Sdes res = ldns_rdf2buffer_str_period(buffer, rdf); 1076238104Sdes break; 1077238104Sdes case LDNS_RDF_TYPE_TSIGTIME: 1078238104Sdes res = ldns_rdf2buffer_str_tsigtime(buffer, rdf); 1079238104Sdes break; 1080238104Sdes case LDNS_RDF_TYPE_A: 1081238104Sdes res = ldns_rdf2buffer_str_a(buffer, rdf); 1082238104Sdes break; 1083238104Sdes case LDNS_RDF_TYPE_AAAA: 1084238104Sdes res = ldns_rdf2buffer_str_aaaa(buffer, rdf); 1085238104Sdes break; 1086238104Sdes case LDNS_RDF_TYPE_STR: 1087238104Sdes res = ldns_rdf2buffer_str_str(buffer, rdf); 1088238104Sdes break; 1089238104Sdes case LDNS_RDF_TYPE_APL: 1090238104Sdes res = ldns_rdf2buffer_str_apl(buffer, rdf); 1091238104Sdes break; 1092238104Sdes case LDNS_RDF_TYPE_B32_EXT: 1093238104Sdes res = ldns_rdf2buffer_str_b32_ext(buffer, rdf); 1094238104Sdes break; 1095238104Sdes case LDNS_RDF_TYPE_B64: 1096238104Sdes res = ldns_rdf2buffer_str_b64(buffer, rdf); 1097238104Sdes break; 1098238104Sdes case LDNS_RDF_TYPE_HEX: 1099238104Sdes res = ldns_rdf2buffer_str_hex(buffer, rdf); 1100238104Sdes break; 1101238104Sdes case LDNS_RDF_TYPE_NSEC: 1102238104Sdes res = ldns_rdf2buffer_str_nsec(buffer, rdf); 1103238104Sdes break; 1104238104Sdes case LDNS_RDF_TYPE_NSEC3_SALT: 1105238104Sdes res = ldns_rdf2buffer_str_nsec3_salt(buffer, rdf); 1106238104Sdes break; 1107238104Sdes case LDNS_RDF_TYPE_TYPE: 1108238104Sdes res = ldns_rdf2buffer_str_type(buffer, rdf); 1109238104Sdes break; 1110238104Sdes case LDNS_RDF_TYPE_CLASS: 1111238104Sdes res = ldns_rdf2buffer_str_class(buffer, rdf); 1112238104Sdes break; 1113238104Sdes case LDNS_RDF_TYPE_CERT_ALG: 1114238104Sdes res = ldns_rdf2buffer_str_cert_alg(buffer, rdf); 1115238104Sdes break; 1116238104Sdes case LDNS_RDF_TYPE_ALG: 1117238104Sdes res = ldns_rdf2buffer_str_alg(buffer, rdf); 1118238104Sdes break; 1119238104Sdes case LDNS_RDF_TYPE_UNKNOWN: 1120238104Sdes res = ldns_rdf2buffer_str_unknown(buffer, rdf); 1121238104Sdes break; 1122238104Sdes case LDNS_RDF_TYPE_TIME: 1123238104Sdes res = ldns_rdf2buffer_str_time(buffer, rdf); 1124238104Sdes break; 1125238104Sdes case LDNS_RDF_TYPE_LOC: 1126238104Sdes res = ldns_rdf2buffer_str_loc(buffer, rdf); 1127238104Sdes break; 1128238104Sdes case LDNS_RDF_TYPE_WKS: 1129238104Sdes case LDNS_RDF_TYPE_SERVICE: 1130238104Sdes res = ldns_rdf2buffer_str_wks(buffer, rdf); 1131238104Sdes break; 1132238104Sdes case LDNS_RDF_TYPE_NSAP: 1133238104Sdes res = ldns_rdf2buffer_str_nsap(buffer, rdf); 1134238104Sdes break; 1135238104Sdes case LDNS_RDF_TYPE_ATMA: 1136238104Sdes res = ldns_rdf2buffer_str_atma(buffer, rdf); 1137238104Sdes break; 1138238104Sdes case LDNS_RDF_TYPE_IPSECKEY: 1139238104Sdes res = ldns_rdf2buffer_str_ipseckey(buffer, rdf); 1140238104Sdes break; 1141238104Sdes case LDNS_RDF_TYPE_TSIG: 1142238104Sdes res = ldns_rdf2buffer_str_tsig(buffer, rdf); 1143238104Sdes break; 1144238104Sdes case LDNS_RDF_TYPE_INT16_DATA: 1145238104Sdes res = ldns_rdf2buffer_str_int16_data(buffer, rdf); 1146238104Sdes break; 1147238104Sdes case LDNS_RDF_TYPE_NSEC3_NEXT_OWNER: 1148238104Sdes res = ldns_rdf2buffer_str_b32_ext(buffer, rdf); 1149238104Sdes break; 1150238104Sdes } 1151238104Sdes } else { 1152238104Sdes ldns_buffer_printf(buffer, "(null) "); 1153238104Sdes res = ldns_buffer_status(buffer); 1154238104Sdes } 1155238104Sdes return res; 1156238104Sdes} 1157238104Sdes 1158246827Sdesstatic ldns_rdf * 1159238104Sdesldns_b32_ext2dname(const ldns_rdf *rdf) 1160238104Sdes{ 1161238104Sdes size_t size; 1162238104Sdes char *b32; 1163238104Sdes ldns_rdf *out; 1164238104Sdes if(ldns_rdf_size(rdf) == 0) 1165238104Sdes return NULL; 1166238104Sdes /* remove -1 for the b32-hash-len octet */ 1167238104Sdes size = ldns_b32_ntop_calculate_size(ldns_rdf_size(rdf) - 1); 1168238104Sdes /* add one for the end nul for the string */ 1169238104Sdes b32 = LDNS_XMALLOC(char, size + 2); 1170238104Sdes if (b32) { 1171238104Sdes if (ldns_b32_ntop_extended_hex(ldns_rdf_data(rdf) + 1, 1172238104Sdes ldns_rdf_size(rdf) - 1, b32, size+1) > 0) { 1173238104Sdes b32[size] = '.'; 1174238104Sdes b32[size+1] = '\0'; 1175238104Sdes if (ldns_str2rdf_dname(&out, b32) == LDNS_STATUS_OK) { 1176238104Sdes LDNS_FREE(b32); 1177238104Sdes return out; 1178238104Sdes } 1179238104Sdes } 1180238104Sdes LDNS_FREE(b32); 1181238104Sdes } 1182238104Sdes return NULL; 1183238104Sdes} 1184238104Sdes 1185238104Sdesldns_status 1186238104Sdesldns_rr2buffer_str_fmt(ldns_buffer *output, 1187238104Sdes const ldns_output_format *fmt, const ldns_rr *rr) 1188238104Sdes{ 1189238104Sdes uint16_t i, flags; 1190238104Sdes ldns_status status = LDNS_STATUS_OK; 1191238104Sdes 1192238104Sdes if (fmt == NULL) { 1193238104Sdes fmt = ldns_output_format_default; 1194238104Sdes } 1195238104Sdes if (!rr) { 1196238104Sdes if (LDNS_COMMENT_NULLS & fmt->flags) { 1197238104Sdes ldns_buffer_printf(output, "; (null)\n"); 1198238104Sdes } 1199238104Sdes return ldns_buffer_status(output); 1200238104Sdes } 1201238104Sdes if (ldns_rr_owner(rr)) { 1202238104Sdes status = ldns_rdf2buffer_str_dname(output, ldns_rr_owner(rr)); 1203238104Sdes } 1204238104Sdes if (status != LDNS_STATUS_OK) { 1205238104Sdes return status; 1206238104Sdes } 1207238104Sdes 1208238104Sdes /* TTL should NOT be printed if it is a question */ 1209238104Sdes if (!ldns_rr_is_question(rr)) { 1210238104Sdes ldns_buffer_printf(output, "\t%d", ldns_rr_ttl(rr)); 1211238104Sdes } 1212238104Sdes 1213238104Sdes ldns_buffer_printf(output, "\t"); 1214238104Sdes status = ldns_rr_class2buffer_str(output, ldns_rr_get_class(rr)); 1215238104Sdes if (status != LDNS_STATUS_OK) { 1216238104Sdes return status; 1217238104Sdes } 1218238104Sdes ldns_buffer_printf(output, "\t"); 1219238104Sdes 1220238104Sdes status = ldns_rr_type2buffer_str(output, ldns_rr_get_type(rr)); 1221238104Sdes if (status != LDNS_STATUS_OK) { 1222238104Sdes return status; 1223238104Sdes } 1224238104Sdes 1225238104Sdes if (ldns_rr_rd_count(rr) > 0) { 1226238104Sdes ldns_buffer_printf(output, "\t"); 1227238104Sdes } else if (!ldns_rr_is_question(rr)) { 1228238104Sdes ldns_buffer_printf(output, "\t\\# 0"); 1229238104Sdes } 1230238104Sdes 1231238104Sdes for (i = 0; i < ldns_rr_rd_count(rr); i++) { 1232238104Sdes /* ldns_rdf2buffer_str handles NULL input fine! */ 1233238104Sdes status = ldns_rdf2buffer_str(output, ldns_rr_rdf(rr, i)); 1234238104Sdes if(status != LDNS_STATUS_OK) 1235238104Sdes return status; 1236238104Sdes if (i < ldns_rr_rd_count(rr) - 1) { 1237238104Sdes ldns_buffer_printf(output, " "); 1238238104Sdes } 1239238104Sdes } 1240238104Sdes /* per RR special comments - handy for DNSSEC types */ 1241238104Sdes /* check to prevent question sec. rr from 1242238104Sdes * getting here */ 1243238104Sdes if (ldns_rr_rd_count(rr) > 0) { 1244238104Sdes switch (ldns_rr_get_type(rr)) { 1245238104Sdes case LDNS_RR_TYPE_DNSKEY: 1246238104Sdes /* if ldns_rr_rd_count(rr) > 0 1247238104Sdes then ldns_rr_rdf(rr, 0) exists! */ 1248238104Sdes if (! (fmt->flags & LDNS_COMMENT_KEY)) { 1249238104Sdes break; 1250238104Sdes } 1251238104Sdes flags = ldns_rdf2native_int16( 1252238104Sdes ldns_rr_rdf(rr, 0)); 1253238104Sdes ldns_buffer_printf(output, " ;{"); 1254238104Sdes if (fmt->flags & LDNS_COMMENT_KEY_ID) { 1255238104Sdes ldns_buffer_printf(output, "id = %u", 1256238104Sdes (unsigned int) 1257238104Sdes ldns_calc_keytag(rr)); 1258238104Sdes } 1259238104Sdes if ((fmt->flags & LDNS_COMMENT_KEY_TYPE) 1260238104Sdes && (flags & LDNS_KEY_ZONE_KEY)){ 1261238104Sdes if (flags & LDNS_KEY_SEP_KEY) { 1262238104Sdes ldns_buffer_printf( 1263238104Sdes output, " (ksk)"); 1264238104Sdes } 1265238104Sdes else { 1266238104Sdes ldns_buffer_printf( 1267238104Sdes output, " (zsk)"); 1268238104Sdes } 1269238104Sdes if (fmt->flags & LDNS_COMMENT_KEY_SIZE){ 1270238104Sdes ldns_buffer_printf( 1271238104Sdes output, ", "); 1272238104Sdes } 1273238104Sdes } else if (fmt->flags 1274238104Sdes & (LDNS_COMMENT_KEY_ID 1275238104Sdes |LDNS_COMMENT_KEY_SIZE)) { 1276238104Sdes ldns_buffer_printf( output, ", "); 1277238104Sdes } 1278238104Sdes if (fmt->flags & LDNS_COMMENT_KEY_SIZE) { 1279238104Sdes ldns_buffer_printf(output, "size = %db", 1280238104Sdes ldns_rr_dnskey_key_size(rr)); 1281238104Sdes } 1282238104Sdes ldns_buffer_printf(output, "}"); 1283238104Sdes break; 1284238104Sdes case LDNS_RR_TYPE_RRSIG: 1285238104Sdes if ((fmt->flags & LDNS_COMMENT_KEY) 1286238104Sdes && (fmt->flags 1287238104Sdes & LDNS_COMMENT_RRSIGS) 1288238104Sdes && ldns_rr_rdf(rr, 6) != NULL) { 1289238104Sdes ldns_buffer_printf(output 1290238104Sdes , " ;{id = %d}" 1291238104Sdes , ldns_rdf2native_int16( 1292238104Sdes ldns_rr_rdf(rr, 6))); 1293238104Sdes } 1294238104Sdes break; 1295238104Sdes case LDNS_RR_TYPE_DS: 1296238104Sdes if ((fmt->flags & LDNS_COMMENT_BUBBLEBABBLE) 1297238104Sdes && ldns_rr_rdf(rr, 3) != NULL) { 1298238104Sdes uint8_t *data = ldns_rdf_data( 1299238104Sdes ldns_rr_rdf(rr, 3)); 1300238104Sdes size_t len = ldns_rdf_size( 1301238104Sdes ldns_rr_rdf(rr, 3)); 1302238104Sdes char *babble = ldns_bubblebabble( 1303238104Sdes data, len); 1304238104Sdes if(babble) { 1305238104Sdes ldns_buffer_printf(output 1306238104Sdes , " ;{%s}", babble); 1307238104Sdes } 1308238104Sdes LDNS_FREE(babble); 1309238104Sdes } 1310238104Sdes break; 1311238104Sdes case LDNS_RR_TYPE_NSEC3: 1312238104Sdes if (! (fmt->flags & LDNS_COMMENT_FLAGS) && 1313238104Sdes ! (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN)) { 1314238104Sdes break; 1315238104Sdes } 1316238104Sdes ldns_buffer_printf(output, " ;{"); 1317238104Sdes if ((fmt->flags & LDNS_COMMENT_FLAGS)) { 1318238104Sdes if (ldns_nsec3_optout(rr)) { 1319238104Sdes ldns_buffer_printf(output, 1320238104Sdes " flags: optout"); 1321238104Sdes } else { 1322238104Sdes ldns_buffer_printf(output, 1323238104Sdes " flags: -"); 1324238104Sdes } 1325238104Sdes if (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN 1326238104Sdes && fmt->data != NULL) { 1327238104Sdes ldns_buffer_printf(output, ", "); 1328238104Sdes } 1329238104Sdes } 1330238104Sdes if (fmt->flags & LDNS_COMMENT_NSEC3_CHAIN 1331238104Sdes && fmt->data != NULL) { 1332238104Sdes ldns_rbnode_t *node; 1333238104Sdes ldns_rdf *key = ldns_dname_label( 1334238104Sdes ldns_rr_owner(rr), 0); 1335238104Sdes if (key) { 1336238104Sdes node = ldns_rbtree_search( 1337238104Sdes (ldns_rbtree_t *) 1338238104Sdes fmt->data, 1339238104Sdes (void *) key); 1340238104Sdes if (node->data) { 1341238104Sdes ldns_buffer_printf( 1342238104Sdes output, 1343238104Sdes "from: "); 1344238104Sdes (void) 1345238104Sdes ldns_rdf2buffer_str( 1346238104Sdes output, 1347238104Sdes (ldns_rdf *) 1348238104Sdes node->data); 1349238104Sdes } 1350238104Sdes ldns_rdf_free(key); 1351238104Sdes } 1352238104Sdes key = ldns_b32_ext2dname( 1353238104Sdes ldns_nsec3_next_owner(rr)); 1354238104Sdes if (key) { 1355238104Sdes node = ldns_rbtree_search( 1356238104Sdes (ldns_rbtree_t *) 1357238104Sdes fmt->data, 1358238104Sdes (void *) key); 1359238104Sdes if (node->data) { 1360238104Sdes ldns_buffer_printf( 1361238104Sdes output, 1362238104Sdes " to: "); 1363238104Sdes (void) 1364238104Sdes ldns_rdf2buffer_str( 1365238104Sdes output, 1366238104Sdes (ldns_rdf *) 1367238104Sdes node->data); 1368238104Sdes } 1369238104Sdes ldns_rdf_free(key); 1370238104Sdes } 1371238104Sdes } 1372238104Sdes ldns_buffer_printf(output, "}"); 1373238104Sdes break; 1374238104Sdes default: 1375238104Sdes break; 1376238104Sdes 1377238104Sdes } 1378238104Sdes } 1379238104Sdes /* last */ 1380238104Sdes ldns_buffer_printf(output, "\n"); 1381238104Sdes return ldns_buffer_status(output); 1382238104Sdes} 1383238104Sdes 1384238104Sdesldns_status 1385238104Sdesldns_rr2buffer_str(ldns_buffer *output, const ldns_rr *rr) 1386238104Sdes{ 1387238104Sdes return ldns_rr2buffer_str_fmt(output, ldns_output_format_default, rr); 1388238104Sdes} 1389238104Sdes 1390238104Sdesldns_status 1391238104Sdesldns_rr_list2buffer_str_fmt(ldns_buffer *output, 1392238104Sdes const ldns_output_format *fmt, const ldns_rr_list *list) 1393238104Sdes{ 1394238104Sdes uint16_t i; 1395238104Sdes 1396238104Sdes for(i = 0; i < ldns_rr_list_rr_count(list); i++) { 1397238104Sdes (void) ldns_rr2buffer_str_fmt(output, fmt, 1398238104Sdes ldns_rr_list_rr(list, i)); 1399238104Sdes } 1400238104Sdes return ldns_buffer_status(output); 1401238104Sdes} 1402238104Sdes 1403238104Sdesldns_status 1404238104Sdesldns_rr_list2buffer_str(ldns_buffer *output, const ldns_rr_list *list) 1405238104Sdes{ 1406238104Sdes return ldns_rr_list2buffer_str_fmt( 1407238104Sdes output, ldns_output_format_default, list); 1408238104Sdes} 1409238104Sdes 1410238104Sdesldns_status 1411238104Sdesldns_pktheader2buffer_str(ldns_buffer *output, const ldns_pkt *pkt) 1412238104Sdes{ 1413238104Sdes ldns_lookup_table *opcode = ldns_lookup_by_id(ldns_opcodes, 1414238104Sdes (int) ldns_pkt_get_opcode(pkt)); 1415238104Sdes ldns_lookup_table *rcode = ldns_lookup_by_id(ldns_rcodes, 1416238104Sdes (int) ldns_pkt_get_rcode(pkt)); 1417238104Sdes 1418238104Sdes ldns_buffer_printf(output, ";; ->>HEADER<<- "); 1419238104Sdes if (opcode) { 1420238104Sdes ldns_buffer_printf(output, "opcode: %s, ", opcode->name); 1421238104Sdes } else { 1422238104Sdes ldns_buffer_printf(output, "opcode: ?? (%u), ", 1423238104Sdes ldns_pkt_get_opcode(pkt)); 1424238104Sdes } 1425238104Sdes if (rcode) { 1426238104Sdes ldns_buffer_printf(output, "rcode: %s, ", rcode->name); 1427238104Sdes } else { 1428238104Sdes ldns_buffer_printf(output, "rcode: ?? (%u), ", ldns_pkt_get_rcode(pkt)); 1429238104Sdes } 1430238104Sdes ldns_buffer_printf(output, "id: %d\n", ldns_pkt_id(pkt)); 1431238104Sdes ldns_buffer_printf(output, ";; flags: "); 1432238104Sdes 1433238104Sdes if (ldns_pkt_qr(pkt)) { 1434238104Sdes ldns_buffer_printf(output, "qr "); 1435238104Sdes } 1436238104Sdes if (ldns_pkt_aa(pkt)) { 1437238104Sdes ldns_buffer_printf(output, "aa "); 1438238104Sdes } 1439238104Sdes if (ldns_pkt_tc(pkt)) { 1440238104Sdes ldns_buffer_printf(output, "tc "); 1441238104Sdes } 1442238104Sdes if (ldns_pkt_rd(pkt)) { 1443238104Sdes ldns_buffer_printf(output, "rd "); 1444238104Sdes } 1445238104Sdes if (ldns_pkt_cd(pkt)) { 1446238104Sdes ldns_buffer_printf(output, "cd "); 1447238104Sdes } 1448238104Sdes if (ldns_pkt_ra(pkt)) { 1449238104Sdes ldns_buffer_printf(output, "ra "); 1450238104Sdes } 1451238104Sdes if (ldns_pkt_ad(pkt)) { 1452238104Sdes ldns_buffer_printf(output, "ad "); 1453238104Sdes } 1454238104Sdes ldns_buffer_printf(output, "; "); 1455238104Sdes ldns_buffer_printf(output, "QUERY: %u, ", ldns_pkt_qdcount(pkt)); 1456238104Sdes ldns_buffer_printf(output, "ANSWER: %u, ", ldns_pkt_ancount(pkt)); 1457238104Sdes ldns_buffer_printf(output, "AUTHORITY: %u, ", ldns_pkt_nscount(pkt)); 1458238104Sdes ldns_buffer_printf(output, "ADDITIONAL: %u ", ldns_pkt_arcount(pkt)); 1459238104Sdes return ldns_buffer_status(output); 1460238104Sdes} 1461238104Sdes 1462238104Sdesldns_status 1463238104Sdesldns_pkt2buffer_str_fmt(ldns_buffer *output, 1464238104Sdes const ldns_output_format *fmt, const ldns_pkt *pkt) 1465238104Sdes{ 1466238104Sdes uint16_t i; 1467238104Sdes ldns_status status = LDNS_STATUS_OK; 1468238104Sdes char *tmp; 1469238104Sdes struct timeval time; 1470238104Sdes time_t time_tt; 1471238104Sdes 1472238104Sdes if (!pkt) { 1473238104Sdes ldns_buffer_printf(output, "null"); 1474238104Sdes return LDNS_STATUS_OK; 1475238104Sdes } 1476238104Sdes 1477238104Sdes if (ldns_buffer_status_ok(output)) { 1478238104Sdes status = ldns_pktheader2buffer_str(output, pkt); 1479238104Sdes if (status != LDNS_STATUS_OK) { 1480238104Sdes return status; 1481238104Sdes } 1482238104Sdes 1483238104Sdes ldns_buffer_printf(output, "\n"); 1484238104Sdes 1485238104Sdes ldns_buffer_printf(output, ";; QUESTION SECTION:\n;; "); 1486238104Sdes 1487238104Sdes 1488238104Sdes for (i = 0; i < ldns_pkt_qdcount(pkt); i++) { 1489238104Sdes status = ldns_rr2buffer_str_fmt(output, fmt, 1490238104Sdes ldns_rr_list_rr( 1491238104Sdes ldns_pkt_question(pkt), i)); 1492238104Sdes if (status != LDNS_STATUS_OK) { 1493238104Sdes return status; 1494238104Sdes } 1495238104Sdes } 1496238104Sdes ldns_buffer_printf(output, "\n"); 1497238104Sdes 1498238104Sdes ldns_buffer_printf(output, ";; ANSWER SECTION:\n"); 1499238104Sdes for (i = 0; i < ldns_pkt_ancount(pkt); i++) { 1500238104Sdes status = ldns_rr2buffer_str_fmt(output, fmt, 1501238104Sdes ldns_rr_list_rr( 1502238104Sdes ldns_pkt_answer(pkt), i)); 1503238104Sdes if (status != LDNS_STATUS_OK) { 1504238104Sdes return status; 1505238104Sdes } 1506238104Sdes 1507238104Sdes } 1508238104Sdes ldns_buffer_printf(output, "\n"); 1509238104Sdes 1510238104Sdes ldns_buffer_printf(output, ";; AUTHORITY SECTION:\n"); 1511238104Sdes 1512238104Sdes for (i = 0; i < ldns_pkt_nscount(pkt); i++) { 1513238104Sdes status = ldns_rr2buffer_str_fmt(output, fmt, 1514238104Sdes ldns_rr_list_rr( 1515238104Sdes ldns_pkt_authority(pkt), i)); 1516238104Sdes if (status != LDNS_STATUS_OK) { 1517238104Sdes return status; 1518238104Sdes } 1519238104Sdes } 1520238104Sdes ldns_buffer_printf(output, "\n"); 1521238104Sdes 1522238104Sdes ldns_buffer_printf(output, ";; ADDITIONAL SECTION:\n"); 1523238104Sdes for (i = 0; i < ldns_pkt_arcount(pkt); i++) { 1524238104Sdes status = ldns_rr2buffer_str_fmt(output, fmt, 1525238104Sdes ldns_rr_list_rr( 1526238104Sdes ldns_pkt_additional(pkt), i)); 1527238104Sdes if (status != LDNS_STATUS_OK) { 1528238104Sdes return status; 1529238104Sdes } 1530238104Sdes 1531238104Sdes } 1532238104Sdes ldns_buffer_printf(output, "\n"); 1533238104Sdes /* add some futher fields */ 1534238104Sdes ldns_buffer_printf(output, ";; Query time: %d msec\n", 1535238104Sdes ldns_pkt_querytime(pkt)); 1536238104Sdes if (ldns_pkt_edns(pkt)) { 1537238104Sdes ldns_buffer_printf(output, 1538238104Sdes ";; EDNS: version %u; flags:", 1539238104Sdes ldns_pkt_edns_version(pkt)); 1540238104Sdes if (ldns_pkt_edns_do(pkt)) { 1541238104Sdes ldns_buffer_printf(output, " do"); 1542238104Sdes } 1543238104Sdes /* the extended rcode is the value set, shifted four bits, 1544238104Sdes * and or'd with the original rcode */ 1545238104Sdes if (ldns_pkt_edns_extended_rcode(pkt)) { 1546238104Sdes ldns_buffer_printf(output, " ; ext-rcode: %d", 1547238104Sdes (ldns_pkt_edns_extended_rcode(pkt) << 4 | ldns_pkt_get_rcode(pkt))); 1548238104Sdes } 1549238104Sdes ldns_buffer_printf(output, " ; udp: %u\n", 1550238104Sdes ldns_pkt_edns_udp_size(pkt)); 1551238104Sdes 1552238104Sdes if (ldns_pkt_edns_data(pkt)) { 1553238104Sdes ldns_buffer_printf(output, ";; Data: "); 1554238104Sdes (void)ldns_rdf2buffer_str(output, 1555238104Sdes ldns_pkt_edns_data(pkt)); 1556238104Sdes ldns_buffer_printf(output, "\n"); 1557238104Sdes } 1558238104Sdes } 1559238104Sdes if (ldns_pkt_tsig(pkt)) { 1560238104Sdes ldns_buffer_printf(output, ";; TSIG:\n;; "); 1561238104Sdes (void) ldns_rr2buffer_str_fmt( 1562238104Sdes output, fmt, ldns_pkt_tsig(pkt)); 1563238104Sdes ldns_buffer_printf(output, "\n"); 1564238104Sdes } 1565238104Sdes if (ldns_pkt_answerfrom(pkt)) { 1566238104Sdes tmp = ldns_rdf2str(ldns_pkt_answerfrom(pkt)); 1567238104Sdes ldns_buffer_printf(output, ";; SERVER: %s\n", tmp); 1568238104Sdes LDNS_FREE(tmp); 1569238104Sdes } 1570238104Sdes time = ldns_pkt_timestamp(pkt); 1571238104Sdes time_tt = (time_t)time.tv_sec; 1572238104Sdes ldns_buffer_printf(output, ";; WHEN: %s", 1573238104Sdes (char*)ctime(&time_tt)); 1574238104Sdes 1575238104Sdes ldns_buffer_printf(output, ";; MSG SIZE rcvd: %d\n", 1576238104Sdes (int)ldns_pkt_size(pkt)); 1577238104Sdes } else { 1578238104Sdes return ldns_buffer_status(output); 1579238104Sdes } 1580238104Sdes return status; 1581238104Sdes} 1582238104Sdes 1583238104Sdesldns_status 1584238104Sdesldns_pkt2buffer_str(ldns_buffer *output, const ldns_pkt *pkt) 1585238104Sdes{ 1586238104Sdes return ldns_pkt2buffer_str_fmt(output, ldns_output_format_default, pkt); 1587238104Sdes} 1588238104Sdes 1589238104Sdes 1590238104Sdes#ifdef HAVE_SSL 1591238104Sdesstatic ldns_status 1592238104Sdesldns_hmac_key2buffer_str(ldns_buffer *output, const ldns_key *k) 1593238104Sdes{ 1594238104Sdes ldns_status status; 1595238104Sdes size_t i; 1596238104Sdes ldns_rdf *b64_bignum; 1597238104Sdes 1598238104Sdes ldns_buffer_printf(output, "Key: "); 1599238104Sdes 1600238104Sdes i = ldns_key_hmac_size(k); 1601238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, ldns_key_hmac_key(k)); 1602238104Sdes status = ldns_rdf2buffer_str(output, b64_bignum); 1603238104Sdes ldns_rdf_deep_free(b64_bignum); 1604238104Sdes ldns_buffer_printf(output, "\n"); 1605238104Sdes return status; 1606238104Sdes} 1607238104Sdes#endif 1608238104Sdes 1609238104Sdes#if defined(HAVE_SSL) && defined(USE_GOST) 1610238104Sdesstatic ldns_status 1611238104Sdesldns_gost_key2buffer_str(ldns_buffer *output, EVP_PKEY *p) 1612238104Sdes{ 1613238104Sdes unsigned char* pp = NULL; 1614238104Sdes int ret; 1615238104Sdes ldns_rdf *b64_bignum; 1616238104Sdes ldns_status status; 1617238104Sdes 1618238104Sdes ldns_buffer_printf(output, "GostAsn1: "); 1619238104Sdes 1620238104Sdes ret = i2d_PrivateKey(p, &pp); 1621238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, (size_t)ret, pp); 1622238104Sdes status = ldns_rdf2buffer_str(output, b64_bignum); 1623238104Sdes 1624238104Sdes ldns_rdf_deep_free(b64_bignum); 1625238104Sdes OPENSSL_free(pp); 1626238104Sdes ldns_buffer_printf(output, "\n"); 1627238104Sdes return status; 1628238104Sdes} 1629238104Sdes#endif 1630238104Sdes 1631238104Sdesldns_status 1632238104Sdesldns_key2buffer_str(ldns_buffer *output, const ldns_key *k) 1633238104Sdes{ 1634238104Sdes ldns_status status = LDNS_STATUS_OK; 1635238104Sdes unsigned char *bignum; 1636238104Sdes#ifndef S_SPLINT_S 1637238104Sdes uint16_t i; 1638238104Sdes#endif 1639238104Sdes 1640238104Sdes#ifdef HAVE_SSL 1641238104Sdes /* not used when ssl is not defined */ 1642238104Sdes ldns_rdf *b64_bignum = NULL; 1643238104Sdes 1644238104Sdes RSA *rsa; 1645238104Sdes DSA *dsa; 1646238104Sdes#endif /* HAVE_SSL */ 1647238104Sdes 1648238104Sdes if (!k) { 1649238104Sdes return LDNS_STATUS_ERR; 1650238104Sdes } 1651238104Sdes 1652238104Sdes bignum = LDNS_XMALLOC(unsigned char, LDNS_MAX_KEYLEN); 1653238104Sdes if (!bignum) { 1654238104Sdes return LDNS_STATUS_ERR; 1655238104Sdes } 1656238104Sdes 1657238104Sdes if (ldns_buffer_status_ok(output)) { 1658238104Sdes#ifdef HAVE_SSL 1659238104Sdes switch(ldns_key_algorithm(k)) { 1660238104Sdes case LDNS_SIGN_RSASHA1: 1661238104Sdes case LDNS_SIGN_RSASHA1_NSEC3: 1662238104Sdes case LDNS_SIGN_RSASHA256: 1663238104Sdes case LDNS_SIGN_RSASHA512: 1664238104Sdes case LDNS_SIGN_RSAMD5: 1665238104Sdes /* copied by looking at dnssec-keygen output */ 1666238104Sdes /* header */ 1667238104Sdes rsa = ldns_key_rsa_key(k); 1668238104Sdes 1669238104Sdes ldns_buffer_printf(output,"Private-key-format: v1.2\n"); 1670238104Sdes switch(ldns_key_algorithm(k)) { 1671238104Sdes case LDNS_SIGN_RSAMD5: 1672238104Sdes ldns_buffer_printf(output, 1673238104Sdes "Algorithm: %u (RSA)\n", 1674238104Sdes LDNS_RSAMD5); 1675238104Sdes break; 1676238104Sdes case LDNS_SIGN_RSASHA1: 1677238104Sdes ldns_buffer_printf(output, 1678238104Sdes "Algorithm: %u (RSASHA1)\n", 1679238104Sdes LDNS_RSASHA1); 1680238104Sdes break; 1681238104Sdes case LDNS_SIGN_RSASHA1_NSEC3: 1682238104Sdes ldns_buffer_printf(output, 1683238104Sdes "Algorithm: %u (RSASHA1_NSEC3)\n", 1684238104Sdes LDNS_RSASHA1_NSEC3); 1685238104Sdes break; 1686238104Sdes#ifdef USE_SHA2 1687238104Sdes case LDNS_SIGN_RSASHA256: 1688238104Sdes ldns_buffer_printf(output, 1689238104Sdes "Algorithm: %u (RSASHA256)\n", 1690238104Sdes LDNS_RSASHA256); 1691238104Sdes break; 1692238104Sdes case LDNS_SIGN_RSASHA512: 1693238104Sdes ldns_buffer_printf(output, 1694238104Sdes "Algorithm: %u (RSASHA512)\n", 1695238104Sdes LDNS_RSASHA512); 1696238104Sdes break; 1697238104Sdes#endif 1698238104Sdes default: 1699238104Sdes fprintf(stderr, "Warning: unknown signature "); 1700238104Sdes fprintf(stderr, 1701238104Sdes "algorithm type %u\n", 1702238104Sdes ldns_key_algorithm(k)); 1703238104Sdes ldns_buffer_printf(output, 1704238104Sdes "Algorithm: %u (Unknown)\n", 1705238104Sdes ldns_key_algorithm(k)); 1706238104Sdes break; 1707238104Sdes } 1708238104Sdes 1709238104Sdes /* print to buf, convert to bin, convert to b64, 1710238104Sdes * print to buf */ 1711238104Sdes ldns_buffer_printf(output, "Modulus: "); 1712238104Sdes#ifndef S_SPLINT_S 1713238104Sdes i = (uint16_t)BN_bn2bin(rsa->n, bignum); 1714238104Sdes if (i > LDNS_MAX_KEYLEN) { 1715238104Sdes goto error; 1716238104Sdes } 1717238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1718238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1719238104Sdes goto error; 1720238104Sdes } 1721238104Sdes ldns_rdf_deep_free(b64_bignum); 1722238104Sdes ldns_buffer_printf(output, "\n"); 1723238104Sdes ldns_buffer_printf(output, "PublicExponent: "); 1724238104Sdes i = (uint16_t)BN_bn2bin(rsa->e, bignum); 1725238104Sdes if (i > LDNS_MAX_KEYLEN) { 1726238104Sdes goto error; 1727238104Sdes } 1728238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1729238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1730238104Sdes goto error; 1731238104Sdes } 1732238104Sdes ldns_rdf_deep_free(b64_bignum); 1733238104Sdes ldns_buffer_printf(output, "\n"); 1734238104Sdes 1735238104Sdes ldns_buffer_printf(output, "PrivateExponent: "); 1736238104Sdes if (rsa->d) { 1737238104Sdes i = (uint16_t)BN_bn2bin(rsa->d, bignum); 1738238104Sdes if (i > LDNS_MAX_KEYLEN) { 1739238104Sdes goto error; 1740238104Sdes } 1741238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1742238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1743238104Sdes goto error; 1744238104Sdes } 1745238104Sdes ldns_rdf_deep_free(b64_bignum); 1746238104Sdes ldns_buffer_printf(output, "\n"); 1747238104Sdes } else { 1748238104Sdes ldns_buffer_printf(output, "(Not available)\n"); 1749238104Sdes } 1750238104Sdes 1751238104Sdes ldns_buffer_printf(output, "Prime1: "); 1752238104Sdes if (rsa->p) { 1753238104Sdes i = (uint16_t)BN_bn2bin(rsa->p, bignum); 1754238104Sdes if (i > LDNS_MAX_KEYLEN) { 1755238104Sdes goto error; 1756238104Sdes } 1757238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1758238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1759238104Sdes goto error; 1760238104Sdes } 1761238104Sdes ldns_rdf_deep_free(b64_bignum); 1762238104Sdes ldns_buffer_printf(output, "\n"); 1763238104Sdes } else { 1764238104Sdes ldns_buffer_printf(output, "(Not available)\n"); 1765238104Sdes } 1766238104Sdes 1767238104Sdes ldns_buffer_printf(output, "Prime2: "); 1768238104Sdes if (rsa->q) { 1769238104Sdes i = (uint16_t)BN_bn2bin(rsa->q, bignum); 1770238104Sdes if (i > LDNS_MAX_KEYLEN) { 1771238104Sdes goto error; 1772238104Sdes } 1773238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1774238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1775238104Sdes goto error; 1776238104Sdes } 1777238104Sdes ldns_rdf_deep_free(b64_bignum); 1778238104Sdes ldns_buffer_printf(output, "\n"); 1779238104Sdes } else { 1780238104Sdes ldns_buffer_printf(output, "(Not available)\n"); 1781238104Sdes } 1782238104Sdes 1783238104Sdes ldns_buffer_printf(output, "Exponent1: "); 1784238104Sdes if (rsa->dmp1) { 1785238104Sdes i = (uint16_t)BN_bn2bin(rsa->dmp1, bignum); 1786238104Sdes if (i > LDNS_MAX_KEYLEN) { 1787238104Sdes goto error; 1788238104Sdes } 1789238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1790238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1791238104Sdes goto error; 1792238104Sdes } 1793238104Sdes ldns_rdf_deep_free(b64_bignum); 1794238104Sdes ldns_buffer_printf(output, "\n"); 1795238104Sdes } else { 1796238104Sdes ldns_buffer_printf(output, "(Not available)\n"); 1797238104Sdes } 1798238104Sdes 1799238104Sdes ldns_buffer_printf(output, "Exponent2: "); 1800238104Sdes if (rsa->dmq1) { 1801238104Sdes i = (uint16_t)BN_bn2bin(rsa->dmq1, bignum); 1802238104Sdes if (i > LDNS_MAX_KEYLEN) { 1803238104Sdes goto error; 1804238104Sdes } 1805238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1806238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1807238104Sdes goto error; 1808238104Sdes } 1809238104Sdes ldns_rdf_deep_free(b64_bignum); 1810238104Sdes ldns_buffer_printf(output, "\n"); 1811238104Sdes } else { 1812238104Sdes ldns_buffer_printf(output, "(Not available)\n"); 1813238104Sdes } 1814238104Sdes 1815238104Sdes ldns_buffer_printf(output, "Coefficient: "); 1816238104Sdes if (rsa->iqmp) { 1817238104Sdes i = (uint16_t)BN_bn2bin(rsa->iqmp, bignum); 1818238104Sdes if (i > LDNS_MAX_KEYLEN) { 1819238104Sdes goto error; 1820238104Sdes } 1821238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1822238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1823238104Sdes goto error; 1824238104Sdes } 1825238104Sdes ldns_rdf_deep_free(b64_bignum); 1826238104Sdes ldns_buffer_printf(output, "\n"); 1827238104Sdes } else { 1828238104Sdes ldns_buffer_printf(output, "(Not available)\n"); 1829238104Sdes } 1830238104Sdes#endif /* splint */ 1831238104Sdes 1832238104Sdes RSA_free(rsa); 1833238104Sdes break; 1834238104Sdes case LDNS_SIGN_DSA: 1835238104Sdes case LDNS_SIGN_DSA_NSEC3: 1836238104Sdes dsa = ldns_key_dsa_key(k); 1837238104Sdes 1838238104Sdes ldns_buffer_printf(output,"Private-key-format: v1.2\n"); 1839238104Sdes if (ldns_key_algorithm(k) == LDNS_SIGN_DSA) { 1840238104Sdes ldns_buffer_printf(output,"Algorithm: 3 (DSA)\n"); 1841238104Sdes } else if (ldns_key_algorithm(k) == LDNS_SIGN_DSA_NSEC3) { 1842238104Sdes ldns_buffer_printf(output,"Algorithm: 6 (DSA_NSEC3)\n"); 1843238104Sdes } 1844238104Sdes 1845238104Sdes /* print to buf, convert to bin, convert to b64, 1846238104Sdes * print to buf */ 1847238104Sdes ldns_buffer_printf(output, "Prime(p): "); 1848238104Sdes#ifndef S_SPLINT_S 1849238104Sdes if (dsa->p) { 1850238104Sdes i = (uint16_t)BN_bn2bin(dsa->p, bignum); 1851238104Sdes if (i > LDNS_MAX_KEYLEN) { 1852238104Sdes goto error; 1853238104Sdes } 1854238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1855238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1856238104Sdes goto error; 1857238104Sdes } 1858238104Sdes ldns_rdf_deep_free(b64_bignum); 1859238104Sdes ldns_buffer_printf(output, "\n"); 1860238104Sdes } else { 1861238104Sdes printf("(Not available)\n"); 1862238104Sdes } 1863238104Sdes 1864238104Sdes ldns_buffer_printf(output, "Subprime(q): "); 1865238104Sdes if (dsa->q) { 1866238104Sdes i = (uint16_t)BN_bn2bin(dsa->q, bignum); 1867238104Sdes if (i > LDNS_MAX_KEYLEN) { 1868238104Sdes goto error; 1869238104Sdes } 1870238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1871238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1872238104Sdes goto error; 1873238104Sdes } 1874238104Sdes ldns_rdf_deep_free(b64_bignum); 1875238104Sdes ldns_buffer_printf(output, "\n"); 1876238104Sdes } else { 1877238104Sdes printf("(Not available)\n"); 1878238104Sdes } 1879238104Sdes 1880238104Sdes ldns_buffer_printf(output, "Base(g): "); 1881238104Sdes if (dsa->g) { 1882238104Sdes i = (uint16_t)BN_bn2bin(dsa->g, bignum); 1883238104Sdes if (i > LDNS_MAX_KEYLEN) { 1884238104Sdes goto error; 1885238104Sdes } 1886238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1887238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1888238104Sdes goto error; 1889238104Sdes } 1890238104Sdes ldns_rdf_deep_free(b64_bignum); 1891238104Sdes ldns_buffer_printf(output, "\n"); 1892238104Sdes } else { 1893238104Sdes printf("(Not available)\n"); 1894238104Sdes } 1895238104Sdes 1896238104Sdes ldns_buffer_printf(output, "Private_value(x): "); 1897238104Sdes if (dsa->priv_key) { 1898238104Sdes i = (uint16_t)BN_bn2bin(dsa->priv_key, bignum); 1899238104Sdes if (i > LDNS_MAX_KEYLEN) { 1900238104Sdes goto error; 1901238104Sdes } 1902238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1903238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1904238104Sdes goto error; 1905238104Sdes } 1906238104Sdes ldns_rdf_deep_free(b64_bignum); 1907238104Sdes ldns_buffer_printf(output, "\n"); 1908238104Sdes } else { 1909238104Sdes printf("(Not available)\n"); 1910238104Sdes } 1911238104Sdes 1912238104Sdes ldns_buffer_printf(output, "Public_value(y): "); 1913238104Sdes if (dsa->pub_key) { 1914238104Sdes i = (uint16_t)BN_bn2bin(dsa->pub_key, bignum); 1915238104Sdes if (i > LDNS_MAX_KEYLEN) { 1916238104Sdes goto error; 1917238104Sdes } 1918238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1919238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1920238104Sdes goto error; 1921238104Sdes } 1922238104Sdes ldns_rdf_deep_free(b64_bignum); 1923238104Sdes ldns_buffer_printf(output, "\n"); 1924238104Sdes } else { 1925238104Sdes printf("(Not available)\n"); 1926238104Sdes } 1927238104Sdes#endif /* splint */ 1928238104Sdes break; 1929238104Sdes case LDNS_SIGN_ECC_GOST: 1930238104Sdes /* no format defined, use blob */ 1931238104Sdes#if defined(HAVE_SSL) && defined(USE_GOST) 1932238104Sdes ldns_buffer_printf(output, "Private-key-format: v1.2\n"); 1933238104Sdes ldns_buffer_printf(output, "Algorithm: %d (ECC-GOST)\n", LDNS_SIGN_ECC_GOST); 1934238104Sdes status = ldns_gost_key2buffer_str(output, 1935238104Sdes#ifndef S_SPLINT_S 1936238104Sdes k->_key.key 1937238104Sdes#else 1938238104Sdes NULL 1939238104Sdes#endif 1940238104Sdes ); 1941238104Sdes#else 1942238104Sdes goto error; 1943238104Sdes#endif /* GOST */ 1944238104Sdes break; 1945238104Sdes case LDNS_SIGN_ECDSAP256SHA256: 1946238104Sdes case LDNS_SIGN_ECDSAP384SHA384: 1947238104Sdes#ifdef USE_ECDSA 1948238104Sdes ldns_buffer_printf(output, "Private-key-format: v1.2\n"); 1949238104Sdes ldns_buffer_printf(output, "Algorithm: %d (", ldns_key_algorithm(k)); 1950238104Sdes status=ldns_algorithm2buffer_str(output, (ldns_algorithm)ldns_key_algorithm(k)); 1951238104Sdes#ifndef S_SPLINT_S 1952238104Sdes ldns_buffer_printf(output, ")\n"); 1953238104Sdes if(k->_key.key) { 1954238104Sdes EC_KEY* ec = EVP_PKEY_get1_EC_KEY(k->_key.key); 1955238104Sdes const BIGNUM* b = EC_KEY_get0_private_key(ec); 1956238104Sdes ldns_buffer_printf(output, "PrivateKey: "); 1957238104Sdes i = (uint16_t)BN_bn2bin(b, bignum); 1958238104Sdes if (i > LDNS_MAX_KEYLEN) { 1959238104Sdes goto error; 1960238104Sdes } 1961238104Sdes b64_bignum = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_B64, i, bignum); 1962238104Sdes if (ldns_rdf2buffer_str(output, b64_bignum) != LDNS_STATUS_OK) { 1963238104Sdes goto error; 1964238104Sdes } 1965238104Sdes ldns_rdf_deep_free(b64_bignum); 1966238104Sdes ldns_buffer_printf(output, "\n"); 1967238104Sdes /* down reference count in EC_KEY 1968238104Sdes * its still assigned to the PKEY */ 1969238104Sdes EC_KEY_free(ec); 1970238104Sdes } 1971238104Sdes#endif /* splint */ 1972238104Sdes#else 1973238104Sdes goto error; 1974238104Sdes#endif /* ECDSA */ 1975238104Sdes break; 1976238104Sdes case LDNS_SIGN_HMACMD5: 1977238104Sdes /* there's not much of a format defined for TSIG */ 1978238104Sdes /* It's just a binary blob, Same for all algorithms */ 1979238104Sdes ldns_buffer_printf(output, "Private-key-format: v1.2\n"); 1980238104Sdes ldns_buffer_printf(output, "Algorithm: 157 (HMAC_MD5)\n"); 1981238104Sdes status = ldns_hmac_key2buffer_str(output, k); 1982238104Sdes break; 1983238104Sdes case LDNS_SIGN_HMACSHA1: 1984238104Sdes ldns_buffer_printf(output, "Private-key-format: v1.2\n"); 1985238104Sdes ldns_buffer_printf(output, "Algorithm: 158 (HMAC_SHA1)\n"); 1986238104Sdes status = ldns_hmac_key2buffer_str(output, k); 1987238104Sdes break; 1988238104Sdes case LDNS_SIGN_HMACSHA256: 1989238104Sdes ldns_buffer_printf(output, "Private-key-format: v1.2\n"); 1990238104Sdes ldns_buffer_printf(output, "Algorithm: 159 (HMAC_SHA256)\n"); 1991238104Sdes status = ldns_hmac_key2buffer_str(output, k); 1992238104Sdes break; 1993238104Sdes } 1994238104Sdes#endif /* HAVE_SSL */ 1995238104Sdes } else { 1996238104Sdes#ifdef HAVE_SSL 1997238104Sdes LDNS_FREE(b64_bignum); 1998238104Sdes#endif 1999238104Sdes LDNS_FREE(bignum); 2000238104Sdes return ldns_buffer_status(output); 2001238104Sdes } 2002238104Sdes LDNS_FREE(bignum); 2003238104Sdes return status; 2004238104Sdes 2005238104Sdes#ifdef HAVE_SSL 2006238104Sdes /* compiles warn the label isn't used */ 2007238104Sdeserror: 2008238104Sdes LDNS_FREE(bignum); 2009238104Sdes return LDNS_STATUS_ERR; 2010238104Sdes#endif /* HAVE_SSL */ 2011238104Sdes 2012238104Sdes} 2013238104Sdes 2014238104Sdes/* 2015238104Sdes * Zero terminate the buffer and fix it to the size of the string. 2016238104Sdes */ 2017238104Sdeschar * 2018238104Sdesldns_buffer2str(ldns_buffer *buffer) 2019238104Sdes{ 2020238104Sdes char *tmp_str; 2021238104Sdes char *str; 2022238104Sdes 2023238104Sdes /* check if buffer ends with \0, if not, and 2024238104Sdes if there is space, add it */ 2025238104Sdes if (*(ldns_buffer_at(buffer, ldns_buffer_position(buffer))) != 0) { 2026238104Sdes if (!ldns_buffer_reserve(buffer, 1)) { 2027238104Sdes return NULL; 2028238104Sdes } 2029238104Sdes ldns_buffer_write_u8(buffer, (uint8_t) '\0'); 2030238104Sdes if (!ldns_buffer_set_capacity(buffer, ldns_buffer_position(buffer))) { 2031238104Sdes return NULL; 2032238104Sdes } 2033238104Sdes } 2034238104Sdes 2035238104Sdes tmp_str = ldns_buffer_export(buffer); 2036238104Sdes str = LDNS_XMALLOC(char, strlen(tmp_str) + 1); 2037238104Sdes if(!str) { 2038238104Sdes return NULL; 2039238104Sdes } 2040238104Sdes memcpy(str, tmp_str, strlen(tmp_str) + 1); 2041238104Sdes 2042238104Sdes return str; 2043238104Sdes} 2044238104Sdes 2045238104Sdeschar * 2046238104Sdesldns_rdf2str(const ldns_rdf *rdf) 2047238104Sdes{ 2048238104Sdes char *result = NULL; 2049238104Sdes ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); 2050238104Sdes 2051238104Sdes if (!tmp_buffer) { 2052238104Sdes return NULL; 2053238104Sdes } 2054238104Sdes if (ldns_rdf2buffer_str(tmp_buffer, rdf) == LDNS_STATUS_OK) { 2055238104Sdes /* export and return string, destroy rest */ 2056238104Sdes result = ldns_buffer2str(tmp_buffer); 2057238104Sdes } 2058238104Sdes ldns_buffer_free(tmp_buffer); 2059238104Sdes return result; 2060238104Sdes} 2061238104Sdes 2062238104Sdeschar * 2063238104Sdesldns_rr2str_fmt(const ldns_output_format *fmt, const ldns_rr *rr) 2064238104Sdes{ 2065238104Sdes char *result = NULL; 2066238104Sdes ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); 2067238104Sdes 2068238104Sdes if (!tmp_buffer) { 2069238104Sdes return NULL; 2070238104Sdes } 2071238104Sdes if (ldns_rr2buffer_str_fmt(tmp_buffer, fmt, rr) 2072238104Sdes == LDNS_STATUS_OK) { 2073238104Sdes /* export and return string, destroy rest */ 2074238104Sdes result = ldns_buffer2str(tmp_buffer); 2075238104Sdes } 2076238104Sdes ldns_buffer_free(tmp_buffer); 2077238104Sdes return result; 2078238104Sdes} 2079238104Sdes 2080238104Sdeschar * 2081238104Sdesldns_rr2str(const ldns_rr *rr) 2082238104Sdes{ 2083238104Sdes return ldns_rr2str_fmt(ldns_output_format_default, rr); 2084238104Sdes} 2085238104Sdes 2086238104Sdeschar * 2087238104Sdesldns_pkt2str_fmt(const ldns_output_format *fmt, const ldns_pkt *pkt) 2088238104Sdes{ 2089238104Sdes char *result = NULL; 2090238104Sdes ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); 2091238104Sdes 2092238104Sdes if (!tmp_buffer) { 2093238104Sdes return NULL; 2094238104Sdes } 2095238104Sdes if (ldns_pkt2buffer_str_fmt(tmp_buffer, fmt, pkt) 2096238104Sdes == LDNS_STATUS_OK) { 2097238104Sdes /* export and return string, destroy rest */ 2098238104Sdes result = ldns_buffer2str(tmp_buffer); 2099238104Sdes } 2100238104Sdes 2101238104Sdes ldns_buffer_free(tmp_buffer); 2102238104Sdes return result; 2103238104Sdes} 2104238104Sdes 2105238104Sdeschar * 2106238104Sdesldns_pkt2str(const ldns_pkt *pkt) 2107238104Sdes{ 2108238104Sdes return ldns_pkt2str_fmt(ldns_output_format_default, pkt); 2109238104Sdes} 2110238104Sdes 2111238104Sdeschar * 2112238104Sdesldns_key2str(const ldns_key *k) 2113238104Sdes{ 2114238104Sdes char *result = NULL; 2115238104Sdes ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); 2116238104Sdes 2117238104Sdes if (!tmp_buffer) { 2118238104Sdes return NULL; 2119238104Sdes } 2120238104Sdes if (ldns_key2buffer_str(tmp_buffer, k) == LDNS_STATUS_OK) { 2121238104Sdes /* export and return string, destroy rest */ 2122238104Sdes result = ldns_buffer2str(tmp_buffer); 2123238104Sdes } 2124238104Sdes ldns_buffer_free(tmp_buffer); 2125238104Sdes return result; 2126238104Sdes} 2127238104Sdes 2128238104Sdeschar * 2129238104Sdesldns_rr_list2str_fmt(const ldns_output_format *fmt, const ldns_rr_list *list) 2130238104Sdes{ 2131238104Sdes char *result = NULL; 2132238104Sdes ldns_buffer *tmp_buffer = ldns_buffer_new(LDNS_MAX_PACKETLEN); 2133238104Sdes 2134238104Sdes if (!tmp_buffer) { 2135238104Sdes return NULL; 2136238104Sdes } 2137238104Sdes if (list) { 2138238104Sdes if (ldns_rr_list2buffer_str_fmt( 2139238104Sdes tmp_buffer, fmt, list) 2140238104Sdes == LDNS_STATUS_OK) { 2141238104Sdes } 2142238104Sdes } else { 2143238104Sdes if (fmt == NULL) { 2144238104Sdes fmt = ldns_output_format_default; 2145238104Sdes } 2146238104Sdes if (fmt->flags & LDNS_COMMENT_NULLS) { 2147238104Sdes ldns_buffer_printf(tmp_buffer, "; (null)\n"); 2148238104Sdes } 2149238104Sdes } 2150238104Sdes 2151238104Sdes /* export and return string, destroy rest */ 2152238104Sdes result = ldns_buffer2str(tmp_buffer); 2153238104Sdes ldns_buffer_free(tmp_buffer); 2154238104Sdes return result; 2155238104Sdes} 2156238104Sdes 2157238104Sdeschar * 2158238104Sdesldns_rr_list2str(const ldns_rr_list *list) 2159238104Sdes{ 2160238104Sdes return ldns_rr_list2str_fmt(ldns_output_format_default, list); 2161238104Sdes} 2162238104Sdes 2163238104Sdesvoid 2164238104Sdesldns_rdf_print(FILE *output, const ldns_rdf *rdf) 2165238104Sdes{ 2166238104Sdes char *str = ldns_rdf2str(rdf); 2167238104Sdes if (str) { 2168238104Sdes fprintf(output, "%s", str); 2169238104Sdes } else { 2170238104Sdes fprintf(output, "Unable to convert rdf to string\n"); 2171238104Sdes } 2172238104Sdes LDNS_FREE(str); 2173238104Sdes} 2174238104Sdes 2175238104Sdesvoid 2176238104Sdesldns_rr_print_fmt(FILE *output, 2177238104Sdes const ldns_output_format *fmt, const ldns_rr *rr) 2178238104Sdes{ 2179238104Sdes char *str = ldns_rr2str_fmt(fmt, rr); 2180238104Sdes if (str) { 2181238104Sdes fprintf(output, "%s", str); 2182238104Sdes } else { 2183238104Sdes fprintf(output, "Unable to convert rr to string\n"); 2184238104Sdes } 2185238104Sdes LDNS_FREE(str); 2186238104Sdes} 2187238104Sdes 2188238104Sdesvoid 2189238104Sdesldns_rr_print(FILE *output, const ldns_rr *rr) 2190238104Sdes{ 2191238104Sdes ldns_rr_print_fmt(output, ldns_output_format_default, rr); 2192238104Sdes} 2193238104Sdes 2194238104Sdesvoid 2195238104Sdesldns_pkt_print_fmt(FILE *output, 2196238104Sdes const ldns_output_format *fmt, const ldns_pkt *pkt) 2197238104Sdes{ 2198238104Sdes char *str = ldns_pkt2str_fmt(fmt, pkt); 2199238104Sdes if (str) { 2200238104Sdes fprintf(output, "%s", str); 2201238104Sdes } else { 2202238104Sdes fprintf(output, "Unable to convert packet to string\n"); 2203238104Sdes } 2204238104Sdes LDNS_FREE(str); 2205238104Sdes} 2206238104Sdes 2207238104Sdesvoid 2208238104Sdesldns_pkt_print(FILE *output, const ldns_pkt *pkt) 2209238104Sdes{ 2210238104Sdes ldns_pkt_print_fmt(output, ldns_output_format_default, pkt); 2211238104Sdes} 2212238104Sdes 2213238104Sdesvoid 2214238104Sdesldns_rr_list_print_fmt(FILE *output, 2215238104Sdes const ldns_output_format *fmt, const ldns_rr_list *lst) 2216238104Sdes{ 2217238104Sdes size_t i; 2218238104Sdes for (i = 0; i < ldns_rr_list_rr_count(lst); i++) { 2219238104Sdes ldns_rr_print_fmt(output, fmt, ldns_rr_list_rr(lst, i)); 2220238104Sdes } 2221238104Sdes} 2222238104Sdes 2223238104Sdesvoid 2224238104Sdesldns_rr_list_print(FILE *output, const ldns_rr_list *lst) 2225238104Sdes{ 2226238104Sdes ldns_rr_list_print_fmt(output, ldns_output_format_default, lst); 2227238104Sdes} 2228238104Sdes 2229238104Sdesvoid 2230238104Sdesldns_resolver_print_fmt(FILE *output, 2231238104Sdes const ldns_output_format *fmt, const ldns_resolver *r) 2232238104Sdes{ 2233238104Sdes uint16_t i; 2234238104Sdes ldns_rdf **n; 2235238104Sdes ldns_rdf **s; 2236238104Sdes size_t *rtt; 2237238104Sdes if (!r) { 2238238104Sdes return; 2239238104Sdes } 2240238104Sdes n = ldns_resolver_nameservers(r); 2241238104Sdes s = ldns_resolver_searchlist(r); 2242238104Sdes rtt = ldns_resolver_rtt(r); 2243238104Sdes 2244238104Sdes fprintf(output, "port: %d\n", (int)ldns_resolver_port(r)); 2245238104Sdes fprintf(output, "edns0 size: %d\n", (int)ldns_resolver_edns_udp_size(r)); 2246238104Sdes fprintf(output, "use ip6: %d\n", (int)ldns_resolver_ip6(r)); 2247238104Sdes 2248238104Sdes fprintf(output, "recursive: %d\n", ldns_resolver_recursive(r)); 2249238104Sdes fprintf(output, "usevc: %d\n", ldns_resolver_usevc(r)); 2250238104Sdes fprintf(output, "igntc: %d\n", ldns_resolver_igntc(r)); 2251238104Sdes fprintf(output, "fail: %d\n", ldns_resolver_fail(r)); 2252238104Sdes fprintf(output, "retry: %d\n", (int)ldns_resolver_retry(r)); 2253238104Sdes fprintf(output, "retrans: %d\n", (int)ldns_resolver_retrans(r)); 2254238104Sdes fprintf(output, "fallback: %d\n", ldns_resolver_fallback(r)); 2255238104Sdes fprintf(output, "random: %d\n", ldns_resolver_random(r)); 2256238104Sdes fprintf(output, "timeout: %d\n", (int)ldns_resolver_timeout(r).tv_sec); 2257238104Sdes fprintf(output, "dnssec: %d\n", ldns_resolver_dnssec(r)); 2258238104Sdes fprintf(output, "dnssec cd: %d\n", ldns_resolver_dnssec_cd(r)); 2259238104Sdes fprintf(output, "trust anchors (%d listed):\n", 2260238104Sdes (int)ldns_rr_list_rr_count(ldns_resolver_dnssec_anchors(r))); 2261238104Sdes ldns_rr_list_print_fmt(output, fmt, ldns_resolver_dnssec_anchors(r)); 2262238104Sdes fprintf(output, "tsig: %s %s\n", 2263238104Sdes ldns_resolver_tsig_keyname(r)?ldns_resolver_tsig_keyname(r):"-", 2264238104Sdes ldns_resolver_tsig_algorithm(r)?ldns_resolver_tsig_algorithm(r):"-"); 2265238104Sdes fprintf(output, "debug: %d\n", ldns_resolver_debug(r)); 2266238104Sdes 2267238104Sdes fprintf(output, "default domain: "); 2268238104Sdes ldns_rdf_print(output, ldns_resolver_domain(r)); 2269238104Sdes fprintf(output, "\n"); 2270238104Sdes fprintf(output, "apply default domain: %d\n", ldns_resolver_defnames(r)); 2271238104Sdes 2272238104Sdes fprintf(output, "searchlist (%d listed):\n", (int)ldns_resolver_searchlist_count(r)); 2273238104Sdes for (i = 0; i < ldns_resolver_searchlist_count(r); i++) { 2274238104Sdes fprintf(output, "\t"); 2275238104Sdes ldns_rdf_print(output, s[i]); 2276238104Sdes fprintf(output, "\n"); 2277238104Sdes } 2278238104Sdes fprintf(output, "apply search list: %d\n", ldns_resolver_dnsrch(r)); 2279238104Sdes 2280238104Sdes fprintf(output, "nameservers (%d listed):\n", (int)ldns_resolver_nameserver_count(r)); 2281238104Sdes for (i = 0; i < ldns_resolver_nameserver_count(r); i++) { 2282238104Sdes fprintf(output, "\t"); 2283238104Sdes ldns_rdf_print(output, n[i]); 2284238104Sdes 2285238104Sdes switch ((int)rtt[i]) { 2286238104Sdes case LDNS_RESOLV_RTT_MIN: 2287238104Sdes fprintf(output, " - reachable\n"); 2288238104Sdes break; 2289238104Sdes case LDNS_RESOLV_RTT_INF: 2290238104Sdes fprintf(output, " - unreachable\n"); 2291238104Sdes break; 2292238104Sdes } 2293238104Sdes } 2294238104Sdes} 2295238104Sdes 2296238104Sdesvoid 2297238104Sdesldns_resolver_print(FILE *output, const ldns_resolver *r) 2298238104Sdes{ 2299238104Sdes ldns_resolver_print_fmt(output, ldns_output_format_default, r); 2300238104Sdes} 2301238104Sdes 2302238104Sdesvoid 2303238104Sdesldns_zone_print_fmt(FILE *output, 2304238104Sdes const ldns_output_format *fmt, const ldns_zone *z) 2305238104Sdes{ 2306238104Sdes if(ldns_zone_soa(z)) 2307238104Sdes ldns_rr_print_fmt(output, fmt, ldns_zone_soa(z)); 2308238104Sdes ldns_rr_list_print_fmt(output, fmt, ldns_zone_rrs(z)); 2309238104Sdes} 2310238104Sdesvoid 2311238104Sdesldns_zone_print(FILE *output, const ldns_zone *z) 2312238104Sdes{ 2313238104Sdes ldns_zone_print_fmt(output, ldns_output_format_default, z); 2314238104Sdes} 2315