blob: 20f3a850826f19eda06a340d422f0bf1ba6abae5 [file] [log] [blame]
/*
* Copyright (c) 2022 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.
*/
#import <XCTest/XCTest.h>
#include <CoreUtils/CoreUtils.h>
#include "dns_obj_rr_dnskey.h"
#include "ResourceRecordBytes.h"
#include "dns_common.h"
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include "mdns_strict.h"
@interface DNSObjRRDNSKeyTest : XCTestCase
@end
@implementation DNSObjRRDNSKeyTest
- (void)testCreate
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey_allocated = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, false, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
XCTAssertTrue(dns_obj_equal(dnskey_allocated, dnskey));
MDNS_DISPOSE_DNS_OBJ(dnskey);
MDNS_DISPOSE_DNS_OBJ(dnskey_allocated);
}
}
- (void)testGetFlags
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const uint16_t flags = dns_obj_rr_dnskey_get_flags(dnskey);
XCTAssertEqual(expected_result->flags, flags);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testGetProtocol
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const uint8_t protocol = dns_obj_rr_dnskey_get_protocol(dnskey);
XCTAssertEqual(expected_result->protocol, protocol);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testGetAlgorithm
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const uint8_t algorithm = dns_obj_rr_dnskey_get_algorithm(dnskey);
XCTAssertEqual(expected_result->algorithm, algorithm);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testGetPublicKeyAndSize
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const uint8_t *const public_key = dns_obj_rr_dnskey_get_public_key(dnskey);
const uint16_t public_key_size = dns_obj_rr_dnskey_get_public_key_size(dnskey);
XCTAssertEqual(expected_result->public_key_size, public_key_size);
XCTAssertEqual(memcmp(expected_result->public_key, public_key, public_key_size), 0);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testGetKeyTag
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const uint16_t key_tag = dns_obj_rr_dnskey_get_key_tag(dnskey);
XCTAssertEqual(expected_result->key_tag, key_tag);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testIsZoneKey
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const bool is_zone_key = dns_obj_rr_dnskey_is_zone_key(dnskey);
XCTAssertEqual(expected_result->is_zone_key, is_zone_key);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testIsSecureEntryPoint
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const bool is_secure_entry_point = dns_obj_rr_dnskey_is_secure_entry_point(dnskey);
XCTAssertEqual(expected_result->is_secure_entry_point, is_secure_entry_point);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testHasSupportedAlgorithm
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const bool has_supported_algorithm = dns_obj_rr_dnskey_has_supported_algorithm(dnskey);
XCTAssertEqual(expected_result->has_supported_algorithm, has_supported_algorithm);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testIsValidForDNS
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const bool is_valid_for_dns = dns_obj_rr_dnskey_is_valid_for_dnssec(dnskey, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
XCTAssertEqual(expected_result->is_valid_for_dnssec, is_valid_for_dns);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testGetPriority
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
const expected_dnskey_result_t * const expected_result = &test_records[i].expected_result_u.dnskey;
const uint16_t priority = dns_obj_rr_dnskey_algorithm_get_priority(dns_obj_rr_dnskey_get_algorithm(dnskey));
XCTAssertEqual(expected_result->priority, priority);
MDNS_DISPOSE_DNS_OBJ(dnskey);
}
}
- (void)testCompareEquality
{
for (size_t i = 0; i < countof(test_records); i++) {
if (test_records[i].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_error_t err;
dns_obj_rr_dnskey_t dnskey_i = dns_obj_rr_dnskey_create(test_records[i].name,
test_records[i].class, test_records[i].rdata, test_records[i].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
for (size_t j = 0; j < countof(test_records); j++) {
if (test_records[j].type != kDNSRecordType_DNSKEY) {
continue;
}
dns_obj_rr_dnskey_t dnskey_j = dns_obj_rr_dnskey_create(test_records[j].name,
test_records[j].class, test_records[j].rdata, test_records[j].rdata_len, true, &err);
XCTAssertEqual(err, DNS_OBJ_ERROR_NO_ERROR);
XCTAssertEqual(dns_obj_equal(dnskey_i, dnskey_j), i == j);
MDNS_DISPOSE_DNS_OBJ(dnskey_j);
}
MDNS_DISPOSE_DNS_OBJ(dnskey_i);
}
}
@end