1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/crypto/krb/keyblocks.c - Keyblock utility functions */
3 /*
4 * Copyright (C) 2002, 2005 by the Massachusetts Institute of Technology.
5 * All rights reserved.
6 *
7 * Export of this software from the United States of America may
8 * require a specific license from the United States Government.
9 * It is the responsibility of any person or organization contemplating
10 * export to obtain such a license before exporting.
11 *
12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13 * distribute this software and its documentation for any purpose and
14 * without fee is hereby granted, provided that the above copyright
15 * notice appear in all copies and that both that copyright notice and
16 * this permission notice appear in supporting documentation, and that
17 * the name of M.I.T. not be used in advertising or publicity pertaining
18 * to distribution of the software without specific, written prior
19 * permission. Furthermore if you modify this software you must label
20 * your software as modified software and not distribute it in such a
21 * fashion that it might be confused with the original M.I.T. software.
22 * M.I.T. makes no representations about the suitability of
23 * this software for any purpose. It is provided "as is" without express
24 * or implied warranty.
25 */
26
27 #include "crypto_int.h"
28
29 krb5_error_code
krb5int_c_init_keyblock(krb5_context context,krb5_enctype enctype,size_t length,krb5_keyblock ** out)30 krb5int_c_init_keyblock(krb5_context context, krb5_enctype enctype,
31 size_t length, krb5_keyblock **out)
32 {
33 krb5_keyblock *kb;
34
35 assert(out);
36 *out = NULL;
37
38 kb = malloc(sizeof(krb5_keyblock));
39 if (kb == NULL)
40 return ENOMEM;
41 kb->magic = KV5M_KEYBLOCK;
42 kb->enctype = enctype;
43 kb->length = length;
44 if (length) {
45 kb->contents = malloc(length);
46 if (!kb->contents) {
47 free(kb);
48 return ENOMEM;
49 }
50 } else {
51 kb->contents = NULL;
52 }
53
54 *out = kb;
55 return 0;
56 }
57
58 void
krb5int_c_free_keyblock(krb5_context context,krb5_keyblock * val)59 krb5int_c_free_keyblock(krb5_context context, krb5_keyblock *val)
60 {
61 krb5int_c_free_keyblock_contents(context, val);
62 free(val);
63 }
64
65 void
krb5int_c_free_keyblock_contents(krb5_context context,krb5_keyblock * key)66 krb5int_c_free_keyblock_contents(krb5_context context, krb5_keyblock *key)
67 {
68 if (key && key->contents) {
69 zapfree(key->contents, key->length);
70 key->contents = NULL;
71 key->length = 0;
72 }
73 }
74
75 krb5_error_code
krb5int_c_copy_keyblock(krb5_context context,const krb5_keyblock * from,krb5_keyblock ** to)76 krb5int_c_copy_keyblock(krb5_context context, const krb5_keyblock *from,
77 krb5_keyblock **to)
78 {
79 krb5_keyblock *new_key;
80 krb5_error_code code;
81
82 *to = NULL;
83 new_key = malloc(sizeof(*new_key));
84 if (!new_key)
85 return ENOMEM;
86 code = krb5int_c_copy_keyblock_contents(context, from, new_key);
87 if (code) {
88 free(new_key);
89 return code;
90 }
91 *to = new_key;
92 return 0;
93 }
94
95 krb5_error_code
krb5int_c_copy_keyblock_contents(krb5_context context,const krb5_keyblock * from,krb5_keyblock * to)96 krb5int_c_copy_keyblock_contents(krb5_context context,
97 const krb5_keyblock *from, krb5_keyblock *to)
98 {
99 *to = *from;
100 if (to->length) {
101 to->contents = malloc(to->length);
102 if (!to->contents)
103 return ENOMEM;
104 memcpy(to->contents, from->contents, to->length);
105 } else
106 to->contents = 0;
107 return 0;
108 }
109