Merge from vendor branch GCC:
[dragonfly.git] / contrib / bind-9.3 / lib / dns / key.c
1 /*
2  * Copyright (C) 2004, 2005  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 2001  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /* $Id: key.c,v 1.1.4.3 2005/06/09 23:54:29 marka Exp $ */
19
20 #include <config.h>
21
22 #include <stddef.h>
23 #include <stdlib.h>
24
25 #include <isc/region.h>
26 #include <isc/util.h>
27
28 #include <dns/keyvalues.h>
29
30 #include <dst/dst.h>
31
32 #include "dst_internal.h"
33
34 isc_uint16_t
35 dst_region_computeid(const isc_region_t *source, unsigned int alg) {
36         isc_uint32_t ac;
37         const unsigned char *p;
38         int size;
39
40         REQUIRE(source != NULL);
41         REQUIRE(source->length >= 4);
42
43         p = source->base;
44         size = source->length;
45
46         if (alg == DST_ALG_RSAMD5)
47                 return ((p[size - 3] << 8) + p[size - 2]);
48
49         for (ac = 0; size > 1; size -= 2, p += 2)
50                 ac += ((*p) << 8) + *(p + 1);
51
52         if (size > 0)
53                 ac += ((*p) << 8);
54         ac += (ac >> 16) & 0xffff;
55
56         return ((isc_uint16_t)(ac & 0xffff));
57 }
58
59 dns_name_t *
60 dst_key_name(const dst_key_t *key) {
61         REQUIRE(VALID_KEY(key));
62         return (key->key_name);
63 }
64
65 unsigned int
66 dst_key_size(const dst_key_t *key) {
67         REQUIRE(VALID_KEY(key));
68         return (key->key_size);
69 }
70
71 unsigned int
72 dst_key_proto(const dst_key_t *key) {
73         REQUIRE(VALID_KEY(key));
74         return (key->key_proto);
75 }
76
77 unsigned int
78 dst_key_alg(const dst_key_t *key) {
79         REQUIRE(VALID_KEY(key));
80         return (key->key_alg);
81 }
82
83 isc_uint32_t
84 dst_key_flags(const dst_key_t *key) {
85         REQUIRE(VALID_KEY(key));
86         return (key->key_flags);
87 }
88
89 dns_keytag_t
90 dst_key_id(const dst_key_t *key) {
91         REQUIRE(VALID_KEY(key));
92         return (key->key_id);
93 }
94
95 dns_rdataclass_t
96 dst_key_class(const dst_key_t *key) {
97         REQUIRE(VALID_KEY(key));
98         return (key->key_class);
99 }
100
101 isc_boolean_t
102 dst_key_iszonekey(const dst_key_t *key) {
103         REQUIRE(VALID_KEY(key));
104
105         if ((key->key_flags & DNS_KEYTYPE_NOAUTH) != 0)
106                 return (ISC_FALSE);
107         if ((key->key_flags & DNS_KEYFLAG_OWNERMASK) != DNS_KEYOWNER_ZONE)
108                 return (ISC_FALSE);
109         if (key->key_proto != DNS_KEYPROTO_DNSSEC &&
110             key->key_proto != DNS_KEYPROTO_ANY)
111                 return (ISC_FALSE);
112         return (ISC_TRUE);
113 }
114
115 isc_boolean_t
116 dst_key_isnullkey(const dst_key_t *key) {
117         REQUIRE(VALID_KEY(key));
118
119         if ((key->key_flags & DNS_KEYFLAG_TYPEMASK) != DNS_KEYTYPE_NOKEY)
120                 return (ISC_FALSE);
121         if ((key->key_flags & DNS_KEYFLAG_OWNERMASK) != DNS_KEYOWNER_ZONE)
122                 return (ISC_FALSE);
123         if (key->key_proto != DNS_KEYPROTO_DNSSEC &&
124             key->key_proto != DNS_KEYPROTO_ANY)
125                 return (ISC_FALSE);
126         return (ISC_TRUE);
127 }