You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
350 lines
9.2 KiB
350 lines
9.2 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: NameVal.cpp
|
|
//
|
|
// Contents: Microsoft Internet Security Catalog Utilities
|
|
// implements the Certificate Trust List & persistent storage
|
|
//
|
|
// Functions: CatalogEncodeNameValue
|
|
// CatalogDecodeNameValue
|
|
// CatalogCertExt2CryptAttr
|
|
// CatalogCryptAttr2CertExt
|
|
//
|
|
// *** local functions ***
|
|
// EncodeUserOID
|
|
// DecodeUserOID
|
|
//
|
|
// History: 16-May-1997 pberkman created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "global.hxx"
|
|
#include "mscat32.h"
|
|
|
|
|
|
BOOL EncodeUserOID(CRYPTCATSTORE *pCatStore, CAT_NAMEVALUE *pNameValue);
|
|
BOOL DecodeUserOID(CRYPTCATSTORE *pCatStore, CAT_NAMEVALUE *pNV, BYTE **ppbUserOIDDecode,
|
|
DWORD *pcbUserOIDDecode);
|
|
|
|
void CatalogCertExt2CryptAttr(CERT_EXTENSION *pCertExt, CRYPT_ATTRIBUTE *pCryptAttr)
|
|
{
|
|
memset(pCryptAttr, 0x00, sizeof(CRYPT_ATTRIBUTE));
|
|
|
|
pCryptAttr->pszObjId = pCertExt->pszObjId;
|
|
pCryptAttr->cValue = 1;
|
|
pCryptAttr->rgValue = &pCertExt->Value;
|
|
}
|
|
|
|
void CatalogCryptAttr2CertExt(CRYPT_ATTRIBUTE *pCryptAttr, CERT_EXTENSION *pCertExt)
|
|
{
|
|
memset(pCertExt, 0x00, sizeof(CERT_EXTENSION));
|
|
|
|
pCertExt->pszObjId = pCryptAttr->pszObjId;
|
|
pCertExt->fCritical = FALSE;
|
|
|
|
if ((pCryptAttr->cValue) && (pCryptAttr->rgValue))
|
|
{
|
|
memcpy(&pCertExt->Value, &pCryptAttr->rgValue[0], sizeof(CRYPT_ATTR_BLOB));
|
|
}
|
|
}
|
|
|
|
BOOL CatalogEncodeNameValue(CRYPTCATSTORE *pCatStore, CRYPTCATATTRIBUTE *pAttr,
|
|
PCRYPT_ATTRIBUTE pCryptAttr)
|
|
{
|
|
CAT_NAMEVALUE sNV;
|
|
|
|
memset(&sNV, 0x00, sizeof(CAT_NAMEVALUE));
|
|
|
|
sNV.pwszTag = pAttr->pwszReferenceTag;
|
|
sNV.fdwFlags = pAttr->dwAttrTypeAndAction;
|
|
sNV.Value.cbData = pAttr->cbValue;
|
|
|
|
if (!(sNV.Value.pbData = (BYTE *)CatalogNew(sNV.Value.cbData)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
memcpy(sNV.Value.pbData, pAttr->pbValue, sNV.Value.cbData);
|
|
|
|
if (pAttr->dwAttrTypeAndAction & CRYPTCAT_ATTR_NAMEOBJID)
|
|
{
|
|
if (!(EncodeUserOID(pCatStore, &sNV)))
|
|
{
|
|
delete sNV.Value.pbData;
|
|
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
pCryptAttr->pszObjId = CAT_NAMEVALUE_OBJID;
|
|
|
|
pCryptAttr->rgValue->cbData = 0;
|
|
|
|
CryptEncodeObject(pCatStore->dwEncodingType,
|
|
pCryptAttr->pszObjId,
|
|
&sNV,
|
|
NULL,
|
|
&pCryptAttr->rgValue->cbData);
|
|
|
|
if (pCryptAttr->rgValue->cbData > 0)
|
|
{
|
|
if (!(pCryptAttr->rgValue->pbData = (BYTE *)CatalogNew(pCryptAttr->rgValue->cbData)))
|
|
{
|
|
delete sNV.Value.pbData;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(CryptEncodeObject(pCatStore->dwEncodingType,
|
|
pCryptAttr->pszObjId,
|
|
&sNV,
|
|
pCryptAttr->rgValue->pbData,
|
|
&pCryptAttr->rgValue->cbData)))
|
|
{
|
|
delete sNV.Value.pbData;
|
|
|
|
DELETE_OBJECT(pCryptAttr->rgValue->pbData);
|
|
|
|
pCryptAttr->rgValue->cbData = 0;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
delete sNV.Value.pbData;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
delete sNV.Value.pbData;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
BOOL CatalogDecodeNameValue(CRYPTCATSTORE *pCatStore, PCRYPT_ATTRIBUTE pCryptAttr,
|
|
CRYPTCATATTRIBUTE *pCatAttr)
|
|
{
|
|
CAT_NAMEVALUE *pNV;
|
|
DWORD cbDecoded;
|
|
|
|
cbDecoded = 0;
|
|
|
|
|
|
CryptDecodeObject( pCatStore->dwEncodingType,
|
|
CAT_NAMEVALUE_STRUCT,
|
|
pCryptAttr->rgValue->pbData,
|
|
pCryptAttr->rgValue->cbData,
|
|
0,
|
|
NULL,
|
|
&cbDecoded);
|
|
|
|
if (cbDecoded > 0)
|
|
{
|
|
if (!(pNV = (CAT_NAMEVALUE *)CatalogNew(cbDecoded)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(CryptDecodeObject( pCatStore->dwEncodingType,
|
|
CAT_NAMEVALUE_STRUCT,
|
|
pCryptAttr->rgValue->pbData,
|
|
pCryptAttr->rgValue->cbData,
|
|
0,
|
|
pNV,
|
|
&cbDecoded)))
|
|
{
|
|
delete pNV;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(pCatAttr->pwszReferenceTag = (LPWSTR)CatalogNew((wcslen(pNV->pwszTag) + 1) * sizeof(WCHAR))))
|
|
{
|
|
delete pNV;
|
|
|
|
return(FALSE);
|
|
}
|
|
wcscpy(pCatAttr->pwszReferenceTag, pNV->pwszTag);
|
|
|
|
pCatAttr->dwAttrTypeAndAction = pNV->fdwFlags;
|
|
|
|
if (pCatAttr->dwAttrTypeAndAction & CRYPTCAT_ATTR_NAMEOBJID)
|
|
{
|
|
DWORD cbUserOIDDecode;
|
|
BYTE *pbUserOIDDecode;
|
|
|
|
if (!(DecodeUserOID(pCatStore, pNV, &pbUserOIDDecode, &cbUserOIDDecode)))
|
|
{
|
|
delete pNV;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
delete pNV;
|
|
|
|
pCatAttr->pbValue = pbUserOIDDecode;
|
|
pCatAttr->cbValue = cbUserOIDDecode;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
if (!(pCatAttr->pbValue = (BYTE *)CatalogNew(pNV->Value.cbData)))
|
|
{
|
|
delete pNV;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
memcpy(pCatAttr->pbValue, pNV->Value.pbData, pNV->Value.cbData);
|
|
pCatAttr->cbValue = pNV->Value.cbData;
|
|
|
|
delete pNV;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
BOOL EncodeUserOID(CRYPTCATSTORE *pCatStore, CAT_NAMEVALUE *pNameValue)
|
|
{
|
|
DWORD cbEncoded;
|
|
BYTE *pbEncoded;
|
|
DWORD cbConv;
|
|
LPSTR pszObjId;
|
|
|
|
pbEncoded = NULL;
|
|
|
|
cbConv = WideCharToMultiByte(0, 0,
|
|
pNameValue->pwszTag, wcslen(pNameValue->pwszTag) + 1,
|
|
NULL, 0, NULL, NULL);
|
|
if (cbConv < 1)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(pszObjId = (LPSTR)CatalogNew(cbConv + 1)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
WideCharToMultiByte(0, 0,
|
|
pNameValue->pwszTag, wcslen(pNameValue->pwszTag) + 1,
|
|
pszObjId, cbConv, NULL, NULL);
|
|
|
|
pszObjId[cbConv] = NULL;
|
|
|
|
cbEncoded = 0;
|
|
|
|
CryptEncodeObject(pCatStore->dwEncodingType,
|
|
pszObjId,
|
|
pNameValue->Value.pbData,
|
|
NULL,
|
|
&cbEncoded);
|
|
|
|
if (cbEncoded > 0)
|
|
{
|
|
if (!(pbEncoded = (BYTE *)CatalogNew(cbEncoded)))
|
|
{
|
|
delete pszObjId;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(CryptEncodeObject(pCatStore->dwEncodingType,
|
|
pszObjId,
|
|
pNameValue->Value.pbData,
|
|
pbEncoded,
|
|
&cbEncoded)))
|
|
{
|
|
delete pszObjId;
|
|
|
|
delete pbEncoded;
|
|
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
delete pszObjId;
|
|
|
|
DELETE_OBJECT(pNameValue->Value.pbData);
|
|
|
|
pNameValue->Value.pbData = pbEncoded;
|
|
pNameValue->Value.cbData = cbEncoded;
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
BOOL DecodeUserOID(CRYPTCATSTORE *pCatStore, CAT_NAMEVALUE *pNV, BYTE **ppbUserOIDDecode,
|
|
DWORD *pcbUserOIDDecode)
|
|
{
|
|
*ppbUserOIDDecode = NULL;
|
|
*pcbUserOIDDecode = 0;
|
|
|
|
DWORD cbConv;
|
|
LPSTR pszObjId;
|
|
|
|
cbConv = WideCharToMultiByte(0, 0,
|
|
pNV->pwszTag, wcslen(pNV->pwszTag) + 1,
|
|
NULL, 0, NULL, NULL);
|
|
if (cbConv < 1)
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(pszObjId = (LPSTR)CatalogNew(cbConv + 1)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
WideCharToMultiByte(0, 0,
|
|
pNV->pwszTag, wcslen(pNV->pwszTag) + 1,
|
|
pszObjId, cbConv, NULL, NULL);
|
|
|
|
pszObjId[cbConv] = NULL;
|
|
|
|
CryptDecodeObject(pCatStore->dwEncodingType,
|
|
pszObjId,
|
|
pNV->Value.pbData,
|
|
pNV->Value.cbData,
|
|
0,
|
|
NULL,
|
|
pcbUserOIDDecode);
|
|
|
|
if (*pcbUserOIDDecode > 0)
|
|
{
|
|
if (!(*ppbUserOIDDecode = (BYTE *)CatalogNew(*pcbUserOIDDecode)))
|
|
{
|
|
delete pszObjId;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(CryptDecodeObject(pCatStore->dwEncodingType,
|
|
pszObjId,
|
|
pNV->Value.pbData,
|
|
pNV->Value.cbData,
|
|
0,
|
|
*ppbUserOIDDecode,
|
|
pcbUserOIDDecode)))
|
|
{
|
|
delete pszObjId;
|
|
|
|
DELETE_OBJECT(*ppbUserOIDDecode);
|
|
*pcbUserOIDDecode = 0;
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
delete pszObjId;
|
|
|
|
return(FALSE);
|
|
|
|
}
|