9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2011, 2012, 2016 Internet Systems Consortium, Inc. ("ISC")
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews/* $Id$ */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt/*! \file */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <config.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <atf-c.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <unistd.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <isc/buffer.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <dns/nsec3.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <dns/private.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <dns/rdataclass.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <dns/rdatatype.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include <dst/dst.h>
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt#include "dnstest.h"
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Huntstatic dns_rdatatype_t privatetype = 65534;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunttypedef struct {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char alg;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_keytag_t keyid;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_boolean_t remove;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_boolean_t complete;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt} signing_testcase_t;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunttypedef struct {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char hash;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char flags;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned int iterations;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned long salt;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_boolean_t remove;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_boolean_t pending;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_boolean_t nonsec;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt} nsec3_testcase_t;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt/*
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt * Helper functions
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Huntstatic void
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Huntmake_signing(signing_testcase_t *testcase, dns_rdata_t *private,
f83542787f882444d2abf9fcaf47a34c29e4fec2Mark Andrews unsigned char *buf, size_t len)
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt{
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_init(private);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt buf[0] = testcase->alg;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt buf[1] = (testcase->keyid & 0xff00) >> 8;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt buf[2] = (testcase->keyid & 0xff);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt buf[3] = testcase->remove;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt buf[4] = testcase->complete;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt private->data = buf;
f83542787f882444d2abf9fcaf47a34c29e4fec2Mark Andrews private->length = len;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt private->type = privatetype;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt private->rdclass = dns_rdataclass_in;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Huntstatic void
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Huntmake_nsec3(nsec3_testcase_t *testcase, dns_rdata_t *private,
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char *pbuf)
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt{
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_nsec3param_t params;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_t nsec3param = DNS_RDATA_INIT;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char bufdata[BUFSIZ];
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_buffer_t buf;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_uint32_t salt;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char *sp;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt int slen = 4;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt /* for simplicity, we're using a maximum salt length of 4 */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt salt = htonl(testcase->salt);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt sp = (unsigned char *) &salt;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt while (*sp == '\0' && slen > 0) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt slen--;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt sp++;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt }
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.common.rdclass = dns_rdataclass_in;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.common.rdtype = dns_rdatatype_nsec3param;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.hash = testcase->hash;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.iterations = testcase->iterations;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.salt = sp;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.salt_length = slen;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.flags = testcase->flags;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt if (testcase->remove) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.flags |= DNS_NSEC3FLAG_REMOVE;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt if (testcase->nonsec)
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.flags |= DNS_NSEC3FLAG_NONSEC;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt } else {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.flags |= DNS_NSEC3FLAG_CREATE;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt if (testcase->pending)
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt params.flags |= DNS_NSEC3FLAG_INITIAL;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt }
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_buffer_init(&buf, bufdata, sizeof(bufdata));
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_fromstruct(&nsec3param, dns_rdataclass_in,
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdatatype_nsec3param, &params, &buf);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_init(private);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_nsec3param_toprivate(&nsec3param, private, privatetype,
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt pbuf, DNS_NSEC3PARAM_BUFFERSIZE + 1);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt/*
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt * Individual unit tests
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TC(private_signing_totext);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TC_HEAD(private_signing_totext, tc) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt atf_tc_set_md_var(tc, "descr",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "convert private signing records to text");
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TC_BODY(private_signing_totext, tc) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_result_t result;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_t private;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt int i;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt signing_testcase_t testcases[] = {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { DST_ALG_RSASHA512, 12345, 0, 0 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { DST_ALG_RSASHA256, 54321, 1, 0 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { DST_ALG_NSEC3RSASHA1, 22222, 0, 1 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { DST_ALG_RSASHA1, 33333, 1, 1 }
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt };
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt const char *results[] = {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Signing with key 12345/RSASHA512",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Removing signatures for key 54321/RSASHA256",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Done signing with key 22222/NSEC3RSASHA1",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Done removing signatures for key 33333/RSASHA1"
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt };
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt int ncases = 4;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt UNUSED(tc);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt result = dns_test_begin(NULL, ISC_TRUE);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt for (i = 0; i < ncases; i++) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char data[5];
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt char output[BUFSIZ];
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_buffer_t buf;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_buffer_init(&buf, output, sizeof(output));
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
f83542787f882444d2abf9fcaf47a34c29e4fec2Mark Andrews make_signing(&testcases[i], &private, data, sizeof(data));
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_private_totext(&private, &buf);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt ATF_CHECK_STREQ(output, results[i]);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt }
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_test_end();
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TC(private_nsec3_totext);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TC_HEAD(private_nsec3_totext, tc) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt atf_tc_set_md_var(tc, "descr", "convert private chain records to text");
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TC_BODY(private_nsec3_totext, tc) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_result_t result;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_rdata_t private;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt int i;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt nsec3_testcase_t testcases[] = {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { 1, 0, 1, 0xbeef, 0, 0, 0 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { 1, 1, 10, 0xdadd, 0, 0, 0 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { 1, 0, 20, 0xbead, 0, 1, 0 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { 1, 0, 30, 0xdeaf, 1, 0, 0 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt { 1, 0, 100, 0xfeedabee, 1, 0, 1 },
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt };
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt const char *results[] = {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Creating NSEC3 chain 1 0 1 BEEF",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Creating NSEC3 chain 1 1 10 DADD",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Pending NSEC3 chain 1 0 20 BEAD",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Removing NSEC3 chain 1 0 30 DEAF / creating NSEC chain",
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt "Removing NSEC3 chain 1 0 100 FEEDABEE"
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt };
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt int ncases = 5;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt UNUSED(tc);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt result = dns_test_begin(NULL, ISC_TRUE);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt for (i = 0; i < ncases; i++) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt unsigned char data[DNS_NSEC3PARAM_BUFFERSIZE + 1];
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt char output[BUFSIZ];
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_buffer_t buf;
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt isc_buffer_init(&buf, output, sizeof(output));
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt make_nsec3(&testcases[i], &private, data);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_private_totext(&private, &buf);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt ATF_CHECK_STREQ(output, results[i]);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt }
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt dns_test_end();
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt/*
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt * Main
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt */
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan HuntATF_TP_ADD_TCS(tp) {
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt ATF_TP_ADD_TC(tp, private_signing_totext);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt ATF_TP_ADD_TC(tp, private_nsec3_totext);
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt return (atf_no_error());
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt}
9c03f13e18c1b0c32f62391a17300378605bbc7bEvan Hunt