/* * Copyright (c) 2018, 2021 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. */ #include "DNSCommon.h" // Defines general DNS utility routines #include "unittest_common.h" #include "mDNSFeatures.h" mDNSexport mStatus mDNS_InitStorage_ut(mDNS *const m, mDNS_PlatformSupport *const p, CacheEntity *rrcachestorage, mDNSu32 rrcachesize, mDNSBool AdvertiseLocalAddresses, mDNSCallback *Callback, void *Context) { return mDNS_InitStorage(m, p, rrcachestorage, rrcachesize, AdvertiseLocalAddresses, Callback, Context); } #if MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2) void ParseCNameChainFromMessage_ut( const DNSMessage *const response, const mDNSu8 *const limit, const mDNSInterfaceID InterfaceID, const domainname *const qname, domainname cnameChain[static const MAX_CNAME_TRAVERSAL], mDNSu32 *const outChainLen) { ParseCNameChainFromMessage(response, limit, InterfaceID, qname, cnameChain, outChainLen); } void ParseDenialOfExistenceObjsFromMessage_ut( const DNSMessage *const response, const mDNSu8 *const limit, const mDNSInterfaceID InterfaceID, dnssec_obj_rr_soa_t *const outObjSOA, dnssec_obj_rr_rrsig_t objSOARRSIG[static const MAX_NUM_RRSIG_TO_PROCESS], mDNSu8 *const outSOARRSIGCount, dnssec_obj_rr_nsec_t outObjNSECs[static const MAX_NUM_NSEC_NSEC3_TO_PROCESS], mDNSu8 *const outNSECCount, dnssec_obj_rr_nsec3_t outObjNSEC3s[static const MAX_NUM_NSEC_NSEC3_TO_PROCESS], mDNSu8 *const outNSEC3Count, dnssec_obj_rr_rrsig_t outObjRRSIGs[static const MAX_NUM_RRSIG_TO_PROCESS], mDNSu8 *const outRRSIGCount) { ParseDenialOfExistenceObjsFromMessage(response, limit, InterfaceID, outObjSOA, objSOARRSIG, outSOARRSIGCount, outObjNSECs, outNSECCount, outObjNSEC3s, outNSEC3Count, outObjRRSIGs, outRRSIGCount); } // This function extracts the resource record from the answer section of the message, and determine what type of record // is contained in the answer section: // 1. If there are only CNAME records, kDNSType_CNAME will be returned. // 2. If there are DNS record other than CNAME record, the other data type will be returned. // 3. If no record is contained in the answer section, 0 will be returned. // This function is only used in the XCTest to help the test of wildcard data response since this kind of denial of // existence is always accompanied by the No Error data that comes from wildcard matching. mDNSu16 GetRRTypeFromMessage(const DNSMessage * const response, const mDNSu8 * const limit, const mDNSInterfaceID InterfaceID) { mDNSu16 rrtype = 0; const mDNSu16 answerCount = response->h.numAnswers; if (answerCount == 0) { goto exit; } const mDNSu8 *ptr = LocateAnswers(response, limit); if (ptr == mDNSNULL) { goto exit; } mDNS *const m = &mDNSStorage; for (mDNSu32 i = 0; i < answerCount && ptr < limit; mDNSCoreResetRecord(m), i++) { ptr = GetLargeResourceRecord(m, response, ptr, limit, InterfaceID, kDNSRecordTypePacketAuth, &m->rec); const ResourceRecord *const rr = &(m->rec.r.resrec); if (rr->RecordType == kDNSRecordTypePacketNegative) { continue; } if (rrtype == 0 || rrtype == kDNSType_CNAME) { rrtype = rr->rrtype; } } exit: return rrtype; } #endif // MDNSRESPONDER_SUPPORTS(APPLE, DNSSECv2)