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