|
|
1.1 ! root 1: /* crypto/cast/c_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: #include "cast.h" ! 60: #include "cast_lcl.h" ! 61: ! 62: #pragma warning( disable : 4131 ) ! 63: ! 64: void CAST_encrypt(data,key) ! 65: CAST_LONG *data; ! 66: CAST_KEY *key; ! 67: { ! 68: register CAST_LONG l,r,*k,t; ! 69: ! 70: k= &(key->data[0]); ! 71: l=data[0]; ! 72: r=data[1]; ! 73: ! 74: E_CAST( 0,k,l,r,+,^,-); ! 75: E_CAST( 1,k,r,l,^,-,+); ! 76: E_CAST( 2,k,l,r,-,+,^); ! 77: E_CAST( 3,k,r,l,+,^,-); ! 78: E_CAST( 4,k,l,r,^,-,+); ! 79: E_CAST( 5,k,r,l,-,+,^); ! 80: E_CAST( 6,k,l,r,+,^,-); ! 81: E_CAST( 7,k,r,l,^,-,+); ! 82: E_CAST( 8,k,l,r,-,+,^); ! 83: E_CAST( 9,k,r,l,+,^,-); ! 84: E_CAST(10,k,l,r,^,-,+); ! 85: E_CAST(11,k,r,l,-,+,^); ! 86: E_CAST(12,k,l,r,+,^,-); ! 87: E_CAST(13,k,r,l,^,-,+); ! 88: E_CAST(14,k,l,r,-,+,^); ! 89: E_CAST(15,k,r,l,+,^,-); ! 90: ! 91: data[1]=l&0xffffffffL; ! 92: data[0]=r&0xffffffffL; ! 93: } ! 94: ! 95: void CAST_decrypt(data,key) ! 96: CAST_LONG *data; ! 97: CAST_KEY *key; ! 98: { ! 99: register CAST_LONG l,r,*k,t; ! 100: ! 101: k= &(key->data[0]); ! 102: l=data[0]; ! 103: r=data[1]; ! 104: ! 105: E_CAST(15,k,l,r,+,^,-); ! 106: E_CAST(14,k,r,l,-,+,^); ! 107: E_CAST(13,k,l,r,^,-,+); ! 108: E_CAST(12,k,r,l,+,^,-); ! 109: E_CAST(11,k,l,r,-,+,^); ! 110: E_CAST(10,k,r,l,^,-,+); ! 111: E_CAST( 9,k,l,r,+,^,-); ! 112: E_CAST( 8,k,r,l,-,+,^); ! 113: E_CAST( 7,k,l,r,^,-,+); ! 114: E_CAST( 6,k,r,l,+,^,-); ! 115: E_CAST( 5,k,l,r,-,+,^); ! 116: E_CAST( 4,k,r,l,^,-,+); ! 117: E_CAST( 3,k,l,r,+,^,-); ! 118: E_CAST( 2,k,r,l,-,+,^); ! 119: E_CAST( 1,k,l,r,^,-,+); ! 120: E_CAST( 0,k,r,l,+,^,-); ! 121: ! 122: data[1]=l&0xffffffffL; ! 123: data[0]=r&0xffffffffL; ! 124: } ! 125: ! 126: void CAST_cbc_encrypt(in, out, length, ks, iv, encrypt) ! 127: unsigned char *in; ! 128: unsigned char *out; ! 129: long length; ! 130: CAST_KEY *ks; ! 131: unsigned char *iv; ! 132: int encrypt; ! 133: { ! 134: register CAST_LONG tin0,tin1; ! 135: register CAST_LONG tout0,tout1,xor0,xor1; ! 136: register long l=length; ! 137: CAST_LONG tin[2]; ! 138: ! 139: if (encrypt) ! 140: { ! 141: n2l(iv,tout0); ! 142: n2l(iv,tout1); ! 143: iv-=8; ! 144: for (l-=8; l>=0; l-=8) ! 145: { ! 146: n2l(in,tin0); ! 147: n2l(in,tin1); ! 148: tin0^=tout0; ! 149: tin1^=tout1; ! 150: tin[0]=tin0; ! 151: tin[1]=tin1; ! 152: CAST_encrypt(tin,ks); ! 153: tout0=tin[0]; ! 154: tout1=tin[1]; ! 155: l2n(tout0,out); ! 156: l2n(tout1,out); ! 157: } ! 158: if (l != -8) ! 159: { ! 160: n2ln(in,tin0,tin1,l+8); ! 161: tin0^=tout0; ! 162: tin1^=tout1; ! 163: tin[0]=tin0; ! 164: tin[1]=tin1; ! 165: CAST_encrypt(tin,ks); ! 166: tout0=tin[0]; ! 167: tout1=tin[1]; ! 168: l2n(tout0,out); ! 169: l2n(tout1,out); ! 170: } ! 171: l2n(tout0,iv); ! 172: l2n(tout1,iv); ! 173: } ! 174: else ! 175: { ! 176: n2l(iv,xor0); ! 177: n2l(iv,xor1); ! 178: iv-=8; ! 179: for (l-=8; l>=0; l-=8) ! 180: { ! 181: n2l(in,tin0); ! 182: n2l(in,tin1); ! 183: tin[0]=tin0; ! 184: tin[1]=tin1; ! 185: CAST_decrypt(tin,ks); ! 186: tout0=tin[0]^xor0; ! 187: tout1=tin[1]^xor1; ! 188: l2n(tout0,out); ! 189: l2n(tout1,out); ! 190: xor0=tin0; ! 191: xor1=tin1; ! 192: } ! 193: if (l != -8) ! 194: { ! 195: n2l(in,tin0); ! 196: n2l(in,tin1); ! 197: tin[0]=tin0; ! 198: tin[1]=tin1; ! 199: CAST_decrypt(tin,ks); ! 200: tout0=tin[0]^xor0; ! 201: tout1=tin[1]^xor1; ! 202: l2nn(tout0,tout1,out,l+8); ! 203: xor0=tin0; ! 204: xor1=tin1; ! 205: } ! 206: l2n(xor0,iv); ! 207: l2n(xor1,iv); ! 208: } ! 209: tin0=tin1=tout0=tout1=xor0=xor1=0; ! 210: tin[0]=tin[1]=0; ! 211: } ! 212:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.