1 /*
2  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 
7 /*
8  * des_cbc_cksum.c - compute an 8 byte checksum using DES in CBC mode
9  */
10 #include "des_int.h"
11 
12 /*
13  * This routine performs DES cipher-block-chaining checksum operation,
14  * a.k.a.  Message Authentication Code.  It ALWAYS encrypts from input
15  * to a single 64 bit output MAC checksum.
16  *
17  * The key schedule is passed as an arg, as well as the cleartext or
18  * ciphertext. The cleartext and ciphertext should be in host order.
19  *
20  * NOTE-- the output is ALWAYS 8 bytes long.  If not enough space was
21  * provided, your program will get trashed.
22  *
23  * The input is null padded, at the end (highest addr), to an integral
24  * multiple of eight bytes.
25  */
26 unsigned long
mit_des_cbc_cksum(krb5_context context,const krb5_octet * in,krb5_octet * out,unsigned long length,krb5_keyblock * key,const krb5_octet * ivec)27 mit_des_cbc_cksum(krb5_context context,
28 	const krb5_octet *in, krb5_octet *out,
29 	unsigned long length, krb5_keyblock *key,
30 	const krb5_octet  *ivec)
31 {
32 	krb5_error_code ret = 0;
33 	krb5_data input;
34 	krb5_data output;
35 	krb5_data ivecdata;
36 
37 	input.data = (char *)in;
38 	input.length = length;
39 	output.data = (char *)out;
40 	output.length = MIT_DES_BLOCK_LENGTH;
41 	ivecdata.data = (char *)ivec;
42 	ivecdata.length = MIT_DES_BLOCK_LENGTH;
43 
44 	ret = k5_ef_mac(context, key, &ivecdata,
45 		(const krb5_data *)&input, &output);
46 
47 	return (ret);
48 }
49