/* * Copyright (c) 2022-2024 Apple Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ //====================================================================================================================== // MARK: - Headers #include "dns_obj_log.h" #include "dns_common.h" #include "dns_sd.h" #include "dns_assert_macros.h" #include "mdns_strict.h" //====================================================================================================================== // MARK: - Public Functions uint16_t get_uint16_from_bytes(const uint8_t * const bytes) { return (uint16_t)((uint16_t)bytes[0] << 8 | (uint16_t)bytes[1]); } //====================================================================================================================== uint32_t get_uint32_from_bytes(const uint8_t * const bytes) { return (uint32_t)((uint32_t)bytes[0] << 24 | (uint32_t)bytes[1] << 16 | (uint32_t)bytes[2] << 8 | (uint32_t)bytes[3]); } //====================================================================================================================== static uint8_t * _write_uint16_to_bytes(uint8_t *ptr, const uint16_t u16) { *ptr++ = (uint8_t)((u16 >> 8) & 0xFF); *ptr++ = (uint8_t)( u16 & 0xFF); return ptr; } void put_uint16_to_bytes(const uint16_t u16, uint8_t ** const ptr) { *ptr = _write_uint16_to_bytes(*ptr, u16); } //====================================================================================================================== static uint8_t * _write_uint32_to_bytes(uint8_t *ptr, const uint32_t u32) { *ptr++ = (uint8_t)((u32 >> 24) & 0xFF); *ptr++ = (uint8_t)((u32 >> 16) & 0xFF); *ptr++ = (uint8_t)((u32 >> 8) & 0xFF); *ptr++ = (uint8_t)( u32 & 0xFF); return ptr; } void put_uint32_to_bytes(const uint32_t u32, uint8_t ** const ptr) { *ptr = _write_uint32_to_bytes(*ptr, u32); } //====================================================================================================================== char * put_hex_from_bytes(const uint8_t * const bytes, const size_t len, char * const buffer, const size_t buffer_len) { if (bytes == NULL || len == 0) { return buffer; } if (buffer_len <= len * 2) { return buffer; } char *ptr = buffer; const char * const limit = buffer + buffer_len; for (size_t i = 0; i < len; i++) { ptr += snprintf(ptr, (size_t)(limit - ptr), "%02X", bytes[i]); } return ptr; } //====================================================================================================================== const char * dns_record_type_value_to_string(const uint16_t type) { switch(type) { case kDNSRecordType_A: return("A"); case kDNSRecordType_NS: return("NS"); case kDNSRecordType_MD: return("MD"); case kDNSRecordType_MF: return("MF"); case kDNSRecordType_CNAME: return("CNAME"); case kDNSRecordType_SOA: return("SOA"); case kDNSRecordType_MB: return("MB"); case kDNSRecordType_MG: return("MG"); case kDNSRecordType_MR: return("MR"); case kDNSRecordType_NULL: return("NULL"); case kDNSRecordType_WKS: return("WKS"); case kDNSRecordType_PTR: return("PTR"); case kDNSRecordType_HINFO: return("HINFO"); case kDNSRecordType_MINFO: return("MINFO"); case kDNSRecordType_MX: return("MX"); case kDNSRecordType_TXT: return("TXT"); case kDNSRecordType_RP: return("RP"); case kDNSRecordType_AFSDB: return("AFSDB"); case kDNSRecordType_X25: return("X25"); case kDNSRecordType_ISDN: return("ISDN"); case kDNSRecordType_RT: return("RT"); case kDNSRecordType_NSAP: return("NSAP"); case kDNSRecordType_NSAP_PTR: return("NSAP-PTR"); case kDNSRecordType_SIG: return("SIG"); case kDNSRecordType_KEY: return("KEY"); case kDNSRecordType_PX: return("PX"); case kDNSRecordType_GPOS: return("GPOS"); case kDNSRecordType_AAAA: return("AAAA"); case kDNSRecordType_LOC: return("LOC"); case kDNSRecordType_NXT: return("NXT"); case kDNSRecordType_EID: return("EID"); case kDNSRecordType_NIMLOC: return("NIMLOC"); case kDNSRecordType_SRV: return("SRV"); case kDNSRecordType_ATMA: return("ATMA"); case kDNSRecordType_NAPTR: return("NAPTR"); case kDNSRecordType_KX: return("KX"); case kDNSRecordType_CERT: return("CERT"); case kDNSRecordType_A6: return("A6"); case kDNSRecordType_DNAME: return("DNAME"); case kDNSRecordType_SINK: return("SINK"); case kDNSRecordType_OPT: return("OPT"); case kDNSRecordType_APL: return("APL"); case kDNSRecordType_DS: return("DS"); case kDNSRecordType_SSHFP: return("SSHFP"); case kDNSRecordType_IPSECKEY: return("IPSECKEY"); case kDNSRecordType_RRSIG: return("RRSIG"); case kDNSRecordType_NSEC: return("NSEC"); case kDNSRecordType_DNSKEY: return("DNSKEY"); case kDNSRecordType_DHCID: return("DHCID"); case kDNSRecordType_NSEC3: return("NSEC3"); case kDNSRecordType_NSEC3PARAM: return("NSEC3PARAM"); case kDNSRecordType_TLSA: return("TLSA"); case kDNSRecordType_SMIMEA: return("SMIMEA"); case kDNSRecordType_HIP: return("HIP"); case kDNSRecordType_NINFO: return("NINFO"); case kDNSRecordType_RKEY: return("RKEY"); case kDNSRecordType_TALINK: return("TALINK"); case kDNSRecordType_CDS: return("CDS"); case kDNSRecordType_CDNSKEY: return("CDNSKEY"); case kDNSRecordType_OPENPGPKEY: return("OPENPGPKEY"); case kDNSRecordType_CSYNC: return("CSYNC"); case kDNSRecordType_ZONEMD: return("ZONEMD"); case kDNSRecordType_SVCB: return("SVCB"); case kDNSRecordType_HTTPS: return("HTTPS"); case kDNSRecordType_SPF: return("SPF"); case kDNSRecordType_UINFO: return("UINFO"); case kDNSRecordType_UID: return("UID"); case kDNSRecordType_GID: return("GID"); case kDNSRecordType_UNSPEC: return("UNSPEC"); case kDNSRecordType_NID: return("NID"); case kDNSRecordType_L32: return("L32"); case kDNSRecordType_L64: return("L64"); case kDNSRecordType_LP: return("LP"); case kDNSRecordType_EUI48: return("EUI48"); case kDNSRecordType_EUI64: return("EUI64"); case kDNSRecordType_TKEY: return("TKEY"); case kDNSRecordType_TSIG: return("TSIG"); case kDNSRecordType_IXFR: return("IXFR"); case kDNSRecordType_AXFR: return("AXFR"); case kDNSRecordType_MAILB: return("MAILB"); case kDNSRecordType_MAILA: return("MAILA"); case kDNSRecordType_ANY: return("ANY"); case kDNSRecordType_URI: return("URI"); case kDNSRecordType_CAA: return("CAA"); case kDNSRecordType_AVC: return("AVC"); case kDNSRecordType_DOA: return("DOA"); case kDNSRecordType_AMTRELAY: return("AMTRELAY"); case kDNSRecordType_TA: return("TA"); case kDNSRecordType_DLV: return("DLV"); case kDNSRecordType_Reserved: return("Reserved"); default: return NULL; } } //====================================================================================================================== const char * dns_obj_error_get_error_description(const dns_obj_error_t error) { switch (error) { case DNS_OBJ_ERROR_NO_ERROR: return "No error."; default: return "DNS object error."; } }