bf_enc.c revision 1.2
11.2Sitojun/*	$NetBSD: bf_enc.c,v 1.2 2000/08/31 06:46:21 itojun Exp $	*/
21.2Sitojun/*	$KAME: bf_enc.c,v 1.4 2000/08/31 05:41:03 itojun Exp $	*/
31.1Sthorpej
41.1Sthorpej/* crypto/bf/bf_enc.c */
51.1Sthorpej/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
61.1Sthorpej * All rights reserved.
71.1Sthorpej *
81.1Sthorpej * This package is an SSL implementation written
91.1Sthorpej * by Eric Young (eay@mincom.oz.au).
101.1Sthorpej * The implementation was written so as to conform with Netscapes SSL.
111.1Sthorpej *
121.1Sthorpej * This library is free for commercial and non-commercial use as long as
131.1Sthorpej * the following conditions are aheared to.  The following conditions
141.1Sthorpej * apply to all code found in this distribution, be it the RC4, RSA,
151.1Sthorpej * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
161.1Sthorpej * included with this distribution is covered by the same copyright terms
171.1Sthorpej * except that the holder is Tim Hudson (tjh@mincom.oz.au).
181.1Sthorpej *
191.1Sthorpej * Copyright remains Eric Young's, and as such any Copyright notices in
201.1Sthorpej * the code are not to be removed.
211.1Sthorpej * If this package is used in a product, Eric Young should be given attribution
221.1Sthorpej * as the author of the parts of the library used.
231.1Sthorpej * This can be in the form of a textual message at program startup or
241.1Sthorpej * in documentation (online or textual) provided with the package.
251.1Sthorpej *
261.1Sthorpej * Redistribution and use in source and binary forms, with or without
271.1Sthorpej * modification, are permitted provided that the following conditions
281.1Sthorpej * are met:
291.1Sthorpej * 1. Redistributions of source code must retain the copyright
301.1Sthorpej *    notice, this list of conditions and the following disclaimer.
311.1Sthorpej * 2. Redistributions in binary form must reproduce the above copyright
321.1Sthorpej *    notice, this list of conditions and the following disclaimer in the
331.1Sthorpej *    documentation and/or other materials provided with the distribution.
341.1Sthorpej * 3. All advertising materials mentioning features or use of this software
351.1Sthorpej *    must display the following acknowledgement:
361.1Sthorpej *    "This product includes cryptographic software written by
371.1Sthorpej *     Eric Young (eay@mincom.oz.au)"
381.1Sthorpej *    The word 'cryptographic' can be left out if the rouines from the library
391.1Sthorpej *    being used are not cryptographic related :-).
401.1Sthorpej * 4. If you include any Windows specific code (or a derivative thereof) from
411.1Sthorpej *    the apps directory (application code) you must include an acknowledgement:
421.1Sthorpej *    "This product includes software written by Tim Hudson (tjh@mincom.oz.au)"
431.1Sthorpej *
441.1Sthorpej * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
451.1Sthorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
461.1Sthorpej * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
471.1Sthorpej * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
481.1Sthorpej * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
491.1Sthorpej * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
501.1Sthorpej * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
511.1Sthorpej * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
521.1Sthorpej * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
531.1Sthorpej * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
541.1Sthorpej * SUCH DAMAGE.
551.1Sthorpej *
561.1Sthorpej * The licence and distribution terms for any publically available version or
571.1Sthorpej * derivative of this code cannot be changed.  i.e. this code cannot simply be
581.1Sthorpej * copied and put under another distribution licence
591.1Sthorpej * [including the GNU Public Licence.]
601.1Sthorpej */
611.1Sthorpej
621.2Sitojun#include <sys/types.h>
631.1Sthorpej#include <crypto/blowfish/blowfish.h>
641.1Sthorpej#include <crypto/blowfish/bf_locl.h>
651.1Sthorpej
661.1Sthorpej/* Blowfish as implemented from 'Blowfish: Springer-Verlag paper'
671.1Sthorpej * (From LECTURE NOTES IN COIMPUTER SCIENCE 809, FAST SOFTWARE ENCRYPTION,
681.1Sthorpej * CAMBRIDGE SECURITY WORKSHOP, CAMBRIDGE, U.K., DECEMBER 9-11, 1993)
691.1Sthorpej */
701.1Sthorpej
711.1Sthorpej#if (BF_ROUNDS != 16) && (BF_ROUNDS != 20)
721.1SthorpejIf you set BF_ROUNDS to some value other than 16 or 20, you will have
731.1Sthorpejto modify the code.
741.1Sthorpej#endif
751.1Sthorpej
761.1Sthorpejvoid BF_encrypt(data,key,encrypt)
771.1SthorpejBF_LONG *data;
781.1SthorpejBF_KEY *key;
791.1Sthorpejint encrypt;
801.1Sthorpej	{
811.1Sthorpej	register BF_LONG l,r,*p,*s;
821.1Sthorpej
831.1Sthorpej	p=key->P;
841.1Sthorpej	s= &(key->S[0]);
851.1Sthorpej	l=data[0];
861.1Sthorpej	r=data[1];
871.1Sthorpej
881.1Sthorpej	if (encrypt)
891.1Sthorpej		{
901.1Sthorpej		l^=p[0];
911.1Sthorpej		BF_ENC(r,l,s,p[ 1]);
921.1Sthorpej		BF_ENC(l,r,s,p[ 2]);
931.1Sthorpej		BF_ENC(r,l,s,p[ 3]);
941.1Sthorpej		BF_ENC(l,r,s,p[ 4]);
951.1Sthorpej		BF_ENC(r,l,s,p[ 5]);
961.1Sthorpej		BF_ENC(l,r,s,p[ 6]);
971.1Sthorpej		BF_ENC(r,l,s,p[ 7]);
981.1Sthorpej		BF_ENC(l,r,s,p[ 8]);
991.1Sthorpej		BF_ENC(r,l,s,p[ 9]);
1001.1Sthorpej		BF_ENC(l,r,s,p[10]);
1011.1Sthorpej		BF_ENC(r,l,s,p[11]);
1021.1Sthorpej		BF_ENC(l,r,s,p[12]);
1031.1Sthorpej		BF_ENC(r,l,s,p[13]);
1041.1Sthorpej		BF_ENC(l,r,s,p[14]);
1051.1Sthorpej		BF_ENC(r,l,s,p[15]);
1061.1Sthorpej		BF_ENC(l,r,s,p[16]);
1071.1Sthorpej#if BF_ROUNDS == 20
1081.1Sthorpej		BF_ENC(r,l,s,p[17]);
1091.1Sthorpej		BF_ENC(l,r,s,p[18]);
1101.1Sthorpej		BF_ENC(r,l,s,p[19]);
1111.1Sthorpej		BF_ENC(l,r,s,p[20]);
1121.1Sthorpej#endif
1131.1Sthorpej		r^=p[BF_ROUNDS+1];
1141.1Sthorpej		}
1151.1Sthorpej	else
1161.1Sthorpej		{
1171.1Sthorpej		l^=p[BF_ROUNDS+1];
1181.1Sthorpej#if BF_ROUNDS == 20
1191.1Sthorpej		BF_ENC(r,l,s,p[20]);
1201.1Sthorpej		BF_ENC(l,r,s,p[19]);
1211.1Sthorpej		BF_ENC(r,l,s,p[18]);
1221.1Sthorpej		BF_ENC(l,r,s,p[17]);
1231.1Sthorpej#endif
1241.1Sthorpej		BF_ENC(r,l,s,p[16]);
1251.1Sthorpej		BF_ENC(l,r,s,p[15]);
1261.1Sthorpej		BF_ENC(r,l,s,p[14]);
1271.1Sthorpej		BF_ENC(l,r,s,p[13]);
1281.1Sthorpej		BF_ENC(r,l,s,p[12]);
1291.1Sthorpej		BF_ENC(l,r,s,p[11]);
1301.1Sthorpej		BF_ENC(r,l,s,p[10]);
1311.1Sthorpej		BF_ENC(l,r,s,p[ 9]);
1321.1Sthorpej		BF_ENC(r,l,s,p[ 8]);
1331.1Sthorpej		BF_ENC(l,r,s,p[ 7]);
1341.1Sthorpej		BF_ENC(r,l,s,p[ 6]);
1351.1Sthorpej		BF_ENC(l,r,s,p[ 5]);
1361.1Sthorpej		BF_ENC(r,l,s,p[ 4]);
1371.1Sthorpej		BF_ENC(l,r,s,p[ 3]);
1381.1Sthorpej		BF_ENC(r,l,s,p[ 2]);
1391.1Sthorpej		BF_ENC(l,r,s,p[ 1]);
1401.1Sthorpej		r^=p[0];
1411.1Sthorpej		}
1421.1Sthorpej	data[1]=l&0xffffffff;
1431.1Sthorpej	data[0]=r&0xffffffff;
1441.1Sthorpej	}
145