📄 ipp_cipher_blf.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_blf.h"
#include <string.h>
//////////////////////////////////////////////////
//
// cipher: Blowfish
//
BLF::BLF(const Ipp8u* pKey, int keyLen)
{
algoBlockSize = BLF_BLKLEN;
int ctxSize;
ippsBlowfishGetSize(&ctxSize);
pCtx = (IppsBlowfishSpec*)( new Ipp8u [ctxSize] );
ResetKey(pKey, keyLen);
}
void BLF::ResetKey(const Ipp8u* pKey, int keyLen)
{
if(keyLen*8 > BF_KEYSIZE_MAX)
keyLen = BF_KEYSIZE_MAX/8;
ippsBlowfishInit(pKey, keyLen, pCtx);
}
BLF::~BLF()
{
delete [] (Ipp8u*)pCtx;
}
int BLF::doCipher(Ipp8u* pDst, const Ipp8u* pSrc, int srcLen)
{
Ipp8u newIV[BLF_BLKLEN];
switch (mode) {
case ECB:
status = ENCRYPT==operation?
ippsBlowfishEncryptECB(pSrc, pDst, srcLen, pCtx, NONE):
ippsBlowfishDecryptECB(pSrc, pDst, srcLen, pCtx, NONE);
break;
case CBC:
if(ENCRYPT==operation) {
status = ippsBlowfishEncryptCBC(pSrc, pDst, srcLen, pCtx, iv, NONE);
memcpy(iv, pDst+srcLen-BLF_BLKLEN, BLF_BLKLEN);
}
else {
memcpy(newIV, pSrc+srcLen-BLF_BLKLEN, BLF_BLKLEN);
status = ippsBlowfishDecryptCBC(pSrc, pDst, srcLen, pCtx, iv, NONE);
memcpy(iv, newIV, BLF_BLKLEN);
}
break;
case CFB:
if(ENCRYPT==operation) {
status = ippsBlowfishEncryptCFB(pSrc, pDst, srcLen, param, pCtx, iv, NONE);
if(srcLen<BLF_BLKLEN) {
memcpy(iv, iv+srcLen, BLF_BLKLEN-srcLen);
memcpy(iv+BLF_BLKLEN-srcLen, pDst, srcLen);
}
else
memcpy(iv, pDst+srcLen-BLF_BLKLEN, BLF_BLKLEN);
}
else {
if(srcLen<BLF_BLKLEN) {
memcpy(newIV, iv+srcLen, BLF_BLKLEN-srcLen);
memcpy(newIV+BLF_BLKLEN-srcLen, pSrc, srcLen);
}
else
memcpy(newIV, pSrc+srcLen-BLF_BLKLEN, BLF_BLKLEN);
status = ippsBlowfishDecryptCFB(pSrc, pDst, srcLen, param, pCtx, iv, NONE);
memcpy(iv, newIV, BLF_BLKLEN);
}
break;
case CTR:
status = ENCRYPT==operation?
ippsBlowfishEncryptCTR(pSrc, pDst, srcLen, pCtx, iv, param):
ippsBlowfishDecryptCTR(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 + -