/* crypto/des/des_old.c -*- mode:C; c-file-style: "eay" -*- */

/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 *
 * The function names in here are deprecated and are only present to
 * provide an interface compatible with libdes.  OpenSSL now provides
 * functions where "des_" has been replaced with "DES_" in the names,
 * to make it possible to make incompatible changes that are needed
 * for C type security and other stuff.
 *
 * Please consider starting to use the DES_ functions rather than the
 * des_ ones.  The des_ functions will dissapear completely before
 * OpenSSL 1.0!
 *
 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 */

/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
 * project 2001.
 */
/* ====================================================================
 * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#define OPENSSL_DES_LIBDES_COMPATIBILITY
#include <openssl/crypto.h>
#include <openssl/des.h>
#include <openssl/rand.h>

const char *_ossl_old_des_options(void)
	{
	return DES_options();
	}
void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	des_key_schedule ks1,des_key_schedule ks2,
	des_key_schedule ks3, int enc)
	{
	DES_ecb3_encrypt((const_DES_cblock *)input, output,
		(DES_key_schedule *)ks1, (DES_key_schedule *)ks2,
		(DES_key_schedule *)ks3, enc);
	}
DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	long length,des_key_schedule schedule,_ossl_old_des_cblock *ivec)
	{
	return DES_cbc_cksum((unsigned char *)input, output, length,
		(DES_key_schedule *)schedule, ivec);
	}
void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc)
	{
	DES_cbc_encrypt((unsigned char *)input, (unsigned char *)output,
		length, (DES_key_schedule *)schedule, ivec, enc);
	}
void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc)
	{
	DES_ncbc_encrypt((unsigned char *)input, (unsigned char *)output,
		length, (DES_key_schedule *)schedule, ivec, enc);
	}
void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	des_key_schedule schedule,_ossl_old_des_cblock *ivec,
	_ossl_old_des_cblock *inw,_ossl_old_des_cblock *outw,int enc)
	{
	DES_xcbc_encrypt((unsigned char *)input, (unsigned char *)output,
		length, (DES_key_schedule *)schedule, ivec, inw, outw, enc);
	}
void _ossl_old_des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits,
	long length,des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc)
	{
	DES_cfb_encrypt(in, out, numbits, length,
		(DES_key_schedule *)schedule, ivec, enc);
	}
void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	des_key_schedule ks,int enc)
	{
	DES_ecb_encrypt(input, output, (DES_key_schedule *)ks, enc);
	}
void _ossl_old_des_encrypt(DES_LONG *data,des_key_schedule ks, int enc)
	{
	DES_encrypt1(data, (DES_key_schedule *)ks, enc);
	}
void _ossl_old_des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc)
	{
	DES_encrypt2(data, (DES_key_schedule *)ks, enc);
	}
void _ossl_old_des_encrypt3(DES_LONG *data, des_key_schedule ks1,
	des_key_schedule ks2, des_key_schedule ks3)
	{
	DES_encrypt3(data, (DES_key_schedule *)ks1, (DES_key_schedule *)ks2,
		(DES_key_schedule *)ks3);
	}
void _ossl_old_des_decrypt3(DES_LONG *data, des_key_schedule ks1,
	des_key_schedule ks2, des_key_schedule ks3)
	{
	DES_decrypt3(data, (DES_key_schedule *)ks1, (DES_key_schedule *)ks2,
		(DES_key_schedule *)ks3);
	}
void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, _ossl_old_des_cblock *output, 
	long length, des_key_schedule ks1, des_key_schedule ks2, 
	des_key_schedule ks3, _ossl_old_des_cblock *ivec, int enc)
	{
	DES_ede3_cbc_encrypt((unsigned char *)input, (unsigned char *)output,
		length, (DES_key_schedule *)ks1, (DES_key_schedule *)ks2,
		(DES_key_schedule *)ks3, ivec, enc);
	}
void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out,
	long length, des_key_schedule ks1, des_key_schedule ks2,
	des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num, int enc)
	{
	DES_ede3_cfb64_encrypt(in, out, length,
		(DES_key_schedule *)ks1, (DES_key_schedule *)ks2,
		(DES_key_schedule *)ks3, ivec, num, enc);
	}
void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out,
	long length, des_key_schedule ks1, des_key_schedule ks2,
	des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num)
	{
	DES_ede3_ofb64_encrypt(in, out, length,
		(DES_key_schedule *)ks1, (DES_key_schedule *)ks2,
		(DES_key_schedule *)ks3, ivec, num);
	}

#if 0 /* broken code, preserved just in case anyone specifically looks for this */
void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), _ossl_old_des_cblock (*in_white),
	_ossl_old_des_cblock (*out_white))
	{
	DES_xwhite_in2out(des_key, in_white, out_white);
	}
#endif

int _ossl_old_des_enc_read(int fd,char *buf,int len,des_key_schedule sched,
	_ossl_old_des_cblock *iv)
	{
	return DES_enc_read(fd, buf, len, (DES_key_schedule *)sched, iv);
	}
int _ossl_old_des_enc_write(int fd,char *buf,int len,des_key_schedule sched,
	_ossl_old_des_cblock *iv)
	{
	return DES_enc_write(fd, buf, len, (DES_key_schedule *)sched, iv);
	}
char *_ossl_old_des_fcrypt(const char *buf,const char *salt, char *ret)
	{
	return DES_fcrypt(buf, salt, ret);
	}
char *_ossl_old_des_crypt(const char *buf,const char *salt)
	{
	return DES_crypt(buf, salt);
	}
char *_ossl_old_crypt(const char *buf,const char *salt)
	{
	return DES_crypt(buf, salt);
	}
void _ossl_old_des_ofb_encrypt(unsigned char *in,unsigned char *out,
	int numbits,long length,des_key_schedule schedule,_ossl_old_des_cblock *ivec)
	{
	DES_ofb_encrypt(in, out, numbits, length, (DES_key_schedule *)schedule,
		ivec);
	}
void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc)
	{
	DES_pcbc_encrypt((unsigned char *)input, (unsigned char *)output,
		length, (DES_key_schedule *)schedule, ivec, enc);
	}
DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	long length,int out_count,_ossl_old_des_cblock *seed)
	{
	return DES_quad_cksum((unsigned char *)input, output, length,
		out_count, seed);
	}
void _ossl_old_des_random_seed(_ossl_old_des_cblock key)
	{
	RAND_seed(key, sizeof(_ossl_old_des_cblock));
	}
void _ossl_old_des_random_key(_ossl_old_des_cblock ret)
	{
	DES_random_key((DES_cblock *)ret);
	}
int _ossl_old_des_read_password(_ossl_old_des_cblock *key, const char *prompt,
				int verify)
	{
	return DES_read_password(key, prompt, verify);
	}
int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1, _ossl_old_des_cblock *key2,
	const char *prompt, int verify)
	{
	return DES_read_2passwords(key1, key2, prompt, verify);
	}
void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key)
	{
	DES_set_odd_parity(key);
	}
int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key)
	{
	return DES_is_weak_key(key);
	}
int _ossl_old_des_set_key(_ossl_old_des_cblock *key,des_key_schedule schedule)
	{
	return DES_set_key(key, (DES_key_schedule *)schedule);
	}
int _ossl_old_des_key_sched(_ossl_old_des_cblock *key,des_key_schedule schedule)
	{
	return DES_key_sched(key, (DES_key_schedule *)schedule);
	}
void _ossl_old_des_string_to_key(char *str,_ossl_old_des_cblock *key)
	{
	DES_string_to_key(str, key);
	}
void _ossl_old_des_string_to_2keys(char *str,_ossl_old_des_cblock *key1,_ossl_old_des_cblock *key2)
	{
	DES_string_to_2keys(str, key1, key2);
	}
void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
	des_key_schedule schedule, _ossl_old_des_cblock *ivec, int *num, int enc)
	{
	DES_cfb64_encrypt(in, out, length, (DES_key_schedule *)schedule,
		ivec, num, enc);
	}
void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
	des_key_schedule schedule, _ossl_old_des_cblock *ivec, int *num)
	{
	DES_ofb64_encrypt(in, out, length, (DES_key_schedule *)schedule,
		ivec, num);
	}
