1*159d09a2SMark Phalan /*
2*159d09a2SMark Phalan * COPYRIGHT (c) 2006
3*159d09a2SMark Phalan * The Regents of the University of Michigan
4*159d09a2SMark Phalan * ALL RIGHTS RESERVED
5*159d09a2SMark Phalan *
6*159d09a2SMark Phalan * Permission is granted to use, copy, create derivative works
7*159d09a2SMark Phalan * and redistribute this software and such derivative works
8*159d09a2SMark Phalan * for any purpose, so long as the name of The University of
9*159d09a2SMark Phalan * Michigan is not used in any advertising or publicity
10*159d09a2SMark Phalan * pertaining to the use of distribution of this software
11*159d09a2SMark Phalan * without specific, written prior authorization. If the
12*159d09a2SMark Phalan * above copyright notice or any other identification of the
13*159d09a2SMark Phalan * University of Michigan is included in any copy of any
14*159d09a2SMark Phalan * portion of this software, then the disclaimer below must
15*159d09a2SMark Phalan * also be included.
16*159d09a2SMark Phalan *
17*159d09a2SMark Phalan * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION
18*159d09a2SMark Phalan * FROM THE UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY
19*159d09a2SMark Phalan * PURPOSE, AND WITHOUT WARRANTY BY THE UNIVERSITY OF
20*159d09a2SMark Phalan * MICHIGAN OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
21*159d09a2SMark Phalan * WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
22*159d09a2SMark Phalan * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
23*159d09a2SMark Phalan * REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE
24*159d09a2SMark Phalan * FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR
25*159d09a2SMark Phalan * CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING
26*159d09a2SMark Phalan * OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN
27*159d09a2SMark Phalan * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF
28*159d09a2SMark Phalan * SUCH DAMAGES.
29*159d09a2SMark Phalan */
30*159d09a2SMark Phalan
31*159d09a2SMark Phalan
32*159d09a2SMark Phalan /*
33*159d09a2SMark Phalan * Create a key given random data. It is assumed that random_key has
34*159d09a2SMark Phalan * already been initialized and random_key->contents have been allocated
35*159d09a2SMark Phalan * with the correct length.
36*159d09a2SMark Phalan */
37*159d09a2SMark Phalan #include "k5-int.h"
38*159d09a2SMark Phalan #include "etypes.h"
39*159d09a2SMark Phalan
40*159d09a2SMark Phalan krb5_error_code KRB5_CALLCONV
krb5_c_random_to_key(krb5_context context,krb5_enctype enctype,krb5_data * random_data,krb5_keyblock * random_key)41*159d09a2SMark Phalan krb5_c_random_to_key(krb5_context context, krb5_enctype enctype,
42*159d09a2SMark Phalan krb5_data *random_data, krb5_keyblock *random_key)
43*159d09a2SMark Phalan {
44*159d09a2SMark Phalan int i;
45*159d09a2SMark Phalan krb5_error_code ret;
46*159d09a2SMark Phalan const struct krb5_enc_provider *enc;
47*159d09a2SMark Phalan
48*159d09a2SMark Phalan if (random_data == NULL || random_key == NULL)
49*159d09a2SMark Phalan return(EINVAL);
50*159d09a2SMark Phalan
51*159d09a2SMark Phalan if (random_key->contents == NULL)
52*159d09a2SMark Phalan return(EINVAL);
53*159d09a2SMark Phalan
54*159d09a2SMark Phalan for (i=0; i<krb5_enctypes_length; i++) {
55*159d09a2SMark Phalan if (krb5_enctypes_list[i].etype == enctype)
56*159d09a2SMark Phalan break;
57*159d09a2SMark Phalan }
58*159d09a2SMark Phalan
59*159d09a2SMark Phalan if (i == krb5_enctypes_length)
60*159d09a2SMark Phalan return(KRB5_BAD_ENCTYPE);
61*159d09a2SMark Phalan
62*159d09a2SMark Phalan enc = krb5_enctypes_list[i].enc;
63*159d09a2SMark Phalan
64*159d09a2SMark Phalan if (random_key->length != enc->keylength)
65*159d09a2SMark Phalan return(KRB5_BAD_KEYSIZE);
66*159d09a2SMark Phalan
67*159d09a2SMark Phalan /* Solaris Kerberos */
68*159d09a2SMark Phalan ret = ((*(enc->make_key))(context, random_data, random_key));
69*159d09a2SMark Phalan
70*159d09a2SMark Phalan if (ret) {
71*159d09a2SMark Phalan memset(random_key->contents, 0, random_key->length);
72*159d09a2SMark Phalan }
73*159d09a2SMark Phalan
74*159d09a2SMark Phalan return(ret);
75*159d09a2SMark Phalan }
76