Annotation of truecrypt/crypto/bf_enc.c, revision 1.1.1.3

1.1       root        1: /* crypto/bf/bf_enc.c */
                      2: /* Copyright (C) 1995-1997 Eric Young ([email protected])
                      3:  * All rights reserved.
                      4:  *
                      5:  * This package is an SSL implementation written
                      6:  * by Eric Young ([email protected]).
                      7:  * The implementation was written so as to conform with Netscapes SSL.
                      8:  * 
                      9:  * This library is free for commercial and non-commercial use as long as
                     10:  * the following conditions are aheared to.  The following conditions
                     11:  * apply to all code found in this distribution, be it the RC4, RSA,
                     12:  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
                     13:  * included with this distribution is covered by the same copyright terms
                     14:  * except that the holder is Tim Hudson ([email protected]).
                     15:  * 
                     16:  * Copyright remains Eric Young's, and as such any Copyright notices in
                     17:  * the code are not to be removed.
                     18:  * If this package is used in a product, Eric Young should be given attribution
                     19:  * as the author of the parts of the library used.
                     20:  * This can be in the form of a textual message at program startup or
                     21:  * in documentation (online or textual) provided with the package.
                     22:  * 
                     23:  * Redistribution and use in source and binary forms, with or without
                     24:  * modification, are permitted provided that the following conditions
                     25:  * are met:
                     26:  * 1. Redistributions of source code must retain the copyright
                     27:  *    notice, this list of conditions and the following disclaimer.
                     28:  * 2. Redistributions in binary form must reproduce the above copyright
                     29:  *    notice, this list of conditions and the following disclaimer in the
                     30:  *    documentation and/or other materials provided with the distribution.
                     31:  * 3. All advertising materials mentioning features or use of this software
                     32:  *    must display the following acknowledgement:
                     33:  *    "This product includes cryptographic software written by
                     34:  *     Eric Young ([email protected])"
                     35:  *    The word 'cryptographic' can be left out if the rouines from the library
                     36:  *    being used are not cryptographic related :-).
                     37:  * 4. If you include any Windows specific code (or a derivative thereof) from 
                     38:  *    the apps directory (application code) you must include an acknowledgement:
                     39:  *    "This product includes software written by Tim Hudson ([email protected])"
                     40:  * 
                     41:  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
                     42:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     43:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     44:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     45:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     46:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     47:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     48:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     49:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     50:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     51:  * SUCH DAMAGE.
                     52:  * 
                     53:  * The licence and distribution terms for any publically available version or
                     54:  * derivative of this code cannot be changed.  i.e. this code cannot simply be
                     55:  * copied and put under another distribution licence
                     56:  * [including the GNU Public Licence.]
                     57:  */
                     58: 
                     59: 
                     60: 
1.1.1.2   root       61: #include "Blowfish.h"
                     62: #include "Bf_locl.h"
1.1       root       63: 
                     64: /* Blowfish as implemented from 'Blowfish: Springer-Verlag paper'
                     65:  * (From LECTURE NOTES IN COIMPUTER SCIENCE 809, FAST SOFTWARE ENCRYPTION,
                     66:  * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993)
                     67:  */
                     68: 
                     69: #if (BF_ROUNDS != 16) && (BF_ROUNDS != 20)
                     70: If you set BF_ROUNDS to some value other than 16 or 20, you will have
                     71: to modify the code.
                     72: #endif
                     73: 
                     74: void BF_encrypt(data,key)
                     75: BF_LONG *data;
                     76: BF_KEY *key;
                     77:        {
                     78:        register BF_LONG l,r,*p,*s;
                     79: 
                     80:        p=key->P;
                     81:        s= &(key->S[0]);
                     82:        l=data[0];
                     83:        r=data[1];
                     84: 
                     85:        l^=p[0];
                     86:        BF_ENC(r,l,s,p[ 1]);
                     87:        BF_ENC(l,r,s,p[ 2]);
                     88:        BF_ENC(r,l,s,p[ 3]);
                     89:        BF_ENC(l,r,s,p[ 4]);
                     90:        BF_ENC(r,l,s,p[ 5]);
                     91:        BF_ENC(l,r,s,p[ 6]);
                     92:        BF_ENC(r,l,s,p[ 7]);
                     93:        BF_ENC(l,r,s,p[ 8]);
                     94:        BF_ENC(r,l,s,p[ 9]);
                     95:        BF_ENC(l,r,s,p[10]);
                     96:        BF_ENC(r,l,s,p[11]);
                     97:        BF_ENC(l,r,s,p[12]);
                     98:        BF_ENC(r,l,s,p[13]);
                     99:        BF_ENC(l,r,s,p[14]);
                    100:        BF_ENC(r,l,s,p[15]);
                    101:        BF_ENC(l,r,s,p[16]);
                    102: #if BF_ROUNDS == 20
                    103:        BF_ENC(r,l,s,p[17]);
                    104:        BF_ENC(l,r,s,p[18]);
                    105:        BF_ENC(r,l,s,p[19]);
                    106:        BF_ENC(l,r,s,p[20]);
                    107: #endif
                    108:        r^=p[BF_ROUNDS+1];
                    109: 
                    110:        data[1]=l&0xffffffffL;
                    111:        data[0]=r&0xffffffffL;
                    112:        }
                    113: 
                    114: #ifndef BF_DEFAULT_OPTIONS
                    115: 
                    116: void BF_decrypt(data,key)
                    117: BF_LONG *data;
                    118: BF_KEY *key;
                    119:        {
                    120:        register BF_LONG l,r,*p,*s;
                    121: 
                    122:        p=key->P;
                    123:        s= &(key->S[0]);
                    124:        l=data[0];
                    125:        r=data[1];
                    126: 
                    127:        l^=p[BF_ROUNDS+1];
                    128: #if BF_ROUNDS == 20
                    129:        BF_ENC(r,l,s,p[20]);
                    130:        BF_ENC(l,r,s,p[19]);
                    131:        BF_ENC(r,l,s,p[18]);
                    132:        BF_ENC(l,r,s,p[17]);
                    133: #endif
                    134:        BF_ENC(r,l,s,p[16]);
                    135:        BF_ENC(l,r,s,p[15]);
                    136:        BF_ENC(r,l,s,p[14]);
                    137:        BF_ENC(l,r,s,p[13]);
                    138:        BF_ENC(r,l,s,p[12]);
                    139:        BF_ENC(l,r,s,p[11]);
                    140:        BF_ENC(r,l,s,p[10]);
                    141:        BF_ENC(l,r,s,p[ 9]);
                    142:        BF_ENC(r,l,s,p[ 8]);
                    143:        BF_ENC(l,r,s,p[ 7]);
                    144:        BF_ENC(r,l,s,p[ 6]);
                    145:        BF_ENC(l,r,s,p[ 5]);
                    146:        BF_ENC(r,l,s,p[ 4]);
                    147:        BF_ENC(l,r,s,p[ 3]);
                    148:        BF_ENC(r,l,s,p[ 2]);
                    149:        BF_ENC(l,r,s,p[ 1]);
                    150:        r^=p[0];
                    151: 
                    152:        data[1]=l&0xffffffffL;
                    153:        data[0]=r&0xffffffffL;
                    154:        }
                    155: 
                    156: void BF_cbc_encrypt(in, out, length, ks, iv, encrypt)
                    157: unsigned char *in;
                    158: unsigned char *out;
                    159: long length;
                    160: BF_KEY *ks;
                    161: unsigned char *iv;
                    162: int encrypt;
                    163:        {
                    164:        register BF_LONG tin0,tin1;
                    165:        register BF_LONG tout0,tout1,xor0,xor1;
                    166:        register long l=length;
                    167:        BF_LONG tin[2];
                    168: 
                    169:        if (encrypt)
                    170:                {
                    171:                n2l(iv,tout0);
                    172:                n2l(iv,tout1);
                    173:                iv-=8;
                    174:                for (l-=8; l>=0; l-=8)
                    175:                        {
                    176:                        n2l(in,tin0);
                    177:                        n2l(in,tin1);
                    178:                        tin0^=tout0;
                    179:                        tin1^=tout1;
                    180:                        tin[0]=tin0;
                    181:                        tin[1]=tin1;
                    182:                        BF_encrypt(tin,ks);
                    183:                        tout0=tin[0];
                    184:                        tout1=tin[1];
                    185:                        l2n(tout0,out);
                    186:                        l2n(tout1,out);
                    187:                        }
                    188:                if (l != -8)
                    189:                        {
                    190:                        n2ln(in,tin0,tin1,l+8);
                    191:                        tin0^=tout0;
                    192:                        tin1^=tout1;
                    193:                        tin[0]=tin0;
                    194:                        tin[1]=tin1;
                    195:                        BF_encrypt(tin,ks);
                    196:                        tout0=tin[0];
                    197:                        tout1=tin[1];
                    198:                        l2n(tout0,out);
                    199:                        l2n(tout1,out);
                    200:                        }
                    201:                l2n(tout0,iv);
                    202:                l2n(tout1,iv);
                    203:                }
                    204:        else
                    205:                {
                    206:                n2l(iv,xor0);
                    207:                n2l(iv,xor1);
                    208:                iv-=8;
                    209:                for (l-=8; l>=0; l-=8)
                    210:                        {
                    211:                        n2l(in,tin0);
                    212:                        n2l(in,tin1);
                    213:                        tin[0]=tin0;
                    214:                        tin[1]=tin1;
                    215:                        BF_decrypt(tin,ks);
                    216:                        tout0=tin[0]^xor0;
                    217:                        tout1=tin[1]^xor1;
                    218:                        l2n(tout0,out);
                    219:                        l2n(tout1,out);
                    220:                        xor0=tin0;
                    221:                        xor1=tin1;
                    222:                        }
                    223:                if (l != -8)
                    224:                        {
                    225:                        n2l(in,tin0);
                    226:                        n2l(in,tin1);
                    227:                        tin[0]=tin0;
                    228:                        tin[1]=tin1;
                    229:                        BF_decrypt(tin,ks);
                    230:                        tout0=tin[0]^xor0;
                    231:                        tout1=tin[1]^xor1;
                    232:                        l2nn(tout0,tout1,out,l+8);
                    233:                        xor0=tin0;
                    234:                        xor1=tin1;
                    235:                        }
                    236:                l2n(xor0,iv);
                    237:                l2n(xor1,iv);
                    238:                }
                    239:        tin0=tin1=tout0=tout1=xor0=xor1=0;
                    240:        tin[0]=tin[1]=0;
                    241:        }
                    242: 
                    243: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.