|
|
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: #pragma warning( disable : 4131 ) ! 61: ! 62: ! 63: #include "blowfish.h" ! 64: #include "bf_locl.h" ! 65: ! 66: /* Blowfish as implemented from 'Blowfish: Springer-Verlag paper' ! 67: * (From LECTURE NOTES IN COIMPUTER SCIENCE 809, FAST SOFTWARE ENCRYPTION, ! 68: * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993) ! 69: */ ! 70: ! 71: #if (BF_ROUNDS != 16) && (BF_ROUNDS != 20) ! 72: If you set BF_ROUNDS to some value other than 16 or 20, you will have ! 73: to modify the code. ! 74: #endif ! 75: ! 76: void BF_encrypt(data,key) ! 77: BF_LONG *data; ! 78: BF_KEY *key; ! 79: { ! 80: register BF_LONG l,r,*p,*s; ! 81: ! 82: p=key->P; ! 83: s= &(key->S[0]); ! 84: l=data[0]; ! 85: r=data[1]; ! 86: ! 87: l^=p[0]; ! 88: BF_ENC(r,l,s,p[ 1]); ! 89: BF_ENC(l,r,s,p[ 2]); ! 90: BF_ENC(r,l,s,p[ 3]); ! 91: BF_ENC(l,r,s,p[ 4]); ! 92: BF_ENC(r,l,s,p[ 5]); ! 93: BF_ENC(l,r,s,p[ 6]); ! 94: BF_ENC(r,l,s,p[ 7]); ! 95: BF_ENC(l,r,s,p[ 8]); ! 96: BF_ENC(r,l,s,p[ 9]); ! 97: BF_ENC(l,r,s,p[10]); ! 98: BF_ENC(r,l,s,p[11]); ! 99: BF_ENC(l,r,s,p[12]); ! 100: BF_ENC(r,l,s,p[13]); ! 101: BF_ENC(l,r,s,p[14]); ! 102: BF_ENC(r,l,s,p[15]); ! 103: BF_ENC(l,r,s,p[16]); ! 104: #if BF_ROUNDS == 20 ! 105: BF_ENC(r,l,s,p[17]); ! 106: BF_ENC(l,r,s,p[18]); ! 107: BF_ENC(r,l,s,p[19]); ! 108: BF_ENC(l,r,s,p[20]); ! 109: #endif ! 110: r^=p[BF_ROUNDS+1]; ! 111: ! 112: data[1]=l&0xffffffffL; ! 113: data[0]=r&0xffffffffL; ! 114: } ! 115: ! 116: #ifndef BF_DEFAULT_OPTIONS ! 117: ! 118: void BF_decrypt(data,key) ! 119: BF_LONG *data; ! 120: BF_KEY *key; ! 121: { ! 122: register BF_LONG l,r,*p,*s; ! 123: ! 124: p=key->P; ! 125: s= &(key->S[0]); ! 126: l=data[0]; ! 127: r=data[1]; ! 128: ! 129: l^=p[BF_ROUNDS+1]; ! 130: #if BF_ROUNDS == 20 ! 131: BF_ENC(r,l,s,p[20]); ! 132: BF_ENC(l,r,s,p[19]); ! 133: BF_ENC(r,l,s,p[18]); ! 134: BF_ENC(l,r,s,p[17]); ! 135: #endif ! 136: BF_ENC(r,l,s,p[16]); ! 137: BF_ENC(l,r,s,p[15]); ! 138: BF_ENC(r,l,s,p[14]); ! 139: BF_ENC(l,r,s,p[13]); ! 140: BF_ENC(r,l,s,p[12]); ! 141: BF_ENC(l,r,s,p[11]); ! 142: BF_ENC(r,l,s,p[10]); ! 143: BF_ENC(l,r,s,p[ 9]); ! 144: BF_ENC(r,l,s,p[ 8]); ! 145: BF_ENC(l,r,s,p[ 7]); ! 146: BF_ENC(r,l,s,p[ 6]); ! 147: BF_ENC(l,r,s,p[ 5]); ! 148: BF_ENC(r,l,s,p[ 4]); ! 149: BF_ENC(l,r,s,p[ 3]); ! 150: BF_ENC(r,l,s,p[ 2]); ! 151: BF_ENC(l,r,s,p[ 1]); ! 152: r^=p[0]; ! 153: ! 154: data[1]=l&0xffffffffL; ! 155: data[0]=r&0xffffffffL; ! 156: } ! 157: ! 158: void BF_cbc_encrypt(in, out, length, ks, iv, encrypt) ! 159: unsigned char *in; ! 160: unsigned char *out; ! 161: long length; ! 162: BF_KEY *ks; ! 163: unsigned char *iv; ! 164: int encrypt; ! 165: { ! 166: register BF_LONG tin0,tin1; ! 167: register BF_LONG tout0,tout1,xor0,xor1; ! 168: register long l=length; ! 169: BF_LONG tin[2]; ! 170: ! 171: if (encrypt) ! 172: { ! 173: n2l(iv,tout0); ! 174: n2l(iv,tout1); ! 175: iv-=8; ! 176: for (l-=8; l>=0; l-=8) ! 177: { ! 178: n2l(in,tin0); ! 179: n2l(in,tin1); ! 180: tin0^=tout0; ! 181: tin1^=tout1; ! 182: tin[0]=tin0; ! 183: tin[1]=tin1; ! 184: BF_encrypt(tin,ks); ! 185: tout0=tin[0]; ! 186: tout1=tin[1]; ! 187: l2n(tout0,out); ! 188: l2n(tout1,out); ! 189: } ! 190: if (l != -8) ! 191: { ! 192: n2ln(in,tin0,tin1,l+8); ! 193: tin0^=tout0; ! 194: tin1^=tout1; ! 195: tin[0]=tin0; ! 196: tin[1]=tin1; ! 197: BF_encrypt(tin,ks); ! 198: tout0=tin[0]; ! 199: tout1=tin[1]; ! 200: l2n(tout0,out); ! 201: l2n(tout1,out); ! 202: } ! 203: l2n(tout0,iv); ! 204: l2n(tout1,iv); ! 205: } ! 206: else ! 207: { ! 208: n2l(iv,xor0); ! 209: n2l(iv,xor1); ! 210: iv-=8; ! 211: for (l-=8; l>=0; l-=8) ! 212: { ! 213: n2l(in,tin0); ! 214: n2l(in,tin1); ! 215: tin[0]=tin0; ! 216: tin[1]=tin1; ! 217: BF_decrypt(tin,ks); ! 218: tout0=tin[0]^xor0; ! 219: tout1=tin[1]^xor1; ! 220: l2n(tout0,out); ! 221: l2n(tout1,out); ! 222: xor0=tin0; ! 223: xor1=tin1; ! 224: } ! 225: if (l != -8) ! 226: { ! 227: n2l(in,tin0); ! 228: n2l(in,tin1); ! 229: tin[0]=tin0; ! 230: tin[1]=tin1; ! 231: BF_decrypt(tin,ks); ! 232: tout0=tin[0]^xor0; ! 233: tout1=tin[1]^xor1; ! 234: l2nn(tout0,tout1,out,l+8); ! 235: xor0=tin0; ! 236: xor1=tin1; ! 237: } ! 238: l2n(xor0,iv); ! 239: l2n(xor1,iv); ! 240: } ! 241: tin0=tin1=tout0=tout1=xor0=xor1=0; ! 242: tin[0]=tin[1]=0; ! 243: } ! 244: ! 245: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.