168651Skris/* crypto/evp/e_des.c */ 268651Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 368651Skris * All rights reserved. 468651Skris * 568651Skris * This package is an SSL implementation written 668651Skris * by Eric Young (eay@cryptsoft.com). 768651Skris * The implementation was written so as to conform with Netscapes SSL. 8296465Sdelphij * 968651Skris * This library is free for commercial and non-commercial use as long as 1068651Skris * the following conditions are aheared to. The following conditions 1168651Skris * apply to all code found in this distribution, be it the RC4, RSA, 1268651Skris * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1368651Skris * included with this distribution is covered by the same copyright terms 1468651Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15296465Sdelphij * 1668651Skris * Copyright remains Eric Young's, and as such any Copyright notices in 1768651Skris * the code are not to be removed. 1868651Skris * If this package is used in a product, Eric Young should be given attribution 1968651Skris * as the author of the parts of the library used. 2068651Skris * This can be in the form of a textual message at program startup or 2168651Skris * in documentation (online or textual) provided with the package. 22296465Sdelphij * 2368651Skris * Redistribution and use in source and binary forms, with or without 2468651Skris * modification, are permitted provided that the following conditions 2568651Skris * are met: 2668651Skris * 1. Redistributions of source code must retain the copyright 2768651Skris * notice, this list of conditions and the following disclaimer. 2868651Skris * 2. Redistributions in binary form must reproduce the above copyright 2968651Skris * notice, this list of conditions and the following disclaimer in the 3068651Skris * documentation and/or other materials provided with the distribution. 3168651Skris * 3. All advertising materials mentioning features or use of this software 3268651Skris * must display the following acknowledgement: 3368651Skris * "This product includes cryptographic software written by 3468651Skris * Eric Young (eay@cryptsoft.com)" 3568651Skris * The word 'cryptographic' can be left out if the rouines from the library 3668651Skris * being used are not cryptographic related :-). 37296465Sdelphij * 4. If you include any Windows specific code (or a derivative thereof) from 3868651Skris * the apps directory (application code) you must include an acknowledgement: 3968651Skris * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40296465Sdelphij * 4168651Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4268651Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4368651Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4468651Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4568651Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4668651Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4768651Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4868651Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4968651Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5068651Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5168651Skris * SUCH DAMAGE. 52296465Sdelphij * 5368651Skris * The licence and distribution terms for any publically available version or 5468651Skris * derivative of this code cannot be changed. i.e. this code cannot simply be 5568651Skris * copied and put under another distribution licence 5668651Skris * [including the GNU Public Licence.] 5768651Skris */ 5868651Skris 5968651Skris#include <stdio.h> 6068651Skris#include "cryptlib.h" 61142425Snectar#ifndef OPENSSL_NO_DES 62296465Sdelphij# include <openssl/evp.h> 63296465Sdelphij# include <openssl/objects.h> 64296465Sdelphij# include "evp_locl.h" 65296465Sdelphij# include <openssl/des.h> 66296465Sdelphij# include <openssl/rand.h> 6768651Skris 6868651Skrisstatic int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 69296465Sdelphij const unsigned char *iv, int enc); 70160814Ssimonstatic int des_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr); 7168651Skris 72296465Sdelphij/* 73296465Sdelphij * Because of various casts and different names can't use 74296465Sdelphij * IMPLEMENT_BLOCK_CIPHER 75296465Sdelphij */ 7668651Skris 7768651Skrisstatic int des_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 78296465Sdelphij const unsigned char *in, unsigned int inl) 7968651Skris{ 80296465Sdelphij BLOCK_CIPHER_ecb_loop() 81296465Sdelphij DES_ecb_encrypt((DES_cblock *)(in + i), (DES_cblock *)(out + i), 82296465Sdelphij ctx->cipher_data, ctx->encrypt); 83296465Sdelphij return 1; 8468651Skris} 8568651Skris 8668651Skrisstatic int des_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 87296465Sdelphij const unsigned char *in, unsigned int inl) 8868651Skris{ 89296465Sdelphij DES_ofb64_encrypt(in, out, (long)inl, ctx->cipher_data, 90296465Sdelphij (DES_cblock *)ctx->iv, &ctx->num); 91296465Sdelphij return 1; 9268651Skris} 9368651Skris 9468651Skrisstatic int des_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 95296465Sdelphij const unsigned char *in, unsigned int inl) 9668651Skris{ 97296465Sdelphij DES_ncbc_encrypt(in, out, (long)inl, ctx->cipher_data, 98296465Sdelphij (DES_cblock *)ctx->iv, ctx->encrypt); 99296465Sdelphij return 1; 10068651Skris} 10168651Skris 102142425Snectarstatic int des_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 103296465Sdelphij const unsigned char *in, unsigned int inl) 10468651Skris{ 105296465Sdelphij DES_cfb64_encrypt(in, out, (long)inl, ctx->cipher_data, 106296465Sdelphij (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); 107296465Sdelphij return 1; 10868651Skris} 10968651Skris 110296465Sdelphij/* 111296465Sdelphij * Although we have a CFB-r implementation for DES, it doesn't pack the right 112296465Sdelphij * way, so wrap it here 113296465Sdelphij */ 114142425Snectarstatic int des_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 115296465Sdelphij const unsigned char *in, unsigned int inl) 116296465Sdelphij{ 117142425Snectar unsigned int n; 118296465Sdelphij unsigned char c[1], d[1]; 119142425Snectar 120296465Sdelphij for (n = 0; n < inl; ++n) { 121296465Sdelphij c[0] = (in[n / 8] & (1 << (7 - n % 8))) ? 0x80 : 0; 122296465Sdelphij DES_cfb_encrypt(c, d, 1, 1, ctx->cipher_data, (DES_cblock *)ctx->iv, 123296465Sdelphij ctx->encrypt); 124296465Sdelphij out[n / 8] = 125296465Sdelphij (out[n / 8] & ~(0x80 >> (n % 8))) | ((d[0] & 0x80) >> (n % 8)); 126296465Sdelphij } 127142425Snectar return 1; 128296465Sdelphij} 129142425Snectar 130142425Snectarstatic int des_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 131296465Sdelphij const unsigned char *in, unsigned int inl) 132296465Sdelphij{ 133296465Sdelphij DES_cfb_encrypt(in, out, 8, inl, ctx->cipher_data, (DES_cblock *)ctx->iv, 134296465Sdelphij ctx->encrypt); 135142425Snectar return 1; 136296465Sdelphij} 137142425Snectar 138109998SmarkmBLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, 139296465Sdelphij EVP_CIPH_RAND_KEY, 140296465Sdelphij des_init_key, NULL, 141296465Sdelphij EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, des_ctrl) 14268651Skris 14368651Skris 144296465SdelphijBLOCK_CIPHER_def_cfb(des, DES_key_schedule, NID_des, 8, 8, 1, 145296465Sdelphij EVP_CIPH_RAND_KEY, 146296465Sdelphij des_init_key, NULL, 147296465Sdelphij EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, des_ctrl) 148142425Snectar 149296465SdelphijBLOCK_CIPHER_def_cfb(des, DES_key_schedule, NID_des, 8, 8, 8, 150296465Sdelphij EVP_CIPH_RAND_KEY, 151296465Sdelphij des_init_key, NULL, 152296465Sdelphij EVP_CIPHER_set_asn1_iv, EVP_CIPHER_get_asn1_iv, des_ctrl) 153296465Sdelphij 15468651Skrisstatic int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 155296465Sdelphij const unsigned char *iv, int enc) 156296465Sdelphij{ 157296465Sdelphij DES_cblock *deskey = (DES_cblock *)key; 158296465Sdelphij# ifdef EVP_CHECK_DES_KEY 159296465Sdelphij if (DES_set_key_checked(deskey, ctx->cipher_data) != 0) 160296465Sdelphij return 0; 161296465Sdelphij# else 162296465Sdelphij DES_set_key_unchecked(deskey, ctx->cipher_data); 163296465Sdelphij# endif 164296465Sdelphij return 1; 165296465Sdelphij} 16668651Skris 167160814Ssimonstatic int des_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) 168296465Sdelphij{ 169160814Ssimon 170296465Sdelphij switch (type) { 171296465Sdelphij case EVP_CTRL_RAND_KEY: 172296465Sdelphij if (RAND_bytes(ptr, 8) <= 0) 173296465Sdelphij return 0; 174296465Sdelphij DES_set_odd_parity((DES_cblock *)ptr); 175296465Sdelphij return 1; 176160814Ssimon 177296465Sdelphij default: 178296465Sdelphij return -1; 179296465Sdelphij } 180296465Sdelphij} 181296465Sdelphij 18268651Skris#endif 183