hmacimpl.c

来自「IBE是一种非对称密码技术」· C语言 代码 · 共 188 行

C
188
字号
/* Copyright 2003-2006, Voltage Security, all rights reserved.
 */
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "algobj.h"
#include "digest.h"
#include "voltmac.h"
#include "hmac.h"
#include "errorctx.h"

int HMACInit (
   VoltAlgorithmObject *hmacObject,
   VoltKeyObject *keyObject   
   )
{
  int status;
  unsigned int index;
  VoltLibCtx *libCtx = (VoltLibCtx *)(hmacObject->voltObject.libraryCtx);
  VoltMACClassCtx *macCtx = (VoltMACClassCtx *)hmacObject->classCtx;
  VoltHMACCtx *hmacCtx = (VoltHMACCtx *)macCtx->localMacCtx;
  VoltAlgorithmObject *digestObj = hmacCtx->digestObj;
  VoltDigestClassCtx *digestCtx = (VoltDigestClassCtx *)(digestObj->classCtx);
  unsigned int blockLen = digestCtx->blockLen;
  VtItem *keyData = (VtItem *)0;
  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 ((keyObject->keyType & VOLT_KEY_TYPE_MASK_MAC_ALG) != VOLT_KEY_ALG_HMAC)
      break;

    /* We need data (status is still set to VT_ERROR_INVALID_KEY_OBJ if we
     * can't get the data out).
     */
    keyData = (VtItem *)(keyObject->keyData);
    if ((keyObject->keyType & VOLT_KEY_TYPE_MASK_DATA) != VOLT_KEY_TYPE_DATA)
    {
      if (keyObject->GetKeyData == (VGetKeyData)0)
        break;

      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = keyObject->GetKeyData (
        (VtKeyObject)keyObject, (Pointer *)&keyData);
      if (status != 0)
        break;
    }

    /* If the key is larger than the block size of the underlying
     * digest algorithm, reset the key by digesting it.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    if (keyData->len > blockLen) 
    {
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtDigestInit (digestObj);
      if (status != 0)
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtDigestFinal (
        digestObj, keyData->data, keyData->len, hmacCtx->key, blockLen, 
        &(hmacCtx->keyLen));
      if (status != 0 )
        break;
    }
    else
    {
      Z2Memcpy (hmacCtx->key, keyData->data , keyData->len);
      hmacCtx->keyLen = keyData->len;
    }

    /* The internal representation of the key is the following:
     *   1. ipad = 36 36 ... 36 (blockLen bytes of 0x36)
     *   2. opad = 5c 5c ... 5c (blockLen bytes of 0x5c)
     *   3. for as many key bytes as there are, XOR each byte of key
     *   with a byte of ipad, then with a byte of opad.
     */
    Z2Memset (hmacCtx->ipad, 0x36, blockLen);
    Z2Memset (hmacCtx->opad, 0x5c, blockLen);

    for (index = 0; index < hmacCtx->keyLen; ++index)
    {
      hmacCtx->ipad[index] ^= hmacCtx->key[index];
      hmacCtx->opad[index] ^= hmacCtx->key[index];
    }

    /* Now digest the ipad for inner pad 
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestInit (digestObj);
    if (status != 0 )
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestUpdate (digestObj, hmacCtx->ipad, blockLen);
    if (status != 0 )
      break;
   
  } while (0) ; 

  VOLT_LOG_ERROR_COMPARE (
    status, (VtLibCtx)libCtx, status, errorType, fnctLine,
    "HMACInit", (char *)0)

  return status ;
}

int HMACUpdate (
    VoltAlgorithmObject *hmacObject,
    unsigned char *data,
    unsigned int dataLen
    )
{
  unsigned int status = 0;
  VoltMACClassCtx *macCtx = (VoltMACClassCtx *)hmacObject->classCtx;
  VoltHMACCtx *hmacCtx = (VoltHMACCtx *)macCtx->localMacCtx ;
  VoltAlgorithmObject *digestObj = hmacCtx->digestObj ;  
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  /* Continue digesting the data.
   */
  VOLT_SET_FNCT_LINE (fnctLine)
  status = VtDigestUpdate (digestObj, data, dataLen);
  
  VOLT_LOG_ERROR_COMPARE (
    status, hmacObject->voltObject.libraryCtx, status, 0, fnctLine,
    "HMACUpdate", (char *)0)

  return (status);
}

int HMACFinal (
    VoltAlgorithmObject *hmacObject,
    unsigned char *mac    
    )
{
  unsigned int status = 0;  
  unsigned int hashLen, len;     
  VoltMACClassCtx *macCtx = (VoltMACClassCtx *)hmacObject->classCtx;
  VoltHMACCtx *hmacCtx = (VoltHMACCtx *)macCtx->localMacCtx ;
  VoltAlgorithmObject *digestObj = hmacCtx->digestObj ;  
  VoltDigestClassCtx *digestCtx = (VoltDigestClassCtx *)digestObj->classCtx ; 
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* First calculate the digest on ipad || message
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestFinal (
      digestObj, (unsigned char *)0, 0, hmacCtx->ipadHash,
      digestCtx->digestSize, &hashLen);

    /* calculate the digest on opad
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestInit (digestObj);
    if (status != 0 )
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestUpdate (digestObj, hmacCtx->opad, digestCtx->blockLen);
    if (status != 0 )
      break;

    /* The final digest is digest (opad || ipadHash)
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtDigestFinal (
      digestObj, hmacCtx->ipadHash, hashLen, mac, digestCtx->digestSize, &len);

  } while (0);
  
  VOLT_LOG_ERROR_COMPARE (
    status, hmacObject->voltObject.libraryCtx, status, 0, fnctLine,
    "HMACFinal", (char *)0)

  return (status);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?