xref: /freebsd/crypto/heimdal/lib/krb5/mit_glue.c (revision c19800e8)
1c19800e8SDoug Rabson /*
2c19800e8SDoug Rabson  * Copyright (c) 2003 Kungliga Tekniska Högskolan
3c19800e8SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
4c19800e8SDoug Rabson  * All rights reserved.
5c19800e8SDoug Rabson  *
6c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
7c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
8c19800e8SDoug Rabson  * are met:
9c19800e8SDoug Rabson  *
10c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
11c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
12c19800e8SDoug Rabson  *
13c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
14c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
15c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
16c19800e8SDoug Rabson  *
17c19800e8SDoug Rabson  * 3. Neither the name of the Institute nor the names of its contributors
18c19800e8SDoug Rabson  *    may be used to endorse or promote products derived from this software
19c19800e8SDoug Rabson  *    without specific prior written permission.
20c19800e8SDoug Rabson  *
21c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22c19800e8SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24c19800e8SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25c19800e8SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26c19800e8SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27c19800e8SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28c19800e8SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29c19800e8SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30c19800e8SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31c19800e8SDoug Rabson  * SUCH DAMAGE.
32c19800e8SDoug Rabson  */
33c19800e8SDoug Rabson 
34c19800e8SDoug Rabson #include "krb5_locl.h"
35c19800e8SDoug Rabson 
36c19800e8SDoug Rabson #ifndef HEIMDAL_SMALLER
37c19800e8SDoug Rabson 
38c19800e8SDoug Rabson /*
39c19800e8SDoug Rabson  * Glue for MIT API
40c19800e8SDoug Rabson  */
41c19800e8SDoug Rabson 
42c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_make_checksum(krb5_context context,krb5_cksumtype cksumtype,const krb5_keyblock * key,krb5_keyusage usage,const krb5_data * input,krb5_checksum * cksum)43c19800e8SDoug Rabson krb5_c_make_checksum(krb5_context context,
44c19800e8SDoug Rabson 		     krb5_cksumtype cksumtype,
45c19800e8SDoug Rabson 		     const krb5_keyblock *key,
46c19800e8SDoug Rabson 		     krb5_keyusage usage,
47c19800e8SDoug Rabson 		     const krb5_data *input,
48c19800e8SDoug Rabson 		     krb5_checksum *cksum)
49c19800e8SDoug Rabson {
50c19800e8SDoug Rabson     krb5_error_code ret;
51c19800e8SDoug Rabson     krb5_crypto crypto;
52c19800e8SDoug Rabson 
53c19800e8SDoug Rabson     ret = krb5_crypto_init(context, key, 0, &crypto);
54c19800e8SDoug Rabson     if (ret)
55c19800e8SDoug Rabson 	return ret;
56c19800e8SDoug Rabson 
57c19800e8SDoug Rabson     ret = krb5_create_checksum(context, crypto,  usage, cksumtype,
58c19800e8SDoug Rabson 			       input->data, input->length, cksum);
59c19800e8SDoug Rabson     krb5_crypto_destroy(context, crypto);
60c19800e8SDoug Rabson 
61c19800e8SDoug Rabson     return ret ;
62c19800e8SDoug Rabson }
63c19800e8SDoug Rabson 
64c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_verify_checksum(krb5_context context,const krb5_keyblock * key,krb5_keyusage usage,const krb5_data * data,const krb5_checksum * cksum,krb5_boolean * valid)65c19800e8SDoug Rabson krb5_c_verify_checksum(krb5_context context, const krb5_keyblock *key,
66c19800e8SDoug Rabson 		       krb5_keyusage usage, const krb5_data *data,
67c19800e8SDoug Rabson 		       const krb5_checksum *cksum, krb5_boolean *valid)
68c19800e8SDoug Rabson {
69c19800e8SDoug Rabson     krb5_error_code ret;
70c19800e8SDoug Rabson     krb5_checksum data_cksum;
71c19800e8SDoug Rabson 
72c19800e8SDoug Rabson     *valid = 0;
73c19800e8SDoug Rabson 
74c19800e8SDoug Rabson     ret = krb5_c_make_checksum(context, cksum->cksumtype,
75c19800e8SDoug Rabson 			       key, usage, data, &data_cksum);
76c19800e8SDoug Rabson     if (ret)
77c19800e8SDoug Rabson 	return ret;
78c19800e8SDoug Rabson 
79c19800e8SDoug Rabson     if (data_cksum.cksumtype == cksum->cksumtype
80c19800e8SDoug Rabson 	&& krb5_data_ct_cmp(&data_cksum.checksum, &cksum->checksum) == 0)
81c19800e8SDoug Rabson 	*valid = 1;
82c19800e8SDoug Rabson 
83c19800e8SDoug Rabson     krb5_free_checksum_contents(context, &data_cksum);
84c19800e8SDoug Rabson 
85c19800e8SDoug Rabson     return 0;
86c19800e8SDoug Rabson }
87c19800e8SDoug Rabson 
88c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_get_checksum(krb5_context context,const krb5_checksum * cksum,krb5_cksumtype * type,krb5_data ** data)89c19800e8SDoug Rabson krb5_c_get_checksum(krb5_context context, const krb5_checksum *cksum,
90c19800e8SDoug Rabson 		    krb5_cksumtype *type, krb5_data **data)
91c19800e8SDoug Rabson {
92c19800e8SDoug Rabson     krb5_error_code ret;
93c19800e8SDoug Rabson 
94c19800e8SDoug Rabson     if (type)
95c19800e8SDoug Rabson 	*type = cksum->cksumtype;
96c19800e8SDoug Rabson     if (data) {
97c19800e8SDoug Rabson 	*data = malloc(sizeof(**data));
98c19800e8SDoug Rabson 	if (*data == NULL)
99c19800e8SDoug Rabson 	    return ENOMEM;
100c19800e8SDoug Rabson 
101c19800e8SDoug Rabson 	ret = der_copy_octet_string(&cksum->checksum, *data);
102c19800e8SDoug Rabson 	if (ret) {
103c19800e8SDoug Rabson 	    free(*data);
104c19800e8SDoug Rabson 	    *data = NULL;
105c19800e8SDoug Rabson 	    return ret;
106c19800e8SDoug Rabson 	}
107c19800e8SDoug Rabson     }
108c19800e8SDoug Rabson     return 0;
109c19800e8SDoug Rabson }
110c19800e8SDoug Rabson 
111c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_set_checksum(krb5_context context,krb5_checksum * cksum,krb5_cksumtype type,const krb5_data * data)112c19800e8SDoug Rabson krb5_c_set_checksum(krb5_context context, krb5_checksum *cksum,
113c19800e8SDoug Rabson 		    krb5_cksumtype type, const krb5_data *data)
114c19800e8SDoug Rabson {
115c19800e8SDoug Rabson     cksum->cksumtype = type;
116c19800e8SDoug Rabson     return der_copy_octet_string(data, &cksum->checksum);
117c19800e8SDoug Rabson }
118c19800e8SDoug Rabson 
119c19800e8SDoug Rabson KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_free_checksum(krb5_context context,krb5_checksum * cksum)120c19800e8SDoug Rabson krb5_free_checksum (krb5_context context, krb5_checksum *cksum)
121c19800e8SDoug Rabson {
122c19800e8SDoug Rabson     krb5_checksum_free(context, cksum);
123c19800e8SDoug Rabson     free(cksum);
124c19800e8SDoug Rabson }
125c19800e8SDoug Rabson 
126c19800e8SDoug Rabson KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_free_checksum_contents(krb5_context context,krb5_checksum * cksum)127c19800e8SDoug Rabson krb5_free_checksum_contents(krb5_context context, krb5_checksum *cksum)
128c19800e8SDoug Rabson {
129c19800e8SDoug Rabson     krb5_checksum_free(context, cksum);
130c19800e8SDoug Rabson     memset(cksum, 0, sizeof(*cksum));
131c19800e8SDoug Rabson }
132c19800e8SDoug Rabson 
133c19800e8SDoug Rabson KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_checksum_free(krb5_context context,krb5_checksum * cksum)134c19800e8SDoug Rabson krb5_checksum_free(krb5_context context, krb5_checksum *cksum)
135c19800e8SDoug Rabson {
136c19800e8SDoug Rabson     free_Checksum(cksum);
137c19800e8SDoug Rabson }
138c19800e8SDoug Rabson 
139c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL
krb5_c_valid_enctype(krb5_enctype etype)140c19800e8SDoug Rabson krb5_c_valid_enctype (krb5_enctype etype)
141c19800e8SDoug Rabson {
142c19800e8SDoug Rabson     return !krb5_enctype_valid(NULL, etype);
143c19800e8SDoug Rabson }
144c19800e8SDoug Rabson 
145c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL
krb5_c_valid_cksumtype(krb5_cksumtype ctype)146c19800e8SDoug Rabson krb5_c_valid_cksumtype(krb5_cksumtype ctype)
147c19800e8SDoug Rabson {
148c19800e8SDoug Rabson     return krb5_cksumtype_valid(NULL, ctype);
149c19800e8SDoug Rabson }
150c19800e8SDoug Rabson 
151c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL
krb5_c_is_coll_proof_cksum(krb5_cksumtype ctype)152c19800e8SDoug Rabson krb5_c_is_coll_proof_cksum(krb5_cksumtype ctype)
153c19800e8SDoug Rabson {
154c19800e8SDoug Rabson     return krb5_checksum_is_collision_proof(NULL, ctype);
155c19800e8SDoug Rabson }
156c19800e8SDoug Rabson 
157c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL
krb5_c_is_keyed_cksum(krb5_cksumtype ctype)158c19800e8SDoug Rabson krb5_c_is_keyed_cksum(krb5_cksumtype ctype)
159c19800e8SDoug Rabson {
160c19800e8SDoug Rabson     return krb5_checksum_is_keyed(NULL, ctype);
161c19800e8SDoug Rabson }
162c19800e8SDoug Rabson 
163c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_copy_checksum(krb5_context context,const krb5_checksum * old,krb5_checksum ** new)164c19800e8SDoug Rabson krb5_copy_checksum (krb5_context context,
165c19800e8SDoug Rabson 		    const krb5_checksum *old,
166c19800e8SDoug Rabson 		    krb5_checksum **new)
167c19800e8SDoug Rabson {
168c19800e8SDoug Rabson     *new = malloc(sizeof(**new));
169c19800e8SDoug Rabson     if (*new == NULL)
170c19800e8SDoug Rabson 	return ENOMEM;
171c19800e8SDoug Rabson     return copy_Checksum(old, *new);
172c19800e8SDoug Rabson }
173c19800e8SDoug Rabson 
174c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_checksum_length(krb5_context context,krb5_cksumtype cksumtype,size_t * length)175c19800e8SDoug Rabson krb5_c_checksum_length (krb5_context context, krb5_cksumtype cksumtype,
176c19800e8SDoug Rabson 			size_t *length)
177c19800e8SDoug Rabson {
178c19800e8SDoug Rabson     return krb5_checksumsize(context, cksumtype, length);
179c19800e8SDoug Rabson }
180c19800e8SDoug Rabson 
181c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_block_size(krb5_context context,krb5_enctype enctype,size_t * blocksize)182c19800e8SDoug Rabson krb5_c_block_size(krb5_context context,
183c19800e8SDoug Rabson 		  krb5_enctype enctype,
184c19800e8SDoug Rabson 		  size_t *blocksize)
185c19800e8SDoug Rabson {
186c19800e8SDoug Rabson     krb5_error_code ret;
187c19800e8SDoug Rabson     krb5_crypto crypto;
188c19800e8SDoug Rabson     krb5_keyblock key;
189c19800e8SDoug Rabson 
190c19800e8SDoug Rabson     ret = krb5_generate_random_keyblock(context, enctype, &key);
191c19800e8SDoug Rabson     if (ret)
192c19800e8SDoug Rabson 	return ret;
193c19800e8SDoug Rabson 
194c19800e8SDoug Rabson     ret = krb5_crypto_init(context, &key, 0, &crypto);
195c19800e8SDoug Rabson     krb5_free_keyblock_contents(context, &key);
196c19800e8SDoug Rabson     if (ret)
197c19800e8SDoug Rabson 	return ret;
198c19800e8SDoug Rabson     ret = krb5_crypto_getblocksize(context, crypto, blocksize);
199c19800e8SDoug Rabson     krb5_crypto_destroy(context, crypto);
200c19800e8SDoug Rabson 
201c19800e8SDoug Rabson     return ret;
202c19800e8SDoug Rabson }
203c19800e8SDoug Rabson 
204c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_decrypt(krb5_context context,const krb5_keyblock key,krb5_keyusage usage,const krb5_data * ivec,krb5_enc_data * input,krb5_data * output)205c19800e8SDoug Rabson krb5_c_decrypt(krb5_context context,
206c19800e8SDoug Rabson 	       const krb5_keyblock key,
207c19800e8SDoug Rabson 	       krb5_keyusage usage,
208c19800e8SDoug Rabson 	       const krb5_data *ivec,
209c19800e8SDoug Rabson 	       krb5_enc_data *input,
210c19800e8SDoug Rabson 	       krb5_data *output)
211c19800e8SDoug Rabson {
212c19800e8SDoug Rabson     krb5_error_code ret;
213c19800e8SDoug Rabson     krb5_crypto crypto;
214c19800e8SDoug Rabson 
215c19800e8SDoug Rabson     ret = krb5_crypto_init(context, &key, input->enctype, &crypto);
216c19800e8SDoug Rabson     if (ret)
217c19800e8SDoug Rabson 	return ret;
218c19800e8SDoug Rabson 
219c19800e8SDoug Rabson     if (ivec) {
220c19800e8SDoug Rabson 	size_t blocksize;
221c19800e8SDoug Rabson 
222c19800e8SDoug Rabson 	ret = krb5_crypto_getblocksize(context, crypto, &blocksize);
223c19800e8SDoug Rabson 	if (ret) {
224c19800e8SDoug Rabson 	krb5_crypto_destroy(context, crypto);
225c19800e8SDoug Rabson 	return ret;
226c19800e8SDoug Rabson 	}
227c19800e8SDoug Rabson 
228c19800e8SDoug Rabson 	if (blocksize > ivec->length) {
229c19800e8SDoug Rabson 	    krb5_crypto_destroy(context, crypto);
230c19800e8SDoug Rabson 	    return KRB5_BAD_MSIZE;
231c19800e8SDoug Rabson 	}
232c19800e8SDoug Rabson     }
233c19800e8SDoug Rabson 
234c19800e8SDoug Rabson     ret = krb5_decrypt_ivec(context, crypto, usage,
235c19800e8SDoug Rabson 			    input->ciphertext.data, input->ciphertext.length,
236c19800e8SDoug Rabson 			    output,
237c19800e8SDoug Rabson 			    ivec ? ivec->data : NULL);
238c19800e8SDoug Rabson 
239c19800e8SDoug Rabson     krb5_crypto_destroy(context, crypto);
240c19800e8SDoug Rabson 
241c19800e8SDoug Rabson     return ret ;
242c19800e8SDoug Rabson }
243c19800e8SDoug Rabson 
244c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_encrypt(krb5_context context,const krb5_keyblock * key,krb5_keyusage usage,const krb5_data * ivec,const krb5_data * input,krb5_enc_data * output)245c19800e8SDoug Rabson krb5_c_encrypt(krb5_context context,
246c19800e8SDoug Rabson 	       const krb5_keyblock *key,
247c19800e8SDoug Rabson 	       krb5_keyusage usage,
248c19800e8SDoug Rabson 	       const krb5_data *ivec,
249c19800e8SDoug Rabson 	       const krb5_data *input,
250c19800e8SDoug Rabson 	       krb5_enc_data *output)
251c19800e8SDoug Rabson {
252c19800e8SDoug Rabson     krb5_error_code ret;
253c19800e8SDoug Rabson     krb5_crypto crypto;
254c19800e8SDoug Rabson 
255c19800e8SDoug Rabson     ret = krb5_crypto_init(context, key, 0, &crypto);
256c19800e8SDoug Rabson     if (ret)
257c19800e8SDoug Rabson 	return ret;
258c19800e8SDoug Rabson 
259c19800e8SDoug Rabson     if (ivec) {
260c19800e8SDoug Rabson 	size_t blocksize;
261c19800e8SDoug Rabson 
262c19800e8SDoug Rabson 	ret = krb5_crypto_getblocksize(context, crypto, &blocksize);
263c19800e8SDoug Rabson 	if (ret) {
264c19800e8SDoug Rabson 	    krb5_crypto_destroy(context, crypto);
265c19800e8SDoug Rabson 	    return ret;
266c19800e8SDoug Rabson 	}
267c19800e8SDoug Rabson 
268c19800e8SDoug Rabson 	if (blocksize > ivec->length) {
269c19800e8SDoug Rabson 	    krb5_crypto_destroy(context, crypto);
270c19800e8SDoug Rabson 	    return KRB5_BAD_MSIZE;
271c19800e8SDoug Rabson 	}
272c19800e8SDoug Rabson     }
273c19800e8SDoug Rabson 
274c19800e8SDoug Rabson     ret = krb5_encrypt_ivec(context, crypto, usage,
275c19800e8SDoug Rabson 			    input->data, input->length,
276c19800e8SDoug Rabson 			    &output->ciphertext,
277c19800e8SDoug Rabson 			    ivec ? ivec->data : NULL);
278c19800e8SDoug Rabson     output->kvno = 0;
279c19800e8SDoug Rabson     krb5_crypto_getenctype(context, crypto, &output->enctype);
280c19800e8SDoug Rabson 
281c19800e8SDoug Rabson     krb5_crypto_destroy(context, crypto);
282c19800e8SDoug Rabson 
283c19800e8SDoug Rabson     return ret ;
284c19800e8SDoug Rabson }
285c19800e8SDoug Rabson 
286c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_encrypt_length(krb5_context context,krb5_enctype enctype,size_t inputlen,size_t * length)287c19800e8SDoug Rabson krb5_c_encrypt_length(krb5_context context,
288c19800e8SDoug Rabson 		      krb5_enctype enctype,
289c19800e8SDoug Rabson 		      size_t inputlen,
290c19800e8SDoug Rabson 		      size_t *length)
291c19800e8SDoug Rabson {
292c19800e8SDoug Rabson     krb5_error_code ret;
293c19800e8SDoug Rabson     krb5_crypto crypto;
294c19800e8SDoug Rabson     krb5_keyblock key;
295c19800e8SDoug Rabson 
296c19800e8SDoug Rabson     ret = krb5_generate_random_keyblock(context, enctype, &key);
297c19800e8SDoug Rabson     if (ret)
298c19800e8SDoug Rabson 	return ret;
299c19800e8SDoug Rabson 
300c19800e8SDoug Rabson     ret = krb5_crypto_init(context, &key, 0, &crypto);
301c19800e8SDoug Rabson     krb5_free_keyblock_contents(context, &key);
302c19800e8SDoug Rabson     if (ret)
303c19800e8SDoug Rabson 	return ret;
304c19800e8SDoug Rabson 
305c19800e8SDoug Rabson     *length = krb5_get_wrapped_length(context, crypto, inputlen);
306c19800e8SDoug Rabson     krb5_crypto_destroy(context, crypto);
307c19800e8SDoug Rabson 
308c19800e8SDoug Rabson     return 0;
309c19800e8SDoug Rabson }
310c19800e8SDoug Rabson 
311c19800e8SDoug Rabson /**
312c19800e8SDoug Rabson  * Deprecated: keytypes doesn't exists, they are really enctypes.
313c19800e8SDoug Rabson  *
314c19800e8SDoug Rabson  * @ingroup krb5_deprecated
315c19800e8SDoug Rabson  */
316c19800e8SDoug Rabson 
317c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_enctype_compare(krb5_context context,krb5_enctype e1,krb5_enctype e2,krb5_boolean * similar)318c19800e8SDoug Rabson krb5_c_enctype_compare(krb5_context context,
319c19800e8SDoug Rabson 		       krb5_enctype e1,
320c19800e8SDoug Rabson 		       krb5_enctype e2,
321c19800e8SDoug Rabson 		       krb5_boolean *similar)
322c19800e8SDoug Rabson     KRB5_DEPRECATED_FUNCTION("Use X instead")
323c19800e8SDoug Rabson {
324c19800e8SDoug Rabson     *similar = (e1 == e2);
325c19800e8SDoug Rabson     return 0;
326c19800e8SDoug Rabson }
327c19800e8SDoug Rabson 
328c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_make_random_key(krb5_context context,krb5_enctype enctype,krb5_keyblock * random_key)329c19800e8SDoug Rabson krb5_c_make_random_key(krb5_context context,
330c19800e8SDoug Rabson 		       krb5_enctype enctype,
331c19800e8SDoug Rabson 		       krb5_keyblock *random_key)
332c19800e8SDoug Rabson {
333c19800e8SDoug Rabson     return krb5_generate_random_keyblock(context, enctype, random_key);
334c19800e8SDoug Rabson }
335c19800e8SDoug Rabson 
336c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_keylengths(krb5_context context,krb5_enctype enctype,size_t * ilen,size_t * keylen)337c19800e8SDoug Rabson krb5_c_keylengths(krb5_context context,
338c19800e8SDoug Rabson 		  krb5_enctype enctype,
339c19800e8SDoug Rabson 		  size_t *ilen,
340c19800e8SDoug Rabson 		  size_t *keylen)
341c19800e8SDoug Rabson {
342c19800e8SDoug Rabson     krb5_error_code ret;
343c19800e8SDoug Rabson 
344c19800e8SDoug Rabson     ret = krb5_enctype_keybits(context, enctype, ilen);
345c19800e8SDoug Rabson     if (ret)
346c19800e8SDoug Rabson 	return ret;
347c19800e8SDoug Rabson     *ilen = (*ilen + 7) / 8;
348c19800e8SDoug Rabson     return krb5_enctype_keysize(context, enctype, keylen);
349c19800e8SDoug Rabson }
350c19800e8SDoug Rabson 
351c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_prf_length(krb5_context context,krb5_enctype type,size_t * length)352c19800e8SDoug Rabson krb5_c_prf_length(krb5_context context,
353c19800e8SDoug Rabson 		  krb5_enctype type,
354c19800e8SDoug Rabson 		  size_t *length)
355c19800e8SDoug Rabson {
356c19800e8SDoug Rabson     return krb5_crypto_prf_length(context, type, length);
357c19800e8SDoug Rabson }
358c19800e8SDoug Rabson 
359c19800e8SDoug Rabson KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_prf(krb5_context context,const krb5_keyblock * key,const krb5_data * input,krb5_data * output)360c19800e8SDoug Rabson krb5_c_prf(krb5_context context,
361c19800e8SDoug Rabson 	   const krb5_keyblock *key,
362c19800e8SDoug Rabson 	   const krb5_data *input,
363c19800e8SDoug Rabson 	   krb5_data *output)
364c19800e8SDoug Rabson {
365c19800e8SDoug Rabson     krb5_crypto crypto;
366c19800e8SDoug Rabson     krb5_error_code ret;
367c19800e8SDoug Rabson 
368c19800e8SDoug Rabson     ret = krb5_crypto_init(context, key, 0, &crypto);
369c19800e8SDoug Rabson     if (ret)
370 	return ret;
371 
372     ret = krb5_crypto_prf(context, crypto, input, output);
373     krb5_crypto_destroy(context, crypto);
374 
375     return ret;
376 }
377 
378 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_c_random_make_octets(krb5_context context,krb5_data * data)379 krb5_c_random_make_octets(krb5_context context, krb5_data * data)
380 {
381     return krb5_generate_random_keyblock(context, data->length, data->data);
382 }
383 
384 /**
385  * MIT compat glue
386  *
387  * @ingroup krb5_ccache
388  */
389 
390 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_cc_copy_creds(krb5_context context,const krb5_ccache from,krb5_ccache to)391 krb5_cc_copy_creds(krb5_context context,
392 		   const krb5_ccache from,
393 		   krb5_ccache to)
394 {
395     return krb5_cc_copy_cache(context, from, to);
396 }
397 
398 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_auth_con_getsendsubkey(krb5_context context,krb5_auth_context auth_context,krb5_keyblock ** keyblock)399 krb5_auth_con_getsendsubkey(krb5_context context, krb5_auth_context auth_context,
400                             krb5_keyblock **keyblock)
401 {
402     return krb5_auth_con_getlocalsubkey(context, auth_context, keyblock);
403 }
404 
405 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_auth_con_getrecvsubkey(krb5_context context,krb5_auth_context auth_context,krb5_keyblock ** keyblock)406 krb5_auth_con_getrecvsubkey(krb5_context context, krb5_auth_context auth_context,
407                             krb5_keyblock **keyblock)
408 {
409     return krb5_auth_con_getremotesubkey(context, auth_context, keyblock);
410 }
411 
412 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_auth_con_setsendsubkey(krb5_context context,krb5_auth_context auth_context,krb5_keyblock * keyblock)413 krb5_auth_con_setsendsubkey(krb5_context context, krb5_auth_context auth_context,
414                             krb5_keyblock *keyblock)
415 {
416     return krb5_auth_con_setlocalsubkey(context, auth_context, keyblock);
417 }
418 
419 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_auth_con_setrecvsubkey(krb5_context context,krb5_auth_context auth_context,krb5_keyblock * keyblock)420 krb5_auth_con_setrecvsubkey(krb5_context context, krb5_auth_context auth_context,
421                             krb5_keyblock *keyblock)
422 {
423     return krb5_auth_con_setremotesubkey(context, auth_context, keyblock);
424 }
425 
426 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL
krb5_free_default_realm(krb5_context context,krb5_realm realm)427 krb5_free_default_realm(krb5_context context, krb5_realm realm)
428 {
429     return krb5_xfree(realm);
430 }
431 
432 #endif /* HEIMDAL_SMALLER */
433