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

📄 p7settype.c

📁 IBE是一种非对称密码技术
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
 */
#include "vibe.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "p7obj.h"
#include "certobj.h"
#include "vcert.h"
#include "idobj.h"
#include "algobj.h"
#include "cipher.h"
#include "recipinfo.h"
#include "errorctx.h"

ASN1_SEQUENCE (Asn1Pkcs7Data) =
{
  ASN1_SIMPLE (Asn1Pkcs7Data, contentType, Asn1ObjectId),
  ASN1_EXP (Asn1Pkcs7Data, content, ASN1_OCTET_STRING, 0)
} ASN1_SEQUENCE_END (Asn1Pkcs7Data);

IMPLEMENT_ASN1_FUNCTIONS (Asn1Pkcs7Data)

ASN1_SEQUENCE (Asn1SignedData) =
{
  ASN1_SIMPLE (Asn1SignedData, version, ASN1_INTEGER),
  ASN1_SET_OF (Asn1SignedData, digestAlgs, Asn1Encoded),
  ASN1_SIMPLE (Asn1SignedData, content, Asn1Pkcs7Data),
  ASN1_IMP_SET_OF_OPT (Asn1SignedData, certs, Asn1Encoded, 0),
  ASN1_IMP_SET_OF_OPT (Asn1SignedData, crls, Asn1Encoded, 1),
  ASN1_SET_OF (Asn1SignedData, signerInfos, Asn1SignerInfo)
} ASN1_SEQUENCE_END (Asn1SignedData);

IMPLEMENT_ASN1_FUNCTIONS (Asn1SignedData)

ASN1_SEQUENCE (Asn1SignedContent) =
{
  ASN1_SIMPLE (Asn1SignedContent, contentType, Asn1ObjectId),
  ASN1_EXP (Asn1SignedContent, signedData, Asn1SignedData, 0),
} ASN1_SEQUENCE_END (Asn1SignedContent);

IMPLEMENT_ASN1_FUNCTIONS (Asn1SignedContent)

/* The function when getting a recipient list our of an object.
 */
int VOLT_CALLING_CONV VoltP7ParamGetRecipList VOLT_PROTO_LIST ((
   VtPkcs7Object pkcs7Obj,
   Pointer *getInfo
));

/* The function when getting a RecipientInfoList our of an object.
 */
int VOLT_CALLING_CONV P7GetRecipientInfoList VOLT_PROTO_LIST ((
   VoltPkcs7Object *obj,
   Pointer *getInfo
));

int VtPkcs7ParamDataLen (
   VtPkcs7Object pkcs7Obj,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  unsigned int *dataLen;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* This Param cannot get info.
     */
    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 not be set with dataLen yet.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if (obj->dataLen != 0)
      break;
#if VT_64_BIT_LENGTH == 64
    if (obj->dataLen64 != (VtUInt64)0)
      break;
#endif

    /* The state must be SET or INIT, in either SIGN_WRITE or ENV_WRITE.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if ((obj->state & VOLT_P7_STATE_WRITE) == 0)
      break;
    if ((obj->state & (VOLT_P7_STATE_SIGN | VOLT_P7_STATE_ENV)) == 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_CALL_ORDER;
    if ((obj->state & (VOLT_P7_STATE_SET | VOLT_P7_STATE_INIT)) == 0)
      break;

    /* The info should be an unsigned int.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (info == (Pointer)0)
      break;

    dataLen = (unsigned int *)info;

    obj->dataLen = *dataLen;
#if VT_64_BIT_LENGTH == 64
    obj->dataLen64 = (VtUInt64)(obj->dataLen);
#endif

    status = 0;

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, pkcs7Obj, status, 0, VT_ERROR_TYPE_PRIMARY,
    (char *)0, "VtPkcs7ParamDataLen", fnctLine, (char *)0)

  return (status);
}

#if VT_64_BIT_LENGTH == 64
int VtPkcs7ParamDataLen64 (
   VtPkcs7Object pkcs7Obj,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  VtUInt64 *dataLen;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* This Param cannot get info.
     */
    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 not be set with dataLen yet.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if (obj->dataLen != 0)
      break;
    if (obj->dataLen64 != (VtUInt64)0)
      break;

    /* The state must be SET or INIT, in either SIGN_WRITE or ENV_WRITE.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if ((obj->state & VOLT_P7_STATE_WRITE) == 0)
      break;
    if ((obj->state & (VOLT_P7_STATE_SIGN | VOLT_P7_STATE_ENV)) == 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_CALL_ORDER;
    if ((obj->state & (VOLT_P7_STATE_SET | VOLT_P7_STATE_INIT)) == 0)
      break;

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

    dataLen = (VtUInt64 *)info;
    obj->dataLen64 = *dataLen;

    status = 0;

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, pkcs7Obj, status, 0, VT_ERROR_TYPE_PRIMARY,
    (char *)0, "VtPkcs7ParamDataLen64", fnctLine, (char *)0)

  return (status);
}

int VtGetOutputLen64ImplPkcs7 (
   VtLibCtx libraryCtx,
   Pointer associatedInfo,
   VtUInt64 *totalOutputLen,
   unsigned int flag
   )
{
  int status;
  unsigned int state;
  VoltPkcs7Object *obj;
  VOLT_DECLARE_ERROR_TYPE (errorType)
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* This Param must be called by VtGetTotalOutputLen64.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_IMPL;
    if (flag != VOLT_GET_OUTPUT_LEN_64_TYPE_FLAG)
      break;

    /* The associated info is supposed to be a PKCS 7 object.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (associatedInfo == (Pointer)0)
      break;

    obj = (VoltPkcs7Object *)associatedInfo;

    /* Paranoid programming check.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (VOLT_OBJECT_TYPE_NOT_EQUAL (obj, VOLT_OBJECT_TYPE_PKCS7))
      break;

    /* The object should be built to write (either Signed or
     * Enveloped), and the state must be INIT.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if ((obj->state & VOLT_P7_STATE_WRITE) == 0)
      break;

    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_GET_INFO_UNAVAILABLE;
    if ((obj->state & VOLT_P7_STATE_INIT) == 0)
      break;

    /* The object must be set with the data length.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    if (obj->dataLen64 == (VtUInt64)0)
      break;

    /* If the outputLen64 field is not set, call WriteUpdate to set it.
     */
    if (obj->outputLen64 == (VtUInt64)0)
    {
      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VtPkcs7WriteUpdate (
        (VtPkcs7Object)obj, (VtRandomObject)0, (unsigned char *)0, 1,
        (unsigned char *)0, 0, &state);
      if (status == 0)
        status = VT_ERROR_GENERAL;
      if (status != VT_ERROR_BUFFER_TOO_SMALL)
        break;
    }

    *totalOutputLen = obj->outputLen64;

    status = 0;

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, libraryCtx, 0, status, 0, errorType,
    (char *)0, "VtGetOutputLen64ImplPkcs7", fnctLine, (char *)0)

  return (status);
}
#endif

int VtPkcs7ParamRecipientList (
   VtPkcs7Object pkcs7Obj,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  unsigned int count, maxIndex;
  Pointer *getInfo;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VoltPkcs7WriteEnvCtx *envCtx = (VoltPkcs7WriteEnvCtx *)(obj->localCtx);
  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_TYPE;
    if ( (flag != VOLT_PKCS7_SET_TYPE_FLAG) &&
         (flag != VOLT_PKCS7_GET_TYPE_FLAG) )
      break;

    /* If the state is not VOLT_P7_STATE_ENV_WRITE_SET, we can only Get.
     */
    if (obj->state != VOLT_P7_STATE_ENV_WRITE_SET)
    {
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VT_ERROR_INVALID_SET;
      if (flag != VOLT_PKCS7_GET_TYPE_FLAG)
        break;

      VOLT_SET_ERROR_TYPE (errorType, 0)
      VOLT_SET_FNCT_LINE (fnctLine)
      status = VoltP7ParamGetRecipList (pkcs7Obj, (Pointer *)info);
      break;
    }

    /* The state is WRITE, if Getting, just return whatever is in the
     * recipients field of the ctx.
     */
    if (flag == VOLT_PKCS7_GET_TYPE_FLAG)
    {
      getInfo = (Pointer *)info;
      *getInfo = (Pointer)(envCtx->recipList);
      status = 0;
      break;
    }

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

    VOLT_SET_FNCT_LINE (fnctLine)
    if (VOLT_OBJECT_TYPE_NOT_EQUAL (info, VOLT_OBJECT_TYPE_IDENTITY_LIST))
      break;

    /* Make sure there are identities in the recipient list.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtGetIdentityListCount ((VtIdentityList)info, &count, &maxIndex);
    if (status != 0)
      break;

    if (count == 0)
      break;

    /* There can't be an id list there already.
     */
    VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if (envCtx->recipList != (VtIdentityList)0)
      break;

    /* We need our own copy of the list.
     */
    VOLT_SET_ERROR_TYPE (errorType, 0)
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VtCloneObject (info, (Pointer *)&(envCtx->recipList));

  } while (0);

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

  return (status);
}

int VoltP7ParamGetRecipList (
   VtPkcs7Object pkcs7Obj,
   Pointer *getInfo
   )
{
  int status;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VoltPkcs7ReadEnvCtx *readCtx = (VoltPkcs7ReadEnvCtx *)(obj->localCtx);
  VOLT_DECLARE_FNCT_LINE (fnctLine)

  do
  {
    /* The P7 object must be set to read envelope data.
     */
    VOLT_SET_FNCT_LINE (fnctLine)
    status = VT_ERROR_INVALID_P7_OBJ;
    if (obj->contentType != VOLT_PKCS7_ENVELOPED_DATA_READ)
      break;

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

    /* Return the IdentityList that is the recipient list.
     */
    *getInfo = (Pointer)(readCtx->recipList);

    status = 0;

  } while (0);

  VOLT_LOG_ERROR_INFO_COMPARE (
    status, 0, pkcs7Obj, status, 0, VT_ERROR_TYPE_PRIMARY,
    (char *)0, "VoltP7ParamGetRecipList", fnctLine, (char *)0)

  return (status);
}

int VtPkcs7ParamRecipientIndex (

⌨️ 快捷键说明

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