SASC
DVBSoftCAM

i_cbc.c

Go to the documentation of this file.
00001 /* crypto/idea/i_cbc.c */
00002 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
00003  * All rights reserved.
00004  *
00005  * This package is an SSL implementation written
00006  * by Eric Young (eay@cryptsoft.com).
00007  * The implementation was written so as to conform with Netscapes SSL.
00008  * 
00009  * This library is free for commercial and non-commercial use as long as
00010  * the following conditions are aheared to.  The following conditions
00011  * apply to all code found in this distribution, be it the RC4, RSA,
00012  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
00013  * included with this distribution is covered by the same copyright terms
00014  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
00015  * 
00016  * Copyright remains Eric Young's, and as such any Copyright notices in
00017  * the code are not to be removed.
00018  * If this package is used in a product, Eric Young should be given attribution
00019  * as the author of the parts of the library used.
00020  * This can be in the form of a textual message at program startup or
00021  * in documentation (online or textual) provided with the package.
00022  * 
00023  * Redistribution and use in source and binary forms, with or without
00024  * modification, are permitted provided that the following conditions
00025  * are met:
00026  * 1. Redistributions of source code must retain the copyright
00027  *    notice, this list of conditions and the following disclaimer.
00028  * 2. Redistributions in binary form must reproduce the above copyright
00029  *    notice, this list of conditions and the following disclaimer in the
00030  *    documentation and/or other materials provided with the distribution.
00031  * 3. All advertising materials mentioning features or use of this software
00032  *    must display the following acknowledgement:
00033  *    "This product includes cryptographic software written by
00034  *     Eric Young (eay@cryptsoft.com)"
00035  *    The word 'cryptographic' can be left out if the rouines from the library
00036  *    being used are not cryptographic related :-).
00037  * 4. If you include any Windows specific code (or a derivative thereof) from 
00038  *    the apps directory (application code) you must include an acknowledgement:
00039  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
00040  * 
00041  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
00042  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00043  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00044  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
00045  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00046  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00047  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00048  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00049  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00050  * OUT OF THE USE OF THIS  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00051  * SUCH DAMAGE.
00052  * 
00053  * The licence and distribution terms for any publically available version or
00054  * derivative of this code cannot be changed.  i.e. this code cannot simply be
00055  * copied and put under another distribution licence
00056  * [including the GNU Public Licence.]
00057  */
00058 
00059 #include "idea.h"
00060 #include "idea_lcl.h"
00061 
00062 void idea_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
00063              IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int encrypt)
00064         {
00065         register unsigned long tin0,tin1;
00066         register unsigned long tout0,tout1,xor0,xor1;
00067         register long l=length;
00068         unsigned long tin[2];
00069 
00070         if (encrypt)
00071                 {
00072                 n2l(iv,tout0);
00073                 n2l(iv,tout1);
00074                 iv-=8;
00075                 for (l-=8; l>=0; l-=8)
00076                         {
00077                         n2l(in,tin0);
00078                         n2l(in,tin1);
00079                         tin0^=tout0;
00080                         tin1^=tout1;
00081                         tin[0]=tin0;
00082                         tin[1]=tin1;
00083                         idea_encrypt(tin,ks);
00084                         tout0=tin[0]; l2n(tout0,out);
00085                         tout1=tin[1]; l2n(tout1,out);
00086                         }
00087                 if (l != -8)
00088                         {
00089                         n2ln(in,tin0,tin1,l+8);
00090                         tin0^=tout0;
00091                         tin1^=tout1;
00092                         tin[0]=tin0;
00093                         tin[1]=tin1;
00094                         idea_encrypt(tin,ks);
00095                         tout0=tin[0]; l2n(tout0,out);
00096                         tout1=tin[1]; l2n(tout1,out);
00097                         }
00098                 l2n(tout0,iv);
00099                 l2n(tout1,iv);
00100                 }
00101         else
00102                 {
00103                 n2l(iv,xor0);
00104                 n2l(iv,xor1);
00105                 iv-=8;
00106                 for (l-=8; l>=0; l-=8)
00107                         {
00108                         n2l(in,tin0); tin[0]=tin0;
00109                         n2l(in,tin1); tin[1]=tin1;
00110                         idea_encrypt(tin,ks);
00111                         tout0=tin[0]^xor0;
00112                         tout1=tin[1]^xor1;
00113                         l2n(tout0,out);
00114                         l2n(tout1,out);
00115                         xor0=tin0;
00116                         xor1=tin1;
00117                         }
00118                 if (l != -8)
00119                         {
00120                         n2l(in,tin0); tin[0]=tin0;
00121                         n2l(in,tin1); tin[1]=tin1;
00122                         idea_encrypt(tin,ks);
00123                         tout0=tin[0]^xor0;
00124                         tout1=tin[1]^xor1;
00125                         l2nn(tout0,tout1,out,l+8);
00126                         xor0=tin0;
00127                         xor1=tin1;
00128                         }
00129                 l2n(xor0,iv);
00130                 l2n(xor1,iv);
00131                 }
00132         tin0=tin1=tout0=tout1=xor0=xor1=0;
00133         tin[0]=tin[1]=0;
00134         }
00135 
00136 void idea_encrypt(unsigned long *d, IDEA_KEY_SCHEDULE *key)
00137         {
00138         register IDEA_INT *p;
00139         register unsigned long x1,x2,x3,x4,t0,t1,ul;
00140 
00141         x2=d[0];
00142         x1=(x2>>16);
00143         x4=d[1];
00144         x3=(x4>>16);
00145 
00146         p= &(key->data[0][0]);
00147 
00148         E_IDEA(0);
00149         E_IDEA(1);
00150         E_IDEA(2);
00151         E_IDEA(3);
00152         E_IDEA(4);
00153         E_IDEA(5);
00154         E_IDEA(6);
00155         E_IDEA(7);
00156 
00157         x1&=0xffff;
00158         idea_mul(x1,x1,*p,ul); p++;
00159 
00160         t0= x3+ *(p++);
00161         t1= x2+ *(p++);
00162 
00163         x4&=0xffff;
00164         idea_mul(x4,x4,*p,ul);
00165 
00166         d[0]=(t0&0xffff)|((x1&0xffff)<<16);
00167         d[1]=(x4&0xffff)|((t1&0xffff)<<16);
00168         }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines