1*00b67f09SDavid van Moolenbroek /* $NetBSD: key.c,v 1.5 2014/12/10 04:37:58 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004-2007, 2011 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: key.c,v 1.11 2011/10/20 21:20:02 marka Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <stddef.h>
25*00b67f09SDavid van Moolenbroek #include <stdlib.h>
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #include <isc/region.h>
28*00b67f09SDavid van Moolenbroek #include <isc/util.h>
29*00b67f09SDavid van Moolenbroek
30*00b67f09SDavid van Moolenbroek #include <dns/keyvalues.h>
31*00b67f09SDavid van Moolenbroek
32*00b67f09SDavid van Moolenbroek #include <dst/dst.h>
33*00b67f09SDavid van Moolenbroek
34*00b67f09SDavid van Moolenbroek #include "dst_internal.h"
35*00b67f09SDavid van Moolenbroek
36*00b67f09SDavid van Moolenbroek isc_uint16_t
dst_region_computeid(const isc_region_t * source,unsigned int alg)37*00b67f09SDavid van Moolenbroek dst_region_computeid(const isc_region_t *source, unsigned int alg) {
38*00b67f09SDavid van Moolenbroek isc_uint32_t ac;
39*00b67f09SDavid van Moolenbroek const unsigned char *p;
40*00b67f09SDavid van Moolenbroek int size;
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek REQUIRE(source != NULL);
43*00b67f09SDavid van Moolenbroek REQUIRE(source->length >= 4);
44*00b67f09SDavid van Moolenbroek
45*00b67f09SDavid van Moolenbroek p = source->base;
46*00b67f09SDavid van Moolenbroek size = source->length;
47*00b67f09SDavid van Moolenbroek
48*00b67f09SDavid van Moolenbroek if (alg == DST_ALG_RSAMD5)
49*00b67f09SDavid van Moolenbroek return ((p[size - 3] << 8) + p[size - 2]);
50*00b67f09SDavid van Moolenbroek
51*00b67f09SDavid van Moolenbroek for (ac = 0; size > 1; size -= 2, p += 2)
52*00b67f09SDavid van Moolenbroek ac += ((*p) << 8) + *(p + 1);
53*00b67f09SDavid van Moolenbroek
54*00b67f09SDavid van Moolenbroek if (size > 0)
55*00b67f09SDavid van Moolenbroek ac += ((*p) << 8);
56*00b67f09SDavid van Moolenbroek ac += (ac >> 16) & 0xffff;
57*00b67f09SDavid van Moolenbroek
58*00b67f09SDavid van Moolenbroek return ((isc_uint16_t)(ac & 0xffff));
59*00b67f09SDavid van Moolenbroek }
60*00b67f09SDavid van Moolenbroek
61*00b67f09SDavid van Moolenbroek isc_uint16_t
dst_region_computerid(const isc_region_t * source,unsigned int alg)62*00b67f09SDavid van Moolenbroek dst_region_computerid(const isc_region_t *source, unsigned int alg) {
63*00b67f09SDavid van Moolenbroek isc_uint32_t ac;
64*00b67f09SDavid van Moolenbroek const unsigned char *p;
65*00b67f09SDavid van Moolenbroek int size;
66*00b67f09SDavid van Moolenbroek
67*00b67f09SDavid van Moolenbroek REQUIRE(source != NULL);
68*00b67f09SDavid van Moolenbroek REQUIRE(source->length >= 4);
69*00b67f09SDavid van Moolenbroek
70*00b67f09SDavid van Moolenbroek p = source->base;
71*00b67f09SDavid van Moolenbroek size = source->length;
72*00b67f09SDavid van Moolenbroek
73*00b67f09SDavid van Moolenbroek if (alg == DST_ALG_RSAMD5)
74*00b67f09SDavid van Moolenbroek return ((p[size - 3] << 8) + p[size - 2]);
75*00b67f09SDavid van Moolenbroek
76*00b67f09SDavid van Moolenbroek ac = ((*p) << 8) + *(p + 1);
77*00b67f09SDavid van Moolenbroek ac |= DNS_KEYFLAG_REVOKE;
78*00b67f09SDavid van Moolenbroek for (size -= 2, p +=2; size > 1; size -= 2, p += 2)
79*00b67f09SDavid van Moolenbroek ac += ((*p) << 8) + *(p + 1);
80*00b67f09SDavid van Moolenbroek
81*00b67f09SDavid van Moolenbroek if (size > 0)
82*00b67f09SDavid van Moolenbroek ac += ((*p) << 8);
83*00b67f09SDavid van Moolenbroek ac += (ac >> 16) & 0xffff;
84*00b67f09SDavid van Moolenbroek
85*00b67f09SDavid van Moolenbroek return ((isc_uint16_t)(ac & 0xffff));
86*00b67f09SDavid van Moolenbroek }
87*00b67f09SDavid van Moolenbroek
88*00b67f09SDavid van Moolenbroek dns_name_t *
dst_key_name(const dst_key_t * key)89*00b67f09SDavid van Moolenbroek dst_key_name(const dst_key_t *key) {
90*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
91*00b67f09SDavid van Moolenbroek return (key->key_name);
92*00b67f09SDavid van Moolenbroek }
93*00b67f09SDavid van Moolenbroek
94*00b67f09SDavid van Moolenbroek unsigned int
dst_key_size(const dst_key_t * key)95*00b67f09SDavid van Moolenbroek dst_key_size(const dst_key_t *key) {
96*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
97*00b67f09SDavid van Moolenbroek return (key->key_size);
98*00b67f09SDavid van Moolenbroek }
99*00b67f09SDavid van Moolenbroek
100*00b67f09SDavid van Moolenbroek unsigned int
dst_key_proto(const dst_key_t * key)101*00b67f09SDavid van Moolenbroek dst_key_proto(const dst_key_t *key) {
102*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
103*00b67f09SDavid van Moolenbroek return (key->key_proto);
104*00b67f09SDavid van Moolenbroek }
105*00b67f09SDavid van Moolenbroek
106*00b67f09SDavid van Moolenbroek unsigned int
dst_key_alg(const dst_key_t * key)107*00b67f09SDavid van Moolenbroek dst_key_alg(const dst_key_t *key) {
108*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
109*00b67f09SDavid van Moolenbroek return (key->key_alg);
110*00b67f09SDavid van Moolenbroek }
111*00b67f09SDavid van Moolenbroek
112*00b67f09SDavid van Moolenbroek isc_uint32_t
dst_key_flags(const dst_key_t * key)113*00b67f09SDavid van Moolenbroek dst_key_flags(const dst_key_t *key) {
114*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
115*00b67f09SDavid van Moolenbroek return (key->key_flags);
116*00b67f09SDavid van Moolenbroek }
117*00b67f09SDavid van Moolenbroek
118*00b67f09SDavid van Moolenbroek dns_keytag_t
dst_key_id(const dst_key_t * key)119*00b67f09SDavid van Moolenbroek dst_key_id(const dst_key_t *key) {
120*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
121*00b67f09SDavid van Moolenbroek return (key->key_id);
122*00b67f09SDavid van Moolenbroek }
123*00b67f09SDavid van Moolenbroek
124*00b67f09SDavid van Moolenbroek dns_keytag_t
dst_key_rid(const dst_key_t * key)125*00b67f09SDavid van Moolenbroek dst_key_rid(const dst_key_t *key) {
126*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
127*00b67f09SDavid van Moolenbroek return (key->key_rid);
128*00b67f09SDavid van Moolenbroek }
129*00b67f09SDavid van Moolenbroek
130*00b67f09SDavid van Moolenbroek dns_rdataclass_t
dst_key_class(const dst_key_t * key)131*00b67f09SDavid van Moolenbroek dst_key_class(const dst_key_t *key) {
132*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
133*00b67f09SDavid van Moolenbroek return (key->key_class);
134*00b67f09SDavid van Moolenbroek }
135*00b67f09SDavid van Moolenbroek
136*00b67f09SDavid van Moolenbroek isc_boolean_t
dst_key_iszonekey(const dst_key_t * key)137*00b67f09SDavid van Moolenbroek dst_key_iszonekey(const dst_key_t *key) {
138*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
139*00b67f09SDavid van Moolenbroek
140*00b67f09SDavid van Moolenbroek if ((key->key_flags & DNS_KEYTYPE_NOAUTH) != 0)
141*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
142*00b67f09SDavid van Moolenbroek if ((key->key_flags & DNS_KEYFLAG_OWNERMASK) != DNS_KEYOWNER_ZONE)
143*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
144*00b67f09SDavid van Moolenbroek if (key->key_proto != DNS_KEYPROTO_DNSSEC &&
145*00b67f09SDavid van Moolenbroek key->key_proto != DNS_KEYPROTO_ANY)
146*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
147*00b67f09SDavid van Moolenbroek return (ISC_TRUE);
148*00b67f09SDavid van Moolenbroek }
149*00b67f09SDavid van Moolenbroek
150*00b67f09SDavid van Moolenbroek isc_boolean_t
dst_key_isnullkey(const dst_key_t * key)151*00b67f09SDavid van Moolenbroek dst_key_isnullkey(const dst_key_t *key) {
152*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
153*00b67f09SDavid van Moolenbroek
154*00b67f09SDavid van Moolenbroek if ((key->key_flags & DNS_KEYFLAG_TYPEMASK) != DNS_KEYTYPE_NOKEY)
155*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
156*00b67f09SDavid van Moolenbroek if ((key->key_flags & DNS_KEYFLAG_OWNERMASK) != DNS_KEYOWNER_ZONE)
157*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
158*00b67f09SDavid van Moolenbroek if (key->key_proto != DNS_KEYPROTO_DNSSEC &&
159*00b67f09SDavid van Moolenbroek key->key_proto != DNS_KEYPROTO_ANY)
160*00b67f09SDavid van Moolenbroek return (ISC_FALSE);
161*00b67f09SDavid van Moolenbroek return (ISC_TRUE);
162*00b67f09SDavid van Moolenbroek }
163*00b67f09SDavid van Moolenbroek
164*00b67f09SDavid van Moolenbroek void
dst_key_setbits(dst_key_t * key,isc_uint16_t bits)165*00b67f09SDavid van Moolenbroek dst_key_setbits(dst_key_t *key, isc_uint16_t bits) {
166*00b67f09SDavid van Moolenbroek unsigned int maxbits;
167*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
168*00b67f09SDavid van Moolenbroek if (bits != 0) {
169*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(dst_key_sigsize(key, &maxbits) == ISC_R_SUCCESS);
170*00b67f09SDavid van Moolenbroek maxbits *= 8;
171*00b67f09SDavid van Moolenbroek REQUIRE(bits <= maxbits);
172*00b67f09SDavid van Moolenbroek }
173*00b67f09SDavid van Moolenbroek key->key_bits = bits;
174*00b67f09SDavid van Moolenbroek }
175*00b67f09SDavid van Moolenbroek
176*00b67f09SDavid van Moolenbroek isc_uint16_t
dst_key_getbits(const dst_key_t * key)177*00b67f09SDavid van Moolenbroek dst_key_getbits(const dst_key_t *key) {
178*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
179*00b67f09SDavid van Moolenbroek return (key->key_bits);
180*00b67f09SDavid van Moolenbroek }
181*00b67f09SDavid van Moolenbroek
182*00b67f09SDavid van Moolenbroek void
dst_key_setttl(dst_key_t * key,dns_ttl_t ttl)183*00b67f09SDavid van Moolenbroek dst_key_setttl(dst_key_t *key, dns_ttl_t ttl) {
184*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
185*00b67f09SDavid van Moolenbroek key->key_ttl = ttl;
186*00b67f09SDavid van Moolenbroek }
187*00b67f09SDavid van Moolenbroek
188*00b67f09SDavid van Moolenbroek dns_ttl_t
dst_key_getttl(const dst_key_t * key)189*00b67f09SDavid van Moolenbroek dst_key_getttl(const dst_key_t *key) {
190*00b67f09SDavid van Moolenbroek REQUIRE(VALID_KEY(key));
191*00b67f09SDavid van Moolenbroek return (key->key_ttl);
192*00b67f09SDavid van Moolenbroek }
193*00b67f09SDavid van Moolenbroek
194*00b67f09SDavid van Moolenbroek /*! \file */
195