📄 writesigntype.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 "idobj.h"
#include "derhelp.h"
#include "oidlist.h"
#include "keyobj.h"
int VtPkcs7ImplWriteSignedDSA (
VtPkcs7Object *object,
Pointer info,
unsigned int flag
)
{
int status;
unsigned int bufferSize;
VoltPkcs7Object *obj = (VoltPkcs7Object *)(*object);
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
unsigned char *buffer = (unsigned char *)0;
VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)0;
unsigned char sha1AlgId[VoltSHA1AlgIdBytesLen] = { VoltSHA1AlgIdBytes };
unsigned char dsaSha1AlgId[VoltDsaSHA1AlgIdBytesLen] =
{ VoltDsaSHA1AlgIdBytes };
do
{
status = VT_ERROR_INVALID_TYPE;
if (flag != VOLT_PKCS7_SET_TYPE_FLAG)
break;
/* Make sure the object is empty.
*/
status = VT_ERROR_INVALID_P7_OBJ;
if ( (obj->contentType != 0) || (obj->localCtx != (Pointer)0) )
break;
/* Check the info, we're expecting NULL.
*/
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info != (Pointer)0)
break;
/* Build the local ctx.
*/
bufferSize =
sizeof (VoltPkcs7WriteSignCtx) + VoltSHA1AlgIdBytesLen +
VoltDsaSHA1AlgIdBytesLen + 20;
status = VT_ERROR_MEMORY;
buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, bufferSize);
/* Locate the struct.
*/
signCtx = (VoltPkcs7WriteSignCtx *)buffer;
/* Copy the signing algID.
*/
signCtx->sigAlgId.data = buffer + sizeof (VoltPkcs7WriteSignCtx);
Z2Memcpy (signCtx->sigAlgId.data, dsaSha1AlgId, VoltDsaSHA1AlgIdBytesLen);
signCtx->sigAlgId.len = VoltDsaSHA1AlgIdBytesLen;
/* Copy the digest algID.
*/
signCtx->digestAlgId.data =
signCtx->sigAlgId.data + VoltDsaSHA1AlgIdBytesLen;
Z2Memcpy (signCtx->digestAlgId.data, sha1AlgId, VoltSHA1AlgIdBytesLen);
signCtx->digestAlgId.len = VoltSHA1AlgIdBytesLen;;
signCtx->digest = signCtx->digestAlgId.data + VoltSHA1AlgIdBytesLen;
signCtx->digestSize = 20;
/* Build the digest object.
*/
status = VtCreateAlgorithmObject (
(VtLibCtx)libCtx, VtAlgorithmImplSHA1, (Pointer)0,
&(signCtx->digester));
if (status != 0)
break;
obj->state = VOLT_P7_STATE_SIGN_WRITE_SET;
obj->localCtx = (Pointer)signCtx;
obj->LocalCtxDestroy = VoltWriteSignCtxDestroy;
obj->contentType = VT_PKCS7_SIGNED_DATA;
obj->WriteInit = VoltP7SignWriteInit;
obj->WriteUpdate = VoltP7SignWriteUpdate;
obj->WriteFinal = VoltP7SignWriteFinal;
} while (0);
/* If success, we're done.
*/
if (status == 0)
return (0);
/* If error, destroy what we created.
*/
VoltWriteSignCtxDestroy ((Pointer)obj, (Pointer)signCtx);
return (status);
}
void VoltWriteSignCtxDestroy (
Pointer obj,
Pointer ctx
)
{
unsigned int index;
VoltObject *voltObj = (VoltObject *)obj;
VoltLibCtx *libCtx;
VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)ctx;
VoltP7SignerInfo *nextInfo;
VtItem *nextItem;
/* Anything to destroy?
*/
if ( (obj == (Pointer)0) || (ctx == (Pointer)0) )
return;
libCtx = (VoltLibCtx *)(voltObj->libraryCtx);
for (index = 0; index < signCtx->signerInfosCount; ++index)
{
nextInfo = &(signCtx->signerInfos[index]);
VtDestroyIdentityObject (&(nextInfo->signerId));
VtDestroyAlgorithmObject (&(nextInfo->signObj));
VtDestroyKeyObject (&(nextInfo->priKey));
if (nextInfo->cert.data != (unsigned char *)0)
Z2Free (nextInfo->cert.data);
if (nextInfo->signature != (unsigned char *)0)
Z2Free (nextInfo->signature);
if (nextInfo->asn1SignerInfo != (Asn1SignerInfo *)0)
Asn1SignerInfo_free (nextInfo->asn1SignerInfo);
}
if (signCtx->signerInfos != (VoltP7SignerInfo *)0)
Z2Free (signCtx->signerInfos);
for (index = 0; index < signCtx->extraCertsCount; ++index)
{
nextItem = &(signCtx->extraCerts[index]);
if (nextItem->data != (unsigned char *)0)
Z2Free (nextItem->data);
}
if (signCtx->extraCerts != (VtItem *)0)
Z2Free (signCtx->extraCerts);
VtDestroyAlgorithmObject (&(signCtx->digester));
Z2Free (ctx);
}
int VtPkcs7ParamSignerId (
VtPkcs7Object pkcs7Obj,
Pointer info,
unsigned int flag
)
{
int status;
unsigned int bufferSize;
VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)(obj->localCtx);
unsigned char *buffer = (unsigned char *)0;
VoltP7SignerInfo *newInfo;
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 be set to sign data.
*/
status = VT_ERROR_INVALID_P7_OBJ;
if (obj->contentType != VT_PKCS7_SIGNED_DATA)
break;
/* The state must be VOLT_P7_STATE_SIGN_WRITE_SET.
*/
status = VT_ERROR_INVALID_CALL_ORDER;
if (obj->state != VOLT_P7_STATE_SIGN_WRITE_SET)
break;
/* The info should be an identity object.
*/
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info == (Pointer)0)
break;
if (VOLT_OBJECT_TYPE_NOT_EQUAL (info, VOLT_OBJECT_TYPE_IDENTITY))
break;
/* Build an array of VoltP7SignerInfo's with one more entry.
* Copy the old into the new, get rid of the old and set the
* signCtx with the new.
*/
status = VT_ERROR_MEMORY;
bufferSize = signCtx->signerInfosCount + 1;
bufferSize *= sizeof (VoltP7SignerInfo);
buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, bufferSize);
if (signCtx->signerInfos != (VoltP7SignerInfo *)0)
{
Z2Memcpy (
buffer, signCtx->signerInfos,
signCtx->signerInfosCount * sizeof (VoltP7SignerInfo));
Z2Free (signCtx->signerInfos);
}
signCtx->signerInfos = (VoltP7SignerInfo *)buffer;
newInfo = &(signCtx->signerInfos[signCtx->signerInfosCount]);
signCtx->signerInfosCount++;
/* Clone the ID object into the newInfo.
*/
status = VtCloneObject (info, (Pointer *)&(newInfo->signerId));
} while (0);
return (status);
}
int VtPkcs7ParamSignerInfo (
VtPkcs7Object pkcs7Obj,
Pointer info,
unsigned int flag
)
{
int status;
unsigned int bufferSize;
VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
VoltKeyObject *kObj = (VoltKeyObject *)0;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)(obj->localCtx);
VtPkcs7SignerInfo *signerInfo;
unsigned char *buffer = (unsigned char *)0;
VoltP7SignerInfo *newInfo;
VtItem *getCertData = (VtItem *)0;
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 be set to sign data.
*/
status = VT_ERROR_INVALID_P7_OBJ;
if (obj->contentType != VT_PKCS7_SIGNED_DATA)
break;
/* The state must be VOLT_P7_STATE_SIGN_WRITE_SET.
*/
status = VT_ERROR_INVALID_CALL_ORDER;
if (obj->state != VOLT_P7_STATE_SIGN_WRITE_SET)
break;
/* The info should be a pointer to VtPkcs7SignerInfo.
*/
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info == (Pointer)0)
break;
signerInfo = (VtPkcs7SignerInfo *)info;
/* Make sure we have a key object.
*/
if (signerInfo->privateKey == (VtKeyObject)0)
break;
kObj = (VoltKeyObject *)(signerInfo->privateKey);
if (VOLT_OBJECT_TYPE_NOT_EQUAL (kObj, VOLT_OBJECT_TYPE_KEY))
break;
/* It must be a signing key.
*/
if ((kObj->keyType & VOLT_KEY_TYPE_PRIVATE) == 0)
break;
if ((kObj->keyType & VOLT_KEY_TYPE_SIGN) == 0)
break;
/* This implementation requires a cert.
*/
if (signerInfo->signerCert == (VtCertObject)0)
break;
/* Get the cert data out, we'll need it. This call will check the
* cert object.
*/
status = VtGetCertParam (
signerInfo->signerCert, VtCertParamX509DerData,
(Pointer *)&getCertData);
if (status != 0)
{
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
break;
}
/* Build an array of VoltP7SignerInfo's with one more entry.
* Copy the old into the new, get rid of the old and set the
* signCtx with the new.
*/
status = VT_ERROR_MEMORY;
bufferSize = signCtx->signerInfosCount + 1;
bufferSize *= sizeof (VoltP7SignerInfo);
buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, bufferSize);
if (signCtx->signerInfos != (VoltP7SignerInfo *)0)
{
Z2Memcpy (
buffer, signCtx->signerInfos,
signCtx->signerInfosCount * sizeof (VoltP7SignerInfo));
Z2Free (signCtx->signerInfos);
}
signCtx->signerInfos = (VoltP7SignerInfo *)buffer;
newInfo = &(signCtx->signerInfos[signCtx->signerInfosCount]);
signCtx->signerInfosCount++;
/* Copy the cert data, copy a reference to the key.
*/
newInfo->priKeyRef = signerInfo->privateKey;
status = VT_ERROR_MEMORY;
newInfo->cert.data = (unsigned char *)Z2Malloc (getCertData->len, 0);
if (newInfo->cert.data == (unsigned char *)0)
break;
Z2Memcpy (newInfo->cert.data, getCertData->data, getCertData->len);
newInfo->cert.len = getCertData->len;
/* If the signerInfo contains an ID object, clone it. If not, we;re
* done.
*/
status = 0;
if (signerInfo->signerId == (VtIdentityObject)0)
break;
if (VOLT_OBJECT_TYPE_NOT_EQUAL (
signerInfo->signerId, VOLT_OBJECT_TYPE_IDENTITY))
break;
status = VtCloneObject (
(Pointer)(signerInfo->signerId), (Pointer *)&(newInfo->signerId));
} while (0);
return (status);
}
int VtPkcs7ParamCert (
VtPkcs7Object pkcs7Obj,
Pointer info,
unsigned int flag
)
{
int status;
unsigned int bufferSize;
VoltPkcs7Object *obj = (VoltPkcs7Object *)pkcs7Obj;
VoltLibCtx *libCtx = (VoltLibCtx *)(obj->voltObject.libraryCtx);
VoltPkcs7WriteSignCtx *signCtx = (VoltPkcs7WriteSignCtx *)(obj->localCtx);
unsigned char *buffer = (unsigned char *)0;
VtItem *getCertData = (VtItem *)0;
VtItem *newItem;
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 be set to sign data.
*/
status = VT_ERROR_INVALID_P7_OBJ;
if (obj->contentType != VT_PKCS7_SIGNED_DATA)
break;
/* The state must be VOLT_P7_STATE_SIGN_WRITE_SET.
*/
status = VT_ERROR_INVALID_CALL_ORDER;
if (obj->state != VOLT_P7_STATE_SIGN_WRITE_SET)
break;
/* The info should be a cert object.
*/
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
if (info == (Pointer)0)
break;
/* Get the cert data out, we'll need it. This call will check the
* cert object.
*/
status = VtGetCertParam (
(VtCertObject)info, VtCertParamX509DerData,
(Pointer *)&getCertData);
if (status != 0)
{
status = VT_ERROR_INVALID_ASSOCIATED_INFO;
break;
}
/* Add this cert to the list of extra certs.
* Build an array of VtItem's with one more entry.
* Copy the old into the new, get rid of the old and set the
* signCtx with the new.
*/
status = VT_ERROR_MEMORY;
bufferSize = signCtx->extraCertsCount + 1;
bufferSize *= sizeof (VtItem);
buffer = (unsigned char *)Z2Malloc (bufferSize, 0);
if (buffer == (unsigned char *)0)
break;
Z2Memset (buffer, 0, bufferSize);
/* If there's an old, copy the old into the new.
*/
if (signCtx->extraCerts != (VtItem *)0)
{
Z2Memcpy (
buffer, signCtx->extraCerts,
signCtx->extraCertsCount * sizeof (VtItem));
Z2Free (signCtx->extraCerts);
}
signCtx->extraCerts = (VtItem *)buffer;
/* Copy the cert data.
*/
newItem = &(signCtx->extraCerts[signCtx->extraCertsCount]);
newItem->data = (unsigned char *)Z2Malloc (getCertData->len, 0);
if (newItem->data == (unsigned char *)0)
break;
Z2Memcpy (newItem->data, getCertData->data, getCertData->len);
newItem->len = getCertData->len;
signCtx->extraCertsCount++;
status = 0;
} while (0);
return (status);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -