📄 tdesimpl.c
字号:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
*/
#include "vibecrypto.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "algobj.h"
#include "cipher.h"
#include "block.h"
#include "des.h"
#include "errorctx.h"
int TripleDesEdeEncryptInit (
VoltAlgorithmObject *algObj,
VoltKeyObject *keyObj
)
{
int status;
VtItem *keyData;
VtItem desData;
VoltCipherClassCtx *cipherCtx = (VoltCipherClassCtx *)(algObj->classCtx);
VoltBlockCipherCtx *blockCtx =
(VoltBlockCipherCtx *)(cipherCtx->localCipherCtx);
VoltTripleDesCtx *tdesCtx = (VoltTripleDesCtx *)(blockCtx->algCtx);
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Make sure the key matches the algorithm object.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_KEY_OBJ;
if ((keyObj->keyType & VOLT_KEY_TYPE_MASK_SYM_ALG) != VOLT_KEY_ALG_3_DES)
break;
/* We need data (status is still set to VT_ERROR_INVALID_KEY_OBJ if we
* can't get the data out).
*/
keyData = (VtItem *)(keyObj->keyData);
if ((keyObj->keyType & VOLT_KEY_TYPE_MASK_DATA) != VOLT_KEY_TYPE_DATA)
{
VOLT_SET_FNCT_LINE (fnctLine)
if (keyObj->GetKeyData == (VGetKeyData)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
if ((status = keyObj->GetKeyData
((VtKeyObject)keyObj, (Pointer *)&keyData)) != 0)
break;
}
desData.data = keyData->data;
desData.len = 8;
DESInit (VOLT_DES_ENCRYPT, &desData, &(tdesCtx->des1));
desData.data = keyData->data + 8;
desData.len = 8;
DESInit (VOLT_DES_DECRYPT, &desData, &(tdesCtx->des2));
desData.data = keyData->data + 16;
desData.len = 8;
DESInit (VOLT_DES_ENCRYPT, &desData, &(tdesCtx->des3));
status = 0;
} while (0);
VOLT_LOG_ERROR_COMPARE (
status, algObj->voltObject.libraryCtx, status, errorType, fnctLine,
"TripleDesEdeEncryptInit", (char *)0)
return (status);
}
int TripleDesEdeEncryptUpdate (
VoltAlgorithmObject *algObj,
VtRandomObject random,
unsigned char *dataToEncrypt,
unsigned int dataToEncryptLen,
unsigned char *encryptedData
)
{
VoltCipherClassCtx *cipherCtx = (VoltCipherClassCtx *)(algObj->classCtx);
VoltBlockCipherCtx *blockCtx =
(VoltBlockCipherCtx *)(cipherCtx->localCipherCtx);
VoltTripleDesCtx *tdesCtx = (VoltTripleDesCtx *)(blockCtx->algCtx);
/* So long as we have blocks to encrypt, call the EncryptBlock
* routine.
*/
while (dataToEncryptLen >= 8)
{
desEncryptBlock (&(tdesCtx->des1), dataToEncrypt, tdesCtx->temp);
desDecryptBlock (&(tdesCtx->des2), tdesCtx->temp, tdesCtx->temp);
desEncryptBlock (&(tdesCtx->des3), tdesCtx->temp, encryptedData);
dataToEncryptLen -= 8;
dataToEncrypt += 8;
encryptedData += 8;
}
return (0);
}
int TripleDesEdeDecryptInit (
VoltAlgorithmObject *algObj,
VoltKeyObject *keyObj
)
{
int status;
VtItem *keyData;
VtItem desData;
VoltCipherClassCtx *cipherCtx = (VoltCipherClassCtx *)(algObj->classCtx);
VoltBlockCipherCtx *blockCtx =
(VoltBlockCipherCtx *)(cipherCtx->localCipherCtx);
VoltTripleDesCtx *tdesCtx = (VoltTripleDesCtx *)(blockCtx->algCtx);
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
do
{
/* Make sure the key matches the algorithm object.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_KEY_OBJ;
if ((keyObj->keyType & VOLT_KEY_TYPE_MASK_SYM_ALG) != VOLT_KEY_ALG_3_DES)
break;
/* We need data (status is still set to VT_ERROR_INVALID_KEY_OBJ if we
* can't get the data out).
*/
keyData = (VtItem *)(keyObj->keyData);
if ((keyObj->keyType & VOLT_KEY_TYPE_MASK_DATA) != VOLT_KEY_TYPE_DATA)
{
VOLT_SET_FNCT_LINE (fnctLine)
if (keyObj->GetKeyData == (VGetKeyData)0)
break;
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = keyObj->GetKeyData ((VtKeyObject)keyObj, (Pointer *)&keyData);
if (status != 0)
break;
}
desData.data = keyData->data;
desData.len = 8;
DESInit (VOLT_DES_DECRYPT, &desData, &(tdesCtx->des1));
desData.data = keyData->data + 8;
desData.len = 8;
DESInit (VOLT_DES_ENCRYPT, &desData, &(tdesCtx->des2));
desData.data = keyData->data + 16;
desData.len = 8;
DESInit (VOLT_DES_DECRYPT, &desData, &(tdesCtx->des3));
status = 0;
} while (0);
VOLT_LOG_ERROR_COMPARE (
status, algObj->voltObject.libraryCtx, status, errorType, fnctLine,
"TripleDesEdeDecryptInit", (char *)0)
return (status);
}
int TripleDesEdeDecryptUpdate (
VoltAlgorithmObject *algObj,
VtRandomObject random,
unsigned char *dataToDecrypt,
unsigned int dataToDecryptLen,
unsigned char *decryptedData
)
{
VoltCipherClassCtx *cipherCtx = (VoltCipherClassCtx *)(algObj->classCtx);
VoltBlockCipherCtx *blockCtx =
(VoltBlockCipherCtx *)(cipherCtx->localCipherCtx);
VoltTripleDesCtx *tdesCtx = (VoltTripleDesCtx *)(blockCtx->algCtx);
/* So long as we have blocks to encrypt, call the EncryptBlock
* routine.
*/
while (dataToDecryptLen >= 8)
{
desDecryptBlock (&(tdesCtx->des3), dataToDecrypt, tdesCtx->temp);
desEncryptBlock (&(tdesCtx->des2), tdesCtx->temp, tdesCtx->temp);
desDecryptBlock (&(tdesCtx->des1), tdesCtx->temp, decryptedData);
dataToDecryptLen -= 8;
dataToDecrypt += 8;
decryptedData += 8;
}
return (0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -