|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: mscatapi.cpp
//
// Contents: Microsoft Internet Security Catalog Utilities
//
// Functions: CryptCATOpen
// CryptCATClose
// CryptCATStoreFromHandle
// CryptCATGetMemberInfo
// CryptCATPutMemberInfo
// CryptCATVerifyMember
// CryptCATGetAttrInfo
// CryptCATPutAttrInfo
// CryptCATEnumerateMember
// CryptCATEnumerateAttr
//
// *** local functions ***
//
// CryptCATCreateStore
// CryptCATOpenStore
// FillNameValue
// CatalogCheckForDuplicateMember
//
// History: 29-Apr-1997 pberkman created
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include "mscat32.h"
BOOL CryptCATCreateStore(CRYPTCATSTORE *pCat, LPWSTR pwszCatFile); BOOL CryptCATOpenStore(CRYPTCATSTORE *pCat, LPWSTR pwszCatFile); BOOL FillNameValue(CRYPTCATSTORE *pCatStore, CRYPTCATATTRIBUTE *pAttr); BOOL CatalogCheckForDuplicateMember(Stack_ *pMembers, WCHAR *pwszReferenceTag);
/////////////////////////////////////////////////////////////////////////////
//
// Exported Functions
//
HANDLE WINAPI CryptCATOpen(LPWSTR pwszCatFile, DWORD fdwOpenFlags, HCRYPTPROV hProv, DWORD dwPublicVersion, DWORD dwEncodingType) { CRYPTCATSTORE *pCatStore; if (!(pwszCatFile)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return((HANDLE)INVALID_HANDLE_VALUE); }
if (!(pCatStore = (CRYPTCATSTORE *)CatalogNew(sizeof(CRYPTCATSTORE)))) { return((HANDLE)INVALID_HANDLE_VALUE); }
memset(pCatStore, 0x00, sizeof(CRYPTCATSTORE));
pCatStore->cbStruct = sizeof(CRYPTCATSTORE); pCatStore->hProv = hProv; pCatStore->dwPublicVersion = (dwPublicVersion) ? dwPublicVersion : 0x00000100; pCatStore->dwEncodingType = (dwEncodingType) ? dwEncodingType : PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
if (!(hProv)) { pCatStore->hProv = I_CryptGetDefaultCryptProv(0); // get the default and DONT RELEASE IT!!!!
if (!(pCatStore->hProv)) { goto ErrorReturn; } }
if (fdwOpenFlags & CRYPTCAT_OPEN_CREATENEW) { if (!CryptCATCreateStore(pCatStore, pwszCatFile)) { goto ErrorReturn; } } else { BOOL fRet;
fRet = CryptCATOpenStore(pCatStore, pwszCatFile); if (!(fRet) && (fdwOpenFlags & CRYPTCAT_OPEN_ALWAYS)) { fRet = CryptCATCreateStore(pCatStore, pwszCatFile); }
if (fRet == FALSE) { goto ErrorReturn; } }
return((HANDLE)pCatStore); ErrorReturn:
DWORD dwLastError;
dwLastError = GetLastError(); CryptCATClose((HANDLE)pCatStore); SetLastError(dwLastError);
return(INVALID_HANDLE_VALUE); }
BOOL WINAPI CryptCATClose(HANDLE hCatalog) { if (!(hCatalog) || (hCatalog == INVALID_HANDLE_VALUE)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
__try { if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); } } __except(EXCEPTION_EXECUTE_HANDLER) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); }
BOOL fRet; DWORD dwlerr;
dwlerr = GetLastError();
fRet = TRUE;
//
// file name
//
DELETE_OBJECT(pCatStore->pwszP7File);
//
// attributes
//
if (_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hAttrs)) { if (pCatStore->hAttrs) { Stack_ *ps; DWORD cStack; CRYPTCATATTRIBUTE *pAttr; ps = (Stack_ *)pCatStore->hAttrs; cStack = 0;
while (pAttr = (CRYPTCATATTRIBUTE *)ps->Get(cStack)) { CatalogFreeAttribute(pAttr);
cStack++; } DELETE_OBJECT(ps); pCatStore->hAttrs = NULL; } }
//
// check hReserved to see if we used pStack
//
if (pCatStore->hReserved) { Stack_ *pStack; CRYPTCATMEMBER *pCatMember; DWORD dwCurPos;
pStack = (Stack_ *)pCatStore->hReserved;
dwCurPos = 0;
while (pCatMember = (CRYPTCATMEMBER *)pStack->Get(dwCurPos)) { CatalogFreeMember(pCatMember); dwCurPos++; }
DELETE_OBJECT(pStack);
pCatStore->hReserved = NULL; }
pCatStore->cbStruct = 0; // just in case they try to re-open it!
DELETE_OBJECT(pCatStore);
//
// restore last error
//
SetLastError(dwlerr);
return(fRet); }
CRYPTCATSTORE * WINAPI CryptCATStoreFromHandle(IN HANDLE hCatalog) { return((CRYPTCATSTORE *)hCatalog); }
HANDLE WINAPI CryptCATHandleFromStore(IN CRYPTCATSTORE *pCatStore) { return((HANDLE)pCatStore); }
BOOL WINAPI CryptCATPersistStore(IN HANDLE hCatalog) { CRYPTCATSTORE *pStore;
if (!(hCatalog) || (hCatalog == INVALID_HANDLE_VALUE)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); }
pStore = CryptCATStoreFromHandle(hCatalog);
if (!(pStore->pwszP7File)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); }
return(CatalogSaveP7UData(pStore)); }
CRYPTCATATTRIBUTE * WINAPI CryptCATGetCatAttrInfo(HANDLE hCatalog, LPWSTR pwszReferenceTag) { CRYPTCATATTRIBUTE *pAttr; CRYPTCATSTORE *pCatStore;
pAttr = NULL;
if (!(hCatalog) || (hCatalog == INVALID_HANDLE_VALUE) || !(pwszReferenceTag)) { goto ErrorInvalidParam; }
pCatStore = CryptCATStoreFromHandle(hCatalog);
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hAttrs))) { goto ErrorInvalidParam; }
while (pAttr = CryptCATEnumerateCatAttr(hCatalog, pAttr)) { if (pAttr->pwszReferenceTag) { if (_wcsicmp(pwszReferenceTag, pAttr->pwszReferenceTag) == 0) { goto CommonReturn; } } }
goto ErrorNotFound;
CommonReturn: ErrorReturn: return(pAttr);
SET_ERROR_VAR_EX(DBG_SS, ErrorInvalidParam, ERROR_INVALID_PARAMETER); SET_ERROR_VAR_EX(DBG_SS, ErrorNotFound, CRYPT_E_NOT_FOUND); }
CRYPTCATATTRIBUTE * WINAPI CryptCATPutCatAttrInfo(HANDLE hCatalog, LPWSTR pwszReferenceTag, DWORD dwAttrTypeAndAction, DWORD cbData, BYTE *pbData) { CRYPTCATATTRIBUTE *pAttr;
pAttr = NULL;
if (!(hCatalog) || (hCatalog == INVALID_HANDLE_VALUE) || !(pwszReferenceTag) || ((cbData > 0) && !(pbData))) { goto ErrorInvalidParam; }
if (!(dwAttrTypeAndAction & CRYPTCAT_ATTR_DATABASE64) && !(dwAttrTypeAndAction & CRYPTCAT_ATTR_DATAASCII) && !(dwAttrTypeAndAction & CRYPTCAT_ATTR_DATAREPLACE)) { goto ErrorInvalidParam; }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hAttrs))) { goto ErrorInvalidParam; }
Stack_ *pStack;
if (!(pCatStore->hAttrs)) { pStack = new Stack_(&MSCAT_CriticalSection);
if (!(pStack)) { goto ErrorMemory; }
pCatStore->hAttrs = (HANDLE)pStack; }
pStack = (Stack_ *)pCatStore->hAttrs;
if (!(dwAttrTypeAndAction & CRYPTCAT_ATTR_DATAREPLACE)) { if (!(pAttr = (CRYPTCATATTRIBUTE *)pStack->Add(sizeof(CRYPTCATATTRIBUTE)))) { goto StackError; }
memset(pAttr, 0x00, sizeof(CRYPTCATATTRIBUTE));
pAttr->cbStruct = sizeof(CRYPTCATATTRIBUTE);
if (!(pAttr->pwszReferenceTag = (LPWSTR)CatalogNew((wcslen(pwszReferenceTag) + 1) * sizeof(WCHAR)))) { goto ErrorMemory; }
wcscpy(pAttr->pwszReferenceTag, pwszReferenceTag);
pAttr->dwAttrTypeAndAction = dwAttrTypeAndAction;
if (pbData) { if (dwAttrTypeAndAction & CRYPTCAT_ATTR_DATABASE64) { CryptStringToBinaryW((WCHAR *)pbData, cbData / sizeof(WCHAR), CRYPT_STRING_ANY, NULL, &pAttr->cbValue, NULL, NULL);
if (pAttr->cbValue < 1) { goto DecodeError; }
if (!(pAttr->pbValue = (BYTE *)CatalogNew(pAttr->cbValue))) { pAttr->cbValue = 0; goto ErrorMemory; }
if (!CryptStringToBinaryW((WCHAR *)pbData, cbData / sizeof(WCHAR), CRYPT_STRING_ANY, pAttr->pbValue, &pAttr->cbValue, NULL, NULL)) { goto DecodeError; } } else if (dwAttrTypeAndAction & CRYPTCAT_ATTR_DATAASCII) { if (!(pAttr->pbValue = (BYTE *)CatalogNew(cbData))) { goto ErrorMemory; }
memcpy(pAttr->pbValue, pbData, cbData); pAttr->cbValue = cbData; } } } else { DWORD pos = 0; pAttr = (CRYPTCATATTRIBUTE *) pStack->Get(pos++, NULL); while ((pAttr != NULL) && (wcscmp(pAttr->pwszReferenceTag, pwszReferenceTag) != 0)) { pAttr = (CRYPTCATATTRIBUTE *) pStack->Get(pos++, NULL); } if (pAttr != NULL) { DELETE_OBJECT(pAttr->pbValue); pAttr->pbValue = NULL; pAttr->cbValue = 0;
if (!(pAttr->pbValue = (BYTE *)CatalogNew(cbData))) { goto ErrorMemory; }
memcpy(pAttr->pbValue, pbData, cbData); pAttr->cbValue = cbData; } }
// CommonReturn:
ErrorReturn: return(pAttr);
TRACE_ERROR_EX(DBG_SS, StackError); TRACE_ERROR_EX(DBG_SS, DecodeError);
SET_ERROR_VAR_EX(DBG_SS, ErrorMemory, ERROR_NOT_ENOUGH_MEMORY); SET_ERROR_VAR_EX(DBG_SS, ErrorInvalidParam, ERROR_INVALID_PARAMETER); }
CRYPTCATATTRIBUTE * WINAPI CryptCATEnumerateCatAttr(HANDLE hCatalog, CRYPTCATATTRIBUTE *pPrevAttr) { CRYPTCATATTRIBUTE *pAttr;
pAttr = NULL;
if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE)) { goto ErrorInvalidParam; }
CRYPTCATSTORE *pStore;
pStore = CryptCATStoreFromHandle(hCatalog);
if (!(_ISINSTRUCT(CRYPTCATSTORE, pStore->cbStruct, hAttrs))) { goto ErrorInvalidParam; }
DWORD dwNext;
dwNext = 0;
if (pPrevAttr) { if (!(_ISINSTRUCT(CRYPTCATATTRIBUTE, pPrevAttr->cbStruct, dwReserved))) { goto ErrorInvalidParam; }
dwNext = pPrevAttr->dwReserved + 1; }
if (pStore->hAttrs) { Stack_ *ps;
ps = (Stack_ *)pStore->hAttrs;
if (pAttr = (CRYPTCATATTRIBUTE *)ps->Get(dwNext)) { //
// save our "id" for next time
//
pAttr->dwReserved = dwNext;
//
// Done!
//
goto CommonReturn; } }
goto ErrorNotFound;
CommonReturn: ErrorReturn: return(pAttr);
SET_ERROR_VAR_EX(DBG_SS, ErrorInvalidParam, ERROR_INVALID_PARAMETER); SET_ERROR_VAR_EX(DBG_SS, ErrorNotFound, CRYPT_E_NOT_FOUND); }
CRYPTCATMEMBER * WINAPI CryptCATGetMemberInfo(IN HANDLE hCatalog, IN LPWSTR pwszReferenceTag) { if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE) || !(pwszReferenceTag)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
CRYPTCATSTORE *pCatStore; CRYPTCATMEMBER *pCatMember;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
pCatMember = NULL;
if (pCatStore->hReserved) { Stack_ *ps;
ps = (Stack_ *)pCatStore->hReserved;
if (pCatMember = (CRYPTCATMEMBER *)ps->Get(WVT_OFFSETOF(CRYPTCATMEMBER, pwszReferenceTag), sizeof(WCHAR *), STACK_SORTTYPE_PWSZ, pwszReferenceTag)) { if (!(pCatMember->pIndirectData)) { CatalogReallyDecodeIndirectData(pCatStore, pCatMember, &pCatMember->sEncodedIndirectData); }
if ((pCatMember->gSubjectType.Data1 == 0) && (pCatMember->gSubjectType.Data2 == 0) && (pCatMember->gSubjectType.Data3 == 0)) { CatalogReallyDecodeMemberInfo(pCatStore, pCatMember, &pCatMember->sEncodedMemberInfo); }
return(pCatMember); } }
return(NULL); }
CRYPTCATMEMBER * WINAPI CryptCATPutMemberInfo(HANDLE hCatalog, LPWSTR pwszFileName, LPWSTR pwszReferenceTag, GUID *pgSubjectType, DWORD dwCertVersion, DWORD cbIndirectData, BYTE *pbIndirectData)
{ if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE) || !(pwszReferenceTag) || !(pgSubjectType) || !(pbIndirectData) || (wcslen(pwszReferenceTag) > CRYPTCAT_MAX_MEMBERTAG)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
Stack_ *pStack; CRYPTCATMEMBER *pCatMember;
if (!(pCatStore->hReserved)) { pStack = new Stack_(&MSCAT_CriticalSection);
if (!(pStack)) { assert(0); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return(NULL); }
pCatStore->hReserved = (HANDLE)pStack; }
//
// the following is commented out -- too slow!!!!
//
// else if (CatalogCheckForDuplicateMember((Stack_ *)pCatStore->hReserved, pwszReferenceTag))
// {
// SetLastError(CRYPT_E_EXISTS);
// return(NULL);
// }
pStack = (Stack_ *)pCatStore->hReserved;
if (!(pCatMember = (CRYPTCATMEMBER *)pStack->Add(sizeof(CRYPTCATMEMBER)))) { return(NULL); }
memset(pCatMember, 0x00, sizeof(CRYPTCATMEMBER));
pCatMember->cbStruct = sizeof(CRYPTCATMEMBER);
if (pwszFileName) { if (!(pCatMember->pwszFileName = (LPWSTR)CatalogNew((wcslen(pwszFileName) + 1) * sizeof(WCHAR)))) { return(NULL); }
wcscpy(pCatMember->pwszFileName, pwszFileName); }
if (!(pCatMember->pwszReferenceTag = (LPWSTR)CatalogNew((wcslen(pwszReferenceTag) + 1) * sizeof(WCHAR)))) { return(NULL); }
wcscpy(pCatMember->pwszReferenceTag, pwszReferenceTag);
if (cbIndirectData > 0) { SIP_INDIRECT_DATA *pInd;
if (!(pCatMember->pIndirectData = (SIP_INDIRECT_DATA *)CatalogNew(sizeof(SIP_INDIRECT_DATA)))) { return(NULL); }
memset(pCatMember->pIndirectData, 0x00, sizeof(SIP_INDIRECT_DATA));
pInd = (SIP_INDIRECT_DATA *)pbIndirectData;
if (pInd->Data.pszObjId) { if (!(pCatMember->pIndirectData->Data.pszObjId = (LPSTR)CatalogNew(strlen(pInd->Data.pszObjId) + 1))) { return(NULL); } strcpy(pCatMember->pIndirectData->Data.pszObjId, pInd->Data.pszObjId); }
if (pInd->Data.Value.cbData > 0) { if (!(pCatMember->pIndirectData->Data.Value.pbData = (BYTE *)CatalogNew(pInd->Data.Value.cbData))) { return(NULL); } memcpy(pCatMember->pIndirectData->Data.Value.pbData, pInd->Data.Value.pbData, pInd->Data.Value.cbData); }
pCatMember->pIndirectData->Data.Value.cbData = pInd->Data.Value.cbData;
if (!(pCatMember->pIndirectData->DigestAlgorithm.pszObjId = (LPSTR)CatalogNew(strlen(pInd->DigestAlgorithm.pszObjId) + 1))) { return(NULL); } strcpy(pCatMember->pIndirectData->DigestAlgorithm.pszObjId, pInd->DigestAlgorithm.pszObjId);
if (!(pCatMember->pIndirectData->Digest.pbData = (BYTE *)CatalogNew(pInd->Digest.cbData))) { return(NULL); } memcpy(pCatMember->pIndirectData->Digest.pbData, pInd->Digest.pbData, pInd->Digest.cbData); pCatMember->pIndirectData->Digest.cbData = pInd->Digest.cbData; }
memcpy(&pCatMember->gSubjectType, pgSubjectType, sizeof(GUID));
pCatMember->dwCertVersion = dwCertVersion;
return(pCatMember); }
BOOL WINAPI CryptCATVerifyMember(HANDLE hCatalog, CRYPTCATMEMBER *pCatMember, HANDLE hFileOrMemory) { if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE) || !(pCatMember) || !(_ISINSTRUCT(CRYPTCATMEMBER, pCatMember->cbStruct, hReserved)) || !(hFileOrMemory) || (hFileOrMemory == INVALID_HANDLE_VALUE)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(FALSE); }
// TBDTBD!!!
return(FALSE); }
CRYPTCATATTRIBUTE * WINAPI CryptCATGetAttrInfo(HANDLE hCatalog, CRYPTCATMEMBER *pCatMember, LPWSTR pwszReferenceTag) { if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE) || !(pCatMember) || !(_ISINSTRUCT(CRYPTCATMEMBER, pCatMember->cbStruct, hReserved)) || !(pwszReferenceTag)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
CRYPTCATSTORE *pCatStore; CRYPTCATATTRIBUTE *pCatAttr;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
pCatAttr = NULL;
while (pCatAttr = CryptCATEnumerateAttr(hCatalog, pCatMember, pCatAttr)) { if (pCatAttr->pwszReferenceTag) { if (_wcsicmp(pwszReferenceTag, pCatAttr->pwszReferenceTag) == 0) { return(pCatAttr); } } }
SetLastError(CRYPT_E_NOT_FOUND);
return(NULL); }
CRYPTCATATTRIBUTE * WINAPI CryptCATPutAttrInfo(HANDLE hCatalog, CRYPTCATMEMBER *pCatMember, LPWSTR pwszReferenceTag, DWORD dwAttrTypeAndAction, DWORD cbData, BYTE *pbData) { if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE) || !(pCatMember) || !(_ISINSTRUCT(CRYPTCATMEMBER, pCatMember->cbStruct, hReserved)) || !(pwszReferenceTag) || ((cbData > 0) && !(pbData))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
if (!(dwAttrTypeAndAction & CRYPTCAT_ATTR_DATABASE64) && !(dwAttrTypeAndAction & CRYPTCAT_ATTR_DATAASCII)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
Stack_ *pStack; CRYPTCATATTRIBUTE *pAttr;
if (!(pCatMember->hReserved)) { pStack = new Stack_(&MSCAT_CriticalSection);
if (!(pStack)) { assert(0); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return(NULL); }
pCatMember->hReserved = (HANDLE)pStack; }
pStack = (Stack_ *)pCatMember->hReserved;
if (!(pAttr = (CRYPTCATATTRIBUTE *)pStack->Add(sizeof(CRYPTCATATTRIBUTE)))) { return(NULL); }
memset(pAttr, 0x00, sizeof(CRYPTCATATTRIBUTE));
pAttr->cbStruct = sizeof(CRYPTCATATTRIBUTE);
if (!(pAttr->pwszReferenceTag = (LPWSTR)CatalogNew((wcslen(pwszReferenceTag) + 1) * sizeof(WCHAR)))) { return(NULL); }
wcscpy(pAttr->pwszReferenceTag, pwszReferenceTag);
pAttr->dwAttrTypeAndAction = dwAttrTypeAndAction;
if (pbData) { if (dwAttrTypeAndAction & CRYPTCAT_ATTR_DATABASE64) { CryptStringToBinaryW((WCHAR *)pbData, cbData / sizeof(WCHAR), CRYPT_STRING_ANY, NULL, &pAttr->cbValue, NULL, NULL);
if (pAttr->cbValue < 1) { return(NULL); }
if (!(pAttr->pbValue = (BYTE *)CatalogNew(pAttr->cbValue))) { pAttr->cbValue = 0; return(NULL); }
memset(pAttr->pbValue, 0x00, pAttr->cbValue);
if (!CryptStringToBinaryW((WCHAR *)pbData, cbData / sizeof(WCHAR), CRYPT_STRING_ANY, pAttr->pbValue, &pAttr->cbValue, NULL, NULL)) { return(NULL); } } else if (dwAttrTypeAndAction & CRYPTCAT_ATTR_DATAASCII) { if (!(pAttr->pbValue = (BYTE *)CatalogNew(cbData))) { return(NULL); }
memcpy(pAttr->pbValue, pbData, cbData); pAttr->cbValue = cbData; } }
return(pAttr); }
CRYPTCATMEMBER * WINAPI CryptCATEnumerateMember(HANDLE hCatalog, CRYPTCATMEMBER *pPrevMember) { if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
DWORD dwNext;
dwNext = 0;
if (pPrevMember) { if (!(_ISINSTRUCT(CRYPTCATMEMBER, pPrevMember->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
dwNext = pPrevMember->dwReserved + 1; }
if (pCatStore->hReserved) { CRYPTCATMEMBER *pCatMember; Stack_ *ps;
ps = (Stack_ *)pCatStore->hReserved;
if (pCatMember = (CRYPTCATMEMBER *)ps->Get(dwNext)) { //
// save our "id" for next time
//
pCatMember->dwReserved = dwNext;
if (!(pCatMember->pIndirectData)) { CatalogReallyDecodeIndirectData(pCatStore, pCatMember, &pCatMember->sEncodedIndirectData); }
if ((pCatMember->gSubjectType.Data1 == 0) && (pCatMember->gSubjectType.Data2 == 0) && (pCatMember->gSubjectType.Data3 == 0)) { CatalogReallyDecodeMemberInfo(pCatStore, pCatMember, &pCatMember->sEncodedMemberInfo); }
//
// Done!
//
return(pCatMember); } }
return(NULL); }
CRYPTCATATTRIBUTE * WINAPI CryptCATEnumerateAttr(HANDLE hCatalog, CRYPTCATMEMBER *pCatMember, CRYPTCATATTRIBUTE *pPrevAttr) { if (!(hCatalog) || (hCatalog == (HANDLE)INVALID_HANDLE_VALUE)) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
CRYPTCATSTORE *pCatStore;
pCatStore = (CRYPTCATSTORE *)hCatalog;
if (!(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
DWORD dwNext;
dwNext = 0;
if (pPrevAttr) { if (!(_ISINSTRUCT(CRYPTCATATTRIBUTE, pPrevAttr->cbStruct, dwReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
dwNext = pPrevAttr->dwReserved + 1; }
if (!(pCatStore) || !(_ISINSTRUCT(CRYPTCATSTORE, pCatStore->cbStruct, hReserved)) || !(pCatMember) || !(_ISINSTRUCT(CRYPTCATMEMBER, pCatMember->cbStruct, hReserved))) { SetLastError((DWORD)ERROR_INVALID_PARAMETER); return(NULL); }
if (pCatMember->hReserved) { CRYPTCATATTRIBUTE *pCatAttr; Stack_ *ps;
ps = (Stack_ *)pCatMember->hReserved;
if (pCatAttr = (CRYPTCATATTRIBUTE *)ps->Get(dwNext)) { //
// save our "id" for next time
//
pCatAttr->dwReserved = dwNext;
//
// Done!
//
return(pCatAttr); } }
return(NULL); }
/////////////////////////////////////////////////////////////////////////////
//
// Local Functions
//
BOOL CryptCATCreateStore(CRYPTCATSTORE *pCatStore, LPWSTR pwszCatFile) { HANDLE hFile; DWORD lErr;
lErr = GetLastError();
if ((hFile = CreateFileU(pwszCatFile, GENERIC_WRITE | GENERIC_READ, 0, // no sharing!!
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { return(FALSE); }
CloseHandle(hFile);
SetLastError(lErr);
return(CryptCATOpenStore(pCatStore, pwszCatFile)); } BOOL CryptCATOpenStore(CRYPTCATSTORE *pCatStore, LPWSTR pwszCatFile) { if (!(pCatStore->pwszP7File = (LPWSTR)CatalogNew((wcslen(pwszCatFile) + 1) * sizeof(WCHAR)))) { return(FALSE); }
wcscpy(pCatStore->pwszP7File, pwszCatFile);
return(CatalogLoadFileData(pCatStore)); }
|