17c478bd9Sstevel@tonic-gate /*
2159d09a2SMark Phalan  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
37c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
47c478bd9Sstevel@tonic-gate  */
57c478bd9Sstevel@tonic-gate 
67c478bd9Sstevel@tonic-gate 
77c478bd9Sstevel@tonic-gate /*
87c478bd9Sstevel@tonic-gate  * Copyright (C) 1998 by the FundsXpress, INC.
9*55fea89dSDan Cross  *
107c478bd9Sstevel@tonic-gate  * All rights reserved.
11*55fea89dSDan Cross  *
127c478bd9Sstevel@tonic-gate  * Export of this software from the United States of America may require
137c478bd9Sstevel@tonic-gate  * a specific license from the United States Government.  It is the
147c478bd9Sstevel@tonic-gate  * responsibility of any person or organization contemplating export to
157c478bd9Sstevel@tonic-gate  * obtain such a license before exporting.
16*55fea89dSDan Cross  *
177c478bd9Sstevel@tonic-gate  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
187c478bd9Sstevel@tonic-gate  * distribute this software and its documentation for any purpose and
197c478bd9Sstevel@tonic-gate  * without fee is hereby granted, provided that the above copyright
207c478bd9Sstevel@tonic-gate  * notice appear in all copies and that both that copyright notice and
217c478bd9Sstevel@tonic-gate  * this permission notice appear in supporting documentation, and that
227c478bd9Sstevel@tonic-gate  * the name of FundsXpress. not be used in advertising or publicity pertaining
237c478bd9Sstevel@tonic-gate  * to distribution of the software without specific, written prior
247c478bd9Sstevel@tonic-gate  * permission.  FundsXpress makes no representations about the suitability of
257c478bd9Sstevel@tonic-gate  * this software for any purpose.  It is provided "as is" without express
267c478bd9Sstevel@tonic-gate  * or implied warranty.
27*55fea89dSDan Cross  *
287c478bd9Sstevel@tonic-gate  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
297c478bd9Sstevel@tonic-gate  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
307c478bd9Sstevel@tonic-gate  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
317c478bd9Sstevel@tonic-gate  */
327c478bd9Sstevel@tonic-gate 
33159d09a2SMark Phalan #include "k5-int.h"
34159d09a2SMark Phalan #include "des_int.h"
35159d09a2SMark Phalan #include "enc_provider.h"
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate static krb5_error_code
k5_des_docrypt(krb5_context context,krb5_const krb5_keyblock * key,krb5_const krb5_data * ivec,krb5_const krb5_data * input,krb5_data * output,int encrypt)38*55fea89dSDan Cross k5_des_docrypt(krb5_context context, krb5_const krb5_keyblock *key,
397c478bd9Sstevel@tonic-gate 	krb5_const krb5_data *ivec, krb5_const krb5_data *input,
407c478bd9Sstevel@tonic-gate 	krb5_data *output, int encrypt)
417c478bd9Sstevel@tonic-gate {
427c478bd9Sstevel@tonic-gate     krb5_error_code ret;
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate     KRB5_LOG(KRB5_INFO, "k5_des_docrypt() start encrypt=%d\n", encrypt);
457c478bd9Sstevel@tonic-gate     /* key->enctype was checked by the caller */
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate     if (key->length != 8)
487c478bd9Sstevel@tonic-gate 	return(KRB5_BAD_KEYSIZE);
497c478bd9Sstevel@tonic-gate     if ((input->length%8) != 0)
507c478bd9Sstevel@tonic-gate 	return(KRB5_BAD_MSIZE);
517c478bd9Sstevel@tonic-gate     if (ivec && (ivec->length != 8))
527c478bd9Sstevel@tonic-gate 	return(KRB5_BAD_MSIZE);
537c478bd9Sstevel@tonic-gate     if (input->length != output->length)
547c478bd9Sstevel@tonic-gate 	return(KRB5_BAD_MSIZE);
557c478bd9Sstevel@tonic-gate 
567c478bd9Sstevel@tonic-gate     ret = mit_des_cbc_encrypt(context, (krb5_pointer) input->data,
577c478bd9Sstevel@tonic-gate 	(krb5_pointer) output->data, input->length,
587c478bd9Sstevel@tonic-gate 	(krb5_keyblock *)key,
59*55fea89dSDan Cross 	ivec?(unsigned char *)ivec->data:
607c478bd9Sstevel@tonic-gate 	(unsigned char *)mit_des_zeroblock, encrypt);
617c478bd9Sstevel@tonic-gate 
627c478bd9Sstevel@tonic-gate     KRB5_LOG0(KRB5_INFO, "k5_des_docrypt() end\n");
637c478bd9Sstevel@tonic-gate     return(ret);
647c478bd9Sstevel@tonic-gate }
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate static krb5_error_code
k5_des_encrypt(krb5_context context,krb5_const krb5_keyblock * key,krb5_const krb5_data * ivec,krb5_const krb5_data * input,krb5_data * output)677c478bd9Sstevel@tonic-gate k5_des_encrypt(krb5_context context, krb5_const krb5_keyblock *key,
687c478bd9Sstevel@tonic-gate 		krb5_const krb5_data *ivec, krb5_const krb5_data *input,
697c478bd9Sstevel@tonic-gate 		krb5_data *output)
707c478bd9Sstevel@tonic-gate {
717c478bd9Sstevel@tonic-gate     return(k5_des_docrypt(context, key, ivec, input, output, 1));
727c478bd9Sstevel@tonic-gate }
737c478bd9Sstevel@tonic-gate 
747c478bd9Sstevel@tonic-gate static krb5_error_code
k5_des_decrypt(krb5_context context,krb5_const krb5_keyblock * key,krb5_const krb5_data * ivec,krb5_const krb5_data * input,krb5_data * output)757c478bd9Sstevel@tonic-gate k5_des_decrypt(krb5_context context, krb5_const krb5_keyblock *key,
767c478bd9Sstevel@tonic-gate 		krb5_const krb5_data *ivec, krb5_const krb5_data *input,
777c478bd9Sstevel@tonic-gate 		krb5_data *output)
787c478bd9Sstevel@tonic-gate {
797c478bd9Sstevel@tonic-gate     return(k5_des_docrypt(context, key, ivec, input, output, 0));
807c478bd9Sstevel@tonic-gate }
817c478bd9Sstevel@tonic-gate 
827c478bd9Sstevel@tonic-gate static krb5_error_code
k5_des_make_key(krb5_context context,krb5_const krb5_data * randombits,krb5_keyblock * key)837c478bd9Sstevel@tonic-gate k5_des_make_key(krb5_context context, krb5_const krb5_data *randombits,
847c478bd9Sstevel@tonic-gate 		krb5_keyblock *key)
857c478bd9Sstevel@tonic-gate {
867c478bd9Sstevel@tonic-gate     krb5_error_code ret = 0;
877c478bd9Sstevel@tonic-gate     if (key->length != 8)
887c478bd9Sstevel@tonic-gate 	return(KRB5_BAD_KEYSIZE);
897c478bd9Sstevel@tonic-gate     if (randombits->length != 7)
907c478bd9Sstevel@tonic-gate 	return(KRB5_CRYPTO_INTERNAL);
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate     key->magic = KV5M_KEYBLOCK;
937c478bd9Sstevel@tonic-gate     key->length = 8;
947c478bd9Sstevel@tonic-gate     key->dk_list = NULL;
957c478bd9Sstevel@tonic-gate 
967c478bd9Sstevel@tonic-gate     /* take the seven bytes, move them around into the top 7 bits of the
977c478bd9Sstevel@tonic-gate        8 key bytes, then compute the parity bits */
987c478bd9Sstevel@tonic-gate 
997c478bd9Sstevel@tonic-gate     (void) memcpy(key->contents, randombits->data, randombits->length);
1007c478bd9Sstevel@tonic-gate     key->contents[7] = (((key->contents[0]&1)<<1) | ((key->contents[1]&1)<<2) |
1017c478bd9Sstevel@tonic-gate 			((key->contents[2]&1)<<3) | ((key->contents[3]&1)<<4) |
1027c478bd9Sstevel@tonic-gate 			((key->contents[4]&1)<<5) | ((key->contents[5]&1)<<6) |
1037c478bd9Sstevel@tonic-gate 			((key->contents[6]&1)<<7));
1047c478bd9Sstevel@tonic-gate 
1057c478bd9Sstevel@tonic-gate     mit_des_fixup_key_parity(key->contents);
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate #ifdef _KERNEL
1087c478bd9Sstevel@tonic-gate     key->kef_key.ck_data = NULL;
1097c478bd9Sstevel@tonic-gate     key->key_tmpl = NULL;
1107c478bd9Sstevel@tonic-gate     ret = init_key_kef(context->kef_cipher_mt, key);
1117c478bd9Sstevel@tonic-gate #else
1127c478bd9Sstevel@tonic-gate     key->hKey = CK_INVALID_HANDLE;
1137c478bd9Sstevel@tonic-gate     ret = init_key_uef(krb_ctx_hSession(context), key);
1147c478bd9Sstevel@tonic-gate #endif /* _KERNEL */
1157c478bd9Sstevel@tonic-gate 
1167c478bd9Sstevel@tonic-gate     return (ret);
1177c478bd9Sstevel@tonic-gate }
1187c478bd9Sstevel@tonic-gate 
119159d09a2SMark Phalan const struct krb5_enc_provider krb5int_enc_des = {
120505d05c7Sgtb     8,
121505d05c7Sgtb     7, 8,
1227c478bd9Sstevel@tonic-gate     k5_des_encrypt,
1237c478bd9Sstevel@tonic-gate     k5_des_decrypt,
1247c478bd9Sstevel@tonic-gate     k5_des_make_key,
1257c478bd9Sstevel@tonic-gate     krb5int_des_init_state,
1267c478bd9Sstevel@tonic-gate     krb5int_default_free_state
1277c478bd9Sstevel@tonic-gate };
128