📄 ipp_cipher_twf.cpp
字号:
/*
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 2005 Intel Corporation. All Rights Reserved.
//
*/
#include "ipp_cipher_twf.h"
#include <string.h>
//////////////////////////////////////////////////
//
// cipher: Twofish
//
TWF::TWF(const Ipp8u* pKey, int keyLen)
{
algoBlockSize = TWF_BLKLEN;
int ctxSize;
ippsTwofishGetSize(&ctxSize);
pCtx = (IppsTwofishSpec*)( new Ipp8u [ctxSize] );
ResetKey(pKey, keyLen);
}
void TWF::ResetKey(const Ipp8u* pKey, int keyLen)
{
Ipp8u key[TF_KEYSIZE_MIN/8];
if(keyLen*8 < TF_KEYSIZE_MIN) {
memset(key, 0, sizeof(key));
memcpy(key, pKey, keyLen);
keyLen = TF_KEYSIZE_MIN/8;
pKey = key;
}
if(keyLen*8 > TF_KEYSIZE_MAX)
keyLen = TF_KEYSIZE_MAX/8;
ippsTwofishInit(pKey, keyLen, pCtx);
}
TWF::~TWF()
{
delete [] (Ipp8u*)pCtx;
}
int TWF::doCipher(Ipp8u* pDst, const Ipp8u* pSrc, int srcLen)
{
Ipp8u newIV[TWF_BLKLEN];
switch (mode) {
case ECB:
status = ENCRYPT==operation?
ippsTwofishEncryptECB(pSrc, pDst, srcLen, pCtx, NONE):
ippsTwofishDecryptECB(pSrc, pDst, srcLen, pCtx, NONE);
break;
case CBC:
if(ENCRYPT==operation) {
status = ippsTwofishEncryptCBC(pSrc, pDst, srcLen, pCtx, iv, NONE);
memcpy(iv, pDst+srcLen-TWF_BLKLEN, TWF_BLKLEN);
}
else {
memcpy(newIV, pSrc+srcLen-TWF_BLKLEN, TWF_BLKLEN);
status = ippsTwofishDecryptCBC(pSrc, pDst, srcLen, pCtx, iv, NONE);
memcpy(iv, newIV, TWF_BLKLEN);
}
break;
case CFB:
if(ENCRYPT==operation) {
status = ippsTwofishEncryptCFB(pSrc, pDst, srcLen, param, pCtx, iv, NONE);
if(srcLen<TWF_BLKLEN) {
memcpy(iv, iv+srcLen, TWF_BLKLEN-srcLen);
memcpy(iv+TWF_BLKLEN-srcLen, pDst, srcLen);
}
else
memcpy(iv, pDst+srcLen-TWF_BLKLEN, TWF_BLKLEN);
}
else {
if(srcLen<TWF_BLKLEN) {
memcpy(newIV, iv+srcLen, TWF_BLKLEN-srcLen);
memcpy(newIV+TWF_BLKLEN-srcLen, pSrc, srcLen);
}
else
memcpy(newIV, pSrc+srcLen-TWF_BLKLEN, TWF_BLKLEN);
status = ippsTwofishDecryptCFB(pSrc, pDst, srcLen, param, pCtx, iv, NONE);
memcpy(iv, newIV, TWF_BLKLEN);
}
break;
case CTR:
status = ENCRYPT==operation?
ippsTwofishEncryptCTR(pSrc, pDst, srcLen, pCtx, iv, param):
ippsTwofishDecryptCTR(pSrc, pDst, srcLen, pCtx, iv, param);
break;
default:
return 0; // unsupported mode
}
return ippStsNoErr==status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -