|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: IndData.cpp
//
// Contents: Microsoft Internet Security Catalog Utilities
// implements the Certificate Trust List & persistent storage
//
// Functions: CatalogDecodeIndirectData
// CatalogReallyDecodeIndirectData
// CatalogEncodeIndirectData
//
// History: 16-May-1997 pberkman created
// 01-Oct-1997 pberkman add lazy decode
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include "mscat32.h"
BOOL CatalogDecodeIndirectData(CRYPTCATSTORE *pCat, CRYPTCATMEMBER *pMember, CRYPT_ATTRIBUTE *pAttr) { DELETE_OBJECT(pMember->sEncodedIndirectData.pbData);
if (pAttr->rgValue->cbData < 1) { return(FALSE); }
if (!(pMember->sEncodedIndirectData.pbData = (BYTE *)CatalogNew(pAttr->rgValue->cbData))) { pMember->sEncodedIndirectData.cbData = 0;
return(FALSE); }
pMember->sEncodedIndirectData.cbData = pAttr->rgValue->cbData; memcpy(pMember->sEncodedIndirectData.pbData, pAttr->rgValue->pbData, pAttr->rgValue->cbData);
return(TRUE); }
BOOL CatalogReallyDecodeIndirectData(CRYPTCATSTORE *pCat, CRYPTCATMEMBER *pMember, CRYPT_ATTR_BLOB *pAttr) { DWORD cbDecode; SIP_INDIRECT_DATA *pInd;
cbDecode = 0;
CryptDecodeObject(pCat->dwEncodingType, SPC_INDIRECT_DATA_CONTENT_STRUCT, pAttr->pbData, pAttr->cbData, 0, NULL, &cbDecode);
if (cbDecode > 0) { if (!(pInd = (SIP_INDIRECT_DATA *)CatalogNew(cbDecode))) { return(FALSE); }
if (!(CryptDecodeObject(pCat->dwEncodingType, SPC_INDIRECT_DATA_CONTENT_STRUCT, pAttr->pbData, pAttr->cbData, 0, pInd, &cbDecode))) { delete pInd;
return(FALSE); }
if (!(pMember->pIndirectData = (SIP_INDIRECT_DATA *)CatalogNew(sizeof(SIP_INDIRECT_DATA)))) { delete pInd;
return(FALSE); }
memset(pMember->pIndirectData, 0x00, sizeof(SIP_INDIRECT_DATA));
pMember->pIndirectData->Data.pszObjId = (LPSTR)CatalogNew(strlen(pInd->Data.pszObjId) + 1);
if (pInd->Data.Value.cbData > 0) { pMember->pIndirectData->Data.Value.pbData = (BYTE *)CatalogNew(pInd->Data.Value.cbData); pMember->pIndirectData->Data.Value.cbData = pInd->Data.Value.cbData; }
pMember->pIndirectData->DigestAlgorithm.pszObjId = (LPSTR)CatalogNew(strlen(pInd->DigestAlgorithm.pszObjId) + 1);
if (pInd->Digest.cbData > 0) { pMember->pIndirectData->Digest.pbData = (BYTE *)CatalogNew(pInd->Digest.cbData); pMember->pIndirectData->Digest.cbData = pInd->Digest.cbData; }
if (!(pMember->pIndirectData->Data.pszObjId) || ((pInd->Data.Value.cbData > 0) && !(pMember->pIndirectData->Data.Value.pbData)) || !(pMember->pIndirectData->DigestAlgorithm.pszObjId) || ((pInd->Digest.cbData > 0) && !(pMember->pIndirectData->Digest.pbData))) { delete pInd; return(FALSE); }
strcpy(pMember->pIndirectData->Data.pszObjId, pInd->Data.pszObjId);
if (pInd->Data.Value.cbData > 0) { memcpy(pMember->pIndirectData->Data.Value.pbData, pInd->Data.Value.pbData, pInd->Data.Value.cbData); }
strcpy(pMember->pIndirectData->DigestAlgorithm.pszObjId, pInd->DigestAlgorithm.pszObjId);
if (pInd->Digest.cbData > 0) { memcpy(pMember->pIndirectData->Digest.pbData, pInd->Digest.pbData, pInd->Digest.cbData); }
delete pInd;
return(TRUE); }
return(FALSE); }
BOOL CatalogEncodeIndirectData(CRYPTCATSTORE *pCat, CRYPTCATMEMBER *pMember, PCRYPT_ATTRIBUTE pCryptAttr) { if (!(pCryptAttr->rgValue = (PCRYPT_ATTR_BLOB)CatalogNew(sizeof(CRYPT_ATTR_BLOB)))) { return(FALSE); }
pCryptAttr->cValue = 1;
memset(pCryptAttr->rgValue, 0x00, sizeof(CRYPT_ATTR_BLOB));
if (!(pMember->pIndirectData)) { return(FALSE); }
pCryptAttr->pszObjId = SPC_INDIRECT_DATA_OBJID;
DWORD cbEncoded;
cbEncoded = 0;
CryptEncodeObject(pCat->dwEncodingType, pCryptAttr->pszObjId, pMember->pIndirectData, NULL, &cbEncoded);
if (cbEncoded > 0) { if (!(pCryptAttr->rgValue->pbData = (BYTE *)CatalogNew(cbEncoded))) { return(FALSE); }
pCryptAttr->rgValue->cbData = cbEncoded;
if (!(CryptEncodeObject(pCat->dwEncodingType, pCryptAttr->pszObjId, pMember->pIndirectData, pCryptAttr->rgValue->pbData, &cbEncoded))) { return(FALSE); }
return(TRUE); }
return(FALSE); }
|