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

📄 dsakeytype.c

📁 voltage 公司提供的一个开发Ibe的工具包
💻 C
📖 第 1 页 / 共 3 页
字号:
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_GET_INFO_UNAVAILABLE;
    if (obj->keyData == (Pointer)0)
      break;

    /* Is the algorithm DSA?
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if ((obj->keyType & VOLT_KEY_TYPE_MASK_ASYM_ALG) != VOLT_KEY_ALG_DSA)
      break;

    /* Check the keyType in the object, if it contains
     * VOLT_KEY_ALG_ASYM_PAIR, the contents are a key pair.
     */
    if ((obj->keyType & VOLT_KEY_TYPE_ASYM_PAIR) != 0)
    {
      VOLT_SET_FNCT_LINE (fnctLine)
      theKeyPair = (VoltDsaKeyPair *)(obj->keyData);
      if (theKeyPair->priKey == (VtKeyObject)0)
        break;

      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtGetKeyParam (
        theKeyPair->priKey, VtKeyParamDSAPrivate, getInfo);
      break;
    }

    /* It's not a key pair. If it's not private, we can't work with it.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if ((obj->keyType & VOLT_KEY_TYPE_PRIVATE) == 0)
      break;

    /* Is the key in data form?
     */
    if ((obj->keyType & VOLT_KEY_TYPE_MASK_DATA) != VOLT_KEY_TYPE_DATA)
    {
      /* The data is not available, does the object have a GetData
       * function?
       */
      VOLT_SET_FNCT_LINE (fnctLine)
      *getInfo = (Pointer)0;
      if (obj->GetKeyData == (VGetKeyData)0)
        break;

      /* Call the Get function.
       */
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = obj->GetKeyData ((VtKeyObject)obj, getInfo);
      break;
    }

    /* Do we have the data in the appropriate format already?
     */
    status = 0;
    priKey = (VoltDsaPrivateKey *)(obj->keyData);
    *getInfo = (Pointer)(priKey->keyItems);
    if (priKey->keyItems != (VtDSAPriKeyInfo *)0)
      break;

    /* Call the routine that builds the VtDSAPriKeyInfo struct.
     * This routine actually will return BufferTooSmall and set
     * bufferSize to the space needed. We'll allocate the space and
     * call it again.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    bufferSize = 0;
    status = BuildPriKeyInfo (obj, priKey, buffer, &bufferSize);
    if (status == 0)
      status = VT_ERROR_INVALID_KEY_OBJ;
    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, VOLT_MEMORY_SENSITIVE);
    if (buffer == (unsigned char *)0)
      break;
    Z2Memset (buffer, 0, bufferSize);

    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = BuildPriKeyInfo (obj, priKey, buffer, &bufferSize);
    if (status != 0)
      break;

    priKey->keyItems = (VtDSAPriKeyInfo *)buffer;
    *getInfo = (Pointer)buffer;

  } while (0);

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

  /* If there was an error, free memory we allocated.
   */
  if (buffer != (unsigned char *)0)
    Z2Free (buffer);

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

  return (status);
}

static int SetObjectDSAPublic (
   VoltKeyObject *obj,
   VtDSAPubKeyInfo *keyInfo
   )
{
  int status;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltMpIntCtx *mpCtx = obj->mpCtx;
  VoltDsaPublicKey *pubKeyData = (VoltDsaPublicKey *)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Allocate the VoltDsaPublicKey.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    pubKeyData = (VoltDsaPublicKey *)Z2Malloc (sizeof (VoltDsaPublicKey), 0);
    if (pubKeyData == (VoltDsaPublicKey *)0)
      break;
    Z2Memset (pubKeyData, 0, sizeof (VoltDsaPublicKey));
    pubKeyData->type = VOLT_KEY_TYPE_PUBLIC;

    /* This will hold the actual key data.
     */
    obj->voltObject.CloneObject = VoltCloneDsaPubKey;
    obj->keyData = (Pointer)pubKeyData;
    obj->KeyDataDestroy = DSAKeyDataDestroy;
    obj->keyType =
      VOLT_KEY_ALG_DSA | VOLT_KEY_TYPE_PUBLIC | VOLT_KEY_TYPE_SIGN |
      VOLT_KEY_TYPE_DATA;

    /* Build MpInt's of the data.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->primeP));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->primeP.data, keyInfo->primeP.len, pubKeyData->primeP);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->subprimeQ));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->subprimeQ.data, keyInfo->subprimeQ.len,
      pubKeyData->subprimeQ);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->baseG));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->baseG.data, keyInfo->baseG.len, pubKeyData->baseG);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(pubKeyData->pubValY));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->pubValY.data, keyInfo->pubValY.len, pubKeyData->pubValY);
    if (status != 0)
      break;

  } while (0);

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

  obj->keyType = 0;

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

  return (status);
}

static int SetObjectDSAPrivate (
   VoltKeyObject *obj,
   VtDSAPriKeyInfo *keyInfo
   )
{
  int status;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltMpIntCtx *mpCtx = obj->mpCtx;
  VoltDsaPrivateKey *priKeyData = (VoltDsaPrivateKey *)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* Allocate the VoltDsaPublicKey.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    priKeyData = (VoltDsaPrivateKey *)Z2Malloc (sizeof (VoltDsaPrivateKey), 0);
    if (priKeyData == (VoltDsaPrivateKey *)0)
      break;
    Z2Memset (priKeyData, 0, sizeof (VoltDsaPrivateKey));
    priKeyData->type = VOLT_KEY_TYPE_PRIVATE;

    /* This will hold the actual key data.
     */
    obj->voltObject.CloneObject = VoltCloneDsaPriKey;
    obj->keyData = (Pointer)priKeyData;
    obj->KeyDataDestroy = DSAKeyDataDestroy;
    obj->keyType =
      VOLT_KEY_ALG_DSA | VOLT_KEY_TYPE_PRIVATE | VOLT_KEY_TYPE_SIGN |
      VOLT_KEY_TYPE_DATA;

    /* Build MpInt's of the data.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->primeP));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->primeP.data, keyInfo->primeP.len, priKeyData->primeP);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->subprimeQ));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->subprimeQ.data, keyInfo->subprimeQ.len,
      priKeyData->subprimeQ);
    if (status != 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->baseG));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->baseG.data, keyInfo->baseG.len, priKeyData->baseG);
    if (status != 0)
      break;

    if ( (keyInfo->pubValY.data != (unsigned char *)0) &&
         (keyInfo->pubValY.len != 0) )
    {
      VOLT_SET_FNCT_LINE (fnctLine)
      status = mpCtx->CreateMpInt   ((Pointer)mpCtx, &(priKeyData->pubValY));
      if (status != 0)
        break;
      VOLT_SET_FNCT_LINE (fnctLine)
      status = mpCtx->OctetStringToMpInt (
        0, keyInfo->pubValY.data, keyInfo->pubValY.len, priKeyData->pubValY);
      if (status != 0)
        break;
    }

    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ((Pointer)mpCtx, &(priKeyData->priValX));
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, keyInfo->priValX.data, keyInfo->priValX.len, priKeyData->priValX);
    if (status != 0)
      break;

  } while (0);

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

  obj->keyType = 0;

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

  return (status);
}
static int SetObjectDSAPubFromPrivate (
   VoltLibCtx *libCtx,
   VoltMpIntCtx *mpCtx,
   VoltDsaPrivateKey *priKey
   )
{
  int status;
  unsigned int sign, priValXLen, pubValYLen;
  unsigned int baseLen, primeLen, subprimeLen;
  unsigned char *priValX = (unsigned char *)0;
  unsigned char *pubValY = (unsigned char *)0;
  unsigned char *baseG = (unsigned char *)0;
  unsigned char *primeP = (unsigned char *)0;
  unsigned char *subprimeQ = (unsigned char *)0;  
  VtDSAPriKeyInfo keyInfo;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* First convert all MpInts to octet strings
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->primeP, &sign, (unsigned char *)0, 0, &primeLen);
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->subprimeQ, &sign, (unsigned char *)0, 0, &subprimeLen);
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->baseG, &sign, (unsigned char *)0, 0, &baseLen);
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->priValX, &sign, (unsigned char *)0, 0, &priValXLen);
    if (status != VT_ERROR_BUFFER_TOO_SMALL)
      break;

    /* allocate memory to hold the octet strings
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    primeP = (unsigned char *)Z2Malloc (primeLen, 0);
    if (primeP == (unsigned char *)0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    subprimeQ = (unsigned char *)Z2Malloc (subprimeLen, 0);
    if (subprimeQ == (unsigned char *)0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    baseG = (unsigned char *)Z2Malloc (baseLen, 0);
    if (baseG == (unsigned char *)0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    priValX = (unsigned char *)Z2Malloc (priValXLen, 0);
    if (priValX == (unsigned char *)0)
      break;

    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->primeP, &sign, primeP, primeLen, &primeLen);
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->subprimeQ, &sign, subprimeQ, subprimeLen, &subprimeLen);
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->baseG, &sign, baseG, baseLen, &baseLen);
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->MpIntToOctetString (
      priKey->priValX, &sign, priValX, priValXLen, &priValXLen);
    if (status != 0)
      break;

    keyInfo.primeP.data = primeP;
    keyInfo.primeP.len = primeLen;
    keyInfo.subprimeQ.data = subprimeQ;
    keyInfo.subprimeQ.len = subprimeLen;
    keyInfo.baseG.data = baseG;
    keyInfo.baseG.len = baseLen;
    keyInfo.priValX.data = priValX;
    keyInfo.priValX.len = priValXLen;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VoltGeneratePubValAlloc (
      libCtx, mpCtx, &(keyInfo.primeP), &(keyInfo.baseG),
      keyInfo.priValX.data, VOLT_DSA_PRI_VAL_LEN,
      &pubValY, &pubValYLen);
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->CreateMpInt ( (Pointer)mpCtx, &(priKey->pubValY) );
    if (status != 0)
      break;
    VOLT_SET_FNCT_LINE (fnctLine)
    status = mpCtx->OctetStringToMpInt (
      0, pubValY, pubValYLen, priKey->pubValY);    
    if (status != 0)
      break;

  } while (0);

  /* free any memory we allocated
   */
  if (primeP != (unsigned char *)0)
    Z2Free (primeP);
  if (subprimeQ != (unsigned char *)0)
    Z2Free (subprimeQ);
  if (baseG != (unsigned char *)0)
    Z2Free (baseG);
  if (priValX != (unsigned char *)0)
    Z2Free (priValX);
  if (pubValY != (unsigned char *)0)
    Z2Free (pubValY);  

  if (status == 0)
    return 0;

  VOLT_LOG_ERROR (
    libCtx, status, errorType, fnctLine,
    "SetObjectDSAPubFromPrivate", (char *)0)
  
  return status;
}

static int BuildPubKeyInfo (
   VoltKeyObject *obj,
   VoltDsaPublicKey *pubKey,
   unsigned char *buffer,
   unsigned int *bufferSize
   )
{
  int status;
  unsigned int totalSize, spaceAvailable;
  unsigned int sign, primePLen, subprimeQLen, baseGLen, pubValYLen;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltMpIntCtx *mpCtx = obj->mpCtx;
  VtDSAPubKeyInfo *keyInfo = (VtDSAPubKeyInfo *)buffer;
  unsigned char *currentBuf;
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  /* spaceAvailable is how much space is currently available.

⌨️ 快捷键说明

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