Annotation of truecrypt/crypto/des_enc.c, revision 1.1.1.1

1.1       root        1: /* crypto/des/des_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: #pragma warning( disable : 4131 )
                     60: 
                     61: 
                     62: #include "des_locl.h"
                     63: 
                     64: 
                     65: void des_encrypt(data, ks, enc)
                     66: DES_LONG *data;
                     67: des_key_schedule ks;
                     68: int enc;
                     69:        {
                     70:        register DES_LONG l,r,t,u;
                     71: #ifdef DES_PTR
                     72:        register unsigned char *des_SP=(unsigned char *)des_SPtrans;
                     73: #endif
                     74: #ifndef DES_UNROLL
                     75:        register int i;
                     76: #endif
                     77:        register DES_LONG *s;
                     78: 
                     79:        r=data[0];
                     80:        l=data[1];
                     81: 
                     82:        IP(r,l);
                     83:        /* Things have been modified so that the initial rotate is
                     84:         * done outside the loop.  This required the
                     85:         * des_SPtrans values in sp.h to be rotated 1 bit to the right.
                     86:         * One perl script later and things have a 5% speed up on a sparc2.
                     87:         * Thanks to Richard Outerbridge <[email protected]>
                     88:         * for pointing this out. */
                     89:        /* clear the top bits on machines with 8byte longs */
                     90:        /* shift left by 2 */
                     91:        r=ROTATE(r,29)&0xffffffffL;
                     92:        l=ROTATE(l,29)&0xffffffffL;
                     93: 
                     94:        s=(DES_LONG *)ks;
                     95:        /* I don't know if it is worth the effort of loop unrolling the
                     96:         * inner loop */
                     97:        if (enc)
                     98:                {
                     99: #ifdef DES_UNROLL
                    100:                D_ENCRYPT(l,r, 0); /*  1 */
                    101:                D_ENCRYPT(r,l, 2); /*  2 */
                    102:                D_ENCRYPT(l,r, 4); /*  3 */
                    103:                D_ENCRYPT(r,l, 6); /*  4 */
                    104:                D_ENCRYPT(l,r, 8); /*  5 */
                    105:                D_ENCRYPT(r,l,10); /*  6 */
                    106:                D_ENCRYPT(l,r,12); /*  7 */
                    107:                D_ENCRYPT(r,l,14); /*  8 */
                    108:                D_ENCRYPT(l,r,16); /*  9 */
                    109:                D_ENCRYPT(r,l,18); /*  10 */
                    110:                D_ENCRYPT(l,r,20); /*  11 */
                    111:                D_ENCRYPT(r,l,22); /*  12 */
                    112:                D_ENCRYPT(l,r,24); /*  13 */
                    113:                D_ENCRYPT(r,l,26); /*  14 */
                    114:                D_ENCRYPT(l,r,28); /*  15 */
                    115:                D_ENCRYPT(r,l,30); /*  16 */
                    116: #else
                    117:                for (i=0; i<32; i+=8)
                    118:                        {
                    119:                        D_ENCRYPT(l,r,i+0); /*  1 */
                    120:                        D_ENCRYPT(r,l,i+2); /*  2 */
                    121:                        D_ENCRYPT(l,r,i+4); /*  3 */
                    122:                        D_ENCRYPT(r,l,i+6); /*  4 */
                    123:                        }
                    124: #endif
                    125:                }
                    126:        else
                    127:                {
                    128: #ifdef DES_UNROLL
                    129:                D_ENCRYPT(l,r,30); /* 16 */
                    130:                D_ENCRYPT(r,l,28); /* 15 */
                    131:                D_ENCRYPT(l,r,26); /* 14 */
                    132:                D_ENCRYPT(r,l,24); /* 13 */
                    133:                D_ENCRYPT(l,r,22); /* 12 */
                    134:                D_ENCRYPT(r,l,20); /* 11 */
                    135:                D_ENCRYPT(l,r,18); /* 10 */
                    136:                D_ENCRYPT(r,l,16); /*  9 */
                    137:                D_ENCRYPT(l,r,14); /*  8 */
                    138:                D_ENCRYPT(r,l,12); /*  7 */
                    139:                D_ENCRYPT(l,r,10); /*  6 */
                    140:                D_ENCRYPT(r,l, 8); /*  5 */
                    141:                D_ENCRYPT(l,r, 6); /*  4 */
                    142:                D_ENCRYPT(r,l, 4); /*  3 */
                    143:                D_ENCRYPT(l,r, 2); /*  2 */
                    144:                D_ENCRYPT(r,l, 0); /*  1 */
                    145: #else
                    146:                for (i=30; i>0; i-=8)
                    147:                        {
                    148:                        D_ENCRYPT(l,r,i-0); /* 16 */
                    149:                        D_ENCRYPT(r,l,i-2); /* 15 */
                    150:                        D_ENCRYPT(l,r,i-4); /* 14 */
                    151:                        D_ENCRYPT(r,l,i-6); /* 13 */
                    152:                        }
                    153: #endif
                    154:                }
                    155: 
                    156:        /* rotate and clear the top bits on machines with 8byte longs */
                    157:        l=ROTATE(l,3)&0xffffffffL;
                    158:        r=ROTATE(r,3)&0xffffffffL;
                    159: 
                    160:        FP(r,l);
                    161:        data[0]=l;
                    162:        data[1]=r;
                    163:        l=r=t=u=0;
                    164:        }
                    165: 
                    166: void des_encrypt2(data, ks, enc)
                    167: DES_LONG *data;
                    168: des_key_schedule ks;
                    169: int enc;
                    170:        {
                    171:        register DES_LONG l,r,t,u;
                    172: #ifdef DES_PTR
                    173:        register unsigned char *des_SP=(unsigned char *)des_SPtrans;
                    174: #endif
                    175: #ifndef DES_UNROLL
                    176:        register int i;
                    177: #endif
                    178:        register DES_LONG *s;
                    179: 
                    180:        r=data[0];
                    181:        l=data[1];
                    182: 
                    183:        /* Things have been modified so that the initial rotate is
                    184:         * done outside the loop.  This required the
                    185:         * des_SPtrans values in sp.h to be rotated 1 bit to the right.
                    186:         * One perl script later and things have a 5% speed up on a sparc2.
                    187:         * Thanks to Richard Outerbridge <[email protected]>
                    188:         * for pointing this out. */
                    189:        /* clear the top bits on machines with 8byte longs */
                    190:        r=ROTATE(r,29)&0xffffffffL;
                    191:        l=ROTATE(l,29)&0xffffffffL;
                    192: 
                    193:        s=(DES_LONG *)ks;
                    194:        /* I don't know if it is worth the effort of loop unrolling the
                    195:         * inner loop */
                    196:        if (enc)
                    197:                {
                    198: #ifdef DES_UNROLL
                    199:                D_ENCRYPT(l,r, 0); /*  1 */
                    200:                D_ENCRYPT(r,l, 2); /*  2 */
                    201:                D_ENCRYPT(l,r, 4); /*  3 */
                    202:                D_ENCRYPT(r,l, 6); /*  4 */
                    203:                D_ENCRYPT(l,r, 8); /*  5 */
                    204:                D_ENCRYPT(r,l,10); /*  6 */
                    205:                D_ENCRYPT(l,r,12); /*  7 */
                    206:                D_ENCRYPT(r,l,14); /*  8 */
                    207:                D_ENCRYPT(l,r,16); /*  9 */
                    208:                D_ENCRYPT(r,l,18); /*  10 */
                    209:                D_ENCRYPT(l,r,20); /*  11 */
                    210:                D_ENCRYPT(r,l,22); /*  12 */
                    211:                D_ENCRYPT(l,r,24); /*  13 */
                    212:                D_ENCRYPT(r,l,26); /*  14 */
                    213:                D_ENCRYPT(l,r,28); /*  15 */
                    214:                D_ENCRYPT(r,l,30); /*  16 */
                    215: #else
                    216:                for (i=0; i<32; i+=8)
                    217:                        {
                    218:                        D_ENCRYPT(l,r,i+0); /*  1 */
                    219:                        D_ENCRYPT(r,l,i+2); /*  2 */
                    220:                        D_ENCRYPT(l,r,i+4); /*  3 */
                    221:                        D_ENCRYPT(r,l,i+6); /*  4 */
                    222:                        }
                    223: #endif
                    224:                }
                    225:        else
                    226:                {
                    227: #ifdef DES_UNROLL
                    228:                D_ENCRYPT(l,r,30); /* 16 */
                    229:                D_ENCRYPT(r,l,28); /* 15 */
                    230:                D_ENCRYPT(l,r,26); /* 14 */
                    231:                D_ENCRYPT(r,l,24); /* 13 */
                    232:                D_ENCRYPT(l,r,22); /* 12 */
                    233:                D_ENCRYPT(r,l,20); /* 11 */
                    234:                D_ENCRYPT(l,r,18); /* 10 */
                    235:                D_ENCRYPT(r,l,16); /*  9 */
                    236:                D_ENCRYPT(l,r,14); /*  8 */
                    237:                D_ENCRYPT(r,l,12); /*  7 */
                    238:                D_ENCRYPT(l,r,10); /*  6 */
                    239:                D_ENCRYPT(r,l, 8); /*  5 */
                    240:                D_ENCRYPT(l,r, 6); /*  4 */
                    241:                D_ENCRYPT(r,l, 4); /*  3 */
                    242:                D_ENCRYPT(l,r, 2); /*  2 */
                    243:                D_ENCRYPT(r,l, 0); /*  1 */
                    244: #else
                    245:                for (i=30; i>0; i-=8)
                    246:                        {
                    247:                        D_ENCRYPT(l,r,i-0); /* 16 */
                    248:                        D_ENCRYPT(r,l,i-2); /* 15 */
                    249:                        D_ENCRYPT(l,r,i-4); /* 14 */
                    250:                        D_ENCRYPT(r,l,i-6); /* 13 */
                    251:                        }
                    252: #endif
                    253:                }
                    254:        /* rotate and clear the top bits on machines with 8byte longs */
                    255:        data[0]=ROTATE(l,3)&0xffffffffL;
                    256:        data[1]=ROTATE(r,3)&0xffffffffL;
                    257:        l=r=t=u=0;
                    258:        }
                    259: 
                    260: void des_encrypt3(data,ks1,ks2,ks3)
                    261: DES_LONG *data;
                    262: des_key_schedule ks1;
                    263: des_key_schedule ks2;
                    264: des_key_schedule ks3;
                    265:        {
                    266:        register DES_LONG l,r;
                    267: 
                    268:        l=data[0];
                    269:        r=data[1];
                    270:        IP(l,r);
                    271:        data[0]=l;
                    272:        data[1]=r;
                    273:        des_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
                    274:        des_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
                    275:        des_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
                    276:        l=data[0];
                    277:        r=data[1];
                    278:        FP(r,l);
                    279:        data[0]=l;
                    280:        data[1]=r;
                    281:        }
                    282: 
                    283: void des_decrypt3(data,ks1,ks2,ks3)
                    284: DES_LONG *data;
                    285: des_key_schedule ks1;
                    286: des_key_schedule ks2;
                    287: des_key_schedule ks3;
                    288:        {
                    289:        register DES_LONG l,r;
                    290: 
                    291:        l=data[0];
                    292:        r=data[1];
                    293:        IP(l,r);
                    294:        data[0]=l;
                    295:        data[1]=r;
                    296:        des_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
                    297:        des_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
                    298:        des_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
                    299:        l=data[0];
                    300:        r=data[1];
                    301:        FP(r,l);
                    302:        data[0]=l;
                    303:        data[1]=r;
                    304:        }
                    305: 
                    306: #ifndef DES_DEFAULT_OPTIONS
                    307: 
                    308: void des_ncbc_encrypt(input, output, length, schedule, ivec, enc)
                    309: des_cblock (*input);
                    310: des_cblock (*output);
                    311: long length;
                    312: des_key_schedule schedule;
                    313: des_cblock (*ivec);
                    314: int enc;
                    315:        {
                    316:        register DES_LONG tin0,tin1;
                    317:        register DES_LONG tout0,tout1,xor0,xor1;
                    318:        register unsigned char *in,*out;
                    319:        register long l=length;
                    320:        DES_LONG tin[2];
                    321:        unsigned char *iv;
                    322: 
                    323:        in=(unsigned char *)input;
                    324:        out=(unsigned char *)output;
                    325:        iv=(unsigned char *)ivec;
                    326: 
                    327:        if (enc)
                    328:                {
                    329:                c2l(iv,tout0);
                    330:                c2l(iv,tout1);
                    331:                for (l-=8; l>=0; l-=8)
                    332:                        {
                    333:                        c2l(in,tin0);
                    334:                        c2l(in,tin1);
                    335:                        tin0^=tout0; tin[0]=tin0;
                    336:                        tin1^=tout1; tin[1]=tin1;
                    337:                        des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
                    338:                        tout0=tin[0]; l2c(tout0,out);
                    339:                        tout1=tin[1]; l2c(tout1,out);
                    340:                        }
                    341:                if (l != -8)
                    342:                        {
                    343:                        c2ln(in,tin0,tin1,l+8);
                    344:                        tin0^=tout0; tin[0]=tin0;
                    345:                        tin1^=tout1; tin[1]=tin1;
                    346:                        des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
                    347:                        tout0=tin[0]; l2c(tout0,out);
                    348:                        tout1=tin[1]; l2c(tout1,out);
                    349:                        }
                    350:                iv=(unsigned char *)ivec;
                    351:                l2c(tout0,iv);
                    352:                l2c(tout1,iv);
                    353:                }
                    354:        else
                    355:                {
                    356:                c2l(iv,xor0);
                    357:                c2l(iv,xor1);
                    358:                for (l-=8; l>=0; l-=8)
                    359:                        {
                    360:                        c2l(in,tin0); tin[0]=tin0;
                    361:                        c2l(in,tin1); tin[1]=tin1;
                    362:                        des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
                    363:                        tout0=tin[0]^xor0;
                    364:                        tout1=tin[1]^xor1;
                    365:                        l2c(tout0,out);
                    366:                        l2c(tout1,out);
                    367:                        xor0=tin0;
                    368:                        xor1=tin1;
                    369:                        }
                    370:                if (l != -8)
                    371:                        {
                    372:                        c2l(in,tin0); tin[0]=tin0;
                    373:                        c2l(in,tin1); tin[1]=tin1;
                    374:                        des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
                    375:                        tout0=tin[0]^xor0;
                    376:                        tout1=tin[1]^xor1;
                    377:                        l2cn(tout0,tout1,out,l+8);
                    378:                        xor0=tin0;
                    379:                        xor1=tin1;
                    380:                        }
                    381: 
                    382:                iv=(unsigned char *)ivec;
                    383:                l2c(xor0,iv);
                    384:                l2c(xor1,iv);
                    385:                }
                    386:        tin0=tin1=tout0=tout1=xor0=xor1=0;
                    387:        tin[0]=tin[1]=0;
                    388:        }
                    389: 
                    390: void des_ede3_cbc_encrypt(input, output, length, ks1, ks2, ks3, ivec, enc)
                    391: des_cblock (*input);
                    392: des_cblock (*output);
                    393: long length;
                    394: des_key_schedule ks1;
                    395: des_key_schedule ks2;
                    396: des_key_schedule ks3;
                    397: des_cblock (*ivec);
                    398: int enc;
                    399:        {
                    400:        register DES_LONG tin0,tin1;
                    401:        register DES_LONG tout0,tout1,xor0,xor1;
                    402:        register unsigned char *in,*out;
                    403:        register long l=length;
                    404:        DES_LONG tin[2];
                    405:        unsigned char *iv;
                    406: 
                    407:        in=(unsigned char *)input;
                    408:        out=(unsigned char *)output;
                    409:        iv=(unsigned char *)ivec;
                    410: 
                    411:        if (enc)
                    412:                {
                    413:                c2l(iv,tout0);
                    414:                c2l(iv,tout1);
                    415:                for (l-=8; l>=0; l-=8)
                    416:                        {
                    417:                        c2l(in,tin0);
                    418:                        c2l(in,tin1);
                    419:                        tin0^=tout0;
                    420:                        tin1^=tout1;
                    421: 
                    422:                        tin[0]=tin0;
                    423:                        tin[1]=tin1;
                    424:                        des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                    425:                        tout0=tin[0];
                    426:                        tout1=tin[1];
                    427: 
                    428:                        l2c(tout0,out);
                    429:                        l2c(tout1,out);
                    430:                        }
                    431:                if (l != -8)
                    432:                        {
                    433:                        c2ln(in,tin0,tin1,l+8);
                    434:                        tin0^=tout0;
                    435:                        tin1^=tout1;
                    436: 
                    437:                        tin[0]=tin0;
                    438:                        tin[1]=tin1;
                    439:                        des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                    440:                        tout0=tin[0];
                    441:                        tout1=tin[1];
                    442: 
                    443:                        l2c(tout0,out);
                    444:                        l2c(tout1,out);
                    445:                        }
                    446:                iv=(unsigned char *)ivec;
                    447:                l2c(tout0,iv);
                    448:                l2c(tout1,iv);
                    449:                }
                    450:        else
                    451:                {
                    452:                register DES_LONG t0,t1;
                    453: 
                    454:                c2l(iv,xor0);
                    455:                c2l(iv,xor1);
                    456:                for (l-=8; l>=0; l-=8)
                    457:                        {
                    458:                        c2l(in,tin0);
                    459:                        c2l(in,tin1);
                    460: 
                    461:                        t0=tin0;
                    462:                        t1=tin1;
                    463: 
                    464:                        tin[0]=tin0;
                    465:                        tin[1]=tin1;
                    466:                        des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                    467:                        tout0=tin[0];
                    468:                        tout1=tin[1];
                    469: 
                    470:                        tout0^=xor0;
                    471:                        tout1^=xor1;
                    472:                        l2c(tout0,out);
                    473:                        l2c(tout1,out);
                    474:                        xor0=t0;
                    475:                        xor1=t1;
                    476:                        }
                    477:                if (l != -8)
                    478:                        {
                    479:                        c2l(in,tin0);
                    480:                        c2l(in,tin1);
                    481:                        
                    482:                        t0=tin0;
                    483:                        t1=tin1;
                    484: 
                    485:                        tin[0]=tin0;
                    486:                        tin[1]=tin1;
                    487:                        des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                    488:                        tout0=tin[0];
                    489:                        tout1=tin[1];
                    490:                
                    491:                        tout0^=xor0;
                    492:                        tout1^=xor1;
                    493:                        l2cn(tout0,tout1,out,l+8);
                    494:                        xor0=t0;
                    495:                        xor1=t1;
                    496:                        }
                    497: 
                    498:                iv=(unsigned char *)ivec;
                    499:                l2c(xor0,iv);
                    500:                l2c(xor1,iv);
                    501:                }
                    502:        tin0=tin1=tout0=tout1=xor0=xor1=0;
                    503:        tin[0]=tin[1]=0;
                    504:        }
                    505: 
                    506: #endif /* DES_DEFAULT_OPTIONS */

unix.superglobalmegacorp.com

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