Annotation of embedaddon/dhcp/omapip/auth.c, revision 1.1.1.1
1.1 misho 1: /* auth.c
2:
3: Subroutines having to do with authentication. */
4:
5: /*
6: * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
7: * Copyright (c) 1998-2003 by Internet Software Consortium
8: *
9: * Permission to use, copy, modify, and distribute this software for any
10: * purpose with or without fee is hereby granted, provided that the above
11: * copyright notice and this permission notice appear in all copies.
12: *
13: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
14: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
16: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
19: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20: *
21: * Internet Systems Consortium, Inc.
22: * 950 Charter Street
23: * Redwood City, CA 94063
24: * <info@isc.org>
25: * https://www.isc.org/
26: *
27: * This software has been written for Internet Systems Consortium
28: * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
29: * To learn more about Internet Systems Consortium, see
30: * ``https://www.isc.org/''. To learn more about Vixie Enterprises,
31: * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
32: * ``http://www.nominum.com''.
33: */
34:
35: #include "dhcpd.h"
36:
37: #include <omapip/omapip_p.h>
38:
39: OMAPI_OBJECT_ALLOC (omapi_auth_key, omapi_auth_key_t, omapi_type_auth_key)
40: typedef struct hash omapi_auth_hash_t;
41: HASH_FUNCTIONS_DECL (omapi_auth_key, const char *,
42: omapi_auth_key_t, omapi_auth_hash_t)
43: omapi_auth_hash_t *auth_key_hash;
44: HASH_FUNCTIONS (omapi_auth_key, const char *, omapi_auth_key_t,
45: omapi_auth_hash_t,
46: omapi_auth_key_reference, omapi_auth_key_dereference,
47: do_case_hash)
48:
49: isc_result_t omapi_auth_key_new (omapi_auth_key_t **o, const char *file,
50: int line)
51: {
52: return omapi_auth_key_allocate (o, file, line);
53: }
54:
55: isc_result_t omapi_auth_key_destroy (omapi_object_t *h,
56: const char *file, int line)
57: {
58: omapi_auth_key_t *a;
59:
60: if (h -> type != omapi_type_auth_key)
61: return ISC_R_INVALIDARG;
62: a = (omapi_auth_key_t *)h;
63:
64: if (auth_key_hash)
65: omapi_auth_key_hash_delete (auth_key_hash, a -> name, 0, MDL);
66:
67: if (a -> name)
68: dfree (a -> name, MDL);
69: if (a -> algorithm)
70: dfree (a -> algorithm, MDL);
71: if (a -> key)
72: omapi_data_string_dereference (&a -> key, MDL);
73:
74: return ISC_R_SUCCESS;
75: }
76:
77: isc_result_t omapi_auth_key_enter (omapi_auth_key_t *a)
78: {
79: omapi_auth_key_t *tk;
80:
81: if (a -> type != omapi_type_auth_key)
82: return ISC_R_INVALIDARG;
83:
84: tk = (omapi_auth_key_t *)0;
85: if (auth_key_hash) {
86: omapi_auth_key_hash_lookup (&tk, auth_key_hash,
87: a -> name, 0, MDL);
88: if (tk == a) {
89: omapi_auth_key_dereference (&tk, MDL);
90: return ISC_R_SUCCESS;
91: }
92: if (tk) {
93: omapi_auth_key_hash_delete (auth_key_hash,
94: tk -> name, 0, MDL);
95: omapi_auth_key_dereference (&tk, MDL);
96: }
97: } else {
98: if (!omapi_auth_key_new_hash(&auth_key_hash,
99: KEY_HASH_SIZE, MDL))
100: return ISC_R_NOMEMORY;
101: }
102: omapi_auth_key_hash_add (auth_key_hash, a -> name, 0, a, MDL);
103: return ISC_R_SUCCESS;
104:
105: }
106:
107: isc_result_t omapi_auth_key_lookup_name (omapi_auth_key_t **a,
108: const char *name)
109: {
110: if (!auth_key_hash)
111: return ISC_R_NOTFOUND;
112: if (!omapi_auth_key_hash_lookup (a, auth_key_hash, name, 0, MDL))
113: return ISC_R_NOTFOUND;
114: return ISC_R_SUCCESS;
115: }
116:
117: isc_result_t omapi_auth_key_lookup (omapi_object_t **h,
118: omapi_object_t *id,
119: omapi_object_t *ref)
120: {
121: isc_result_t status;
122: omapi_value_t *name = (omapi_value_t *)0;
123: omapi_value_t *algorithm = (omapi_value_t *)0;
124:
125: if (!auth_key_hash)
126: return ISC_R_NOTFOUND;
127:
128: if (!ref)
129: return ISC_R_NOKEYS;
130:
131: status = omapi_get_value_str (ref, id, "name", &name);
132: if (status != ISC_R_SUCCESS)
133: return status;
134:
135: if ((name -> value -> type != omapi_datatype_string) &&
136: (name -> value -> type != omapi_datatype_data)) {
137: omapi_value_dereference (&name, MDL);
138: return ISC_R_NOTFOUND;
139: }
140:
141: status = omapi_get_value_str (ref, id, "algorithm", &algorithm);
142: if (status != ISC_R_SUCCESS) {
143: omapi_value_dereference (&name, MDL);
144: return status;
145: }
146:
147: if ((algorithm -> value -> type != omapi_datatype_string) &&
148: (algorithm -> value -> type != omapi_datatype_data)) {
149: omapi_value_dereference (&name, MDL);
150: omapi_value_dereference (&algorithm, MDL);
151: return ISC_R_NOTFOUND;
152: }
153:
154:
155: if (!omapi_auth_key_hash_lookup ((omapi_auth_key_t **)h, auth_key_hash,
156: (const char *)
157: name -> value -> u.buffer.value,
158: name -> value -> u.buffer.len, MDL)) {
159: omapi_value_dereference (&name, MDL);
160: omapi_value_dereference (&algorithm, MDL);
161: return ISC_R_NOTFOUND;
162: }
163:
164: if (omapi_td_strcasecmp (algorithm -> value,
165: ((omapi_auth_key_t *)*h) -> algorithm) != 0) {
166: omapi_value_dereference (&name, MDL);
167: omapi_value_dereference (&algorithm, MDL);
168: omapi_object_dereference (h, MDL);
169: return ISC_R_NOTFOUND;
170: }
171:
172: omapi_value_dereference (&name, MDL);
173: omapi_value_dereference (&algorithm, MDL);
174:
175: return ISC_R_SUCCESS;
176: }
177:
178: isc_result_t omapi_auth_key_stuff_values (omapi_object_t *c,
179: omapi_object_t *id,
180: omapi_object_t *h)
181: {
182: omapi_auth_key_t *a;
183: isc_result_t status;
184:
185: if (h -> type != omapi_type_auth_key)
186: return ISC_R_INVALIDARG;
187: a = (omapi_auth_key_t *)h;
188:
189: /* Write only the name and algorithm -- not the secret! */
190: if (a -> name) {
191: status = omapi_connection_put_name (c, "name");
192: if (status != ISC_R_SUCCESS)
193: return status;
194: status = omapi_connection_put_string (c, a -> name);
195: if (status != ISC_R_SUCCESS)
196: return status;
197: }
198: if (a -> algorithm) {
199: status = omapi_connection_put_name (c, "algorithm");
200: if (status != ISC_R_SUCCESS)
201: return status;
202: status = omapi_connection_put_string (c, a -> algorithm);
203: if (status != ISC_R_SUCCESS)
204: return status;
205: }
206:
207: return ISC_R_SUCCESS;
208: }
209:
210: isc_result_t omapi_auth_key_get_value (omapi_object_t *h,
211: omapi_object_t *id,
212: omapi_data_string_t *name,
213: omapi_value_t **value)
214: {
215: omapi_auth_key_t *a;
216: isc_result_t status;
217:
218: if (h -> type != omapi_type_auth_key)
219: return ISC_R_UNEXPECTED;
220: a = (omapi_auth_key_t *)h;
221:
222: if (omapi_ds_strcmp (name, "name") == 0) {
223: if (a -> name)
224: return omapi_make_string_value
225: (value, name, a -> name, MDL);
226: else
227: return ISC_R_NOTFOUND;
228: } else if (omapi_ds_strcmp (name, "key") == 0) {
229: if (a -> key) {
230: status = omapi_value_new (value, MDL);
231: if (status != ISC_R_SUCCESS)
232: return status;
233:
234: status = omapi_data_string_reference
235: (&(*value) -> name, name, MDL);
236: if (status != ISC_R_SUCCESS) {
237: omapi_value_dereference (value, MDL);
238: return status;
239: }
240:
241: status = omapi_typed_data_new (MDL, &(*value) -> value,
242: omapi_datatype_data,
243: a -> key -> len);
244: if (status != ISC_R_SUCCESS) {
245: omapi_value_dereference (value, MDL);
246: return status;
247: }
248:
249: memcpy ((*value) -> value -> u.buffer.value,
250: a -> key -> value, a -> key -> len);
251: return ISC_R_SUCCESS;
252: } else
253: return ISC_R_NOTFOUND;
254: } else if (omapi_ds_strcmp (name, "algorithm") == 0) {
255: if (a -> algorithm)
256: return omapi_make_string_value
257: (value, name, a -> algorithm, MDL);
258: else
259: return ISC_R_NOTFOUND;
260: }
261:
262: return ISC_R_SUCCESS;
263: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>