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

📄 writesigntype.c

📁 IBE是一种非对称密码技术
💻 C
📖 第 1 页 / 共 2 页
字号:
   )
{
  int status;
  unsigned int bufferSize;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VoltKeyObject *kObj = (VoltKeyObject *)0;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)(obj->localCtx);
  VtPkcs7SignerInfo *signerInfo;
  unsigned char *buffer = (unsigned char *)0;
  VoltP7SignerInfo *newInfo;
  VtItem *getCertData = (VtItem *)0;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* This Param cannot get info.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_GET;
    if (flag == VOLT_PKCS7_GET_TYPE_FLAG)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_TYPE;
    if (flag != VOLT_PKCS7_SET_TYPE_FLAG)
      break;

    /* The P7 object must be set to sign data.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if (obj->contentType != VT_PKCS7_SIGNED_DATA)
      break;

    /* The state must be VOLT_P7_STATE_SIGN_WRITE_SET.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_CALL_ORDER;
    if (obj->state != VOLT_P7_STATE_SIGN_WRITE_SET)
      break;

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

    signerInfo = (VtPkcs7SignerInfo *)info;

    /* Make sure we have a key object.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (signerInfo->privateKey == (VtKeyObject)0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    kObj = (VoltKeyObject *)(signerInfo->privateKey);
    if (VOLT_OBJECT_TYPE_NOT_EQUAL (kObj, VOLT_OBJECT_TYPE_KEY))
      break;

    /* It must be a signing key.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if ((kObj->keyType & VOLT_KEY_TYPE_PRIVATE) == 0)
      break;
    if ((kObj->keyType & VOLT_KEY_TYPE_SIGN) == 0)
      break;

    /* This implementation requires a cert.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (signerInfo->signerCert == (VtCertObject)0)
      break;

    /* Get the cert data out, we'll need it. This call will check the
     * cert object.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtGetCertParam (
      signerInfo->signerCert, VtCertParamX509DerData,
      (Pointer *)&getCertData);
    if (status != 0)
    {
      status = VT_ERROR_INVALID_ASSOCIATED_INFO;
      break;
    }

    /* Build an array of VoltP7SignerInfo's with one more entry.
     * Copy the old into the new, get rid of the old and set the
     * signCtx with the new.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    bufferSize = signCtx->signerInfosCount + 1;
    bufferSize *= sizeof (VoltP7SignerInfo);
    buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
    if (buffer == (unsigned char *)0)
      break;
    Z2Memset (buffer, 0, bufferSize);
    if (signCtx->signerInfos != (VoltP7SignerInfo *)0)
    {
      Z2Memcpy (
        buffer, signCtx->signerInfos,
        signCtx->signerInfosCount * sizeof (VoltP7SignerInfo));
      Z2Free (signCtx->signerInfos);
    }
    signCtx->signerInfos = (VoltP7SignerInfo *)buffer;
    newInfo = &(signCtx->signerInfos[signCtx->signerInfosCount]);
    signCtx->signerInfosCount++;

    /* Copy the cert data, copy a reference to the key.
     */
    newInfo->priKeyRef = signerInfo->privateKey;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    newInfo->cert.data = (unsigned char *)Z2Malloc (getCertData->len, 0);
    if (newInfo->cert.data == (unsigned char *)0)
      break;
    Z2Memcpy (newInfo->cert.data, getCertData->data, getCertData->len);
    newInfo->cert.len = getCertData->len;

    /* If the signerInfo contains an ID object, clone it. If not, we;re
     * done.
     */
    status = 0;
    if (signerInfo->signerId == (VtIdentityObject)0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    if (VOLT_OBJECT_TYPE_NOT_EQUAL (
      signerInfo->signerId, VOLT_OBJECT_TYPE_IDENTITY))
      break;

    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtCloneObject (
      (Pointer)(signerInfo->signerId), (Pointer *)&(newInfo->signerId));

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, pkcs7Obj, status, 0, errorType,
    (char *)0, "VtPkcs7ParamSignerInfo", fnctLine, (char *)0)

  return (status);
}

int VtPkcs7ParamCert (
   VtPkcs7Object pkcs7Obj,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  unsigned int bufferSize;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)(obj->localCtx);
  unsigned char *buffer = (unsigned char *)0;
  VtItem *getCertData = (VtItem *)0;
  VtItem *newItem;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* This Param cannot get info.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_GET;
    if (flag == VOLT_PKCS7_GET_TYPE_FLAG)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_TYPE;
    if (flag != VOLT_PKCS7_SET_TYPE_FLAG)
      break;

    /* The P7 object must be set to sign data.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if (obj->contentType != VT_PKCS7_SIGNED_DATA)
      break;

    /* The state must be VOLT_P7_STATE_SIGN_WRITE_SET.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_CALL_ORDER;
    if (obj->state != VOLT_P7_STATE_SIGN_WRITE_SET)
      break;

    /* The info should be a cert object.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (info == (Pointer)0)
      break;

    /* Get the cert data out, we'll need it. This call will check the
     * cert object.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtGetCertParam (
      (VtCertObject)info, VtCertParamX509DerData,
      (Pointer *)&getCertData);
    if (status != 0)
    {
      status = VT_ERROR_INVALID_ASSOCIATED_INFO;
      break;
    }

    /* Add this cert to the list of extra certs.
     * Build an array of VtItem's with one more entry.
     * Copy the old into the new, get rid of the old and set the
     * signCtx with the new.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_MEMORY;
    bufferSize = signCtx->extraCertsCount + 1;
    bufferSize *= sizeof (VtItem);
    buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
    if (buffer == (unsigned char *)0)
      break;
    Z2Memset (buffer, 0, bufferSize);

    /* If there's an old, copy the old into the new.
     */
    if (signCtx->extraCerts != (VtItem *)0)
    {
      Z2Memcpy (
        buffer, signCtx->extraCerts,
        signCtx->extraCertsCount * sizeof (VtItem));
      Z2Free (signCtx->extraCerts);
    }

    signCtx->extraCerts = (VtItem *)buffer;

    /* Copy the cert data.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    newItem = &(signCtx->extraCerts[signCtx->extraCertsCount]);
    newItem->data = (unsigned char *)Z2Malloc (getCertData->len, 0);
    if (newItem->data == (unsigned char *)0)
      break;

    Z2Memcpy (newItem->data, getCertData->data, getCertData->len);
    newItem->len = getCertData->len;
    signCtx->extraCertsCount++;

    status = 0;

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, pkcs7Obj, status, 0, errorType,
    (char *)0, "VtPkcs7ParamCert", fnctLine, (char *)0)

  return (status);
}

⌨️ 快捷键说明

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