Annotation of embedaddon/dhcp/omapip/auth.c, revision 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>