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

📄 dsaparamtype.c

📁 voltage 公司提供的一个开发Ibe的工具包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Copyright 2003-2005, Voltage Security, all rights reserved.
 */
#include "vibecrypto.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "paramobj.h"
#include "dsa.h"
#include "mpint.h"
#include "errorctx.h"

/* Gets the system params out of a parameter object.
 *
 * @param paramObj The object from which the params are to be extracted.
 * @param getInfo The address where the function will deposit the
 * pointer to the info.
 * @return an int, 0 if the function completed successfully or a
 * non-zero error code.
 */
static int VOLT_CALLING_CONV VoltParameterGetDsaParams VOLT_PROTO_LIST ((
   VtParameterObject paramObj,
   Pointer *getInfo
));

int VtParameterParamDSAParams (
   VtParameterObject object,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  VoltParameterObject *obj = (VoltParameterObject *)object;
  VtDSAParamInfo *paramInfo = (VtDSAParamInfo *)info;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    if (flag == VOLT_PARAM_GET_TYPE_FLAG)
    {
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VoltParameterGetDsaParams (object, (Pointer *)info);
      break;
    }

    /* Check the flag, it should be VOLT_PARAM_SET_TYPE_FLAG.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_TYPE;
    if (flag != VOLT_PARAM_SET_TYPE_FLAG)
      break;

    /* Check the paramType of the object. It should be 0.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_SET;
    if (obj->paramType != 0)
      break;

    /* The associated info should be a pointer to VoltageDsaParameters.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (info == (Pointer)0)
      break;

    /* The primeP must be 1024 bits long and the subprimeQ must be 160
     * bits long.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (paramInfo->primeP.len != 128)
      break;
    if ((paramInfo->primeP.data[0] & 0x80) == 0)
      break;
    if (paramInfo->subprimeQ.len != 20)
      break;
    if ((paramInfo->subprimeQ.data[0] & 0x80) == 0)
      break;

    /* If using this ParameterParam, the key must already have an mpCtx
     * loaded.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_PARAM_OBJ;
    if (obj->mpCtx == (VoltMpIntCtx *)0)
      break;

    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = SetDSAParameters (
      obj, &(paramInfo->primeP), &(paramInfo->subprimeQ),
      &(paramInfo->baseG));

  } while (0);

  /* If everything worked, return 0.
   */
  if (status == 0)
  {
    /* Set the FIPS bit in the object type, this object is a FIPS
     * object.
     */
    obj->voltObject.objectType |= VOLT_OBJECT_TYPE_FIPS;
    return (0);
  }

  /* If something went wrong, indicate that this object is not usable.
   */
  obj->paramType = 0;

  VOLT_LOG_ERROR (
    obj->voltObject.libraryCtx, status, errorType, fnctLine,
    "VtParameterParamDSAParams", (char *)0)

  return (status);
}

static int VoltParameterGetDsaParams (
   VtParameterObject paramObj,
   Pointer *getInfo
   )
{
  int status;
  VoltParameterObject *obj = (VoltParameterObject *)paramObj;
  VoltDsaParams *params;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  *getInfo = (Pointer)0;

  do
  {
    /* Check the paramType in the object, it should contain
     * VOLT_PARAM_ALG_DSA.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_GET_INFO_UNAVAILABLE;
    if(obj->paramType == 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_GET;
    if ((obj->paramType & VOLT_PARAM_TYPE_MASK_ALG) != VOLT_PARAM_ALG_DSA)
      break;

    /* Make sure this object contains params and is not set to generate.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if ((obj->paramType & VOLT_PARAM_TYPE_CONTENTS) == 0)
      break;

    /* Are the parameters in data format? If so, we're done. (Set the
     * return values.)
     */
    if ((obj->paramType & VOLT_PARAM_TYPE_MASK_DATA) == VOLT_PARAM_TYPE_DATA)
    {
      status = 0;
      params = (VoltDsaParams *)(obj->paramData);
      *getInfo = (Pointer)&(params->paramInfo);
      break;
    }

    /* The data is not available, does the object have a GetData
     * function?
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_GET_INFO_UNAVAILABLE;
    if (obj->GetParamData == (VGetParamData)0)
      break;

    /* Call the Get function.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = obj->GetParamData ((VtParameterObject)obj, getInfo);

  } while (0);

  VOLT_LOG_ERROR_COMPARE (
    status, obj->voltObject.libraryCtx, status, errorType, fnctLine,
    "VoltParameterGetDsaParams", (char *)0)

  return (status);
}

int VtParameterParamDSAParamsFips (
   VtParameterObject object,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  VoltParameterObject *obj = (VoltParameterObject *)object;
  VoltDsaParams *params;
  Pointer *getInfo = (Pointer *)info;
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  *getInfo = (Pointer)0;

  do
  {
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_TYPE;
    if (flag != VOLT_PARAM_GET_TYPE_FLAG)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_GET;
    if ((obj->paramType & VOLT_PARAM_TYPE_MASK_ALG) != VOLT_PARAM_ALG_DSA)
      break;

    /* Check the paramType in the object, it should contain
     * VOLT_PARAM_ALG_DSA.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_GET;
    if (obj->paramType == 0)
      break;

    /* Make sure this object contains params and is not set to generate.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if ((obj->paramType & VOLT_PARAM_TYPE_CONTENTS) == 0)
      break;

    /* This works only if the params are in data format.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_GET_INFO_UNAVAILABLE;
    if ((obj->paramType & VOLT_PARAM_TYPE_MASK_DATA) != VOLT_PARAM_TYPE_DATA)
      break;

    params = (VoltDsaParams *)(obj->paramData);

    /* The FIPS information may not be there.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (params->fipsInfo.SEED.data == (unsigned char *)0)
      break;

    *getInfo = (Pointer)&(params->fipsInfo);
    status = 0;

  } while (0);

  VOLT_LOG_ERROR_COMPARE (
    status, obj->voltObject.libraryCtx, status, VT_ERROR_TYPE_PRIMARY,
    fnctLine, "VtParameterParamDSAParamsFips", (char *)0)

  return (status);
}

int SetDSAParameters (
   VoltParameterObject *obj,
   VtItem *primePItem,
   VtItem *subprimeQItem,
   VtItem *baseGItem
   )
{
  int status;
  VoltMpIntCtx *mpCtx = obj->mpCtx;
  VoltMpInt *primeP = (VoltMpInt *)0;
  VoltMpInt *subprimeQ = (VoltMpInt *)0;
  VoltMpInt *baseG = (VoltMpInt *)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_MP_INT_CTX;
    if (mpCtx == (VoltMpIntCtx *)0)
      break;

    /* Create and set MpInt's with the data.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &primeP);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, primePItem->data, primePItem->len, primeP);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &subprimeQ);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, subprimeQItem->data, subprimeQItem->len, subprimeQ);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &baseG);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, baseGItem->data, baseGItem->len, baseG);
    if (status != 0)
      break;

    /* Now call the Add routine that takes MpInt's.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = AddDSAParametersMpInt (
      obj, primeP, subprimeQ, baseG, (VoltMpInt *)0,
      (unsigned char *)0, 0, 0);

  } while (0);

  /* If successful, we're done.
   */
  if (status == 0)
    return (0);

  /* If error, clean up some things.
   */
  if (mpCtx != (VoltMpIntCtx *)0)
  {
    mpCtx->DestroyMpInt (&primeP);
    mpCtx->DestroyMpInt (&subprimeQ);
    mpCtx->DestroyMpInt (&baseG);
  }

⌨️ 快捷键说明

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