Home | History | Annotate | Line # | Download | only in utilities
      1 /*
      2  * Copyright (c) 2022-2024 Apple Inc. All rights reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     https://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //======================================================================================================================
     18 // MARK: - Headers
     19 
     20 #include "dns_obj_log.h"
     21 #include "dns_common.h"
     22 #include "dns_sd.h"
     23 
     24 #include "dns_assert_macros.h"
     25 #include "mdns_strict.h"
     26 
     27 //======================================================================================================================
     28 // MARK: - Public Functions
     29 
     30 uint16_t
     31 get_uint16_from_bytes(const uint8_t * const bytes)
     32 {
     33 	return (uint16_t)((uint16_t)bytes[0] << 8 |
     34 					  (uint16_t)bytes[1]);
     35 }
     36 
     37 //======================================================================================================================
     38 
     39 uint32_t
     40 get_uint32_from_bytes(const uint8_t * const bytes)
     41 {
     42 	return (uint32_t)((uint32_t)bytes[0] << 24	|
     43 					  (uint32_t)bytes[1] << 16	|
     44 					  (uint32_t)bytes[2] << 8	|
     45 					  (uint32_t)bytes[3]);
     46 }
     47 
     48 //======================================================================================================================
     49 
     50 static uint8_t *
     51 _write_uint16_to_bytes(uint8_t *ptr, const uint16_t u16)
     52 {
     53 	*ptr++ = (uint8_t)((u16 >> 8)	& 0xFF);
     54 	*ptr++ = (uint8_t)( u16			& 0xFF);
     55 	return ptr;
     56 }
     57 
     58 void
     59 put_uint16_to_bytes(const uint16_t u16, uint8_t ** const ptr)
     60 {
     61 	*ptr = _write_uint16_to_bytes(*ptr, u16);
     62 }
     63 
     64 //======================================================================================================================
     65 
     66 static uint8_t *
     67 _write_uint32_to_bytes(uint8_t *ptr, const uint32_t u32)
     68 {
     69 	*ptr++ = (uint8_t)((u32 >> 24)	& 0xFF);
     70 	*ptr++ = (uint8_t)((u32 >> 16)	& 0xFF);
     71 	*ptr++ = (uint8_t)((u32 >>  8)	& 0xFF);
     72 	*ptr++ = (uint8_t)( u32			& 0xFF);
     73 	return ptr;
     74 }
     75 
     76 void
     77 put_uint32_to_bytes(const uint32_t u32, uint8_t ** const ptr)
     78 {
     79 	*ptr = _write_uint32_to_bytes(*ptr, u32);
     80 }
     81 
     82 //======================================================================================================================
     83 
     84 char *
     85 put_hex_from_bytes(const uint8_t * const bytes, const size_t len, char * const buffer, const size_t buffer_len)
     86 {
     87 	if (bytes == NULL || len == 0) {
     88 		return buffer;
     89 	}
     90 
     91 	if (buffer_len <= len * 2) {
     92 		return buffer;
     93 	}
     94 
     95 	char *ptr = buffer;
     96 	const char * const limit = buffer + buffer_len;
     97 	for (size_t i = 0; i < len; i++) {
     98 		ptr += snprintf(ptr, (size_t)(limit - ptr), "%02X", bytes[i]);
     99 	}
    100 
    101 	return ptr;
    102 }
    103 
    104 //======================================================================================================================
    105 
    106 const char *
    107 dns_record_type_value_to_string(const uint16_t type)
    108 {
    109 	switch(type)
    110 	{
    111 		case kDNSRecordType_A:			return("A");
    112 		case kDNSRecordType_NS:			return("NS");
    113 		case kDNSRecordType_MD:			return("MD");
    114 		case kDNSRecordType_MF:			return("MF");
    115 		case kDNSRecordType_CNAME:		return("CNAME");
    116 		case kDNSRecordType_SOA:		return("SOA");
    117 		case kDNSRecordType_MB:			return("MB");
    118 		case kDNSRecordType_MG:			return("MG");
    119 		case kDNSRecordType_MR:			return("MR");
    120 		case kDNSRecordType_NULL:		return("NULL");
    121 		case kDNSRecordType_WKS:		return("WKS");
    122 		case kDNSRecordType_PTR:		return("PTR");
    123 		case kDNSRecordType_HINFO:		return("HINFO");
    124 		case kDNSRecordType_MINFO:		return("MINFO");
    125 		case kDNSRecordType_MX:			return("MX");
    126 		case kDNSRecordType_TXT:		return("TXT");
    127 		case kDNSRecordType_RP:			return("RP");
    128 		case kDNSRecordType_AFSDB:		return("AFSDB");
    129 		case kDNSRecordType_X25:		return("X25");
    130 		case kDNSRecordType_ISDN:		return("ISDN");
    131 		case kDNSRecordType_RT:			return("RT");
    132 		case kDNSRecordType_NSAP:		return("NSAP");
    133 		case kDNSRecordType_NSAP_PTR:	return("NSAP-PTR");
    134 		case kDNSRecordType_SIG:		return("SIG");
    135 		case kDNSRecordType_KEY:		return("KEY");
    136 		case kDNSRecordType_PX:			return("PX");
    137 		case kDNSRecordType_GPOS:		return("GPOS");
    138 		case kDNSRecordType_AAAA:		return("AAAA");
    139 		case kDNSRecordType_LOC:		return("LOC");
    140 		case kDNSRecordType_NXT:		return("NXT");
    141 		case kDNSRecordType_EID:		return("EID");
    142 		case kDNSRecordType_NIMLOC:		return("NIMLOC");
    143 		case kDNSRecordType_SRV:		return("SRV");
    144 		case kDNSRecordType_ATMA:		return("ATMA");
    145 		case kDNSRecordType_NAPTR:		return("NAPTR");
    146 		case kDNSRecordType_KX:			return("KX");
    147 		case kDNSRecordType_CERT:		return("CERT");
    148 		case kDNSRecordType_A6:			return("A6");
    149 		case kDNSRecordType_DNAME:		return("DNAME");
    150 		case kDNSRecordType_SINK:		return("SINK");
    151 		case kDNSRecordType_OPT:		return("OPT");
    152 		case kDNSRecordType_APL:		return("APL");
    153 		case kDNSRecordType_DS:			return("DS");
    154 		case kDNSRecordType_SSHFP:		return("SSHFP");
    155 		case kDNSRecordType_IPSECKEY:	return("IPSECKEY");
    156 		case kDNSRecordType_RRSIG:		return("RRSIG");
    157 		case kDNSRecordType_NSEC:		return("NSEC");
    158 		case kDNSRecordType_DNSKEY:		return("DNSKEY");
    159 		case kDNSRecordType_DHCID:		return("DHCID");
    160 		case kDNSRecordType_NSEC3:		return("NSEC3");
    161 		case kDNSRecordType_NSEC3PARAM:	return("NSEC3PARAM");
    162 		case kDNSRecordType_TLSA:		return("TLSA");
    163 		case kDNSRecordType_SMIMEA:		return("SMIMEA");
    164 		case kDNSRecordType_HIP:		return("HIP");
    165 		case kDNSRecordType_NINFO:		return("NINFO");
    166 		case kDNSRecordType_RKEY:		return("RKEY");
    167 		case kDNSRecordType_TALINK:		return("TALINK");
    168 		case kDNSRecordType_CDS:		return("CDS");
    169 		case kDNSRecordType_CDNSKEY:	return("CDNSKEY");
    170 		case kDNSRecordType_OPENPGPKEY:	return("OPENPGPKEY");
    171 		case kDNSRecordType_CSYNC:		return("CSYNC");
    172 		case kDNSRecordType_ZONEMD:		return("ZONEMD");
    173 		case kDNSRecordType_SVCB:		return("SVCB");
    174 		case kDNSRecordType_HTTPS:		return("HTTPS");
    175 		case kDNSRecordType_SPF:		return("SPF");
    176 		case kDNSRecordType_UINFO:		return("UINFO");
    177 		case kDNSRecordType_UID:		return("UID");
    178 		case kDNSRecordType_GID:		return("GID");
    179 		case kDNSRecordType_UNSPEC:		return("UNSPEC");
    180 		case kDNSRecordType_NID:		return("NID");
    181 		case kDNSRecordType_L32:		return("L32");
    182 		case kDNSRecordType_L64:		return("L64");
    183 		case kDNSRecordType_LP:			return("LP");
    184 		case kDNSRecordType_EUI48:		return("EUI48");
    185 		case kDNSRecordType_EUI64:		return("EUI64");
    186 		case kDNSRecordType_TKEY:		return("TKEY");
    187 		case kDNSRecordType_TSIG:		return("TSIG");
    188 		case kDNSRecordType_IXFR:		return("IXFR");
    189 		case kDNSRecordType_AXFR:		return("AXFR");
    190 		case kDNSRecordType_MAILB:		return("MAILB");
    191 		case kDNSRecordType_MAILA:		return("MAILA");
    192 		case kDNSRecordType_ANY:		return("ANY");
    193 		case kDNSRecordType_URI:		return("URI");
    194 		case kDNSRecordType_CAA:		return("CAA");
    195 		case kDNSRecordType_AVC:		return("AVC");
    196 		case kDNSRecordType_DOA:		return("DOA");
    197 		case kDNSRecordType_AMTRELAY:	return("AMTRELAY");
    198 		case kDNSRecordType_TA:			return("TA");
    199 		case kDNSRecordType_DLV:		return("DLV");
    200 		case kDNSRecordType_Reserved:	return("Reserved");
    201 		default:						return NULL;
    202 	}
    203 }
    204 
    205 //======================================================================================================================
    206 
    207 const char *
    208 dns_obj_error_get_error_description(const dns_obj_error_t error)
    209 {
    210 	switch (error) {
    211 		case DNS_OBJ_ERROR_NO_ERROR:
    212 			return "No error.";
    213 		default:
    214 			return "DNS object error.";
    215 	}
    216 }
    217