1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/evp/e_des3.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "evp_locl.h" 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/des.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_FIPS 69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const unsigned char *iv,int enc); 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const unsigned char *iv,int enc); 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des3_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr); 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_key_schedule ks1;/* key schedule */ 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_key_schedule ks2;/* key schedule (for ede) */ 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_key_schedule ks3;/* key schedule (for ede3) */ 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } DES_EDE_KEY; 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define data(ctx) ((DES_EDE_KEY *)(ctx)->cipher_data) 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Because of various casts and different args can't use IMPLEMENT_BLOCK_CIPHER */ 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *in, size_t inl) 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BLOCK_CIPHER_ecb_loop() 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_ecb3_encrypt((const_DES_cblock *)(in + i), 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (DES_cblock *)(out + i), 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks1, &data(ctx)->ks2, 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks3, 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ctx->encrypt); 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *in, size_t inl) 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl>=EVP_MAXCHUNK) 105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_ofb64_encrypt(in, out, (long)EVP_MAXCHUNK, 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (DES_cblock *)ctx->iv, &ctx->num); 109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inl-=EVP_MAXCHUNK; 110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom in +=EVP_MAXCHUNK; 111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out+=EVP_MAXCHUNK; 112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl) 114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_ofb64_encrypt(in, out, (long)inl, 115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, 116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (DES_cblock *)ctx->iv, &ctx->num); 117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *in, size_t inl) 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef KSSL_DEBUG 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *cp; 128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom printf("des_ede_cbc_cipher(ctx=%lx, buflen=%d)\n", ctx, ctx->buf_len); 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\t iv= "); 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(i=0;i<8;i++) 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("%02X",ctx->iv[i]); 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\n"); 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* KSSL_DEBUG */ 135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl>=EVP_MAXCHUNK) 136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (DES_cblock *)ctx->iv, ctx->encrypt); 140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inl-=EVP_MAXCHUNK; 141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom in +=EVP_MAXCHUNK; 142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out+=EVP_MAXCHUNK; 143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl) 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_cbc_encrypt(in, out, (long)inl, 146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, 147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (DES_cblock *)ctx->iv, ctx->encrypt); 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *in, size_t inl) 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl>=EVP_MAXCHUNK) 155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_cfb64_encrypt(in, out, (long)EVP_MAXCHUNK, 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); 159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inl-=EVP_MAXCHUNK; 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom in +=EVP_MAXCHUNK; 161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out+=EVP_MAXCHUNK; 162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl) 164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_cfb64_encrypt(in, out, (long)inl, 165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, 166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Although we have a CFB-r implementation for 3-DES, it doesn't pack the right 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project way, so wrap it here */ 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *in, size_t inl) 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom size_t n; 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char c[1],d[1]; 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(n=0 ; n < inl ; ++n) 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_ede3_cfb_encrypt(c,d,1,1, 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (DES_cblock *)ctx->iv,ctx->encrypt); 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out[n/8]=(out[n/8]&~(0x80 >> (unsigned int)(n%8))) | 185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ((d[0]&0x80) >> (unsigned int)(n%8)); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const unsigned char *in, size_t inl) 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom while (inl>=EVP_MAXCHUNK) 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_cfb_encrypt(in,out,8,(long)EVP_MAXCHUNK, 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (DES_cblock *)ctx->iv,ctx->encrypt); 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inl-=EVP_MAXCHUNK; 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom in +=EVP_MAXCHUNK; 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out+=EVP_MAXCHUNK; 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (inl) 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom DES_ede3_cfb_encrypt(in,out,8,(long)inl, 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (DES_cblock *)ctx->iv,ctx->encrypt); 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, 211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPH_RAND_KEY, des_ede_init_key, NULL, 212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_set_asn1_iv, 213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_get_asn1_iv, 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project des3_ctrl) 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_cfb64_cipher des_ede_cfb64_cipher 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_ofb_cipher des_ede_ofb_cipher 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_cbc_cipher des_ede_cbc_cipher 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_ecb_cipher des_ede_ecb_cipher 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, 222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPH_RAND_KEY, des_ede3_init_key, NULL, 223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_set_asn1_iv, 224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_get_asn1_iv, 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project des3_ctrl) 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, 228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, 229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_set_asn1_iv, 230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_get_asn1_iv, 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project des3_ctrl) 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, 235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_set_asn1_iv, 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_CIPHER_get_asn1_iv, 237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project des3_ctrl) 238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const unsigned char *iv, int enc) 241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_cblock *deskey = (DES_cblock *)key; 243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EVP_CHECK_DES_KEY 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1) 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project !! DES_set_key_checked(&deskey[1],&data(ctx)->ks2)) 246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_key_unchecked(&deskey[0],&data(ctx)->ks1); 249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_key_unchecked(&deskey[1],&data(ctx)->ks2); 250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(&data(ctx)->ks3,&data(ctx)->ks1, 252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sizeof(data(ctx)->ks1)); 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const unsigned char *iv, int enc) 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_cblock *deskey = (DES_cblock *)key; 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef KSSL_DEBUG 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom printf("des_ede3_init_key(ctx=%lx)\n", ctx); 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\tKEY= "); 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(i=0;i<24;i++) printf("%02X",key[i]); printf("\n"); 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project printf("\t IV= "); 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for(i=0;i<8;i++) printf("%02X",iv[i]); printf("\n"); 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif /* KSSL_DEBUG */ 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EVP_CHECK_DES_KEY 272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1) 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project || DES_set_key_checked(&deskey[1],&data(ctx)->ks2) 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project || DES_set_key_checked(&deskey[2],&data(ctx)->ks3)) 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_key_unchecked(&deskey[0],&data(ctx)->ks1); 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_key_unchecked(&deskey[1],&data(ctx)->ks2); 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_key_unchecked(&deskey[2],&data(ctx)->ks3); 280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des3_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) 285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_cblock *deskey = ptr; 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch(type) 290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case EVP_CTRL_RAND_KEY: 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (RAND_bytes(ptr, c->key_len) <= 0) 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_odd_parity(deskey); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c->key_len >= 16) 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_odd_parity(deskey + 1); 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (c->key_len >= 24) 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DES_set_odd_parity(deskey + 2); 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project default: 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return -1; 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EVP_CIPHER *EVP_des_ede(void) 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return &des_ede_ecb; 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EVP_CIPHER *EVP_des_ede3(void) 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return &des_ede3_ecb; 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project} 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 317