File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / omapip / auth.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (11 years, 8 months ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    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>