亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? twofish2.c

?? 一個(gè)towfish加密算法的源代碼
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/***************************************************************************
	TWOFISH2.C	-- Optimized C API calls for TWOFISH AES submission

	Submitters:
		Bruce Schneier, Counterpane Systems
		Doug Whiting,	Hi/fn
		John Kelsey,	Counterpane Systems
		Chris Hall,		Counterpane Systems
		David Wagner,	UC Berkeley
			
	Code Author:		Doug Whiting,	Hi/fn
		
	Version  1.00		April 1998
		
	Copyright 1998, Hi/fn and Counterpane Systems.  All rights reserved.
		
	Notes:
		*	Optimized version
		*	Tab size is set to 4 characters in this file

***************************************************************************/
#include	"aes.h"
#include	"table.h"

#include	<memory.h>
#include	<assert.h>

#if   defined(min_key)  && !defined(MIN_KEY)
#define	MIN_KEY		1			/* toupper() */
#elif defined(part_key) && !defined(PART_KEY)
#define	PART_KEY	1
#elif defined(zero_key) && !defined(ZERO_KEY)
#define	ZERO_KEY	1
#endif


#ifdef USE_ASM
extern	int	useAsm;				/* ok to use ASM code? */

typedef	int CipherProc
   (cipherInstance *cipher, keyInstance *key,BYTE *input,int inputLen,BYTE *outBuffer);
typedef int	KeySetupProc(keyInstance *key);

extern CipherProc	*blockEncrypt_86;	/* ptr to ASM functions */
extern CipherProc	*blockDecrypt_86;
extern KeySetupProc	*reKey_86;
extern DWORD		TwofishAsmCodeSize(void);
#endif

/*
+*****************************************************************************
*			Constants/Macros/Tables
-****************************************************************************/

#define		CONST					/* help syntax from C++, NOP here */

CONST		fullSbox MDStab;		/* not actually const.  Initialized ONE time */
int			needToBuildMDS=1;		/* is MDStab initialized yet? */

/* number of rounds for various key sizes:  128, 192, 256 */
/* (ignored for now in optimized code!) */
int			numRounds[4]= {0,ROUNDS_128,ROUNDS_192,ROUNDS_256};

#if REENTRANT
#define		_sBox_	 key->sBox8x32
#else
static		fullSbox _sBox_;		/* permuted MDStab based on keys */
#endif
#define _sBox8_(N) (((BYTE *) _sBox_) + (N)*256)

/*------- see what level of S-box precomputation we need to do -----*/
#if   defined(ZERO_KEY)
#define	MOD_STRING	"(Zero S-box keying)"
#define	Fe32_128(x,R)	\
	(	MDStab[0][p8(01)[p8(02)[_b(x,R  )]^b0(SKEY[1])]^b0(SKEY[0])] ^	\
		MDStab[1][p8(11)[p8(12)[_b(x,R+1)]^b1(SKEY[1])]^b1(SKEY[0])] ^	\
		MDStab[2][p8(21)[p8(22)[_b(x,R+2)]^b2(SKEY[1])]^b2(SKEY[0])] ^	\
		MDStab[3][p8(31)[p8(32)[_b(x,R+3)]^b3(SKEY[1])]^b3(SKEY[0])] )
#define	Fe32_192(x,R)	\
	(	MDStab[0][p8(01)[p8(02)[p8(03)[_b(x,R  )]^b0(SKEY[2])]^b0(SKEY[1])]^b0(SKEY[0])] ^ \
		MDStab[1][p8(11)[p8(12)[p8(13)[_b(x,R+1)]^b1(SKEY[2])]^b1(SKEY[1])]^b1(SKEY[0])] ^ \
		MDStab[2][p8(21)[p8(22)[p8(23)[_b(x,R+2)]^b2(SKEY[2])]^b2(SKEY[1])]^b2(SKEY[0])] ^ \
		MDStab[3][p8(31)[p8(32)[p8(33)[_b(x,R+3)]^b3(SKEY[2])]^b3(SKEY[1])]^b3(SKEY[0])] )
#define	Fe32_256(x,R)	\
	(	MDStab[0][p8(01)[p8(02)[p8(03)[p8(04)[_b(x,R  )]^b0(SKEY[3])]^b0(SKEY[2])]^b0(SKEY[1])]^b0(SKEY[0])] ^ \
		MDStab[1][p8(11)[p8(12)[p8(13)[p8(14)[_b(x,R+1)]^b1(SKEY[3])]^b1(SKEY[2])]^b1(SKEY[1])]^b1(SKEY[0])] ^ \
		MDStab[2][p8(21)[p8(22)[p8(23)[p8(24)[_b(x,R+2)]^b2(SKEY[3])]^b2(SKEY[2])]^b2(SKEY[1])]^b2(SKEY[0])] ^ \
		MDStab[3][p8(31)[p8(32)[p8(33)[p8(34)[_b(x,R+3)]^b3(SKEY[3])]^b3(SKEY[2])]^b3(SKEY[1])]^b3(SKEY[0])] )

#define	GetSboxKey	DWORD SKEY[4];	/* local copy */ \
					memcpy(SKEY,key->sboxKeys,sizeof(SKEY));
/*----------------------------------------------------------------*/
#elif defined(MIN_KEY)
#define	MOD_STRING	"(Minimal keying)"
#define	Fe32_(x,R)(MDStab[0][p8(01)[_sBox8_(0)[_b(x,R  )]] ^ b0(SKEY0)] ^ \
				   MDStab[1][p8(11)[_sBox8_(1)[_b(x,R+1)]] ^ b1(SKEY0)] ^ \
				   MDStab[2][p8(21)[_sBox8_(2)[_b(x,R+2)]] ^ b2(SKEY0)] ^ \
				   MDStab[3][p8(31)[_sBox8_(3)[_b(x,R+3)]] ^ b3(SKEY0)])
#define sbSet(N,i,J,v) { _sBox8_(N)[i+J] = v; }
#define	GetSboxKey	DWORD SKEY0	= key->sboxKeys[0]		/* local copy */
/*----------------------------------------------------------------*/
#elif defined(PART_KEY)	
#define	MOD_STRING	"(Partial keying)"
#define	Fe32_(x,R)(MDStab[0][_sBox8_(0)[_b(x,R  )]] ^ \
				   MDStab[1][_sBox8_(1)[_b(x,R+1)]] ^ \
				   MDStab[2][_sBox8_(2)[_b(x,R+2)]] ^ \
				   MDStab[3][_sBox8_(3)[_b(x,R+3)]])
#define sbSet(N,i,J,v) { _sBox8_(N)[i+J] = v; }
#define	GetSboxKey	
/*----------------------------------------------------------------*/
#else	/* default is FULL_KEY */
#ifndef FULL_KEY
#define	FULL_KEY	1
#endif
#ifdef COMPILE_KEY
#define	MOD_STRING	"(Compiled subkeys)"
#else
#define	MOD_STRING	"(Full keying)"
#endif
/* Fe32_ does a full S-box + MDS lookup.  Need to #define _sBox_ before use.
   Note that we "interleave" 0,1, and 2,3 to avoid cache bank collisions
   in optimized assembly language.
*/
#define	Fe32_(x,R) (_sBox_[0][2*_b(x,R  )] ^ _sBox_[0][2*_b(x,R+1)+1] ^	\
				    _sBox_[2][2*_b(x,R+2)] ^ _sBox_[2][2*_b(x,R+3)+1])
		/* set a single S-box value, given the input byte */
#define sbSet(N,i,J,v) { _sBox_[N&2][2*i+(N&1)+2*J]=MDStab[N][v]; }
#define	GetSboxKey	
#endif

CONST		char *moduleDescription	="Optimized C ";
CONST		char *modeString		=MOD_STRING;


/* macro(s) for debugging help */
#define		CHECK_TABLE		0		/* nonzero --> compare against "slow" table */
#define		VALIDATE_PARMS	0		/* disable for full speed */

#include	"debug.h"				/* debug display macros */

/* end of debug macros */

extern DWORD Here(DWORD x);			/* return caller's address! */
DWORD TwofishCodeStart(void) { return Here(0); };

/*
+*****************************************************************************
*
* Function Name:	setRounds
*
* Function:			Set the number of rounds for Twofish
*
* Arguments:		keyLen		=	which keyLength to affect (128,192,256)
*					numRounds	=	how many rounds
*
* Return:			TRUE if the values passed in are valid
*
* Notes: This routine sets global variable(s) which are used in setting
*		 up the key schedule.
*
-****************************************************************************/
int setRounds(int keyLen,int nRounds)
	{
	if ((nRounds < 2) || (nRounds > MAX_ROUNDS) || (nRounds & 1))
		return FALSE;

	switch (keyLen)
		{
		case 128:	numRounds[1]=nRounds;	break;
		case 192:	numRounds[2]=nRounds;	break;
		case 256:	numRounds[3]=nRounds;	break;
		default:	return FALSE;
		}

	return TRUE;
	}
/*
+*****************************************************************************
*
* Function Name:	TableOp
*
* Function:			Handle table use checking
*
* Arguments:		op	=	what to do	(see TAB_* defns in AES.H)
*
* Return:			TRUE --> done (for TAB_QUERY)		
*
* Notes: This routine is for use in generating the tables KAT file.
*		 For this optimized version, we don't actually track table usage,
*		 since it would make the macros incredibly ugly.  Instead we just
*		 run for a fixed number of queries and then say we're done.
*
-****************************************************************************/
int TableOp(int op)
	{
	static int queryCnt=0;

	switch (op)
		{
		case TAB_DISABLE:
			break;
		case TAB_ENABLE:
			break;
		case TAB_RESET:
			queryCnt=0;
			break;
		case TAB_QUERY:
			queryCnt++;
			if (queryCnt < TAB_MIN_QUERY)
				return FALSE;
		}
	return TRUE;
	}


/*
+*****************************************************************************
*
* Function Name:	ParseHexDword
*
* Function:			Parse ASCII hex nibbles and fill in key/iv dwords
*
* Arguments:		bit			=	# bits to read
*					srcTxt		=	ASCII source
*					d			=	ptr to dwords to fill in
*					dstTxt		=	where to make a copy of ASCII source
*									(NULL ok)
*
* Return:			Zero if no error.  Nonzero --> invalid hex or length
*
* Notes:  Note that the parameter d is a DWORD array, not a byte array.
*	This routine is coded to work both for little-endian and big-endian
*	architectures.  The character stream is interpreted as a LITTLE-ENDIAN
*	byte stream, since that is how the Pentium works, but the conversion
*	happens automatically below. 
*
-****************************************************************************/
int ParseHexDword(int bits,CONST char *srcTxt,DWORD *d,char *dstTxt)
	{
	int i;
	char c;
	DWORD b;

	union	/* make sure LittleEndian is defined correctly */
		{
		BYTE  b[4];
		DWORD d[1];
		} v;
	v.d[0]=1;
	if (v.b[0 ^ ADDR_XOR] != 1)
		return BAD_ENDIAN;		/* make sure compile-time switch is set ok */

#if VALIDATE_PARMS
  #if ALIGN32
	if (((int)d) & 3)
		return BAD_ALIGN32;	
  #endif
#endif

	for (i=0;i*32<bits;i++)
		d[i]=0;					/* first, zero the field */

	for (i=0;i*4<bits;i++)		/* parse one nibble at a time */
		{						/* case out the hexadecimal characters */
		c=srcTxt[i];
		if (dstTxt) dstTxt[i]=c;
		if ((c >= '0') && (c <= '9'))
			b=c-'0';
		else if ((c >= 'a') && (c <= 'f'))
			b=c-'a'+10;
		else if ((c >= 'A') && (c <= 'F'))
			b=c-'A'+10;
		else
			return BAD_KEY_MAT;	/* invalid hex character */
		/* works for big and little endian! */
		d[i/8] |= b << (4*((i^1)&7));		
		}

	return 0;					/* no error */
	}


#if CHECK_TABLE
/*
+*****************************************************************************
*
* Function Name:	f32
*
* Function:			Run four bytes through keyed S-boxes and apply MDS matrix
*
* Arguments:		x			=	input to f function
*					k32			=	pointer to key dwords
*					keyLen		=	total key length (k32 --> keyLey/2 bits)
*
* Return:			The output of the keyed permutation applied to x.
*
* Notes:
*	This function is a keyed 32-bit permutation.  It is the major building
*	block for the Twofish round function, including the four keyed 8x8 
*	permutations and the 4x4 MDS matrix multiply.  This function is used
*	both for generating round subkeys and within the round function on the
*	block being encrypted.  
*
*	This version is fairly slow and pedagogical, although a smartcard would
*	probably perform the operation exactly this way in firmware.   For
*	ultimate performance, the entire operation can be completed with four
*	lookups into four 256x32-bit tables, with three dword xors.
*
*	The MDS matrix is defined in TABLE.H.  To multiply by Mij, just use the
*	macro Mij(x).
*
-****************************************************************************/
DWORD f32(DWORD x,CONST DWORD *k32,int keyLen)
	{
	BYTE  b[4];
	
	/* Run each byte thru 8x8 S-boxes, xoring with key byte at each stage. */
	/* Note that each byte goes through a different combination of S-boxes.*/

	*((DWORD *)b) = Bswap(x);	/* make b[0] = LSB, b[3] = MSB */
	switch (((keyLen + 63)/64) & 3)
		{
		case 0:		/* 256 bits of key */
			b[0] = p8(04)[b[0]] ^ b0(k32[3]);
			b[1] = p8(14)[b[1]] ^ b1(k32[3]);
			b[2] = p8(24)[b[2]] ^ b2(k32[3]);
			b[3] = p8(34)[b[3]] ^ b3(k32[3]);
			/* fall thru, having pre-processed b[0]..b[3] with k32[3] */
		case 3:		/* 192 bits of key */
			b[0] = p8(03)[b[0]] ^ b0(k32[2]);
			b[1] = p8(13)[b[1]] ^ b1(k32[2]);
			b[2] = p8(23)[b[2]] ^ b2(k32[2]);
			b[3] = p8(33)[b[3]] ^ b3(k32[2]);
			/* fall thru, having pre-processed b[0]..b[3] with k32[2] */
		case 2:		/* 128 bits of key */
			b[0] = p8(00)[p8(01)[p8(02)[b[0]] ^ b0(k32[1])] ^ b0(k32[0])];
			b[1] = p8(10)[p8(11)[p8(12)[b[1]] ^ b1(k32[1])] ^ b1(k32[0])];
			b[2] = p8(20)[p8(21)[p8(22)[b[2]] ^ b2(k32[1])] ^ b2(k32[0])];
			b[3] = p8(30)[p8(31)[p8(32)[b[3]] ^ b3(k32[1])] ^ b3(k32[0])];
		}

	/* Now perform the MDS matrix multiply inline. */
	return	((M00(b[0]) ^ M01(b[1]) ^ M02(b[2]) ^ M03(b[3]))	  ) ^
			((M10(b[0]) ^ M11(b[1]) ^ M12(b[2]) ^ M13(b[3])) <<  8) ^
			((M20(b[0]) ^ M21(b[1]) ^ M22(b[2]) ^ M23(b[3])) << 16) ^
			((M30(b[0]) ^ M31(b[1]) ^ M32(b[2]) ^ M33(b[3])) << 24) ;
	}
#endif	/* CHECK_TABLE */


/*
+*****************************************************************************
*
* Function Name:	RS_MDS_encode
*
* Function:			Use (12,8) Reed-Solomon code over GF(256) to produce
*					a key S-box dword from two key material dwords.
*
* Arguments:		k0	=	1st dword
*					k1	=	2nd dword
*
* Return:			Remainder polynomial generated using RS code
*
* Notes:
*	Since this computation is done only once per reKey per 64 bits of key,
*	the performance impact of this routine is imperceptible. The RS code
*	chosen has "simple" coefficients to allow smartcard/hardware implementation
*	without lookup tables.
*
-****************************************************************************/
DWORD RS_MDS_Encode(DWORD k0,DWORD k1)
	{
	int i,j;
	DWORD r;

	for (i=r=0;i<2;i++)
		{
		r ^= (i) ? k0 : k1;			/* merge in 32 more key bits */
		for (j=0;j<4;j++)			/* shift one byte at a time */
			RS_rem(r);				
		}
	return r;
	}


/*
+*****************************************************************************

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男人电影天堂| 一区二区成人在线| 91久久久免费一区二区| 久久国产精品露脸对白| 一区二区三区欧美日| 精品国产乱码久久久久久夜甘婷婷| 99免费精品在线观看| 麻豆成人免费电影| 亚洲第一搞黄网站| ●精品国产综合乱码久久久久 | 色悠悠亚洲一区二区| 激情综合色播五月| 丝袜美腿一区二区三区| 亚洲欧美激情一区二区| 国产无人区一区二区三区| 日韩一区二区麻豆国产| 欧美亚洲动漫精品| 91免费版pro下载短视频| 国产成人激情av| 国内国产精品久久| 久久国产综合精品| 青青草成人在线观看| 婷婷久久综合九色国产成人 | 日韩久久精品一区| 51精品国自产在线| 久久婷婷一区二区三区| av亚洲产国偷v产偷v自拍| 亚洲色图制服丝袜| 制服丝袜亚洲色图| 国产麻豆视频一区| 亚洲地区一二三色| 久久日一线二线三线suv| 成人黄色a**站在线观看| 亚洲国产精品一区二区久久| 日本一区二区三区高清不卡| 国产美女精品人人做人人爽| 亚洲成a人片在线不卡一二三区| 亚洲视频免费看| 中文字幕在线观看一区二区| 中文字幕 久热精品 视频在线| 久久久蜜桃精品| 国产欧美一区二区精品仙草咪| 久久理论电影网| 国产九九视频一区二区三区| 亚洲视频每日更新| 亚洲人一二三区| 亚洲一区二区三区四区在线免费观看| 亚洲精品免费一二三区| 亚洲一区二区综合| 五月天丁香久久| 久久精品99国产精品日本| 韩国精品久久久| 成人av资源站| 欧洲精品一区二区| 91精品国产乱| 久久久久久久久蜜桃| 日本一区二区高清| 亚洲免费成人av| 天使萌一区二区三区免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲蜜臀av乱码久久精品| 亚洲一区二区偷拍精品| 日本一不卡视频| 粉嫩13p一区二区三区| 色婷婷精品大在线视频| 91精品国产高清一区二区三区蜜臀 | 亚洲成人免费av| 日本不卡高清视频| 岛国精品在线播放| 色悠久久久久综合欧美99| 91精品国产丝袜白色高跟鞋| 久久综合国产精品| 一区二区三区视频在线看| 日本91福利区| 99视频在线精品| 欧美一级一区二区| 中文字幕在线不卡国产视频| 丝袜a∨在线一区二区三区不卡| 韩国精品在线观看| 在线观看日韩国产| 久久综合久久综合亚洲| 亚洲欧美日韩中文字幕一区二区三区 | 日韩国产欧美在线视频| 成人一级片在线观看| 欧美日韩综合色| 国产亚洲欧洲997久久综合| 一个色在线综合| 高清在线不卡av| 欧美电影在线免费观看| 国产精品欧美一区二区三区| 免费精品视频最新在线| av不卡免费电影| 欧美精品一区二区三区在线| 亚洲免费观看高清| 国产福利电影一区二区三区| 欧美日韩国产中文| 亚洲人精品一区| 国产成人av一区二区| 欧美一区二区视频网站| 亚洲天堂久久久久久久| 国产麻豆成人精品| 日韩亚洲欧美在线观看| 亚洲黄网站在线观看| 福利一区二区在线| 欧美成人精品二区三区99精品| 樱桃国产成人精品视频| 成人激情免费电影网址| 久久免费电影网| 日韩亚洲电影在线| 久久麻豆一区二区| 免费在线看成人av| 欧洲一区二区av| 亚洲图片激情小说| 成人精品免费网站| 久久精品亚洲乱码伦伦中文| 久久精品二区亚洲w码| 7777精品伊人久久久大香线蕉| 亚洲精品视频自拍| 91在线一区二区| 国产精品天天摸av网| 国产精品99久久久久久有的能看| 日韩精品一区二区在线| 热久久久久久久| 日韩一区二区精品| 日本亚洲电影天堂| 日韩小视频在线观看专区| 日韩电影一区二区三区四区| 欧美日韩国产精品成人| 亚洲高清视频中文字幕| 欧美三级资源在线| 五月天中文字幕一区二区| 在线精品观看国产| 性欧美大战久久久久久久久| 欧美日韩中文字幕一区二区| 亚洲自拍欧美精品| 欧美视频完全免费看| 午夜久久久影院| 91精品在线一区二区| 久久精品99久久久| 久久久久国产一区二区三区四区| 国产伦精一区二区三区| 欧美国产激情一区二区三区蜜月| 成人av网站免费观看| 最好看的中文字幕久久| 在线观看免费亚洲| 天堂久久久久va久久久久| 日韩一区二区三区免费观看| 精品一区二区三区在线观看| 久久蜜桃香蕉精品一区二区三区| 国产精品一二三区在线| 国产精品动漫网站| 欧美亚日韩国产aⅴ精品中极品| 亚洲一区视频在线观看视频| 91精品免费观看| 国产精品一品视频| 亚洲色大成网站www久久九九| 欧美三级一区二区| 久久电影网站中文字幕| 亚洲国产成人私人影院tom| 色综合久久天天| 日本欧美在线看| 中文字幕av一区二区三区| 91黄视频在线| 免费在线观看一区| 中文字幕第一区| 欧美日韩黄视频| 国产凹凸在线观看一区二区| 一区二区三区四区激情| 日韩欧美一二区| 92国产精品观看| 久久精品国产澳门| 国产精品家庭影院| 91 com成人网| 成人国产精品免费观看| 亚洲777理论| 欧美高清一级片在线观看| 欧美日韩亚洲综合在线| 国产精品一二三| 性感美女久久精品| 中文一区在线播放| 欧美精品一卡二卡| 99国产精品久| 精品一区二区在线看| 一区二区三区毛片| 久久综合九色欧美综合狠狠 | 成人性生交大片| 日韩精品久久久久久| 国产精品久久久久久久久动漫 | 亚洲国产人成综合网站| 欧美中文字幕不卡| 国产成人精品一区二区三区四区 | 中文字幕国产一区| 在线综合视频播放| 94-欧美-setu| 国产麻豆视频精品| 免费久久99精品国产| 亚洲激情av在线| 中文字幕亚洲综合久久菠萝蜜| 日韩视频一区二区三区在线播放| 91首页免费视频|