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

📄 p7settype.c

📁 voltage 公司提供的一个开发Ibe的工具包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Copyright 2003-2005, 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"

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
));

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

  do
  {
    /* This Param cannot get info.
     */
    status = VT_ERROR_INVALID_GET;
    if (flag == VOLT_PKCS7_GET_TYPE_FLAG)
      break;

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

    /* The P7 object must not be set with dataLen yet.
     */
    status = VT_ERROR_INVALID_P7_OBJ;
    if (obj->dataLen != 0)
      break;

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

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

    dataLen = (unsigned int *)info;

    obj->dataLen = *dataLen;

    status = 0;

  } while (0);

  return (status);
}

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);

  do
  {
    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.
     */
    status = VT_ERROR_INVALID_CALL_ORDER;
    if (obj->state != VOLT_P7_STATE_ENV_WRITE_SET)
    {
      status = VT_ERROR_INVALID_SET;
      if (flag != VOLT_PKCS7_GET_TYPE_FLAG)
        break;

      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.
     */
    status = VT_ERROR_INVALID_ASSOCIATED_INFO;
    if (info == (Pointer)0)
      break;

    if (VOLT_OBJECT_TYPE_NOT_EQUAL (info, VOLT_OBJECT_TYPE_IDENTITY_LIST))
      break;

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

    if (count == 0)
      break;

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

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

  } while (0);

  return (status);
}

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

  do
  {
    /* The P7 object must be set to read envelope data.
     */
    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.
     */
    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);

  return (status);
}

int VtPkcs7ParamRecipientIndex (
   VtPkcs7Object pkcs7Obj,
   Pointer info,
   unsigned int flag
   )
{
  int status;
  VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
  VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
  VoltPkcs7ReadEnvCtx *readCtx = (VoltPkcs7ReadEnvCtx *)(obj->localCtx);
  VtPkcs7RecipientIndexInfo *indexInfo;
  VtKeyObject newKey = (VtKeyObject)0;
  VtIdentityObject getId;
  VtPolicyCtx policy;
  VtStorageCtx storage;
  VtTransportCtx transport;
  VtSurrenderCallback surrenderCtx;
  VtSurrenderCallback *surrenderToUse = (VtSurrenderCallback *)0;
  VoltSurrenderCtx *surrCtx;

  do
  {
    /* This Param cannot get info.
     */
    status = VT_ERROR_INVALID_GET;
    if (flag == VOLT_PKCS7_GET_TYPE_FLAG)
      break;

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

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

    /* This cannot be called if the ctx already contains a private key.
     */
    if ( (readCtx->priKey != (VtKeyObject)0) ||
         (readCtx->priKeyRef != (VtKeyObject)0) )
      break;

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

    indexInfo = (VtPkcs7RecipientIndexInfo *)info;

    /* Get the identity object associated with the given index.
     */
    status = VtGetIdentityListIdentity (
      readCtx->recipList, indexInfo->index, &getId);
    if (status != 0)
      break;

    /* If no policy, storage or transport passed in, see if there's
     * anything in the libCtx.
     */
    policy = indexInfo->policyCtx;
    if (policy == (VtPolicyCtx)0)
      policy = (VtPolicyCtx)VoltGetLibCtxInfo (
        (VtLibCtx)libCtx, VOLT_LIB_CTX_INFO_TYPE_POLICY_CTX);

    storage = indexInfo->storageCtx;
    if (storage == (VtStorageCtx)0)
      storage = (VtStorageCtx)VoltGetLibCtxInfo (
        (VtLibCtx)libCtx, VOLT_LIB_CTX_INFO_TYPE_STORAGE_CTX);

    transport = indexInfo->transportCtx;
    if (transport == (VtTransportCtx)0)
      transport = (VtTransportCtx)VoltGetLibCtxInfo (
        (VtLibCtx)libCtx, VOLT_LIB_CTX_INFO_TYPE_TRANSPORT_CTX);

    /* Create a key object into which the IBE private key will be
     * loaded.
     */
    status = VtCreateKeyObject (
      (VtLibCtx)libCtx, VtKeyImplMpCtx, (Pointer)(readCtx->mpCtx), &newKey);
    if (status != 0)
      break;

    if (obj->voltObject.surrenderCtx != (Pointer)0)
    {
      surrCtx = (VoltSurrenderCtx *)(obj->voltObject.surrenderCtx);
      surrenderCtx.Surrender = surrCtx->Surrender;
      surrenderCtx.appData = surrCtx->appData;
      surrenderCtx.AppDataCopy = surrCtx->AppDataCopy;
      surrenderCtx.AppDataFree = surrCtx->AppDataFree;
      surrenderToUse = &surrenderCtx;
    }

    /* Now obtain the private key for the given identity.
     */
    status = VtObtainPrivateKeysAndCert (
      getId, (VtRandomObject)0, 0, policy, storage, transport,
      (VtKeyObject)0, (VtCertObject)0, newKey);
    if (status != 0)
      break;

    /* Now that we have a private key, set the reference so later on
     * code can check that value to know a pri key is available. Also,

⌨️ 快捷键说明

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