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

📄 md5algid.c

📁 IBE是一种非对称密码技术
💻 C
字号:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
 */
#include "vibe.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "algobj.h"
#include "oidlist.h"
#include "algid.h"
#include "errorctx.h"

int VtDerCoderMD5 (
   VtDerCoderInfo *coderInfo,
   Pointer object,
   unsigned int flag
   )
{
  int status;
  unsigned int bufferSize;
  VoltAlgorithmObject **obj = (VoltAlgorithmObject **)0;
  VoltDerCoderEncodeData *encodeData = &(coderInfo->info.encodeData);
  VoltDerCoderGetAlgData *getAlgData = &(coderInfo->info.getAlgData);
  VoltDerCoderDecodeData *decodeData = &(coderInfo->info.decodeData);
  Asn1AlgorithmId *algId;
  VoltLibCtx *libCtx;
  unsigned char md5AlgID[VoltMD5AlgIdBytesLen] = { VoltMD5AlgIdBytes };
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  switch (flag)
  {
    default:
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_TYPE;
      break;

    case VOLT_DER_TYPE_ENCODE_FLAG:
      /* If the flag is ENCODE, return the MD5 algID.
       */

      /* Check the args.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NON_NULL_ARG;
      if (object != (Pointer)0)
        break;

      /* The MD5 info should be NULL.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NON_NULL_ARG;
      if (encodeData->info != (Pointer)0)
        break;

      /* We need a place to drop the length.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NULL_ARG;
      if (encodeData->encodingLen == (unsigned int *)0)
        break;

      bufferSize = encodeData->bufferSize;
      if (encodeData->encoding == (unsigned char *)0)
        bufferSize = 0;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_BUFFER_TOO_SMALL;
      *(encodeData->encodingLen) = VoltMD5AlgIdBytesLen;
      if (bufferSize < VoltMD5AlgIdBytesLen)
        break;

      /* There's only one possible MD5 alg ID.
       */
      libCtx = encodeData->libCtx;
      Z2Memcpy (encodeData->encoding, md5AlgID, VoltMD5AlgIdBytesLen);

      status = 0;
      break;

    case VOLT_DER_TYPE_DECODE_FLAG:
      /* If the flag is decode, set the object to perform MD5.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NULL_ARG;
      if (object == (Pointer)0)
        break;

      obj = (VoltAlgorithmObject **)object;

      /* Check the args, the type should be VOLT_DER_TYPE_ALG_ID_FLAG.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_UNKNOWN_BER;
      if (decodeData->type != VOLT_DER_TYPE_ALG_ID_FLAG)
        break;

      /* Make sure this is the algId for MD5.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      algId = (Asn1AlgorithmId *)(decodeData->asn1Object);
      if (algId->oid->base.length != VoltMD5OidBytesLen)
        break;

      libCtx = (VoltLibCtx *)((*obj)->voltObject.libraryCtx);

      VOLT_SET_FNCT_LINE (fnctLine)
      if (Z2Memcmp (
        algId->oid->base.data, md5AlgID + VoltMD5AlgIdOidOffset,
        VoltMD5OidBytesLen) != 0)
        break;

      VtDestroyAlgorithmObject ((VtAlgorithmObject *)object);

      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtCreateAlgorithmObject (
        libCtx, VtAlgorithmImplMD5, (Pointer)0,
        (VtAlgorithmObject *)object);

      break;

    case VOLT_DER_TYPE_GET_ALG_FLAG:
      /* If the flag is get alg, check the input to see if it's the
       * MD5 OID.
       */

      /* Check the args.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NON_NULL_ARG;
      if (object != (Pointer)0)
        break;

      /* The info should be a pointer to a VoltDerCoderEncodeData struct.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NULL_ARG;
      if ( (getAlgData->algorithm == (unsigned int *)0) ||
           (getAlgData->oid == (unsigned char *)0) )
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_UNKNOWN_BER;
      if (getAlgData->oidLen != VoltMD5OidBytesLen)
        break;

      libCtx = getAlgData->libCtx;

      VOLT_SET_FNCT_LINE (fnctLine)
      if (Z2Memcmp (
        getAlgData->oid, md5AlgID + VoltMD5AlgIdOidOffset,
        VoltMD5OidBytesLen) != 0)
        break;

      /* The OID matches, the algorithm is MD5.
       */
      *(getAlgData->algorithm) = VT_ALG_ID_MD5;
      getAlgData->SymKeyParam = (VtKeyParam *)0;
      getAlgData->DigestImpl = VtAlgorithmImplMD5;

      status = 0;
  }

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, object, status, 0, errorType,
    (char *)0, "VtDerCoderMD5", fnctLine, (char *)0)

  return (status);
}

int VtDerCoderHMACwMD5 (
   VtDerCoderInfo *coderInfo,
   Pointer object,
   unsigned int flag
   )
{
  int status;
  unsigned int bufferSize;
  VoltAlgorithmObject **obj = (VoltAlgorithmObject **)0;
  VoltDerCoderEncodeData *encodeData = &(coderInfo->info.encodeData);
  VoltDerCoderGetAlgData *getAlgData = &(coderInfo->info.getAlgData);
  VoltDerCoderDecodeData *decodeData = &(coderInfo->info.decodeData);
  Asn1AlgorithmId *algId;
  VoltLibCtx *libCtx;
  VtHMACInfo hmacInfo;
  unsigned char hmacMd5AlgID[VoltHMACMD5AlgIdBytesLen] = { VoltHMACMD5AlgIdBytes };
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  switch (flag)
  {
    default:
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_TYPE;
      break;

    case VOLT_DER_TYPE_ENCODE_FLAG:
      /* If the flag is ENCODE, return the MD5 algID.
       */

      /* Check the args.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NON_NULL_ARG;
      if (object != (Pointer)0)
        break;

      /* The MD5 info should be NULL.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NON_NULL_ARG;
      if (encodeData->info != (Pointer)0)
        break;

      /* We need a place to drop the length.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NULL_ARG;
      if (encodeData->encodingLen == (unsigned int *)0)
        break;

      bufferSize = encodeData->bufferSize;
      if (encodeData->encoding == (unsigned char *)0)
        bufferSize = 0;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_BUFFER_TOO_SMALL;
      *(encodeData->encodingLen) = VoltHMACMD5AlgIdBytesLen;
      if (bufferSize < VoltHMACMD5AlgIdBytesLen)
        break;

      /* There's only one possible HMAC-MD5 alg ID.
       */
      libCtx = encodeData->libCtx;
      Z2Memcpy (encodeData->encoding, hmacMd5AlgID, VoltHMACMD5AlgIdBytesLen);

      status = 0;
      break;

    case VOLT_DER_TYPE_DECODE_FLAG:
      /* If the flag is decode, set the object to perform HMAC-MD5.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NULL_ARG;
      if (object == (Pointer)0)
        break;

      obj = (VoltAlgorithmObject **)object;

      /* Check the args, the type should be VOLT_DER_TYPE_ALG_ID_FLAG.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_UNKNOWN_BER;
      if (decodeData->type != VOLT_DER_TYPE_ALG_ID_FLAG)
        break;

      /* Make sure this is the algId for HMAC-MD5.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      algId = (Asn1AlgorithmId *)(decodeData->asn1Object);
      if (algId->oid->base.length != VoltHMACMD5OidBytesLen)
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      libCtx = (VoltLibCtx *)((*obj)->voltObject.libraryCtx);
      if (Z2Memcmp (
        algId->oid->base.data, hmacMd5AlgID + VoltHMACMD5AlgIdOidOffset,
        VoltHMACMD5OidBytesLen) != 0)
        break;

      VtDestroyAlgorithmObject((VtAlgorithmObject *)object);

      hmacInfo.digestImpl = VtAlgorithmImplMD5;
      hmacInfo.digestImplInfo = (Pointer)0;
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtCreateAlgorithmObject(
        libCtx, VtAlgorithmImplHMAC, (Pointer)&hmacInfo,
        (VtAlgorithmObject *)object);

      break;

    case VOLT_DER_TYPE_GET_ALG_FLAG:
      /* If the flag is get alg, check the input to see if it's the
       * HMAC-MD5 OID.
       */

      /* Check the args.
       */
      VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NON_NULL_ARG;
      if (object != (Pointer)0)
        break;

      /* The info should be a pointer to a VoltDerCoderEncodeData struct.
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_NULL_ARG;
      if ( (getAlgData->algorithm == (unsigned int *)0) ||
           (getAlgData->oid == (unsigned char *)0) )
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_UNKNOWN_BER;
      if (getAlgData->oidLen != VoltHMACMD5OidBytesLen)
        break;

      libCtx = getAlgData->libCtx;

      VOLT_SET_FNCT_LINE (fnctLine)
      if (Z2Memcmp (
        getAlgData->oid, hmacMd5AlgID + VoltHMACMD5AlgIdOidOffset,
        VoltHMACMD5OidBytesLen) != 0)
        break;

      /* The OID matches, the algorithm is HMAC-MD5.
       */
      *(getAlgData->algorithm) = VT_ALG_ID_HMAC_MD5;
      getAlgData->SymKeyParam = (VtKeyParam *)0;
      getAlgData->DigestImpl = VtAlgorithmImplMD5;

      status = 0;
  }

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, object, status, 0, errorType,
    (char *)0, "VtDerCoderHMACwMD5", fnctLine, (char *)0)

  return (status);
}

⌨️ 快捷键说明

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