#include "des.h"
#include "des_int.h"
#ifdef DEBUG
#include <stdio.h>
extern int des_debug;
#endif
krb5_error_code mit_des_string_to_key (enctype, keyblock, data, princ)
const krb5_enctype enctype;
krb5_keyblock * keyblock;
const krb5_data * data;
krb5_const_principal princ;
{
char copystr[512];
register char *str = copystr;
register krb5_octet *key;
register unsigned temp,i;
register int j;
register long length;
unsigned char *k_p;
int forward;
register char *p_char;
char k_char[64];
mit_des_key_schedule key_sked;
#define min(A, B) ((A) < (B) ? (A): (B))
if ( enctype != ENCTYPE_DES )
return (KRB5_PROG_ENCTYPE_NOSUPP);
if ( !(keyblock->contents = (krb5_octet *)malloc(sizeof(mit_des_cblock))) )
return(ENOMEM);
#define cleanup() {memset(keyblock->contents, 0, sizeof(mit_des_cblock));\
krb5_xfree(keyblock->contents);}
keyblock->enctype = ENCTYPE_DES;
keyblock->length = sizeof(mit_des_cblock);
key = keyblock->contents;
memset(copystr, 0, sizeof(copystr));
j = min(data->length, 511);
(void) strncpy(copystr, data->data, j);
if ( princ != 0 )
for (i=0; princ[i] != 0 && j < 511; i++) {
(void) strncpy(copystr+j, princ[i]->data,
min(princ[i]->length, 511-j));
j += min(princ[i]->length, 511-j);
}
forward = 1;
p_char = k_char;
length = strlen(str);
memset(k_char,0,sizeof(k_char));
#ifdef DEBUG
if (mit_des_debug)
fprintf(stdout,
"\n\ninput str length = %d string = %s\nstring = 0x ",
length,str);
#endif
for (i = 1; i <= length; i++) {
temp = (unsigned int) *str++;
#ifdef DEBUG
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);
(void) mit_des_key_sched(key, key_sked);
(void) mit_des_cbc_cksum((krb5_octet *)copystr, key, length, key_sked, key);
memset((char *)key_sked, 0, sizeof(key_sked));
mit_des_fixup_key_parity(key);
#ifdef DEBUG
if (mit_des_debug)
fprintf(stdout,
"\nResulting string_to_key = 0x%x 0x%x\n",
*((unsigned long *) key),
*((unsigned long *) key+1));
#endif
return 0;
}