19#ifdef HAVE_SYS_SOCKET_H
20#include <sys/socket.h>
22#ifdef HAVE_ARPA_INET_H
32#include <openssl/bn.h>
33#include <openssl/rsa.h>
35#include <openssl/dsa.h>
39#ifndef INET_ADDRSTRLEN
40#define INET_ADDRSTRLEN 16
42#ifndef INET6_ADDRSTRLEN
43#define INET6_ADDRSTRLEN 46
203 if (lt && lt->
name) {
208 return ldns_buffer_status(output);
215 if (lt && lt->
name) {
220 return ldns_buffer_status(output);
229 if (lt && lt->
name) {
234 return ldns_buffer_status(output);
243 if (lt && lt->
name) {
249 return ldns_buffer_status(output);
360 for(i = 0; i < len; i++) {
364 c = (
unsigned char) data[src_pos];
365 if(c ==
'.' || c ==
';' ||
366 c ==
'(' || c ==
')' ||
370 }
else if (!(isascii(c) && isgraph(c))) {
385 return ldns_buffer_status(output);
393 return ldns_buffer_status(output);
401 return ldns_buffer_status(output);
409 return ldns_buffer_status(output);
419 memset(&tm, 0,
sizeof(tm));
421 && strftime(date_buf, 15,
"%Y%m%d%H%M%S", &tm)) {
424 return ldns_buffer_status(output);
435 return ldns_buffer_status(output);
447 return ldns_buffer_status(output);
452 size_t amount,
const uint8_t* characters)
457 if (isprint((
int)ch) || ch ==
'\t') {
458 if (ch ==
'\"' || ch ==
'\\')
464 (
unsigned)(uint8_t) ch);
480 ldns_characters2buffer_str(output,
483 return ldns_buffer_status(output);
494 return ldns_buffer_status(output);
505 return ldns_buffer_status(output);
526 return ldns_buffer_status(output);
537 return ldns_buffer_status(output);
546 if (! ldns_output_format_covers_type(fmt, data) &&
554 return ldns_buffer_status(output);
560 return ldns_rdf2buffer_str_type_fmt(output,
576 return ldns_buffer_status(output);
590 return ldns_buffer_status(output);
600loc_cm_print(
ldns_buffer *output, uint8_t mantissa, uint8_t exponent)
612 for(i=0; i<exponent-2; i++)
640 if (descriptor && descriptor->
_name) {
646 return ldns_buffer_status(output);
682 return ldns_buffer_status(output);
710 uint8_t horizontal_precision;
711 uint8_t vertical_precision;
715 char latitude_hemisphere;
716 char longitude_hemisphere;
721 uint32_t equator = (uint32_t) ldns_power(2, 31);
739 if (latitude > equator) {
740 latitude_hemisphere =
'N';
741 latitude = latitude - equator;
743 latitude_hemisphere =
'S';
744 latitude = equator - latitude;
746 h = latitude / (1000 * 60 * 60);
747 latitude = latitude % (1000 * 60 * 60);
748 m = latitude / (1000 * 60);
749 latitude = latitude % (1000 * 60);
750 s = (double) latitude / 1000.0;
752 h, m, s, latitude_hemisphere);
754 if (longitude > equator) {
755 longitude_hemisphere =
'E';
756 longitude = longitude - equator;
758 longitude_hemisphere =
'W';
759 longitude = equator - longitude;
761 h = longitude / (1000 * 60 * 60);
762 longitude = longitude % (1000 * 60 * 60);
763 m = longitude / (1000 * 60);
764 longitude = longitude % (1000 * 60);
765 s = (double) longitude / (1000.0);
767 h, m, s, longitude_hemisphere);
769 s = ((double) altitude) / 100;
772 if(altitude%100 != 0)
779 loc_cm_print(output, (size & 0xf0) >> 4, size & 0x0f);
782 loc_cm_print(output, (horizontal_precision & 0xf0) >> 4,
783 horizontal_precision & 0x0f);
786 loc_cm_print(output, (vertical_precision & 0xf0) >> 4,
787 vertical_precision & 0x0f);
790 return ldns_buffer_status(output);
820 struct protoent *protocol;
821 char *proto_name = NULL;
823 struct servent *service;
824 uint16_t current_service;
830 protocol = getprotobynumber((
int) protocol_nr);
831 if (protocol && (protocol->p_name != NULL)) {
832 proto_name = protocol->p_name;
838#ifdef HAVE_ENDPROTOENT
842 for (current_service = 0;
843 current_service < (
ldns_rdf_size(rdf)-1)*8; current_service++) {
845 service = getservbyport((
int) htons(current_service),
847 if (service && service->s_name) {
852#ifdef HAVE_ENDSERVENT
857 if(current_service == 65535) {
break; }
859 return ldns_buffer_status(output);
869 uint8_t window_block_nr;
870 uint8_t bitmap_length;
877 window_block_nr = data[pos];
878 bitmap_length = data[pos + 1];
883 for (bit_pos = 0; bit_pos < (bitmap_length) * 8; bit_pos++) {
887 type = 256 * (uint16_t) window_block_nr + bit_pos;
889 if (! ldns_output_format_covers_type(fmt, type) &&
899 pos += (uint16_t) bitmap_length;
901 return ldns_buffer_status(output);
907 return ldns_rdf2buffer_str_nsec_fmt(output,
922 salt_length = data[0];
924 if (salt_length == 0 || ((
size_t)salt_length)+1 >
ldns_rdf_size(rdf)) {
927 for (salt_pos = 0; salt_pos < salt_length; salt_pos++) {
933 return ldns_buffer_status(output);
944 return ldns_buffer_status(output);
951 uint64_t tsigtime = 0;
953 uint64_t d0, d1, d2, d3, d4, d5;
964 tsigtime = (d0<<40) | (d1<<32) | (d2<<24) | (d3<<16) | (d4<<8) | d5;
968 return ldns_buffer_status(output);
975 uint16_t address_family;
985 address_family = ldns_read_uint16(&data[pos]);
986 prefix = data[pos + 2];
996 for (i = 0; i < 4; i++) {
1000 if (i < (
unsigned short) adf_length) {
1017 for (i = 0; i < 16; i++) {
1018 if (i % 2 == 0 && i > 0) {
1021 if (i < (
unsigned short) adf_length) {
1035 "Unknown address family: %u data: ",
1037 for (i = 1; i < (
unsigned short) (4 + adf_length); i++) {
1043 pos += 4 + adf_length;
1045 return ldns_buffer_status(output);
1057 size = ldns_b64_ntop_calculate_size(
ldns_rdf_size(rdf) - 2);
1072 return ldns_buffer_status(output);
1083 uint8_t gateway_type;
1087 uint8_t *gateway_data;
1089 size_t public_key_size;
1090 uint8_t *public_key_data;
1099 precedence = data[0];
1100 gateway_type = data[1];
1101 algorithm = data[2];
1104 switch (gateway_type) {
1157 public_key_data =
LDNS_XMALLOC(uint8_t, public_key_size);
1158 if(!public_key_data) {
1162 memcpy(public_key_data, &data[offset], public_key_size);
1164 public_key_size, public_key_data);
1182 return ldns_buffer_status(output);
1196 return ldns_buffer_status(output);
1209 return ldns_buffer_status(output);
1223 return ldns_buffer_status(output);
1230 const uint8_t* chars;
1241 while (nchars > 0) {
1242 ch = (char)*chars++;
1243 if (! isalnum((
unsigned char)ch)) {
1249 return ldns_buffer_status(output);
1257 ldns_characters2buffer_str(output,
1260 return ldns_buffer_status(output);
1275 if ((hit_size = data[0]) == 0 ||
1276 (pk_size = ldns_read_uint16(data + 2)) == 0 ||
1277 rdf_size < (
size_t) hit_size + pk_size + 4) {
1284 for (data += 4; hit_size > 0; hit_size--, data++) {
1288 ldns_buffer_write_char(output, (uint8_t)
' ');
1291 ldns_b64_ntop_calculate_size(pk_size))) {
1294 (
char *) ldns_buffer_current(output),
1295 ldns_buffer_remaining(output));
1298 written < (
int) ldns_buffer_remaining(output)) {
1303 return ldns_buffer_status(output);
1315 uint8_t discovery_optional;
1319 uint8_t *relay_data;
1327 precedence = data[0];
1328 discovery_optional = ((data[1] & 0x80) >> 7);
1329 relay_type = data[1] & 0x7F;
1332 switch (relay_type) {
1385 precedence, discovery_optional, relay_type);
1390 return ldns_buffer_status(output);
1393#ifdef RRTYPE_SVCB_HTTPS
1397svcparam_mandatory2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1403 for (data += 2, sz -= 2; sz; data += 2, sz -= 2) {
1404 ldns_buffer_write_char(output,
',');
1407 return ldns_buffer_status(output);
1411svcparam_alpn2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1413 uint8_t *eod = data + sz, *dp;
1417 for (dp = data; dp < eod && !quote; dp += 1 + *dp) {
1418 if (dp + 1 + *dp > eod)
1421 for (i = 0; i < *dp; i++)
1422 if (isspace(dp[i + 1]))
1427 ldns_buffer_write_char(output,
'"');
1428 while (data < eod) {
1429 uint8_t *eot = data + 1 + *data;
1434 if (eod - data < (
int)sz)
1435 ldns_buffer_write_char(output,
',');
1437 for (data += 1; data < eot; data += 1) {
1440 if (isprint(ch) || ch ==
'\t') {
1441 if (ch ==
'"' || ch ==
',' || ch ==
'\\')
1442 ldns_buffer_write_char(output,
'\\');
1443 ldns_buffer_write_char(output, ch);
1450 ldns_buffer_write_char(output,
'"');
1451 return ldns_buffer_status(output);
1455svcparam_port2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1460 return ldns_buffer_status(output);
1464svcparam_ipv4hint2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1471 ldns_buffer_write_chars(output, str);
1473 for (data += 4, sz -= 4; sz ; data += 4, sz -= 4 ) {
1474 ldns_buffer_write_char(output,
',');
1478 ldns_buffer_write_chars(output, str);
1480 return ldns_buffer_status(output);
1484svcparam_ech2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1486 size_t str_sz = ldns_b64_ntop_calculate_size(sz);
1493 , (
char *)ldns_buffer_current(output), str_sz);
1495 ldns_buffer_skip(output, written);
1499 return ldns_buffer_status(output);
1503svcparam_ipv6hint2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1510 ldns_buffer_write_chars(output, str);
1512 for (data += 16, sz -= 16; sz ; data += 16, sz -= 16) {
1513 ldns_buffer_write_char(output,
',');
1517 ldns_buffer_write_chars(output, str);
1519 return ldns_buffer_status(output);
1523svcparam_value2buffer_str(
ldns_buffer *output,
size_t sz, uint8_t *data)
1525 uint8_t *eod = data + sz, *dp;
1528 for (dp = data; dp < eod && !isspace(*dp); dp++)
1531 if ((quote = dp < eod))
1532 ldns_buffer_write_char(output,
'"');
1534 for (dp = data; dp < eod; dp++) {
1537 if (isprint(ch) || ch ==
'\t') {
1538 if (ch ==
'"' || ch ==
'\\')
1539 ldns_buffer_write_char(output,
'\\');
1540 ldns_buffer_write_char(output, ch);
1545 ldns_buffer_write_char(output,
'"');
1546 return ldns_buffer_status(output);
1552 uint8_t *data, *dp, *next_dp = NULL;
1563 for (dp = data; dp + 4 <= data + sz; dp = next_dp) {
1565 uint16_t val_sz = ldns_read_uint16(dp + 2);
1567 if ((next_dp = dp + 4 + val_sz) > data + sz)
1571 ldns_buffer_write_char(output,
' ');
1579 ldns_buffer_write_char(output,
'=');
1582 st = svcparam_mandatory2buffer_str(output, val_sz, dp);
1585 st = svcparam_alpn2buffer_str(output, val_sz, dp);
1590 st = svcparam_port2buffer_str(output, val_sz, dp);
1593 st = svcparam_ipv4hint2buffer_str(output, val_sz, dp);
1596 st = svcparam_ech2buffer_str(output, val_sz, dp);
1599 st = svcparam_ipv6hint2buffer_str(output, val_sz, dp);
1602 st = svcparam_value2buffer_str(output, val_sz, dp);
1608 return ldns_buffer_status(output);
1614 (void)output; (void)rdf;
1674 res = ldns_rdf2buffer_str_nsec_fmt(buffer, fmt, rdf);
1680 res = ldns_rdf2buffer_str_type_fmt(buffer, fmt, rdf);
1756ldns_b32_ext2dname(
const ldns_rdf *rdf)
1764 size = ldns_b32_ntop_calculate_size(
ldns_rdf_size(rdf) - 1);