summaryrefslogtreecommitdiff
path: root/usr.sbin/bind/lib/irs/dnsconf.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bind/lib/irs/dnsconf.c')
-rw-r--r--usr.sbin/bind/lib/irs/dnsconf.c269
1 files changed, 0 insertions, 269 deletions
diff --git a/usr.sbin/bind/lib/irs/dnsconf.c b/usr.sbin/bind/lib/irs/dnsconf.c
deleted file mode 100644
index bf873ce15c3..00000000000
--- a/usr.sbin/bind/lib/irs/dnsconf.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $Id: dnsconf.c,v 1.2 2019/12/17 01:46:34 sthen Exp $ */
-
-/*! \file */
-
-#include <config.h>
-
-#include <string.h>
-
-#include <isc/base64.h>
-#include <isc/buffer.h>
-#include <isc/file.h>
-#include <isc/mem.h>
-#include <isc/util.h>
-
-#include <isccfg/dnsconf.h>
-
-#include <dns/fixedname.h>
-#include <dns/name.h>
-#include <dns/rdata.h>
-#include <dns/rdatastruct.h>
-
-#include <irs/dnsconf.h>
-
-#define IRS_DNSCONF_MAGIC ISC_MAGIC('D', 'c', 'f', 'g')
-#define IRS_DNSCONF_VALID(c) ISC_MAGIC_VALID(c, IRS_DNSCONF_MAGIC)
-
-/*!
- * configuration data structure
- */
-
-struct irs_dnsconf {
- unsigned int magic;
- isc_mem_t *mctx;
- irs_dnsconf_dnskeylist_t trusted_keylist;
-};
-
-static isc_result_t
-configure_dnsseckeys(irs_dnsconf_t *conf, cfg_obj_t *cfgobj,
- dns_rdataclass_t rdclass)
-{
- isc_mem_t *mctx = conf->mctx;
- const cfg_obj_t *keys = NULL;
- const cfg_obj_t *key, *keylist;
- dns_fixedname_t fkeyname;
- dns_name_t *keyname_base, *keyname;
- const cfg_listelt_t *element, *element2;
- isc_result_t result;
- isc_uint32_t flags, proto, alg;
- const char *keystr, *keynamestr;
- unsigned char keydata[4096];
- isc_buffer_t keydatabuf_base, *keydatabuf;
- dns_rdata_dnskey_t keystruct;
- unsigned char rrdata[4096];
- isc_buffer_t rrdatabuf;
- isc_region_t r;
- isc_buffer_t namebuf;
- irs_dnsconf_dnskey_t *keyent;
-
- cfg_map_get(cfgobj, "trusted-keys", &keys);
- if (keys == NULL)
- return (ISC_R_SUCCESS);
-
- for (element = cfg_list_first(keys);
- element != NULL;
- element = cfg_list_next(element)) {
- keylist = cfg_listelt_value(element);
- for (element2 = cfg_list_first(keylist);
- element2 != NULL;
- element2 = cfg_list_next(element2))
- {
- keydatabuf = NULL;
- keyname = NULL;
-
- key = cfg_listelt_value(element2);
-
- flags = cfg_obj_asuint32(cfg_tuple_get(key, "flags"));
- proto = cfg_obj_asuint32(cfg_tuple_get(key,
- "protocol"));
- alg = cfg_obj_asuint32(cfg_tuple_get(key,
- "algorithm"));
- keynamestr = cfg_obj_asstring(cfg_tuple_get(key,
- "name"));
-
- keystruct.common.rdclass = rdclass;
- keystruct.common.rdtype = dns_rdatatype_dnskey;
- keystruct.mctx = NULL;
- ISC_LINK_INIT(&keystruct.common, link);
-
- if (flags > 0xffff)
- return (ISC_R_RANGE);
- if (proto > 0xff)
- return (ISC_R_RANGE);
- if (alg > 0xff)
- return (ISC_R_RANGE);
- keystruct.flags = (isc_uint16_t)flags;
- keystruct.protocol = (isc_uint8_t)proto;
- keystruct.algorithm = (isc_uint8_t)alg;
-
- isc_buffer_init(&keydatabuf_base, keydata,
- sizeof(keydata));
- isc_buffer_init(&rrdatabuf, rrdata, sizeof(rrdata));
-
- /* Configure key value */
- keystr = cfg_obj_asstring(cfg_tuple_get(key, "key"));
- result = isc_base64_decodestring(keystr,
- &keydatabuf_base);
- if (result != ISC_R_SUCCESS)
- return (result);
- isc_buffer_usedregion(&keydatabuf_base, &r);
- keystruct.datalen = r.length;
- keystruct.data = r.base;
-
- result = dns_rdata_fromstruct(NULL,
- keystruct.common.rdclass,
- keystruct.common.rdtype,
- &keystruct, &rrdatabuf);
- if (result != ISC_R_SUCCESS)
- return (result);
- isc_buffer_usedregion(&rrdatabuf, &r);
- result = isc_buffer_allocate(mctx, &keydatabuf,
- r.length);
- if (result != ISC_R_SUCCESS)
- return (result);
- result = isc_buffer_copyregion(keydatabuf, &r);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- /* Configure key name */
- dns_fixedname_init(&fkeyname);
- keyname_base = dns_fixedname_name(&fkeyname);
- isc_buffer_constinit(&namebuf, keynamestr,
- strlen(keynamestr));
- isc_buffer_add(&namebuf, strlen(keynamestr));
- result = dns_name_fromtext(keyname_base, &namebuf,
- dns_rootname, 0, NULL);
- if (result != ISC_R_SUCCESS)
- return (result);
- keyname = isc_mem_get(mctx, sizeof(*keyname));
- if (keyname == NULL) {
- result = ISC_R_NOMEMORY;
- goto cleanup;
- }
- dns_name_init(keyname, NULL);
- result = dns_name_dup(keyname_base, mctx, keyname);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- /* Add the key data to the list */
- keyent = isc_mem_get(mctx, sizeof(*keyent));
- if (keyent == NULL) {
- dns_name_free(keyname, mctx);
- result = ISC_R_NOMEMORY;
- goto cleanup;
- }
- keyent->keyname = keyname;
- keyent->keydatabuf = keydatabuf;
-
- ISC_LIST_APPEND(conf->trusted_keylist, keyent, link);
- }
- }
-
- return (ISC_R_SUCCESS);
-
- cleanup:
- if (keydatabuf != NULL)
- isc_buffer_free(&keydatabuf);
- if (keyname != NULL)
- isc_mem_put(mctx, keyname, sizeof(*keyname));
-
- return (result);
-}
-
-isc_result_t
-irs_dnsconf_load(isc_mem_t *mctx, const char *filename, irs_dnsconf_t **confp)
-{
- irs_dnsconf_t *conf;
- cfg_parser_t *parser = NULL;
- cfg_obj_t *cfgobj = NULL;
- isc_result_t result = ISC_R_SUCCESS;
-
- REQUIRE(confp != NULL && *confp == NULL);
-
- conf = isc_mem_get(mctx, sizeof(*conf));
- if (conf == NULL)
- return (ISC_R_NOMEMORY);
-
- conf->mctx = mctx;
- ISC_LIST_INIT(conf->trusted_keylist);
-
- /*
- * If the specified file does not exist, we'll simply with an empty
- * configuration.
- */
- if (!isc_file_exists(filename))
- goto cleanup;
-
- result = cfg_parser_create(mctx, NULL, &parser);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- result = cfg_parse_file(parser, filename, &cfg_type_dnsconf,
- &cfgobj);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- result = configure_dnsseckeys(conf, cfgobj, dns_rdataclass_in);
-
- cleanup:
- if (parser != NULL) {
- if (cfgobj != NULL)
- cfg_obj_destroy(parser, &cfgobj);
- cfg_parser_destroy(&parser);
- }
-
- conf->magic = IRS_DNSCONF_MAGIC;
-
- if (result == ISC_R_SUCCESS)
- *confp = conf;
- else
- irs_dnsconf_destroy(&conf);
-
- return (result);
-}
-
-void
-irs_dnsconf_destroy(irs_dnsconf_t **confp) {
- irs_dnsconf_t *conf;
- irs_dnsconf_dnskey_t *keyent;
-
- REQUIRE(confp != NULL);
- conf = *confp;
- REQUIRE(IRS_DNSCONF_VALID(conf));
-
- while ((keyent = ISC_LIST_HEAD(conf->trusted_keylist)) != NULL) {
- ISC_LIST_UNLINK(conf->trusted_keylist, keyent, link);
-
- isc_buffer_free(&keyent->keydatabuf);
- dns_name_free(keyent->keyname, conf->mctx);
- isc_mem_put(conf->mctx, keyent->keyname, sizeof(dns_name_t));
- isc_mem_put(conf->mctx, keyent, sizeof(*keyent));
- }
-
- isc_mem_put(conf->mctx, conf, sizeof(*conf));
-
- *confp = NULL;
-}
-
-irs_dnsconf_dnskeylist_t *
-irs_dnsconf_gettrustedkeys(irs_dnsconf_t *conf) {
- REQUIRE(IRS_DNSCONF_VALID(conf));
-
- return (&conf->trusted_keylist);
-}