www.pudn.com > truecrypt.zip > IDEA_386.C


/*********************************************************************** 
 * idea_386.c - intel i386 assembler code for IDEA block cipher        * 
 *                                                                     * 
 * IDEA(International Data Encryption Algorithm) is a secret-key block * 
 * cipher algorithm which encrypt/decrypt 64-bit data size, using 128- * 
 * bit key size. The patent of IDEA is held by Ascom Systec Ltd.       * 
 *                                                                     * 
 *                         This program is written by Masayasu Kumagai.* 
 *                                  (E-Mail: kumagai@mxc.meshnet.or.jp)* 
 ***********************************************************************/ 
 
#include "idea.h" 
 
void 
ideaCrypt( unsigned char const *input, unsigned char *output, word16 const *key ) 
{ 
	_asm { 
//%%%%	PUSH		EBP 
	PUSH		EAX 
	PUSH		EBX 
	PUSH		ECX 
	PUSH		EDX 
	PUSH		ESI 
	PUSH		EDI 
	MOV			ESI, input 
#if 0 
	MOV			AX, word ptr [ESI + 0] 
	MOV			EBX, dword ptr [ESI + 2] 
	ROL			EAX, 16 
	MOV			AX, word ptr [ESI + 6] 
#else 
	mov			ax, word ptr [esi + 6] 
	mov 		ebx, dword ptr [esi + 2] 
	shl			eax, 16 
	bswap		ebx 
	mov			ax, word ptr [esi + 0] 
	bswap		eax 
	rol			ebx, 16 
#endif 
	MOV			DX, 8 
	MOV			ESI, key 
_LOOP: 
	ROL			EDX, 16 
	ADD			BX, word ptr [ESI + 2] 
	ROL			EBX, 16 
	ADD			BX, word ptr [ESI + 4] 
	MOV			DI, AX 
	MUL			word ptr [ESI + 6] 
	SUB			AX, DX 
	JZ			_PROD_0_1 
	ADC			AX, 0 
_RET_1: 
	ROL			EAX, 16 
	MOV			DI, AX 
	MUL			word ptr [ESI + 0] 
	SUB			AX, DX 
	JZ			_PROD_0_2 
	ADC			AX, 0 
_RET_2: 
	MOV			ECX, EAX 
	XOR			EAX, EBX 
	MOV			DI, AX 
	MUL			word ptr [ESI + 8] 
	SUB			AX, DX 
	JZ			_PROD_0_3 
	ADC			AX, 0 
_RET_3: 
	MOV			DX, AX 
	ROL			EAX, 16 
	ADD			AX, DX 
	MOV			DI, AX 
	MUL			word ptr [ESI + 10] 
	SUB			AX, DX 
	JZ			_PROD_0_4 
	ADC			AX, 0 
_RET_4: 
	MOV			DX, AX 
	ROL			EAX, 16 
	ADD			AX, DX 
	ROL			EAX, 16 
	XOR			EBX, EAX 
	XOR			EAX, ECX 
	ROL			EAX, 16 
	ADD			ESI, 12 
	ROL			EDX, 16 
	DEC			DX 
	JNZ			_LOOP 
	ADD			BX, word ptr [ESI + 4] 
	ROL			EBX, 16 
	ADD			BX, word ptr [ESI + 2] 
	MOV			DI, AX 
	MUL			word ptr [ESI + 6] 
	SUB			AX, DX 
	JZ			_PROD_0_5 
	ADC			AX, 0 
_RET_5: 
	ROL			EAX, 16 
	MOV			DI, AX 
	MUL			word ptr [ESI + 0] 
	SUB			AX, DX 
	JZ			_PROD_0_6 
	ADC			AX, 0 
_RET_6: 
	JMP			_SKIP 
_PROD_0_1: 
	INC			AX 
	SUB			AX, word ptr [ESI + 6] 
	SUB			AX, DI 
	JMP			_RET_1 
_PROD_0_2: 
	INC			AX 
	SUB			AX, word ptr [ESI + 0] 
	SUB			AX, DI 
	JMP			_RET_2 
_PROD_0_3: 
	INC			AX 
	SUB			AX, word ptr [ESI + 8] 
	SUB			AX, DI 
	JMP			_RET_3 
_PROD_0_4: 
	INC			AX 
	SUB			AX, word ptr [ESI + 10] 
	SUB			AX, DI 
	JMP			_RET_4 
_PROD_0_5: 
	INC			AX 
	SUB			AX, word ptr [ESI + 6] 
	SUB			AX, DI 
	JMP			_RET_5 
_PROD_0_6: 
	INC			AX 
	SUB			AX, word ptr [ESI + 0] 
	SUB			AX, DI 
	JMP			_RET_6 
_SKIP: 
	MOV			EDI, output 
#if 0 
	MOV			word ptr [EDI + 0], AX 
	MOV			dword ptr [EDI + 2], EBX 
	ROL			EAX, 16 
	MOV			word ptr [EDI + 6], AX 
#else 
	bswap		eax 
	bswap		ebx 
	mov			word ptr [edi + 6 ], ax 
	rol			ebx, 16 
	shr			eax, 16 
	mov			dword ptr [edi + 2], ebx 
	mov			word ptr [edi + 0], ax 
#endif 
	POP			EDI 
	POP			ESI 
	POP			EDX 
	POP			ECX 
	POP			EBX 
	POP			EAX 
//%%%%%	POP			EBP 
	} 
}