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