1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* crypto/des/des_enc.c */ 2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * All rights reserved. 4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This package is an SSL implementation written 6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * by Eric Young (eay@cryptsoft.com). 7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The implementation was written so as to conform with Netscapes SSL. 8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This library is free for commercial and non-commercial use as long as 10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the following conditions are aheared to. The following conditions 11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * apply to all code found in this distribution, be it the RC4, RSA, 12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * included with this distribution is covered by the same copyright terms 14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Copyright remains Eric Young's, and as such any Copyright notices in 17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the code are not to be removed. 18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * If this package is used in a product, Eric Young should be given attribution 19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * as the author of the parts of the library used. 20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * This can be in the form of a textual message at program startup or 21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * in documentation (online or textual) provided with the package. 22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Redistribution and use in source and binary forms, with or without 24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * modification, are permitted provided that the following conditions 25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * are met: 26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 1. Redistributions of source code must retain the copyright 27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer. 28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 2. Redistributions in binary form must reproduce the above copyright 29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * notice, this list of conditions and the following disclaimer in the 30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * documentation and/or other materials provided with the distribution. 31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 3. All advertising materials mentioning features or use of this software 32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * must display the following acknowledgement: 33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes cryptographic software written by 34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Eric Young (eay@cryptsoft.com)" 35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The word 'cryptographic' can be left out if the rouines from the library 36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * being used are not cryptographic related :-). 37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 4. If you include any Windows specific code (or a derivative thereof) from 38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * the apps directory (application code) you must include an acknowledgement: 39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * SUCH DAMAGE. 52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * 53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * The licence and distribution terms for any publically available version or 54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * derivative of this code cannot be changed. i.e. this code cannot simply be 55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * copied and put under another distribution licence 56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * [including the GNU Public Licence.] 57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */ 58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "des_locl.h" 60480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org#include "spr.h" 61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc) 63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG l,r,t,u; 65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_PTR 66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans; 67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef DES_UNROLL 69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register int i; 70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG *s; 72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=data[0]; 74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=data[1]; 75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org IP(r,l); 77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* Things have been modified so that the initial rotate is 78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * done outside the loop. This required the 79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DES_SPtrans values in sp.h to be rotated 1 bit to the right. 80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * One perl script later and things have a 5% speed up on a sparc2. 81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> 82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * for pointing this out. */ 83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* clear the top bits on machines with 8byte longs */ 84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* shift left by 2 */ 85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=ROTATE(r,29)&0xffffffffL; 86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=ROTATE(l,29)&0xffffffffL; 87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org s=ks->ks->deslong; 89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* I don't know if it is worth the effort of loop unrolling the 90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * inner loop */ 91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (enc) 92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL 94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 0); /* 1 */ 95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 2); /* 2 */ 96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 4); /* 3 */ 97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 6); /* 4 */ 98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 8); /* 5 */ 99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,10); /* 6 */ 100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,12); /* 7 */ 101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,14); /* 8 */ 102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,16); /* 9 */ 103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,18); /* 10 */ 104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,20); /* 11 */ 105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,22); /* 12 */ 106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,24); /* 13 */ 107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,26); /* 14 */ 108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,28); /* 15 */ 109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,30); /* 16 */ 110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else 111480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org for (i=0; i<32; i+=4) 112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,i+0); /* 1 */ 114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,i+2); /* 2 */ 115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL 121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,30); /* 16 */ 122c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,28); /* 15 */ 123c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,26); /* 14 */ 124c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,24); /* 13 */ 125c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,22); /* 12 */ 126c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,20); /* 11 */ 127c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,18); /* 10 */ 128c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,16); /* 9 */ 129c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,14); /* 8 */ 130c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,12); /* 7 */ 131c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,10); /* 6 */ 132c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 8); /* 5 */ 133c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 6); /* 4 */ 134c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 4); /* 3 */ 135c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 2); /* 2 */ 136c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 0); /* 1 */ 137c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else 138480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org for (i=30; i>0; i-=4) 139c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 140c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,i-0); /* 16 */ 141c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,i-2); /* 15 */ 142c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 143c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 144c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 145c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 146c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* rotate and clear the top bits on machines with 8byte longs */ 147c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=ROTATE(l,3)&0xffffffffL; 148c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=ROTATE(r,3)&0xffffffffL; 149c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 150c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org FP(r,l); 151c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[0]=l; 152c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[1]=r; 153c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=r=t=u=0; 154c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 155c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 156c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc) 157c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 158c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG l,r,t,u; 159c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_PTR 160c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans; 161c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 162c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef DES_UNROLL 163c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register int i; 164c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 165c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG *s; 166c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 167c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=data[0]; 168c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=data[1]; 169c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 170c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* Things have been modified so that the initial rotate is 171c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * done outside the loop. This required the 172c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * DES_SPtrans values in sp.h to be rotated 1 bit to the right. 173c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * One perl script later and things have a 5% speed up on a sparc2. 174c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Thanks to Richard Outerbridge <71755.204@CompuServe.COM> 175c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * for pointing this out. */ 176c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* clear the top bits on machines with 8byte longs */ 177c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=ROTATE(r,29)&0xffffffffL; 178c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=ROTATE(l,29)&0xffffffffL; 179c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 180c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org s=ks->ks->deslong; 181c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* I don't know if it is worth the effort of loop unrolling the 182c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * inner loop */ 183c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (enc) 184c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 185c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL 186c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 0); /* 1 */ 187c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 2); /* 2 */ 188c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 4); /* 3 */ 189c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 6); /* 4 */ 190c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 8); /* 5 */ 191c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,10); /* 6 */ 192c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,12); /* 7 */ 193c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,14); /* 8 */ 194c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,16); /* 9 */ 195c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,18); /* 10 */ 196c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,20); /* 11 */ 197c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,22); /* 12 */ 198c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,24); /* 13 */ 199c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,26); /* 14 */ 200c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,28); /* 15 */ 201c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,30); /* 16 */ 202c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else 203480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org for (i=0; i<32; i+=4) 204c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 205c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,i+0); /* 1 */ 206c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,i+2); /* 2 */ 207c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 208c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 209c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 210c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 211c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 212c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifdef DES_UNROLL 213c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,30); /* 16 */ 214c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,28); /* 15 */ 215c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,26); /* 14 */ 216c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,24); /* 13 */ 217c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,22); /* 12 */ 218c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,20); /* 11 */ 219c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,18); /* 10 */ 220c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,16); /* 9 */ 221c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,14); /* 8 */ 222c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,12); /* 7 */ 223c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,10); /* 6 */ 224c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 8); /* 5 */ 225c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 6); /* 4 */ 226c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 4); /* 3 */ 227c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r, 2); /* 2 */ 228c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l, 0); /* 1 */ 229c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#else 230480da75abf485e7e2a6be5acc0f71842368792c0jnd@chromium.org for (i=30; i>0; i-=4) 231c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 232c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(l,r,i-0); /* 16 */ 233c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org D_ENCRYPT(r,l,i-2); /* 15 */ 234c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 235c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif 236c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 237c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org /* rotate and clear the top bits on machines with 8byte longs */ 238c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[0]=ROTATE(l,3)&0xffffffffL; 239c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[1]=ROTATE(r,3)&0xffffffffL; 240c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=r=t=u=0; 241c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 242c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 243c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1, 244c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_key_schedule *ks2, DES_key_schedule *ks3) 245c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 246c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG l,r; 247c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 248c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=data[0]; 249c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=data[1]; 250c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org IP(l,r); 251c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[0]=l; 252c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[1]=r; 253c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT); 254c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT); 255c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT); 256c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=data[0]; 257c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=data[1]; 258c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org FP(r,l); 259c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[0]=l; 260c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[1]=r; 261c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 262c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 263c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1, 264c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_key_schedule *ks2, DES_key_schedule *ks3) 265c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 266c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG l,r; 267c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 268c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=data[0]; 269c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=data[1]; 270c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org IP(l,r); 271c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[0]=l; 272c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[1]=r; 273c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT); 274c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT); 275c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT); 276c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l=data[0]; 277c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org r=data[1]; 278c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org FP(r,l); 279c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[0]=l; 280c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org data[1]=r; 281c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 282c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 283c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#ifndef DES_DEFAULT_OPTIONS 284c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 285c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#undef CBC_ENC_C__DONT_UPDATE_IV 286c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#include "ncbc_enc.c" /* DES_ncbc_encrypt */ 287c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 288c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgvoid DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output, 289c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org long length, DES_key_schedule *ks1, 290c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_key_schedule *ks2, DES_key_schedule *ks3, 291c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_cblock *ivec, int enc) 292c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 293c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG tin0,tin1; 294c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG tout0,tout1,xor0,xor1; 295c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register const unsigned char *in; 296c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char *out; 297c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register long l=length; 298c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_LONG tin[2]; 299c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org unsigned char *iv; 300c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 301c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org in=input; 302c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org out=output; 303c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org iv = &(*ivec)[0]; 304c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 305c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (enc) 306c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 307c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(iv,tout0); 308c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(iv,tout1); 309c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (l-=8; l>=0; l-=8) 310c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 311c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(in,tin0); 312c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(in,tin1); 313c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin0^=tout0; 314c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin1^=tout1; 315c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 316c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[0]=tin0; 317c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[1]=tin1; 318c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3); 319c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout0=tin[0]; 320c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout1=tin[1]; 321c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 322c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout0,out); 323c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout1,out); 324c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 325c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (l != -8) 326c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 327c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2ln(in,tin0,tin1,l+8); 328c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin0^=tout0; 329c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin1^=tout1; 330c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 331c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[0]=tin0; 332c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[1]=tin1; 333c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3); 334c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout0=tin[0]; 335c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout1=tin[1]; 336c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 337c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout0,out); 338c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout1,out); 339c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 340c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org iv = &(*ivec)[0]; 341c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout0,iv); 342c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout1,iv); 343c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 344c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org else 345c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 346c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org register DES_LONG t0,t1; 347c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 348c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(iv,xor0); 349c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(iv,xor1); 350c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org for (l-=8; l>=0; l-=8) 351c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 352c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(in,tin0); 353c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(in,tin1); 354c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 355c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org t0=tin0; 356c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org t1=tin1; 357c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 358c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[0]=tin0; 359c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[1]=tin1; 360c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3); 361c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout0=tin[0]; 362c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout1=tin[1]; 363c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 364c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout0^=xor0; 365c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout1^=xor1; 366c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout0,out); 367c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(tout1,out); 368c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org xor0=t0; 369c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org xor1=t1; 370c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 371c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org if (l != -8) 372c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org { 373c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(in,tin0); 374c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org c2l(in,tin1); 375c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 376c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org t0=tin0; 377c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org t1=tin1; 378c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 379c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[0]=tin0; 380c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[1]=tin1; 381c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3); 382c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout0=tin[0]; 383c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout1=tin[1]; 384c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 385c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout0^=xor0; 386c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tout1^=xor1; 387c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2cn(tout0,tout1,out,l+8); 388c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org xor0=t0; 389c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org xor1=t1; 390c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 391c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 392c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org iv = &(*ivec)[0]; 393c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(xor0,iv); 394c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org l2c(xor1,iv); 395c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 396c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin0=tin1=tout0=tout1=xor0=xor1=0; 397c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org tin[0]=tin[1]=0; 398c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org } 399c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org 400c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org#endif /* DES_DEFAULT_OPTIONS */ 401