/* mk_preauth.c */ /* part of Cygnus Network Security */ /* Copyright 1994 Cygnus Support */ /* * Permission to use, copy, modify, and * distribute this software and its documentation for any purpose and * without fee is hereby granted, provided that the above copyright * notice appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation. * Cygnus Support makes no representations about the suitability of * this software for any purpose. It is provided "as is" without express * or implied warranty. */ #include "krb.h" #include #ifdef HAS_STDLIB_H #include #else extern char *malloc(), *calloc(), *realloc(); #endif /* Define a couple of function types including parameters. These are needed on MS-Windows to convert arguments of the function pointers to the proper FAR types during calls. These definitions are found in but the code is too opaque unless they are also here. */ #ifndef KEY_PROC_TYPE_DEFINED typedef int (*key_proc_type) PROTOTYPE ((char *, char *, char *, char *, C_Block)); #endif int krb_mk_preauth(preauth_p, preauth_len, key_proc,aname,inst,realm,password,key) char **preauth_p; int *preauth_len; key_proc_type key_proc; char *aname; char *inst; char *realm; char *password; C_Block key; { #ifdef NOENCRYPTION *preauth_len = strlen(aname)+1; /* include the trailing 0 */ *preauth_p = malloc(*preauth_len); strcpy(*preauth_p, aname); /* this will copy the trailing 0 */ #else des_key_schedule key_s; int sl = strlen(aname); #endif (*key_proc)(aname,inst,realm,password,key); #ifndef NOENCRYPTION /* * preauth_len is set to a length greater than sl + 1 * and a multpile of 8 */ *preauth_len = (((sl + 1) / 8) + 1) * 8; /* allocate memory for preauth_p and fill it with 0 */ *preauth_p = (char*) malloc(*preauth_len); /* create the key schedule */ if (des_key_sched(key, key_s)) { return 1; } /* * encrypt aname using key_s as the key schedule and key as the * initialization vector. */ des_pcbc_encrypt((des_cblock *) aname, (des_cblock *) *preauth_p, (long) (sl + 1), key_s, (des_cblock *) key, DES_ENCRYPT); #endif return 0; } void krb_free_preauth(preauth_p, preauth_len) char *preauth_p; int preauth_len; { free(preauth_p); return; }