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