⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdacast.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
字号:
/*__________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: sdacast.c,v 1.3 2002/08/06 20:10:10 dallen Exp $
__________________________________________________________________________*/

#include "DecodeStub.h"

// CAST5decryptCFBdbl decrypts the specified number of blocks in CFB mode.

#ifdef WORDS_BIGENDIAN
static
void
pgpUInt32BigToLittleEndian(PGPUInt32 input, PGPByte *pOutput)
{
	PGPByte		*pByte = (PGPByte *)&input;
	PGPUInt16	i = 0, j = 3;

	for(i=0; i<4; i++)
		pOutput[i] = pByte[j--];
}
#endif /* WORDS_BIGENDIAN */

	void 
CAST5decryptCFBdbl(
	const PGPUInt32*	xkey, 
	PGPUInt32			iv0, 
	PGPUInt32			iv1, 
	PGPUInt32			iv2, 
	PGPUInt32			iv3, 
	const PGPUInt32*	src, 
	PGPUInt32*			dest, 
	PGPUInt32			len)
{
	PGPUInt32	iv[4]	= {iv0, iv1, iv2, iv3};
	PGPUInt32	out[4];
	while (len--)
	{
		(cipherCAST5.encrypt)((void *)xkey,(void const *) iv, (void *) out);
		*dest++	= out[0] ^ (iv[0] = *src++);
		*dest++	= out[1] ^ (iv[1] = *src++);

		(cipherCAST5.encrypt)((void *)xkey,(void const *) (iv+2), (void *) (out+2));
		*dest++	= out[2] ^ (iv[2] = *src++);
		*dest++	= out[3] ^ (iv[3] = *src++);
	}
}

	void
DecryptBlock512(
	SDAHEADER				*SDAHeader,
	PGPUInt32				*ExpandedKey,
	PGPUInt32				blockNumber,
	const PGPUInt32 *		src,
	PGPUInt32 *				dest)
{
	const int kSplitPointInUInt32 = kBlockSizeInUInt32/2;
	const size_t kBytesBeforeSplit = kSplitPointInUInt32 * sizeof(PGPUInt32);
	const size_t kBytesAfterSplit = (kBlockSizeInUInt32 - kSplitPointInUInt32) *
					sizeof(PGPUInt32);
	int	i;
	PGPUInt32	iv0, iv1;

#ifdef WORDS_BIGENDIAN
	PGPUInt32	SALT0, SALT1;
	PGPUInt32	IV0, IV1;
	PGPUInt32	DEST;

	pgpUInt32BigToLittleEndian(SDAHeader->Salt.saltLongs[0], (PGPByte *)&SALT0);
	pgpUInt32BigToLittleEndian(SDAHeader->Salt.saltLongs[1], (PGPByte *)&SALT1);

#endif /* WORDS_BIGENDIAN */

	/* This must be done in two halves to recover the IV */	
	CAST5decryptCFBdbl(ExpandedKey,
		src[ kSplitPointInUInt32 - 4 ], src[ kSplitPointInUInt32 - 3 ],
		src[ kSplitPointInUInt32 - 2 ], src[ kSplitPointInUInt32 - 1 ],
		src + kSplitPointInUInt32, dest + kSplitPointInUInt32,
				kBytesAfterSplit/(8 + 8));
	iv0 = dest[ kBlockSizeInUInt32 - 2 ];
	iv1 = dest[ kBlockSizeInUInt32 - 1 ];
	CAST5decryptCFBdbl(ExpandedKey, iv0, iv1, ~iv0,
			~iv1, src, dest, kBytesBeforeSplit/(8 + 8) );

	/* Undo the checksum */
#ifdef WORDS_BIGENDIAN
	iv0 = SALT0 + blockNumber;
	iv1 = SALT1 + blockNumber;	
#else /* !WORDS_BIGENDIAN */	/* little endian system */
	iv0	= SDAHeader->Salt.saltLongs[ 0 ] + blockNumber;
	iv1	= SDAHeader->Salt.saltLongs[ 1 ] + blockNumber;
#endif /* WORDS_BIGENDIAN */
	for (i = 0; i < kBlockSizeInUInt32 - 2; ++i)
	{
#ifdef WORDS_BIGENDIAN
		pgpUInt32BigToLittleEndian(dest[i], (PGPByte *)&DEST);
		iv1 += DEST;
		iv0 += iv1;
		
#else /* !WORDS_BIGENDIAN */	/* little endian system */ 
		iv1		+= dest[ i ];
		iv0		+= iv1;
#endif /* WORDS_BIGENDIAN */ 
	}

#ifdef WORDS_BIGENDIAN
	pgpUInt32BigToLittleEndian(iv0, (PGPByte *)&IV0);
	pgpUInt32BigToLittleEndian(iv1, (PGPByte *)&IV1);

	dest[kBlockSizeInUInt32 - 2] ^= IV0;
	dest[kBlockSizeInUInt32 - 1] ^= IV1;
#else /* !WORDS_BIGENDIAN */	/* little endian system */ 
	dest[ kBlockSizeInUInt32 - 2 ]	^= iv0;
	dest[ kBlockSizeInUInt32 - 1 ]	^= iv1;
#endif /* WORDS_BIGENDIAN */
}

	
/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -