1b528cefcSMark Murray /* 2adb0ddaeSAssar Westerlund * Copyright (c) 1997 - 2001 Kungliga Tekniska H�gskolan 3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4b528cefcSMark Murray * All rights reserved. 5b528cefcSMark Murray * 6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 7b528cefcSMark Murray * modification, are permitted provided that the following conditions 8b528cefcSMark Murray * are met: 9b528cefcSMark Murray * 10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 12b528cefcSMark Murray * 13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 15b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 16b528cefcSMark Murray * 17b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors 18b528cefcSMark Murray * may be used to endorse or promote products derived from this software 19b528cefcSMark Murray * without specific prior written permission. 20b528cefcSMark Murray * 21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31b528cefcSMark Murray * SUCH DAMAGE. 32b528cefcSMark Murray */ 33b528cefcSMark Murray 34b528cefcSMark Murray #include "krb5_locl.h" 35b528cefcSMark Murray 36c19800e8SDoug Rabson RCSID("$Id: keyblock.c 15167 2005-05-18 04:21:57Z lha $"); 375e9cd1aeSAssar Westerlund 38c19800e8SDoug Rabson void KRB5_LIB_FUNCTION 39c19800e8SDoug Rabson krb5_keyblock_zero(krb5_keyblock *keyblock) 40c19800e8SDoug Rabson { 41c19800e8SDoug Rabson keyblock->keytype = 0; 42c19800e8SDoug Rabson krb5_data_zero(&keyblock->keyvalue); 43c19800e8SDoug Rabson } 44c19800e8SDoug Rabson 45c19800e8SDoug Rabson void KRB5_LIB_FUNCTION 46b528cefcSMark Murray krb5_free_keyblock_contents(krb5_context context, 47b528cefcSMark Murray krb5_keyblock *keyblock) 48b528cefcSMark Murray { 49b528cefcSMark Murray if(keyblock) { 50b528cefcSMark Murray if (keyblock->keyvalue.data != NULL) 51b528cefcSMark Murray memset(keyblock->keyvalue.data, 0, keyblock->keyvalue.length); 52b528cefcSMark Murray krb5_data_free (&keyblock->keyvalue); 53c19800e8SDoug Rabson keyblock->keytype = ENCTYPE_NULL; 54b528cefcSMark Murray } 55b528cefcSMark Murray } 56b528cefcSMark Murray 57c19800e8SDoug Rabson void KRB5_LIB_FUNCTION 58b528cefcSMark Murray krb5_free_keyblock(krb5_context context, 59b528cefcSMark Murray krb5_keyblock *keyblock) 60b528cefcSMark Murray { 61b528cefcSMark Murray if(keyblock){ 62b528cefcSMark Murray krb5_free_keyblock_contents(context, keyblock); 63b528cefcSMark Murray free(keyblock); 64b528cefcSMark Murray } 65b528cefcSMark Murray } 66b528cefcSMark Murray 67c19800e8SDoug Rabson krb5_error_code KRB5_LIB_FUNCTION 68b528cefcSMark Murray krb5_copy_keyblock_contents (krb5_context context, 69b528cefcSMark Murray const krb5_keyblock *inblock, 70b528cefcSMark Murray krb5_keyblock *to) 71b528cefcSMark Murray { 72b528cefcSMark Murray return copy_EncryptionKey(inblock, to); 73b528cefcSMark Murray } 74b528cefcSMark Murray 75c19800e8SDoug Rabson krb5_error_code KRB5_LIB_FUNCTION 76b528cefcSMark Murray krb5_copy_keyblock (krb5_context context, 77b528cefcSMark Murray const krb5_keyblock *inblock, 78b528cefcSMark Murray krb5_keyblock **to) 79b528cefcSMark Murray { 80b528cefcSMark Murray krb5_keyblock *k; 81b528cefcSMark Murray 82b528cefcSMark Murray k = malloc (sizeof(*k)); 83adb0ddaeSAssar Westerlund if (k == NULL) { 84adb0ddaeSAssar Westerlund krb5_set_error_string(context, "malloc: out of memory"); 85b528cefcSMark Murray return ENOMEM; 86adb0ddaeSAssar Westerlund } 87b528cefcSMark Murray *to = k; 88b528cefcSMark Murray return krb5_copy_keyblock_contents (context, inblock, k); 89b528cefcSMark Murray } 90c19800e8SDoug Rabson 91c19800e8SDoug Rabson krb5_enctype 92c19800e8SDoug Rabson krb5_keyblock_get_enctype(const krb5_keyblock *block) 93c19800e8SDoug Rabson { 94c19800e8SDoug Rabson return block->keytype; 95c19800e8SDoug Rabson } 96c19800e8SDoug Rabson 97c19800e8SDoug Rabson /* 98c19800e8SDoug Rabson * Fill in `key' with key data of type `enctype' from `data' of length 99c19800e8SDoug Rabson * `size'. Key should be freed using krb5_free_keyblock_contents. 100c19800e8SDoug Rabson */ 101c19800e8SDoug Rabson 102c19800e8SDoug Rabson krb5_error_code KRB5_LIB_FUNCTION 103c19800e8SDoug Rabson krb5_keyblock_init(krb5_context context, 104c19800e8SDoug Rabson krb5_enctype type, 105c19800e8SDoug Rabson const void *data, 106c19800e8SDoug Rabson size_t size, 107c19800e8SDoug Rabson krb5_keyblock *key) 108c19800e8SDoug Rabson { 109c19800e8SDoug Rabson krb5_error_code ret; 110c19800e8SDoug Rabson size_t len; 111c19800e8SDoug Rabson 112c19800e8SDoug Rabson memset(key, 0, sizeof(*key)); 113c19800e8SDoug Rabson 114c19800e8SDoug Rabson ret = krb5_enctype_keysize(context, type, &len); 115c19800e8SDoug Rabson if (ret) 116c19800e8SDoug Rabson return ret; 117c19800e8SDoug Rabson 118c19800e8SDoug Rabson if (len != size) { 119c19800e8SDoug Rabson krb5_set_error_string(context, "Encryption key %d is %lu bytes " 120c19800e8SDoug Rabson "long, %lu was passed in", 121c19800e8SDoug Rabson type, (unsigned long)len, (unsigned long)size); 122c19800e8SDoug Rabson return KRB5_PROG_ETYPE_NOSUPP; 123c19800e8SDoug Rabson } 124c19800e8SDoug Rabson ret = krb5_data_copy(&key->keyvalue, data, len); 125c19800e8SDoug Rabson if(ret) { 126c19800e8SDoug Rabson krb5_set_error_string(context, "malloc failed: %lu", 127c19800e8SDoug Rabson (unsigned long)len); 128c19800e8SDoug Rabson return ret; 129c19800e8SDoug Rabson } 130c19800e8SDoug Rabson key->keytype = type; 131c19800e8SDoug Rabson 132c19800e8SDoug Rabson return 0; 133c19800e8SDoug Rabson } 134