📄 sdacast.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 + -