key.c revision 222395
186091Sjhb/*
286091Sjhb * Copyright (C) 2004-2007  Internet Systems Consortium, Inc. ("ISC")
386091Sjhb * Copyright (C) 2001  Internet Software Consortium.
486091Sjhb *
586091Sjhb * Permission to use, copy, modify, and/or distribute this software for any
686091Sjhb * purpose with or without fee is hereby granted, provided that the above
786091Sjhb * copyright notice and this permission notice appear in all copies.
886091Sjhb *
986091Sjhb * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
1086091Sjhb * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1186091Sjhb * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
1286091Sjhb * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1386091Sjhb * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
1486091Sjhb * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1586091Sjhb * PERFORMANCE OF THIS SOFTWARE.
1686091Sjhb */
1786091Sjhb
1886091Sjhb/* $Id: key.c,v 1.8 2007-06-19 23:47:16 tbox Exp $ */
1986091Sjhb
2086091Sjhb#include <config.h>
2186091Sjhb
2286091Sjhb#include <stddef.h>
2386091Sjhb#include <stdlib.h>
2486091Sjhb
2586091Sjhb#include <isc/region.h>
2686091Sjhb#include <isc/util.h>
2786091Sjhb
28119482Sobrien#include <dns/keyvalues.h>
29119482Sobrien
30119482Sobrien#include <dst/dst.h>
3186091Sjhb
3286091Sjhb#include "dst_internal.h"
3386091Sjhb
3486091Sjhbisc_uint16_t
3586091Sjhbdst_region_computeid(const isc_region_t *source, unsigned int alg) {
3686091Sjhb	isc_uint32_t ac;
3786091Sjhb	const unsigned char *p;
3886091Sjhb	int size;
3986091Sjhb
4086091Sjhb	REQUIRE(source != NULL);
4186091Sjhb	REQUIRE(source->length >= 4);
4286091Sjhb
4396654Sjhay	p = source->base;
44113083Sphk	size = source->length;
4586091Sjhb
4686091Sjhb	if (alg == DST_ALG_RSAMD5)
4786091Sjhb		return ((p[size - 3] << 8) + p[size - 2]);
4886091Sjhb
4986091Sjhb	for (ac = 0; size > 1; size -= 2, p += 2)
5086091Sjhb		ac += ((*p) << 8) + *(p + 1);
5186091Sjhb
5286091Sjhb	if (size > 0)
5386091Sjhb		ac += ((*p) << 8);
5486091Sjhb	ac += (ac >> 16) & 0xffff;
5586091Sjhb
5686091Sjhb	return ((isc_uint16_t)(ac & 0xffff));
5786091Sjhb}
5886091Sjhb
5986091Sjhbdns_name_t *
6086091Sjhbdst_key_name(const dst_key_t *key) {
6186091Sjhb	REQUIRE(VALID_KEY(key));
6287599Sobrien	return (key->key_name);
6386091Sjhb}
6486091Sjhb
6586091Sjhbunsigned int
6686091Sjhbdst_key_size(const dst_key_t *key) {
6786091Sjhb	REQUIRE(VALID_KEY(key));
6886091Sjhb	return (key->key_size);
6986091Sjhb}
7086091Sjhb
7186091Sjhbunsigned int
7286091Sjhbdst_key_proto(const dst_key_t *key) {
7386091Sjhb	REQUIRE(VALID_KEY(key));
7486091Sjhb	return (key->key_proto);
7586091Sjhb}
7686091Sjhb
7786091Sjhbunsigned int
7886091Sjhbdst_key_alg(const dst_key_t *key) {
7986091Sjhb	REQUIRE(VALID_KEY(key));
8086091Sjhb	return (key->key_alg);
8186091Sjhb}
8286091Sjhb
8386091Sjhbisc_uint32_t
8486091Sjhbdst_key_flags(const dst_key_t *key) {
8586091Sjhb	REQUIRE(VALID_KEY(key));
8686091Sjhb	return (key->key_flags);
8786091Sjhb}
8886091Sjhb
8986091Sjhbdns_keytag_t
9086091Sjhbdst_key_id(const dst_key_t *key) {
9186091Sjhb	REQUIRE(VALID_KEY(key));
9286091Sjhb	return (key->key_id);
9386091Sjhb}
9486091Sjhb
9586091Sjhbdns_rdataclass_t
9686091Sjhbdst_key_class(const dst_key_t *key) {
9786091Sjhb	REQUIRE(VALID_KEY(key));
9886091Sjhb	return (key->key_class);
9986091Sjhb}
10086091Sjhb
10186091Sjhbisc_boolean_t
10286091Sjhbdst_key_iszonekey(const dst_key_t *key) {
10386091Sjhb	REQUIRE(VALID_KEY(key));
10486091Sjhb
10586091Sjhb	if ((key->key_flags & DNS_KEYTYPE_NOAUTH) != 0)
10686091Sjhb		return (ISC_FALSE);
10786091Sjhb	if ((key->key_flags & DNS_KEYFLAG_OWNERMASK) != DNS_KEYOWNER_ZONE)
10886091Sjhb		return (ISC_FALSE);
10986091Sjhb	if (key->key_proto != DNS_KEYPROTO_DNSSEC &&
11086091Sjhb	    key->key_proto != DNS_KEYPROTO_ANY)
11186091Sjhb		return (ISC_FALSE);
11286091Sjhb	return (ISC_TRUE);
11386091Sjhb}
11486091Sjhb
11586091Sjhbisc_boolean_t
11686091Sjhbdst_key_isnullkey(const dst_key_t *key) {
11786091Sjhb	REQUIRE(VALID_KEY(key));
11886091Sjhb
11986091Sjhb	if ((key->key_flags & DNS_KEYFLAG_TYPEMASK) != DNS_KEYTYPE_NOKEY)
12086091Sjhb		return (ISC_FALSE);
12186091Sjhb	if ((key->key_flags & DNS_KEYFLAG_OWNERMASK) != DNS_KEYOWNER_ZONE)
12286091Sjhb		return (ISC_FALSE);
12386091Sjhb	if (key->key_proto != DNS_KEYPROTO_DNSSEC &&
12486091Sjhb	    key->key_proto != DNS_KEYPROTO_ANY)
12586091Sjhb		return (ISC_FALSE);
12686091Sjhb	return (ISC_TRUE);
12786091Sjhb}
12886091Sjhb
12986091Sjhbvoid
13086091Sjhbdst_key_setbits(dst_key_t *key, isc_uint16_t bits) {
13186091Sjhb	unsigned int maxbits;
13286091Sjhb	REQUIRE(VALID_KEY(key));
13386091Sjhb	if (bits != 0) {
13486091Sjhb		RUNTIME_CHECK(dst_key_sigsize(key, &maxbits) == ISC_R_SUCCESS);
13586091Sjhb		maxbits *= 8;
13686091Sjhb		REQUIRE(bits <= maxbits);
13786091Sjhb	}
13886091Sjhb	key->key_bits = bits;
13986091Sjhb}
14086091Sjhb
14186091Sjhbisc_uint16_t
14286091Sjhbdst_key_getbits(const dst_key_t *key) {
14386091Sjhb	REQUIRE(VALID_KEY(key));
14486091Sjhb	return (key->key_bits);
14586091Sjhb}
14686091Sjhb
14786091Sjhb/*! \file */
14886091Sjhb