text: #include "des_int.h"
  #include "des.h"
  #undef mit_des3_cbc_encrypt
  
  /* These functions are exported on KfM for ABI compatibility with
   * older versions of the library.  They have been pulled from the headers
   * in the hope that someday we can remove them.
   * 
   * Do not change the ABIs of any of these functions!
   */
  
  //int des_read_pw_string(char *, int, char *, int);
  char *des_crypt(const char *, const char *);
  char *des_fcrypt(const char *, const char *, char *);
  
  int make_key_sched(des_cblock *, des_key_schedule);
  int des_set_key(des_cblock *, des_key_schedule);
  
  void des_3cbc_encrypt(des_cblock *, des_cblock *, long, 
                        des_key_schedule, des_key_schedule, des_key_schedule, 
                        des_cblock *, int);
  void des_3ecb_encrypt(des_cblock *, des_cblock *, 
                        des_key_schedule, des_key_schedule, des_key_schedule, 
                        int);
  
  void des_generate_random_block(des_cblock);
  void des_set_random_generator_seed(des_cblock);
  void des_set_sequence_number(des_cblock);
  
  #pragma mark -
  
  /* Why was this exported on KfM?  Who knows... */
  int des_debug = 0;
  
  char *des_crypt(const char *str, const char *salt)
  {
      char afs_buf[16];
  
      return des_fcrypt(str, salt, afs_buf);
  }
  
  
  char *des_fcrypt(const char *str, const char *salt, char *buf)
  {
      return mit_afs_crypt(str, salt, buf);
  }
  
  
  int make_key_sched(des_cblock *k, des_key_schedule schedule)
  {
      return mit_des_key_sched((unsigned char *)k, schedule); /* YUCK! */
  }
  
  
  int des_set_key(des_cblock *key, des_key_schedule schedule)
  {
      return make_key_sched(key, schedule);
  }
  
  
  void des_3cbc_encrypt(des_cblock *in, des_cblock *out, long length,
                        des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3, 
                        des_cblock *iv, int enc)
  {
      mit_des3_cbc_encrypt((const des_cblock *)in, out, (unsigned long)length,
  			 ks1, ks2, ks3,
  			 (const unsigned char *)iv, /* YUCK! */
  			 enc);
  }
  
  
  void des_3ecb_encrypt(des_cblock *clear, des_cblock *cipher,
                        des_key_schedule ks1, des_key_schedule ks2, des_key_schedule ks3, 
                        int enc)
  {
      static const des_cblock iv;
  
      mit_des3_cbc_encrypt((const des_cblock *)clear, cipher, 8, ks1, ks2, ks3, iv, enc);
  }
  
  
  void des_generate_random_block(des_cblock block)
  {
      krb5_data data;
  
      data.length = sizeof(des_cblock);
      data.data = (char *)block;
      
      /* This function can return an error, however we must ignore it. */
      /* The worst that happens is that the resulting block is non-random */
      krb5_c_random_make_octets(/* XXX */ 0, &data);
  }
  
  
  void des_set_random_generator_seed(des_cblock block)
  {
      des_init_random_number_generator(block); /* XXX */
  }
  
  
  void des_set_sequence_number(des_cblock block)
  {
      des_init_random_number_generator(block); /* XXX */
  }
  