dhparams.c

来自「IBE是一种非对称密码技术」· C语言 代码 · 共 554 行 · 第 1/2 页

C
554
字号
    /* 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 = (VoltDHParams *)(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_INFO_COMPARE (
    status, 0, paramObj, status, 0, errorType,
    (char *)0, "VoltParameterGetDHParams", fnctLine, (char *)0)

  return (status);
}

int VoltAddDHParametersMpInt (
   VoltParameterObject *obj,
   VoltMpInt *primeP,
   VoltMpInt *subprimeQ,
   VoltMpInt *baseG,
   unsigned char *SEED,
   unsigned int seedLen,
   unsigned int counter
   )
{
  int status;
  unsigned int sign, bufferSize, offset, pLen, qLen, gLen;
  VoltMpIntCtx *mpCtx = obj->mpCtx;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  unsigned char *buffer = (unsigned char *)0;
  VoltDHParams *dhParams = (VoltDHParams *)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* How big are the mpInts?
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      primeP, &sign, (unsigned char *)0, 0, &pLen);
    if (status == 0)
      status = VT_ERROR_GENERAL;
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;

    qLen = 0;
    if (subprimeQ != (VoltMpInt *)0)
    {
      VOLT_SET_FNCT_LINE (fnctLine)
      status = mpCtx->MpIntToOctetString (
        subprimeQ, &sign, (unsigned char *)0, 0, &qLen);
      if (status == 0)
        status = VT_ERROR_GENERAL;
      if (status != VT_ERROR_BUFFER_TOO_SMALL)
        break;
    }

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      baseG, &sign, (unsigned char *)0, 0, &gLen);
    if (status == 0)
      status = VT_ERROR_GENERAL;
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;

    bufferSize = sizeof (VoltDHParams) + pLen + qLen + gLen + seedLen;

    /* Allocate a buffer big enough for the data struct and all the
     * data.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    buffer = (unsigned char *)Z2Malloc (bufferSize, VOLT_MEMORY_SENSITIVE);
    if (buffer == (unsigned char *)0)
      break;
    Z2Memset (buffer, 0, bufferSize);
    dhParams = (VoltDHParams *)buffer;

    offset = sizeof (VoltDHParams);
    dhParams->paramInfo.primeP.data = buffer + offset;
    dhParams->fipsInfo.primeP.data = buffer + offset;
    offset += pLen;
    dhParams->paramInfo.baseG.data = buffer + offset;
    dhParams->fipsInfo.baseG.data = buffer + offset;
    offset += gLen;

    if (subprimeQ != (VoltMpInt *)0)
    {
      dhParams->paramInfo.subprimeQ.data = buffer + offset;
      dhParams->fipsInfo.subprimeQ.data = buffer + offset;
      offset += qLen;
    }

    if (seedLen != 0)
      dhParams->fipsInfo.SEED.data = buffer + offset;

    /* Build mpInts for the prime, subprime, and base
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(dhParams->primeP));
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToMpInt (primeP, dhParams->primeP);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      primeP, &sign, dhParams->paramInfo.primeP.data, pLen,
      &(dhParams->paramInfo.primeP.len));
    if (status != 0)
      break;

    dhParams->fipsInfo.primeP.len = dhParams->paramInfo.primeP.len;

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

      VOLT_SET_FNCT_LINE (fnctLine)
      status = mpCtx->MpIntToMpInt (subprimeQ, dhParams->subprimeQ);
      if (status != 0)
        break;

      VOLT_SET_FNCT_LINE (fnctLine)
      status = mpCtx->MpIntToOctetString (
        subprimeQ, &sign, dhParams->paramInfo.subprimeQ.data, qLen,
        &(dhParams->paramInfo.subprimeQ.len));
      if (status != 0)
        break;

      dhParams->fipsInfo.subprimeQ.len = dhParams->paramInfo.subprimeQ.len;
    }

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

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToMpInt (baseG, dhParams->baseG);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      baseG, &sign, dhParams->paramInfo.baseG.data, pLen,
      &(dhParams->paramInfo.baseG.len));
    if (status != 0)
      break;

    dhParams->fipsInfo.baseG.len = dhParams->paramInfo.baseG.len;

    if (SEED != (unsigned char *)0)
    {
      Z2Memcpy (dhParams->fipsInfo.SEED.data, SEED, seedLen);
      dhParams->fipsInfo.SEED.len = seedLen;
      dhParams->fipsInfo.counter = counter;
    }

    obj->paramType =
      VOLT_PARAM_ALG_DH | VOLT_PARAM_TYPE_CONTENTS |
      VOLT_PARAM_TYPE_PARAMS | VOLT_PARAM_TYPE_DATA;
    obj->paramData = (Pointer)dhParams;
    obj->ParamDataDestroy = DHParameterDataDestroy;
    obj->CopyParams = DHCopyParams;

  } while (0);

  if (status == 0)
    return (0);

  /* If there was an error, destroy/free anything we created/allocated.
   */
  if (dhParams != (VoltDHParams *)0)
  {
    mpCtx->DestroyMpInt (&(dhParams->primeP));
    mpCtx->DestroyMpInt (&(dhParams->subprimeQ));
    mpCtx->DestroyMpInt (&(dhParams->baseG));
  }

  if (buffer != (unsigned char *)0)
    Z2Free (buffer);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, obj, status, 0, errorType,
    (char *)0, "VoltAddDHParametersMpInt", fnctLine, (char *)0)

  return (status);
}

void DHParameterDataDestroy (
   Pointer paramObj,
   Pointer ctx
   )
{
  VoltParameterObject *obj;
  VoltLibCtx *libCtx;
  VoltDHParams *dhParams;

  if ( (paramObj == (Pointer)0) || (ctx == (Pointer)0) )
    return;

  obj = (VoltParameterObject *)paramObj;
  libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  dhParams = (VoltDHParams *)ctx;

  /* Destroy the MpInts.
   */
  if (dhParams->primeP != (VoltMpInt *)0)
    obj->mpCtx->DestroyMpInt (&(dhParams->primeP));
  if (dhParams->subprimeQ != (VoltMpInt *)0)
    obj->mpCtx->DestroyMpInt (&(dhParams->subprimeQ));
  if (dhParams->baseG != (VoltMpInt *)0)
    obj->mpCtx->DestroyMpInt (&(dhParams->baseG));

  Z2Free (ctx);
}

int DHCopyParams (
   Pointer sourceParamObj,
   Pointer destParamObj
   )
{
  int status;
  VoltParameterObject *src = (VoltParameterObject *)sourceParamObj;
  VoltParameterObject *dest = (VoltParameterObject *)destParamObj;
  VoltDHParams *dhParams = (VoltDHParams *)(src->paramData);
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  VOLT_SET_FNCT_LINE (fnctLine)
  status = VoltAddDHParametersMpInt (
    dest, dhParams->primeP, dhParams->subprimeQ, dhParams->baseG,
    dhParams->fipsInfo.SEED.data, dhParams->fipsInfo.SEED.len,
    dhParams->fipsInfo.counter);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, sourceParamObj, status, 0, 0,
    (char *)0, "DHCopyParams", fnctLine, (char *)0)

  return (status);
}

⌨️ 快捷键说明

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