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

📄 dsakgimpl.c

📁 voltage 公司提供的一个开发Ibe的工具包
💻 C
📖 第 1 页 / 共 2 页
字号:
  VoltMpInt *result = (VoltMpInt *)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Build the MPInt's containing the modulus, base and exponent.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &modulus);
    if (status != 0)
      break;

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

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

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

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

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (0, priVal, priValLen, expo);
    if (status != 0)
      break;

    /* Create an empty result MpInt.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &result);
    if (status != 0)
      break;

    /* pubVal = (base ^ expo) mod modulus.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->ModExp (base, expo, modulus, result);
    if (status != 0)
      break;

    /* How big does the buffer need to be?
     * We're expecting a BufferTooSmall error, if we don't get it,
     * that's an error.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      result, &sign, (unsigned char *)0, 0, &bufferSize);
    if (status == 0)
      status = VT_ERROR_INVALID_PARAMS;
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;

    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
    if (buffer == (unsigned char *)0)
      break;

    /* Now that we have a buffer, get the result.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString
      (result, &sign, buffer, bufferSize, &bufferSize);
    if (status != 0)
      break;

    /* If everything worked, set the return values.
     */
    *pubVal = buffer;
    *pubValLen = bufferSize;

  } while (0);

  if (modulus != (VoltMpInt *)0)
    mpCtx->DestroyMpInt (&modulus);
  if (base != (VoltMpInt *)0)
    mpCtx->DestroyMpInt (&base);
  if (expo != (VoltMpInt *)0)
    mpCtx->DestroyMpInt (&expo);
  if (result != (VoltMpInt *)0)
    mpCtx->DestroyMpInt (&result);

  /* If there was no error, we're done.
   */
  if (status == 0)
    return (0);

  /* If there was an error, free the buffer that we would have returned
   * but didn't.
   */
  if (buffer != (unsigned char *)0)
    Z2Free (buffer);

  VOLT_LOG_ERROR (
    (VtLibCtx)libCtx, status, errorType, fnctLine,
    "VoltGeneratePubValAlloc", (char *)0)

  return (status);
}

void DSAKeyPairDataDestroy (
   Pointer obj,
   Pointer ctx
   )
{
  VoltLibCtx *libCtx = (VoltLibCtx *)(((VoltObject *)obj)->libraryCtx);
  VoltDsaKeyPair *theKeyPair = (VoltDsaKeyPair *)ctx;

  /* Is there anything to destroy?
   */
  if (ctx == (Pointer)0)
    return;
  if (theKeyPair->type != VOLT_KEY_TYPE_ASYM_PAIR)
    return;

  /* Destroy the contents.
   */
  if (theKeyPair->priKey != (VtKeyObject)0)
    VtDestroyKeyObject (&(theKeyPair->priKey));
  if (theKeyPair->pubKey != (VtKeyObject)0)
    VtDestroyKeyObject (&(theKeyPair->pubKey));

  /* Free up the memory that made up the context.
   */
  Z2Free (ctx);
}

static int SetPubKeyObject (
   VoltLibCtx *libCtx,
   VoltDsaKeyGenCtx *dsaGenCtx,
   unsigned char *pubVal,
   unsigned int pubValLen,
   VtKeyObject pubKey
   )
{
  int status;
  VtDSAPubKeyInfo keyInfo;
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Fill in the keyInfo struct with the data.
     */
    keyInfo.primeP.data = dsaGenCtx->primeP.data;
    keyInfo.primeP.len = dsaGenCtx->primeP.len;
    keyInfo.subprimeQ.data = dsaGenCtx->subprimeQ.data;
    keyInfo.subprimeQ.len = dsaGenCtx->subprimeQ.len;
    keyInfo.baseG.data = dsaGenCtx->baseG.data;
    keyInfo.baseG.len = dsaGenCtx->baseG.len;
    keyInfo.pubValY.data = pubVal;
    keyInfo.pubValY.len = pubValLen;

    /* Set the object.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtSetKeyParam (pubKey, VtKeyParamDSAPublic, (Pointer)&keyInfo);

  } while (0);

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

  return (status);
}

static int SetPriKeyObject (
   VoltLibCtx *libCtx,
   VoltDsaKeyGenCtx *dsaGenCtx,
   unsigned char *priVal,
   unsigned int priValLen,
   unsigned char *pubVal,
   unsigned int pubValLen,
   VtKeyObject priKey
   )
{
  int status;
  VtDSAPriKeyInfo keyInfo;
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Fill in the keyInfo struct with the data.
     */
    keyInfo.primeP.data = dsaGenCtx->primeP.data;
    keyInfo.primeP.len = dsaGenCtx->primeP.len;
    keyInfo.subprimeQ.data = dsaGenCtx->subprimeQ.data;
    keyInfo.subprimeQ.len = dsaGenCtx->subprimeQ.len;
    keyInfo.baseG.data = dsaGenCtx->baseG.data;
    keyInfo.baseG.len = dsaGenCtx->baseG.len;
    keyInfo.pubValY.data = pubVal;
    keyInfo.pubValY.len = pubValLen;
    keyInfo.priValX.data = priVal;
    keyInfo.priValX.len = priValLen;

    /* Set the object.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtSetKeyParam (priKey, VtKeyParamDSAPrivate, (Pointer)&keyInfo);

  } while (0);

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

  return (status);
}

int VoltTestDsaKeyPair (
   VoltLibCtx *libCtx,
   VoltSurrenderCtx *surrCtx,
   VtKeyObject pubKey,
   VtKeyObject priKey,
   VtRandomObject random
   )
{
  int status;
  unsigned int signatureLen, sigFlag, verifyResult;
  VtAlgorithmObject signer = (VtAlgorithmObject)0;
  VtAlgorithmObject verifier = (VtAlgorithmObject)0;
  VtSurrenderCallback surrenderCtx;
  unsigned char arbitraryData[20];
  unsigned char signature[56];
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Generate arbitrary data to sign.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtGenerateRandomBytes (
      random, arbitraryData, sizeof (arbitraryData));
    if (status != 0)
      break;

    /* Sign it.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    sigFlag = VT_DSA_SIGNATURE_DER_ENCODED;
    status = VtCreateAlgorithmObject (
      (VtLibCtx)libCtx, VtAlgorithmImplDSASign, (Pointer)&sigFlag,
      &signer);
    if (status != 0)
      break;

    if (surrCtx != (VoltSurrenderCtx *)0)
    {
      /* Set the signing object with the surrender ctx, but don't copy
       * the appData, just copy a reference, so we're still using the
       * cert request object's appData.
       */
      surrenderCtx.Surrender = surrCtx->Surrender;
      surrenderCtx.appData = surrCtx->appData;
      surrenderCtx.AppDataCopy = (VtSurrenderAppDataCopy)0;
      surrenderCtx.AppDataFree = (VtSurrenderAppDataFree)0;
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtSetAlgorithmParam (
        signer, VtAlgorithmParamSurrenderCallback, (Pointer)&surrenderCtx);
      if (status != 0)
        break;
    }

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtSign (
      signer, priKey, random, VT_DIGEST_ALG_SHA1,
      arbitraryData, sizeof (arbitraryData),
      signature, sizeof (signature), &signatureLen);
    if (status != 0)
      break;

    /* Try to verify it.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    sigFlag = VT_DSA_SIGNATURE_DER_ENCODED;
    status = VtCreateAlgorithmObject (
      (VtLibCtx)libCtx, VtAlgorithmImplDSAVerify, (Pointer)&sigFlag,
      &verifier);
    if (status != 0)
      break;

    if (surrCtx != (VoltSurrenderCtx *)0)
    {
      /* Set the verification object with the surrender ctx.
       */
      surrenderCtx.Surrender = surrCtx->Surrender;
      surrenderCtx.appData = surrCtx->appData;
      surrenderCtx.AppDataCopy = (VtSurrenderAppDataCopy)0;
      surrenderCtx.AppDataFree = (VtSurrenderAppDataFree)0;
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtSetAlgorithmParam (
        verifier, VtAlgorithmParamSurrenderCallback, (Pointer)&surrenderCtx);
      if (status != 0)
        break;
    }

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtVerifySignature (
      verifier, pubKey, random, VT_DIGEST_ALG_SHA1,
      arbitraryData, sizeof (arbitraryData),
      signature, signatureLen, &verifyResult);
    if (status != 0)
      break;

    /* If the signature verifies, the keys are partners, if not, return
     * an error.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_UNMATCHED_KEY_PAIR;
    if (verifyResult == 0)
      break;

    status = 0;

  } while (0);

  Z2Memset (arbitraryData, 0, sizeof (arbitraryData));
  Z2Memset (signature, 0, sizeof (signature));

  VtDestroyAlgorithmObject (&signer);
  VtDestroyAlgorithmObject (&verifier);

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

  return (status);
}

⌨️ 快捷键说明

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