SASC-NG
DVBSoftCAM

i_skey.c

Go to the documentation of this file.
00001 /* crypto/idea/i_skey.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 static IDEA_INT inverse(unsigned int xin);
00063 void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks)
00064         {
00065         int i;
00066         register IDEA_INT *kt,*kf,r0,r1,r2;
00067 
00068         kt= &(ks->data[0][0]);
00069         n2s(key,kt[0]); n2s(key,kt[1]); n2s(key,kt[2]); n2s(key,kt[3]);
00070         n2s(key,kt[4]); n2s(key,kt[5]); n2s(key,kt[6]); n2s(key,kt[7]);
00071 
00072         kf=kt;
00073         kt+=8;
00074         for (i=0; i<6; i++)
00075                 {
00076                 r2= kf[1];
00077                 r1= kf[2];
00078                 *(kt++)= ((r2<<9) | (r1>>7))&0xffff;
00079                 r0= kf[3];
00080                 *(kt++)= ((r1<<9) | (r0>>7))&0xffff;
00081                 r1= kf[4];
00082                 *(kt++)= ((r0<<9) | (r1>>7))&0xffff;
00083                 r0= kf[5];
00084                 *(kt++)= ((r1<<9) | (r0>>7))&0xffff;
00085                 r1= kf[6];
00086                 *(kt++)= ((r0<<9) | (r1>>7))&0xffff;
00087                 r0= kf[7];
00088                 *(kt++)= ((r1<<9) | (r0>>7))&0xffff;
00089                 r1= kf[0];
00090                 if (i >= 5) break;
00091                 *(kt++)= ((r0<<9) | (r1>>7))&0xffff;
00092                 *(kt++)= ((r1<<9) | (r2>>7))&0xffff;
00093                 kf+=8;
00094                 }
00095         }
00096 
00097 void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk)
00098         {
00099         int r;
00100         register IDEA_INT *fp,*tp,t;
00101 
00102         tp= &(dk->data[0][0]);
00103         fp= &(ek->data[8][0]);
00104         for (r=0; r<9; r++)
00105                 {
00106                 *(tp++)=inverse(fp[0]);
00107                 *(tp++)=((int)(0x10000L-fp[2])&0xffff);
00108                 *(tp++)=((int)(0x10000L-fp[1])&0xffff);
00109                 *(tp++)=inverse(fp[3]);
00110                 if (r == 8) break;
00111                 fp-=6;
00112                 *(tp++)=fp[4];
00113                 *(tp++)=fp[5];
00114                 }
00115 
00116         tp= &(dk->data[0][0]);
00117         t=tp[1];
00118         tp[1]=tp[2];
00119         tp[2]=t;
00120 
00121         t=tp[49];
00122         tp[49]=tp[50];
00123         tp[50]=t;
00124         }
00125 
00126 /* taken directly from the 'paper' I'll have a look at it later */
00127 static IDEA_INT inverse(unsigned int xin)
00128         {
00129         long n1,n2,q,r,b1,b2,t;
00130 
00131         if (xin == 0)
00132                 b2=0;
00133         else
00134                 {
00135                 n1=0x10001;
00136                 n2=xin;
00137                 b2=1;
00138                 b1=0;
00139 
00140                 do      {
00141                         r=(n1%n2);
00142                         q=(n1-r)/n2;
00143                         if (r == 0)
00144                                 { if (b2 < 0) b2=0x10001+b2; }
00145                         else
00146                                 {
00147                                 n1=n2;
00148                                 n2=r;
00149                                 t=b2;
00150                                 b2=b1-q*b2;
00151                                 b1=t;
00152                                 }
00153                         } while (r != 0);
00154                 }
00155         return((IDEA_INT)b2);
00156         }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines