tkeyconf.c 2.74 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright (C) 1999, 2000  Internet Software Consortium.
 * 
 * Permission to use, copy, modify, and 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS
 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
 * CONSORTIUM 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.
 */

#include <config.h>

20
#include <isc/buffer.h>
21
#include <isc/string.h>		/* Required for HP/UX (and others?) */
22
#include <isc/mem.h>
23 24 25

#include <dns/keyvalues.h>
#include <dns/name.h>
26
#include <dns/tkey.h>
27 28 29 30 31 32 33 34 35 36
#include <dns/tkeyconf.h>

#define RETERR(x) do { \
	result = (x); \
	if (result != ISC_R_SUCCESS) \
		goto failure; \
	} while (0)


isc_result_t
37 38
dns_tkeyctx_fromconfig(dns_c_ctx_t *cfg, isc_mem_t *mctx, isc_entropy_t *ectx,
		       dns_tkeyctx_t **tctxp)
39 40
{
	isc_result_t result;
41
	dns_tkeyctx_t *tctx = NULL;
42
	char *s;
43
	isc_uint32_t n;
44 45
	isc_buffer_t b, namebuf;
	unsigned char data[1024];
46
	dns_name_t domain, keyname;
47

48
	result = dns_tkeyctx_create(mctx, ectx, &tctx);
49 50 51 52 53
	if (result != ISC_R_SUCCESS)
		return (result);

	s = NULL;
	result = dns_c_ctx_gettkeydhkey(cfg, &s, &n);
54 55
	if (result == ISC_R_NOTFOUND) {
		*tctxp = tctx;
56
		return (ISC_R_SUCCESS);
57
	}
58 59 60 61 62 63
	isc_buffer_init(&namebuf, data, sizeof(data));
	dns_name_init(&keyname, NULL);
	isc_buffer_init(&b, s, strlen(s));
	isc_buffer_add(&b, strlen(s));
	dns_name_fromtext(&keyname, &b, dns_rootname, ISC_FALSE, &namebuf);
	RETERR(dst_key_fromfile(&keyname, n, DNS_KEYALG_DH,
64
				DST_TYPE_PUBLIC|DST_TYPE_PRIVATE,
Brian Wellington's avatar
Brian Wellington committed
65
				NULL, mctx, &tctx->dhkey));
66 67 68 69
	s = NULL;
	RETERR(dns_c_ctx_gettkeydomain(cfg, &s));
	dns_name_init(&domain, NULL);
	tctx->domain = (dns_name_t *) isc_mem_get(mctx, sizeof(dns_name_t));
70 71 72 73
	if (tctx->domain == NULL) {
		result = ISC_R_NOMEMORY;
		goto failure;
	}
74
	dns_name_init(tctx->domain, NULL);
75
	isc_buffer_init(&b, s, strlen(s));
76 77 78 79 80 81 82 83 84
	isc_buffer_add(&b, strlen(s));
	RETERR(dns_name_fromtext(&domain, &b, dns_rootname, ISC_FALSE,
				 &namebuf));
	RETERR(dns_name_dup(&domain, mctx, tctx->domain));

	*tctxp = tctx;
	return (ISC_R_SUCCESS);

 failure:
85 86
	if (tctx->dhkey != NULL)
		dst_key_free(&tctx->dhkey);
87 88 89 90 91 92 93 94 95
	if (tctx->domain != NULL) {
		dns_name_free(tctx->domain, mctx);
		isc_mem_put(mctx, tctx->domain, sizeof(dns_name_t));
		tctx->domain = NULL;
	}
	dns_tkeyctx_destroy(&tctx);
	return (result);
}