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

📄 tdesimpl.c

📁 IBE是一种非对称密码技术
💻 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 + -