/ lib / kadm5 / keys.c
keys.c
  1  /*
  2   * Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan
  3   * (Royal Institute of Technology, Stockholm, Sweden).
  4   * All rights reserved.
  5   *
  6   * Redistribution and use in source and binary forms, with or without
  7   * modification, are permitted provided that the following conditions
  8   * are met:
  9   *
 10   * 1. Redistributions of source code must retain the above copyright
 11   *    notice, this list of conditions and the following disclaimer.
 12   *
 13   * 2. Redistributions in binary form must reproduce the above copyright
 14   *    notice, this list of conditions and the following disclaimer in the
 15   *    documentation and/or other materials provided with the distribution.
 16   *
 17   * 3. Neither the name of the Institute nor the names of its contributors
 18   *    may be used to endorse or promote products derived from this software
 19   *    without specific prior written permission.
 20   *
 21   * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 22   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 23   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 24   * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 25   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 27   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 28   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 29   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 30   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 31   * SUCH DAMAGE.
 32   */
 33  
 34  #include "kadm5_locl.h"
 35  
 36  RCSID("$Id$");
 37  
 38  /*
 39   * free all the memory used by (len, keys)
 40   */
 41  
 42  void
 43  _kadm5_free_keys (krb5_context context,
 44  		  int len, Key *keys)
 45  {
 46      hdb_free_keys(context, len, keys);
 47  }
 48  
 49  /*
 50   * null-ify `len', `keys'
 51   */
 52  
 53  void
 54  _kadm5_init_keys (Key *keys, int len)
 55  {
 56      int i;
 57  
 58      for (i = 0; i < len; ++i) {
 59  	keys[i].mkvno               = NULL;
 60  	keys[i].salt                = NULL;
 61  	keys[i].key.keyvalue.length = 0;
 62  	keys[i].key.keyvalue.data   = NULL;
 63      }
 64  }
 65  
 66  
 67  /*
 68   * return 1 if any key in `keys1, len1' exists in `keys2, len2'
 69   */
 70  static int
 71  _kadm5_exists_keys(Key *keys1, unsigned len1, Key *keys2, unsigned len2)
 72  {
 73      unsigned i, j;
 74  
 75      for (i = 0; i < len1; ++i) {
 76  	int optimize = 0;
 77  
 78  	for (j = 0; j < len2; j++) {
 79  	    if ((keys1[i].salt != NULL && keys2[j].salt == NULL)
 80  		|| (keys1[i].salt == NULL && keys2[j].salt != NULL))
 81  		continue;
 82  
 83  	    if (keys1[i].salt != NULL) {
 84  		if (keys1[i].salt->type != keys2[j].salt->type)
 85  		    continue;
 86  		if (keys1[i].salt->salt.length != keys2[j].salt->salt.length)
 87  		    continue;
 88  		if (memcmp (keys1[i].salt->salt.data, keys2[j].salt->salt.data,
 89  			    keys1[i].salt->salt.length) != 0)
 90  		    continue;
 91  	    }
 92  	    if (keys1[i].key.keytype != keys2[j].key.keytype)
 93  		continue;
 94  	    optimize = 1;
 95  	    if (keys1[i].key.keyvalue.length != keys2[j].key.keyvalue.length)
 96  		continue;
 97  	    if (memcmp (keys1[i].key.keyvalue.data, keys2[j].key.keyvalue.data,
 98  			keys1[i].key.keyvalue.length) != 0)
 99  		continue;
100  
101  	    return 1;
102  	}
103  
104  	/*
105  	 * Optimization: no need to check all of keys1[] if one there
106  	 * was one key in keys2[] with matching enctype and salt but not
107  	 * matching key.  Assumption: all keys in keys1[] and keys2[]
108  	 * are output by string2key.
109  	 */
110  	if (optimize)
111  	    return 0;
112      }
113      return 0;
114  }
115  
116  /*
117   * return 1 if any key in `keys1, len1' exists in hist_keys
118   */
119  int
120  _kadm5_exists_keys_hist(Key *keys1, unsigned len1, HDB_Ext_KeySet *hist_keys)
121  {
122      unsigned n;
123  
124      for (n = 0; n < hist_keys->len; n++) {
125  	if (_kadm5_exists_keys(keys1, len1,
126  			       hist_keys->val[n].keys.val,
127  			       hist_keys->val[n].keys.len))
128  	    return 1;
129      }
130  
131      return 0;
132  }