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