📄 zdmparams.c
字号:
/* Copyright 2003-2006, Voltage Security, all rights reserved.
*/
#include "vibe.h"
#include "environment.h"
#include "base.h"
#include "libctx.h"
#include "securemail.h"
#include "zdm.h"
#include "p7obj.h"
#include "stringutil.h"
#include "errorctx.h"
#include "vtassert.h"
int VoltZDMSetParamError (
VtZDMObject zdmObj,
int paramSelector,
Pointer setInfo
)
{
VOLT_DECLARE_FNCT_LINE (fnctLine)
VOLT_SET_FNCT_LINE (fnctLine)
VOLT_LOG_ERROR_INFO (
0, zdmObj, VT_ERROR_INVALID_SET, 0, VT_ERROR_TYPE_PRIMARY,
(char *)0, "VoltZDMSetParamError", fnctLine, (char *)0)
return (VT_ERROR_INVALID_SET);
}
int VoltOldZDMSetParamWrite (
VtZDMObject zdmObj,
int paramSelector,
Pointer setInfo
)
{
int status;
unsigned int typeFlag, valueLen;
VoltZDMObject *zObj = (VoltZDMObject *)zdmObj;
VoltLibCtx *libCtx = zdmObj->voltObject.libraryCtx;
VoltSecureMailObject *obj = (VoltSecureMailObject *)(zObj->localCtx);
VoltSecureMailWriteCtx *writeCtx = (VoltSecureMailWriteCtx *)0;
VoltSecureMailReadCtx *readCtx = (VoltSecureMailReadCtx *)0;
VOLT_DECLARE_ERROR_TYPE (errorType)
VOLT_DECLARE_FNCT_LINE (fnctLine)
if ((obj->state & VOLT_SECURE_MAIL_STATE_WRITE) != 0)
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
else
readCtx = (VoltSecureMailReadCtx *)(obj->localCtx);
switch (paramSelector)
{
case VT_ZDM_PARAM_MESSAGE_TYPE:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* The associated info is a pointer to an unsigned int.
* What type is indicated?
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
typeFlag = *((unsigned int *)setInfo);
if (typeFlag == VT_ZDM_MAIL)
obj->formatType = VOLT_MESSAGE_FORMAT_ZDM_MAIL;
else if (typeFlag == VT_ZDM_ATTACHMENT)
obj->formatType = VOLT_MESSAGE_FORMAT_ZDM_ATTACHMENT;
else
break;
status = 0;
break;
case VT_ZDM_PARAM_SENDER_ID:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
/* There can be only one sender.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (writeCtx->senderFlag != 0)
break;
/* Send this identity object on to the p7Signer. This will check
* the validity of the associatedInfo.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7SignedData, VtPkcs7ParamSignerId, setInfo);
writeCtx->senderFlag = 1;
/* Get a reference to the sender ID.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VoltGetSignerIdObjRef (
obj->p7SignedData, 0, (VtIdentityObject *)&(writeCtx->senderIdRef));
if (status == VT_ERROR_NO_ID_AT_INDEX)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
break;
case VT_ZDM_PARAM_SENDER_INFO:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
/* There can be only one sender.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (writeCtx->senderFlag != 0)
break;
/* Send this sender info on to the p7Signer. This will check
* the validity of the associatedInfo.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7SignedData, VtPkcs7ParamSignerInfo, setInfo);
if (status != 0)
break;
writeCtx->senderFlag = 1;
/* We need a reference to the signer's ID object.
* For ZDM, there must be a sender Identity object.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VoltGetSignerIdObjRef (
obj->p7SignedData, 0, (VtIdentityObject *)&(writeCtx->senderIdRef));
if (status == VT_ERROR_NO_ID_AT_INDEX)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
break;
case VT_ZDM_PARAM_RECIPIENT_LIST:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* Set the enveloper with this list.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7EnvelopedData, VtPkcs7ParamRecipientList, setInfo);
if (status != 0)
break;
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
/* We need a reference to the recipient list.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VtGetPkcs7Param (
obj->p7EnvelopedData, VtPkcs7ParamRecipientList,
(Pointer *)&(writeCtx->recipListRef));
break;
case VT_ZDM_PARAM_RECIPIENT_INFO_LIST:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* Set the enveloper with this list.
*/
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7EnvelopedData, VtPkcs7ParamRecipientInfoList, setInfo);
if (status != 0)
break;
/* We need a reference to the recipient list.
*/
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
VOLT_SET_FNCT_LINE (fnctLine)
status = VtGetPkcs7Param (
obj->p7EnvelopedData, VtPkcs7ParamRecipientList,
(Pointer *)&(writeCtx->recipListRef));
break;
case VT_ZDM_PARAM_AES128CBC:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* Set the enveloper with AES.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7EnvelopedData, VtPkcs7ParamEnvAES128CBC, setInfo);
break;
case VT_ZDM_PARAM_3DESCBC:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* Set the enveloper with AES.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7EnvelopedData, VtPkcs7ParamEnv3DESCBC, setInfo);
break;
case VT_ZDM_PARAM_NEW_LINE_CHAR:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* The associated info is a pointer to an unsigned int.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
typeFlag = *((unsigned int *)setInfo);
if ( (typeFlag != VT_SECURE_MAIL_NEW_LINE_LF) &&
(typeFlag != VT_SECURE_MAIL_NEW_LINE_CR_LF) )
break;
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
/* We initialized the buffer holding the new line chars to be
* CR_LF. So there's enough space in there to hold whatever is
* requested.
*/
status = 0;
if (typeFlag == VT_SECURE_MAIL_NEW_LINE_CR_LF)
{
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_NEW_LINE].data[0] = 0x0d;
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_NEW_LINE].data[1] = 0x0a;
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_NEW_LINE].len = 2;
break;
}
/* The caller wants LF.
*/
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_NEW_LINE].data[0] = 0x0a;
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_NEW_LINE].len = 1;
break;
case VT_ZDM_PARAM_DATA_LEN:
/* The SecureMail object must not be set with dataLen yet.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->dataLen != 0)
break;
/* The SecureMail object must be set to write.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_CALL_ORDER;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* The info should be an unsigned int.
*/
obj->dataLen = *((unsigned int *)setInfo);
#if VT_64_BIT_LENGTH == 64
obj->dataLen64 = (VtUInt64)(obj->dataLen);
#endif
status = 0;
break;
#if VT_64_BIT_LENGTH == 64
case VT_ZDM_PARAM_DATA_LEN_64:
/* The SecureMail object must not be set with dataLen yet.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if ( (obj->dataLen != 0) || (obj->dataLen64 != 0) )
break;
/* The object must be set to write.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_CALL_ORDER;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* The info should be a VtUInt64.
*/
obj->dataLen64 = *((VtUInt64 *)setInfo);
status = 0;
break;
#endif
case VT_ZDM_PARAM_FILE_NAME:
/* The SecureMail object must be set to write ZDM attachment.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_CALL_ORDER;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->formatType != VOLT_MESSAGE_FORMAT_ZDM_ATTACHMENT)
break;
/* Make sure the ctx does not yet have the file name set.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_SECURE_FILE_OBJ;
if (writeCtx->fileName.data != (unsigned char *)0)
break;
/* The info should be an unsigned char *.
*/
typeFlag = Z2Strlen (setInfo);
/* Build a buffer with the file name. Add a NULL-terminating
* character.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
writeCtx->fileName.data = (unsigned char *)Z2Malloc (typeFlag + 1, 0);
if (writeCtx->fileName.data == (unsigned char *)0)
break;
Z2Memcpy (writeCtx->fileName.data, setInfo, typeFlag);
writeCtx->fileName.data[typeFlag] = 0;
writeCtx->fileName.len = typeFlag;
status = 0;
break;
case VT_ZDM_PARAM_CONTENT_TYPE:
/* The SecureMail object must be set to write.
*/
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
/* If there's already a content-type in the contentInfo, error.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->contentInfo.data != (unsigned char *)0)
break;
/* How long is the input value.
*/
valueLen = Z2Strlen (setInfo);
/* Copy it into the object.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
obj->contentInfo.data = (unsigned char *)Z2Malloc (valueLen + 1, 0);
if (obj->contentInfo.data == (unsigned char *)0)
break;
Z2Memcpy (obj->contentInfo.data, setInfo, valueLen + 1);
/* We'll write out everything except the NULL-terminating
* character.
*/
obj->contentInfo.len = valueLen;
status = 0;
break;
case VT_ZDM_PARAM_SUBJECT_LINE:
VOLT_SET_ERROR_TYPE (errorType, VT_ERROR_TYPE_PRIMARY)
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_INVALID_ZDM_OBJ;
if (obj->state != VOLT_SECURE_MAIL_STATE_WRITE_SET)
break;
writeCtx = (VoltSecureMailWriteCtx *)(obj->localCtx);
/* If there's already a subject, error.
*/
VOLT_SET_FNCT_LINE (fnctLine)
if (writeCtx->itemArray[VOLT_WRITE_SM_ITEM_SUBJECT].data !=
(unsigned char *)0)
break;
/* How long is the input value.
*/
valueLen = Z2Strlen (setInfo);
/* Copy it into the writeCtx->itemArray.
*/
VOLT_SET_FNCT_LINE (fnctLine)
status = VT_ERROR_MEMORY;
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_SUBJECT].data =
(unsigned char *)Z2Malloc (valueLen, 0);
if (writeCtx->itemArray[VOLT_WRITE_SM_ITEM_SUBJECT].data ==
(unsigned char *)0)
break;
Z2Memcpy (
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_SUBJECT].data, setInfo,
valueLen);
writeCtx->itemArray[VOLT_WRITE_SM_ITEM_SUBJECT].len = valueLen;
status = 0;
break;
case VT_ZDM_PARAM_SURRENDER_CALLBACK:
VOLT_SET_ERROR_TYPE (errorType, 0)
VOLT_SET_FNCT_LINE (fnctLine)
status = VoltSetObjectSurrender (
(VoltObject *)obj, setInfo, 0, 0, 0);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
status = VtSetPkcs7Param (
obj->p7SignedData, VtPkcs7ParamSurrenderCallback, setInfo);
if (status != 0)
break;
VOLT_SET_FNCT_LINE (fnctLine)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -