#include <k5-int.h>
#include <des_int.h>
krb5_error_code
mit_des_string_to_key_int (krb5_context context,
krb5_keyblock *keyblock,
const krb5_data *data,
const krb5_data *salt)
{
krb5_error_code retval = KRB5_PROG_ETYPE_NOSUPP;
register char *str, *copystr;
register krb5_octet *key;
register unsigned temp;
register long i;
register int j;
register long length;
unsigned char *k_p;
int forward;
register char *p_char;
char k_char[64];
#ifndef min
#define min(A, B) ((A) < (B) ? (A): (B))
#endif
keyblock->magic = KV5M_KEYBLOCK;
keyblock->length = sizeof(mit_des_cblock);
key = keyblock->contents;
if (salt
&& (salt->length == SALT_TYPE_AFS_LENGTH
|| salt->length == (unsigned) -1)) {
krb5_data afssalt;
char *at;
afssalt.data = salt->data;
at = strchr(afssalt.data, '@');
if (at) {
*at = 0;
afssalt.length = at - afssalt.data;
} else
afssalt.length = strlen(afssalt.data);
return mit_afs_string_to_key(context, keyblock, data, &afssalt);
}
length = data->length + (salt ? salt->length : 0);
copystr = malloc((size_t) length);
if (!copystr) {
return ENOMEM;
}
(void) memcpy(copystr, (char *) data->data, data->length);
if (salt)
(void) memcpy(copystr + data->length, (char *)salt->data, salt->length);
forward = 1;
p_char = k_char;
(void) memset(k_char,0,sizeof(k_char));
#if 0
if (mit_des_debug)
fprintf(stdout,
"\n\ninput str length = %d string = %*s\nstring = 0x ",
length,length,str);
#endif
str = copystr;
for (i = 1; i <= length; i++) {
temp = (unsigned int) *str++;
#if 0
if (mit_des_debug)
fprintf(stdout,"%02x ",temp & 0xff);
#endif
for (j = 0; j <= 6; j++) {
if (forward)
*p_char++ ^= (int) temp & 01;
else
*--p_char ^= (int) temp & 01;
temp = temp >> 1;
}
if ((i%8) == 0)
forward = !forward;
}
p_char = k_char;
k_p = (unsigned char *) key;
for (i = 0; i <= 7; i++) {
temp = 0;
for (j = 0; j <= 6; j++)
temp |= *p_char++ << (1+j);
*k_p++ = (unsigned char) temp;
}
mit_des_fixup_key_parity(key);
if (mit_des_is_weak_key(key))
((krb5_octet *)key)[7] ^= 0xf0;
retval = mit_des_cbc_cksum(context, (unsigned char*)copystr, key,
length, keyblock, key);
(void) memset(copystr, 0, (size_t) length);
krb5_xfree(copystr);
mit_des_fixup_key_parity(key);
if (mit_des_is_weak_key(key))
((krb5_octet *)key)[7] ^= 0xf0;
if (keyblock->hKey != CK_INVALID_HANDLE) {
(void)C_DestroyObject(krb_ctx_hSession(context), keyblock->hKey);
keyblock->hKey = CK_INVALID_HANDLE;
}
return retval;
}