📄 p7settype.c
字号:
/* 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 + -