|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: ossfunc.cpp
//
//--------------------------------------------------------------------------
#include "global.hxx"
extern "C" { #include "wtasn.h"
} #include "crypttls.h"
#include "unicode.h"
#include "pkiasn1.h"
#include <dbgdef.h>
#include "locals.h"
#define SpcAsnAlloc WVTNew
#define SpcAsnFree WVTDelete
// All the *pvInfo extra stuff needs to be aligned
#define INFO_LEN_ALIGN(Len) ((Len + 7) & ~7)
static const BYTE NullDer[2] = {0x05, 0x00}; static const CRYPT_OBJID_BLOB NullDerBlob = {2, (BYTE *)&NullDer[0]};
static HCRYPTASN1MODULE hAsn1Module;
extern "C" { BOOL WINAPI WVTAsn1SpcLinkEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_LINK pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcLinkDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_LINK pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcIndirectDataContentEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_INDIRECT_DATA_CONTENT pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcIndirectDataContentDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_INDIRECT_DATA_CONTENT pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcSpAgencyInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_SP_AGENCY_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcSpAgencyInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_SP_AGENCY_INFO pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcMinimalCriteriaInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN BOOL *pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcMinimalCriteriaInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT BOOL *pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_FINANCIAL_CRITERIA pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_FINANCIAL_CRITERIA pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcStatementTypeEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_STATEMENT_TYPE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcStatementTypeDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_STATEMENT_TYPE pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcSpOpusInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_SP_OPUS_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_SP_OPUS_INFO pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcPeImageDataEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_PE_IMAGE_DATA pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcPeImageDataDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_PE_IMAGE_DATA pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1SpcSigInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_SIGINFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ); BOOL WINAPI WVTAsn1SpcSigInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_SIGINFO pInfo, IN OUT DWORD *pcbInfo ); BOOL WINAPI WVTAsn1UtcTimeDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT FILETIME * pFileTime, IN OUT DWORD *pcbFileTime );
BOOL WINAPI WVTAsn1CatNameValueEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCAT_NAMEVALUE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded);
BOOL WINAPI WVTAsn1CatMemberInfoEncode( IN DWORD dwEncoding, IN LPCSTR lpszStructType, IN PCAT_MEMBERINFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded);
BOOL WINAPI WVTAsn1CatNameValueDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCAT_NAMEVALUE pInfo, IN OUT DWORD *pcbInfo);
BOOL WINAPI WVTAsn1CatMemberInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCAT_MEMBERINFO pInfo, IN OUT DWORD *pcbInfo); };
static inline ASN1encoding_t GetEncoder(void) { return I_CryptGetAsn1Encoder(hAsn1Module); } static inline ASN1decoding_t GetDecoder(void) { return I_CryptGetAsn1Decoder(hAsn1Module); }
//+-------------------------------------------------------------------------
// SPC ASN allocation and free functions
//--------------------------------------------------------------------------
HRESULT HError() { DWORD dw = GetLastError();
HRESULT hr; if ( dw <= 0xFFFF ) hr = HRESULT_FROM_WIN32 ( dw ); else hr = dw;
if ( ! FAILED ( hr ) ) { // somebody failed a call without properly setting an error condition
hr = E_UNEXPECTED; } return hr; }
typedef struct _OID_REG_ENTRY { LPCSTR pszOID; LPCSTR pszOverrideFuncName; } OID_REG_ENTRY, *POID_REG_ENTRY;
static const OID_REG_ENTRY SpcRegEncodeTable[] = { SPC_PE_IMAGE_DATA_OBJID, "WVTAsn1SpcPeImageDataEncode", SPC_PE_IMAGE_DATA_STRUCT, "WVTAsn1SpcPeImageDataEncode",
SPC_CAB_DATA_OBJID, "WVTAsn1SpcLinkEncode", SPC_CAB_DATA_STRUCT, "WVTAsn1SpcLinkEncode",
SPC_JAVA_CLASS_DATA_OBJID, "WVTAsn1SpcLinkEncode", SPC_JAVA_CLASS_DATA_STRUCT, "WVTAsn1SpcLinkEncode",
SPC_LINK_OBJID, "WVTAsn1SpcLinkEncode", SPC_LINK_STRUCT, "WVTAsn1SpcLinkEncode",
SPC_SIGINFO_OBJID, "WVTAsn1SpcSigInfoEncode", SPC_SIGINFO_STRUCT, "WVTAsn1SpcSigInfoEncode",
SPC_INDIRECT_DATA_OBJID, "WVTAsn1SpcIndirectDataContentEncode", SPC_INDIRECT_DATA_CONTENT_STRUCT, "WVTAsn1SpcIndirectDataContentEncode",
SPC_SP_AGENCY_INFO_OBJID, "WVTAsn1SpcSpAgencyInfoEncode", SPC_SP_AGENCY_INFO_STRUCT, "WVTAsn1SpcSpAgencyInfoEncode",
SPC_MINIMAL_CRITERIA_OBJID, "WVTAsn1SpcMinimalCriteriaInfoEncode", SPC_MINIMAL_CRITERIA_STRUCT, "WVTAsn1SpcMinimalCriteriaInfoEncode",
SPC_FINANCIAL_CRITERIA_OBJID, "WVTAsn1SpcFinancialCriteriaInfoEncode", SPC_FINANCIAL_CRITERIA_STRUCT, "WVTAsn1SpcFinancialCriteriaInfoEncode",
SPC_STATEMENT_TYPE_OBJID, "WVTAsn1SpcStatementTypeEncode", SPC_STATEMENT_TYPE_STRUCT, "WVTAsn1SpcStatementTypeEncode",
CAT_NAMEVALUE_OBJID, "WVTAsn1CatNameValueEncode", CAT_NAMEVALUE_STRUCT, "WVTAsn1CatNameValueEncode",
CAT_MEMBERINFO_OBJID, "WVTAsn1CatMemberInfoEncode", CAT_MEMBERINFO_STRUCT, "WVTAsn1CatMemberInfoEncode",
SPC_SP_OPUS_INFO_OBJID, "WVTAsn1SpcSpOpusInfoEncode", SPC_SP_OPUS_INFO_STRUCT, "WVTAsn1SpcSpOpusInfoEncode"
}; #define SPC_REG_ENCODE_COUNT (sizeof(SpcRegEncodeTable) / sizeof(SpcRegEncodeTable[0]))
static const OID_REG_ENTRY SpcRegDecodeTable[] = { SPC_PE_IMAGE_DATA_OBJID, "WVTAsn1SpcPeImageDataDecode", SPC_PE_IMAGE_DATA_STRUCT, "WVTAsn1SpcPeImageDataDecode",
SPC_CAB_DATA_OBJID, "WVTAsn1SpcLinkDecode", SPC_CAB_DATA_STRUCT, "WVTAsn1SpcLinkDecode",
SPC_JAVA_CLASS_DATA_OBJID, "WVTAsn1SpcLinkDecode", SPC_JAVA_CLASS_DATA_STRUCT, "WVTAsn1SpcLinkDecode",
SPC_LINK_OBJID, "WVTAsn1SpcLinkDecode", SPC_LINK_STRUCT, "WVTAsn1SpcLinkDecode",
SPC_SIGINFO_OBJID, "WVTAsn1SpcSigInfoDecode", SPC_SIGINFO_STRUCT, "WVTAsn1SpcSigInfoDecode",
SPC_INDIRECT_DATA_OBJID, "WVTAsn1SpcIndirectDataContentDecode", SPC_INDIRECT_DATA_CONTENT_STRUCT, "WVTAsn1SpcIndirectDataContentDecode",
SPC_SP_AGENCY_INFO_OBJID, "WVTAsn1SpcSpAgencyInfoDecode", SPC_SP_AGENCY_INFO_STRUCT, "WVTAsn1SpcSpAgencyInfoDecode",
SPC_MINIMAL_CRITERIA_OBJID, "WVTAsn1SpcMinimalCriteriaInfoDecode", SPC_MINIMAL_CRITERIA_STRUCT, "WVTAsn1SpcMinimalCriteriaInfoDecode",
SPC_FINANCIAL_CRITERIA_OBJID, "WVTAsn1SpcFinancialCriteriaInfoDecode", SPC_FINANCIAL_CRITERIA_STRUCT, "WVTAsn1SpcFinancialCriteriaInfoDecode",
SPC_STATEMENT_TYPE_OBJID, "WVTAsn1SpcStatementTypeDecode", SPC_STATEMENT_TYPE_STRUCT, "WVTAsn1SpcStatementTypeDecode",
CAT_NAMEVALUE_OBJID, "WVTAsn1CatNameValueDecode", CAT_NAMEVALUE_STRUCT, "WVTAsn1CatNameValueDecode",
CAT_MEMBERINFO_OBJID, "WVTAsn1CatMemberInfoDecode", CAT_MEMBERINFO_STRUCT, "WVTAsn1CatMemberInfoDecode",
SPC_SP_OPUS_INFO_OBJID, "WVTAsn1SpcSpOpusInfoDecode", SPC_SP_OPUS_INFO_STRUCT, "WVTAsn1SpcSpOpusInfoDecode"
}; #define SPC_REG_DECODE_COUNT (sizeof(SpcRegDecodeTable) / sizeof(SpcRegDecodeTable[0]))
#define ASN1_OID_OFFSET
#define ASN1_OID_PREFIX
static const CRYPT_OID_FUNC_ENTRY SpcEncodeFuncTable[] = { ASN1_OID_OFFSET SPC_PE_IMAGE_DATA_STRUCT, WVTAsn1SpcPeImageDataEncode, ASN1_OID_PREFIX SPC_PE_IMAGE_DATA_OBJID, WVTAsn1SpcPeImageDataEncode,
ASN1_OID_PREFIX SPC_CAB_DATA_OBJID, WVTAsn1SpcLinkEncode, ASN1_OID_OFFSET SPC_CAB_DATA_STRUCT, WVTAsn1SpcLinkEncode,
ASN1_OID_OFFSET SPC_LINK_STRUCT, WVTAsn1SpcLinkEncode, ASN1_OID_PREFIX SPC_LINK_OBJID, WVTAsn1SpcLinkEncode,
ASN1_OID_OFFSET SPC_SIGINFO_STRUCT, WVTAsn1SpcSigInfoEncode, ASN1_OID_PREFIX SPC_SIGINFO_OBJID, WVTAsn1SpcSigInfoEncode,
ASN1_OID_PREFIX SPC_INDIRECT_DATA_OBJID, WVTAsn1SpcIndirectDataContentEncode, ASN1_OID_OFFSET SPC_INDIRECT_DATA_CONTENT_STRUCT, WVTAsn1SpcIndirectDataContentEncode,
ASN1_OID_OFFSET SPC_SP_AGENCY_INFO_STRUCT, WVTAsn1SpcSpAgencyInfoEncode, ASN1_OID_PREFIX SPC_SP_AGENCY_INFO_OBJID, WVTAsn1SpcSpAgencyInfoEncode,
ASN1_OID_OFFSET SPC_MINIMAL_CRITERIA_STRUCT, WVTAsn1SpcMinimalCriteriaInfoEncode, ASN1_OID_PREFIX SPC_MINIMAL_CRITERIA_OBJID, WVTAsn1SpcMinimalCriteriaInfoEncode,
ASN1_OID_OFFSET SPC_FINANCIAL_CRITERIA_STRUCT, WVTAsn1SpcFinancialCriteriaInfoEncode, ASN1_OID_PREFIX SPC_FINANCIAL_CRITERIA_OBJID, WVTAsn1SpcFinancialCriteriaInfoEncode,
ASN1_OID_OFFSET SPC_STATEMENT_TYPE_STRUCT, WVTAsn1SpcStatementTypeEncode, ASN1_OID_PREFIX SPC_STATEMENT_TYPE_OBJID, WVTAsn1SpcStatementTypeEncode,
ASN1_OID_PREFIX CAT_NAMEVALUE_OBJID, WVTAsn1CatNameValueEncode, ASN1_OID_OFFSET CAT_NAMEVALUE_STRUCT, WVTAsn1CatNameValueEncode,
ASN1_OID_PREFIX CAT_MEMBERINFO_OBJID, WVTAsn1CatMemberInfoEncode, ASN1_OID_OFFSET CAT_MEMBERINFO_STRUCT, WVTAsn1CatMemberInfoEncode,
ASN1_OID_OFFSET SPC_SP_OPUS_INFO_STRUCT, WVTAsn1SpcSpOpusInfoEncode, ASN1_OID_PREFIX SPC_SP_OPUS_INFO_OBJID, WVTAsn1SpcSpOpusInfoEncode };
#define SPC_ENCODE_FUNC_COUNT (sizeof(SpcEncodeFuncTable) / \
sizeof(SpcEncodeFuncTable[0]))
static const CRYPT_OID_FUNC_ENTRY SpcDecodeFuncTable[] = { ASN1_OID_OFFSET SPC_PE_IMAGE_DATA_STRUCT, WVTAsn1SpcPeImageDataDecode, ASN1_OID_PREFIX SPC_PE_IMAGE_DATA_OBJID, WVTAsn1SpcPeImageDataDecode,
ASN1_OID_OFFSET SPC_CAB_DATA_STRUCT, WVTAsn1SpcLinkDecode, ASN1_OID_PREFIX SPC_CAB_DATA_OBJID, WVTAsn1SpcLinkDecode,
ASN1_OID_OFFSET SPC_LINK_STRUCT, WVTAsn1SpcLinkDecode, ASN1_OID_PREFIX SPC_LINK_OBJID, WVTAsn1SpcLinkDecode,
ASN1_OID_OFFSET SPC_SIGINFO_STRUCT, WVTAsn1SpcSigInfoDecode, ASN1_OID_PREFIX SPC_SIGINFO_OBJID, WVTAsn1SpcSigInfoDecode,
ASN1_OID_OFFSET PKCS_UTC_TIME, WVTAsn1UtcTimeDecode, ASN1_OID_PREFIX szOID_RSA_signingTime, WVTAsn1UtcTimeDecode,
ASN1_OID_OFFSET SPC_SP_AGENCY_INFO_STRUCT, WVTAsn1SpcSpAgencyInfoDecode, ASN1_OID_PREFIX SPC_SP_AGENCY_INFO_OBJID, WVTAsn1SpcSpAgencyInfoDecode,
ASN1_OID_OFFSET SPC_SP_OPUS_INFO_STRUCT, WVTAsn1SpcSpOpusInfoDecode, ASN1_OID_PREFIX SPC_SP_OPUS_INFO_OBJID, WVTAsn1SpcSpOpusInfoDecode,
ASN1_OID_OFFSET SPC_INDIRECT_DATA_CONTENT_STRUCT, WVTAsn1SpcIndirectDataContentDecode, ASN1_OID_PREFIX SPC_INDIRECT_DATA_OBJID, WVTAsn1SpcIndirectDataContentDecode,
ASN1_OID_OFFSET SPC_SP_AGENCY_INFO_STRUCT, WVTAsn1SpcSpAgencyInfoDecode, ASN1_OID_PREFIX SPC_SP_AGENCY_INFO_OBJID, WVTAsn1SpcSpAgencyInfoDecode,
ASN1_OID_OFFSET SPC_MINIMAL_CRITERIA_STRUCT, WVTAsn1SpcMinimalCriteriaInfoDecode, ASN1_OID_PREFIX SPC_MINIMAL_CRITERIA_OBJID, WVTAsn1SpcMinimalCriteriaInfoDecode,
ASN1_OID_OFFSET SPC_FINANCIAL_CRITERIA_STRUCT, WVTAsn1SpcFinancialCriteriaInfoDecode, ASN1_OID_PREFIX SPC_FINANCIAL_CRITERIA_OBJID, WVTAsn1SpcFinancialCriteriaInfoDecode,
ASN1_OID_OFFSET SPC_STATEMENT_TYPE_STRUCT, WVTAsn1SpcStatementTypeDecode, ASN1_OID_PREFIX SPC_STATEMENT_TYPE_OBJID, WVTAsn1SpcStatementTypeDecode,
ASN1_OID_OFFSET CAT_NAMEVALUE_STRUCT, WVTAsn1CatNameValueDecode, ASN1_OID_PREFIX CAT_NAMEVALUE_OBJID, WVTAsn1CatNameValueDecode,
ASN1_OID_OFFSET CAT_MEMBERINFO_STRUCT, WVTAsn1CatMemberInfoDecode, ASN1_OID_PREFIX CAT_MEMBERINFO_OBJID, WVTAsn1CatMemberInfoDecode,
ASN1_OID_OFFSET SPC_FINANCIAL_CRITERIA_STRUCT, WVTAsn1SpcFinancialCriteriaInfoDecode, ASN1_OID_PREFIX SPC_FINANCIAL_CRITERIA_OBJID, WVTAsn1SpcFinancialCriteriaInfoDecode };
#define SPC_DECODE_FUNC_COUNT (sizeof(SpcDecodeFuncTable) / \
sizeof(SpcDecodeFuncTable[0]))
//+-------------------------------------------------------------------------
// Dll initialization
//--------------------------------------------------------------------------
HRESULT WINAPI ASNRegisterServer(LPCWSTR dllName) { int i;
for (i = 0; i < SPC_REG_ENCODE_COUNT; i++) { if (!(CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, SpcRegEncodeTable[i].pszOID, dllName, SpcRegEncodeTable[i].pszOverrideFuncName))) { return(HError()); } }
for (i = 0; i < SPC_REG_DECODE_COUNT; i++) { if (!(CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, SpcRegDecodeTable[i].pszOID, dllName, SpcRegDecodeTable[i].pszOverrideFuncName))) { return(HError()); } }
return S_OK; }
HRESULT WINAPI ASNUnregisterServer() { HRESULT hr = S_OK; int i;
for (i = 0; i < SPC_REG_ENCODE_COUNT; i++) { if (!(CryptUnregisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, SpcRegEncodeTable[i].pszOID))) { if (ERROR_FILE_NOT_FOUND != GetLastError()) { hr = HError(); } } }
for (i = 0; i < SPC_REG_DECODE_COUNT; i++) { if (!(CryptUnregisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, SpcRegDecodeTable[i].pszOID))) { if (ERROR_FILE_NOT_FOUND != GetLastError()) { hr = HError(); } } } return(hr); }
BOOL WINAPI ASNDllMain(HMODULE hInst, ULONG ulReason, LPVOID lpReserved) { BOOL fRet;
switch (ulReason) { case DLL_PROCESS_ATTACH: WTASN_Module_Startup(); if (0 == (hAsn1Module = I_CryptInstallAsn1Module( WTASN_Module, 0, NULL))) { goto CryptInstallAsn1ModuleError; } /*
if (!(CryptInstallOIDFunctionAddress( hInst, X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, SPC_ENCODE_FUNC_COUNT, SpcEncodeFuncTable, 0))) { goto CryptInstallOIDFunctionAddressError; }
if (!(CryptInstallOIDFunctionAddress( hInst, X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, SPC_DECODE_FUNC_COUNT, SpcDecodeFuncTable, CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG))) { goto CryptInstallOIDFunctionAddressError; } */ break;
case DLL_PROCESS_DETACH: I_CryptUninstallAsn1Module(hAsn1Module); WTASN_Module_Cleanup(); break; case DLL_THREAD_DETACH: default: break; }
fRet = TRUE;
CommonReturn: return(fRet);
ErrorReturn: fRet = FALSE; goto CommonReturn;
TRACE_ERROR_EX(DBG_SS,CryptInstallAsn1ModuleError) //TRACE_ERROR_EX(DBG_SS,CryptInstallOIDFunctionAddressError)
}
//+-------------------------------------------------------------------------
// Set/Get "Any" DER BLOB
//--------------------------------------------------------------------------
inline void WVTAsn1SetAny(IN PCRYPT_OBJID_BLOB pInfo, OUT NOCOPYANY *pOss) { PkiAsn1SetAny(pInfo, pOss); }
inline void WVTAsn1GetAny(IN NOCOPYANY *pOss, IN DWORD dwFlags, OUT PCRYPT_OBJID_BLOB pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra) { PkiAsn1GetAny(pOss, dwFlags, pInfo, ppbExtra, plRemainExtra); }
//+-------------------------------------------------------------------------
// Set/Get CRYPT_DATA_BLOB (Octet String)
//--------------------------------------------------------------------------
inline void WVTAsn1SetOctetString(IN PCRYPT_DATA_BLOB pInfo, OUT OCTETSTRING *pOss) { pOss->value = pInfo->pbData; pOss->length = pInfo->cbData; }
inline void WVTAsn1GetOctetString( IN OCTETSTRING *pOss, IN DWORD dwFlags, OUT PCRYPT_DATA_BLOB pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { PkiAsn1GetOctetString(pOss->length, pOss->value, dwFlags, pInfo, ppbExtra, plRemainExtra); }
inline void WVTAsn1SetBit(IN PCRYPT_BIT_BLOB pInfo, OUT BITSTRING *pOss) { PkiAsn1SetBitString(pInfo, &pOss->length, &pOss->value); }
inline void WVTAsn1GetBit(IN BITSTRING *pOss, IN DWORD dwFlags, OUT PCRYPT_BIT_BLOB pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra) { PkiAsn1GetBitString(pOss->length, pOss->value, dwFlags, pInfo, ppbExtra, plRemainExtra); }
//+-------------------------------------------------------------------------
// Set/Free/Get Unicode mapped to IA5 String
//--------------------------------------------------------------------------
inline BOOL WVTAsn1SetUnicodeConvertedToIA5( IN LPWSTR pwsz, OUT IA5STRING *pOss ) { return PkiAsn1SetUnicodeConvertedToIA5String(pwsz, &pOss->length, &pOss->value); } inline void WVTAsn1FreeUnicodeConvertedToIA5(IN IA5STRING *pOss) { PkiAsn1FreeUnicodeConvertedToIA5String(pOss->value); pOss->value = NULL; } inline void WVTAsn1GetIA5ConvertedToUnicode( IN IA5STRING *pOss, IN DWORD dwFlags, OUT LPWSTR *ppwsz, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { PkiAsn1GetIA5StringConvertedToUnicode(pOss->length, pOss->value, dwFlags, ppwsz, ppbExtra, plRemainExtra); }
//+-------------------------------------------------------------------------
// Set/Get LPWSTR (BMP String)
//--------------------------------------------------------------------------
inline void WVTAsn1SetBMP( IN LPWSTR pwsz, OUT BMPSTRING *pOss ) { pOss->value = pwsz; pOss->length = wcslen(pwsz); } inline void WVTAsn1GetBMP( IN BMPSTRING *pOss, IN DWORD dwFlags, OUT LPWSTR *ppwsz, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { PkiAsn1GetBMPString(pOss->length, pOss->value, dwFlags, ppwsz, ppbExtra, plRemainExtra); }
//+-------------------------------------------------------------------------
// Set/Get Spc String
//--------------------------------------------------------------------------
void WVTAsn1SetSpcString( IN LPWSTR pwsz, OUT SpcString *pOss ) { pOss->choice = unicode_chosen; WVTAsn1SetBMP(pwsz, &pOss->u.unicode); }
void WVTAsn1GetSpcString( IN SpcString *pOss, IN DWORD dwFlags, OUT LPWSTR *ppwsz, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { switch (pOss->choice) { case unicode_chosen: WVTAsn1GetBMP(&pOss->u.unicode, dwFlags, ppwsz, ppbExtra, plRemainExtra); break; case ascii_chosen: WVTAsn1GetIA5ConvertedToUnicode(&pOss->u.ascii, dwFlags, ppwsz, ppbExtra, plRemainExtra); break; default: if (*plRemainExtra >= 0) *ppwsz = NULL; } }
//+-------------------------------------------------------------------------
// Set/Get Spc Link
//--------------------------------------------------------------------------
BOOL WVTAsn1SetSpcLink( IN PSPC_LINK pInfo, OUT SpcLink *pOss ) { BOOL fRet = TRUE;
memset(pOss, 0, sizeof(*pOss));
// Assumption: OSS choice == dwLinkChoice
// WVTAsn1GetSpcLink has asserts to verify
pOss->choice = (unsigned short) pInfo->dwLinkChoice;
switch (pInfo->dwLinkChoice) { case SPC_URL_LINK_CHOICE: fRet = WVTAsn1SetUnicodeConvertedToIA5(pInfo->pwszUrl, &pOss->u.url); break; case SPC_MONIKER_LINK_CHOICE: pOss->u.moniker.classId.length = sizeof(pInfo->Moniker.ClassId); pOss->u.moniker.classId.value = pInfo->Moniker.ClassId; WVTAsn1SetOctetString(&pInfo->Moniker.SerializedData, &pOss->u.moniker.serializedData); break; case SPC_FILE_LINK_CHOICE: WVTAsn1SetSpcString(pInfo->pwszFile, &pOss->u.file); break; default: SetLastError((DWORD) E_INVALIDARG); fRet = FALSE; }
return fRet; }
void WVTAsn1FreeSpcLink( IN SpcLink *pOss ) { if (pOss->choice == url_chosen) WVTAsn1FreeUnicodeConvertedToIA5(&pOss->u.url); }
BOOL WVTAsn1GetSpcLink( IN SpcLink *pOss, IN DWORD dwFlags, OUT PSPC_LINK pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { DWORD dwLinkChoice;
assert(url_chosen == SPC_URL_LINK_CHOICE); assert(moniker_chosen == SPC_MONIKER_LINK_CHOICE); assert(file_chosen == SPC_FILE_LINK_CHOICE);
dwLinkChoice = pOss->choice;
if (*plRemainExtra >= 0) { memset(pInfo, 0, sizeof(*pInfo)); pInfo->dwLinkChoice = dwLinkChoice; }
switch (dwLinkChoice) { case SPC_URL_LINK_CHOICE: WVTAsn1GetIA5ConvertedToUnicode(&pOss->u.url, dwFlags, &pInfo->pwszUrl, ppbExtra, plRemainExtra); break; case SPC_MONIKER_LINK_CHOICE: if (sizeof(pInfo->Moniker.ClassId) != pOss->u.moniker.classId.length) { SetLastError((DWORD) CRYPT_E_BAD_ENCODE); return FALSE; }
if (*plRemainExtra >= 0) { memcpy(pInfo->Moniker.ClassId, pOss->u.moniker.classId.value, sizeof(pInfo->Moniker.ClassId)); } WVTAsn1GetOctetString(&pOss->u.moniker.serializedData, dwFlags, &pInfo->Moniker.SerializedData, ppbExtra, plRemainExtra); break; case SPC_FILE_LINK_CHOICE: WVTAsn1GetSpcString(&pOss->u.file, dwFlags, &pInfo->pwszFile, ppbExtra, plRemainExtra); break; default: SetLastError((DWORD) CRYPT_E_BAD_ENCODE); return FALSE; }
return TRUE; }
BOOL WVTAsn1GetSpcLinkPointer( IN SpcLink *pOss, IN DWORD dwFlags, OUT PSPC_LINK *pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { LONG lAlignExtra; PSPC_LINK pLink;
lAlignExtra = INFO_LEN_ALIGN(sizeof(SPC_LINK)); *plRemainExtra -= lAlignExtra; if (*plRemainExtra >= 0) { pLink = (PSPC_LINK) *ppbExtra; *pInfo = pLink; *ppbExtra += lAlignExtra; } else pLink = NULL;
return WVTAsn1GetSpcLink( pOss, dwFlags, pLink, ppbExtra, plRemainExtra ); }
BOOL WVTAsn1SetSpcSigInfo(IN PSPC_SIGINFO pInfo, OUT SpcSigInfo *pOss) { memset(pOss, 0x00, sizeof(*pOss));
pOss->dwSIPversion = pInfo->dwSipVersion;
pOss->gSIPguid.length = sizeof(GUID); pOss->gSIPguid.value = (BYTE *) &pInfo->gSIPGuid;
pOss->dwReserved1 = pInfo->dwReserved1; pOss->dwReserved2 = pInfo->dwReserved2; pOss->dwReserved3 = pInfo->dwReserved3; pOss->dwReserved4 = pInfo->dwReserved4; pOss->dwReserved5 = pInfo->dwReserved5;
return(TRUE); }
BOOL WVTAsn1GetSpcSigInfo(IN SpcSigInfo *pOss, IN DWORD dwFlags, OUT PSPC_SIGINFO pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra) {
if (!(pInfo)) { return(TRUE); }
pInfo->dwSipVersion = pOss->dwSIPversion; if (sizeof(GUID) != pOss->gSIPguid.length) { SetLastError((DWORD) CRYPT_E_BAD_ENCODE); return FALSE; } memcpy(&pInfo->gSIPGuid, pOss->gSIPguid.value, sizeof(GUID));
pInfo->dwReserved1 = pOss->dwReserved1; pInfo->dwReserved2 = pOss->dwReserved2; pInfo->dwReserved3 = pOss->dwReserved3; pInfo->dwReserved4 = pOss->dwReserved4; pInfo->dwReserved5 = pOss->dwReserved5;
return(TRUE); }
//+-------------------------------------------------------------------------
// Set/Get Object Identifier string
//--------------------------------------------------------------------------
BOOL WVTAsn1SetObjId( IN LPSTR pszObjId, OUT ObjectID *pOss ) { pOss->count = sizeof(pOss->value) / sizeof(pOss->value[0]); if (PkiAsn1ToObjectIdentifier(pszObjId, &pOss->count, pOss->value)) return TRUE; else { SetLastError((DWORD) CRYPT_E_BAD_ENCODE); return FALSE; } }
void WVTAsn1GetObjId( IN ObjectID *pOss, IN DWORD dwFlags, OUT LPSTR *ppszObjId, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { LONG lRemainExtra = *plRemainExtra; BYTE *pbExtra = *ppbExtra; LONG lAlignExtra; DWORD cbObjId;
cbObjId = lRemainExtra > 0 ? lRemainExtra : 0; PkiAsn1FromObjectIdentifier( pOss->count, pOss->value, (LPSTR) pbExtra, &cbObjId );
lAlignExtra = INFO_LEN_ALIGN(cbObjId); lRemainExtra -= lAlignExtra; if (lRemainExtra >= 0) { if(cbObjId) { *ppszObjId = (LPSTR) pbExtra; } else *ppszObjId = NULL; pbExtra += lAlignExtra; }
*plRemainExtra = lRemainExtra; *ppbExtra = pbExtra; }
//+-------------------------------------------------------------------------
// Set/Get CRYPT_ALGORITHM_IDENTIFIER
//--------------------------------------------------------------------------
BOOL WVTAsn1SetAlgorithm( IN PCRYPT_ALGORITHM_IDENTIFIER pInfo, OUT AlgorithmIdentifier *pOss ) { memset(pOss, 0, sizeof(*pOss)); if (pInfo->pszObjId) { if (!WVTAsn1SetObjId(pInfo->pszObjId, &pOss->algorithm)) return FALSE; if (pInfo->Parameters.cbData) WVTAsn1SetAny(&pInfo->Parameters, &pOss->parameters); else // Per PKCS #1: default to the ASN.1 type NULL.
WVTAsn1SetAny((PCRYPT_OBJID_BLOB) &NullDerBlob, &pOss->parameters); pOss->bit_mask |= parameters_present; } return TRUE; }
void WVTAsn1GetAlgorithm( IN AlgorithmIdentifier *pOss, IN DWORD dwFlags, OUT PCRYPT_ALGORITHM_IDENTIFIER pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra ) { if (*plRemainExtra >= 0) memset(pInfo, 0, sizeof(*pInfo)); WVTAsn1GetObjId(&pOss->algorithm, dwFlags, &pInfo->pszObjId, ppbExtra, plRemainExtra); if (pOss->bit_mask & parameters_present) WVTAsn1GetAny(&pOss->parameters, dwFlags, &pInfo->Parameters, ppbExtra, plRemainExtra); }
//+-------------------------------------------------------------------------
// Encode an OSS formatted info structure
//
// Called by the WVTAsn1*Encode() functions.
//--------------------------------------------------------------------------
BOOL WVTAsn1InfoEncode( IN int pdunum, IN void *pOssInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { return PkiAsn1EncodeInfo( GetEncoder(), pdunum, pOssInfo, pbEncoded, pcbEncoded); }
//+-------------------------------------------------------------------------
// Decode into an allocated, OSS formatted info structure
//
// Called by the WVTAsn1*Decode() functions.
//--------------------------------------------------------------------------
BOOL WVTAsn1InfoDecodeAndAlloc( IN int pdunum, IN const BYTE *pbEncoded, IN DWORD cbEncoded, OUT void **ppOssInfo ) { return PkiAsn1DecodeAndAllocInfo( GetDecoder(), pdunum, pbEncoded, cbEncoded, ppOssInfo); }
//+-------------------------------------------------------------------------
// Free an allocated, OSS formatted info structure
//
// Called by the WVTAsn1*Decode() functions.
//--------------------------------------------------------------------------
void WVTAsn1InfoFree( IN int pdunum, IN void *pOssInfo ) { if (pOssInfo) { DWORD dwErr = GetLastError();
// TlsGetValue globbers LastError
PkiAsn1FreeInfo(GetDecoder(), pdunum, pOssInfo);
SetLastError(dwErr); } }
//+-------------------------------------------------------------------------
// SPC PKCS #7 Indirect Data Content Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcIndirectDataContentEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_INDIRECT_DATA_CONTENT pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { BOOL fResult; SpcIndirectDataContent OssInfo;
memset(&OssInfo, 0, sizeof(OssInfo)); if (!WVTAsn1SetObjId(pInfo->Data.pszObjId, &OssInfo.data.type)) goto ErrorReturn;
if (pInfo->Data.Value.cbData) { WVTAsn1SetAny(&pInfo->Data.Value, &OssInfo.data.value); OssInfo.data.bit_mask |= value_present; }
if (!WVTAsn1SetAlgorithm(&pInfo->DigestAlgorithm, &OssInfo.messageDigest.digestAlgorithm)) goto ErrorReturn; WVTAsn1SetOctetString(&pInfo->Digest, &OssInfo.messageDigest.digest);
fResult = WVTAsn1InfoEncode( SpcIndirectDataContent_PDU, &OssInfo, pbEncoded, pcbEncoded );
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE; CommonReturn: return fResult; }
//+-------------------------------------------------------------------------
// SPC PKCS #7 Indirect Data Content Decode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcIndirectDataContentDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_INDIRECT_DATA_CONTENT pInfo, IN OUT DWORD *pcbInfo ) { BOOL fResult; SpcIndirectDataContent *pOssInfo = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) *pcbInfo = 0;
if (!WVTAsn1InfoDecodeAndAlloc( SpcIndirectDataContent_PDU, pbEncoded, cbEncoded, (void **) &pOssInfo)) goto ErrorReturn;
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_INDIRECT_DATA_CONTENT); if (lRemainExtra < 0) { pbExtra = NULL; } else { // Default all optional fields to zero
memset(pInfo, 0, sizeof(SPC_INDIRECT_DATA_CONTENT));
pbExtra = (BYTE *) pInfo + sizeof(SPC_INDIRECT_DATA_CONTENT); }
WVTAsn1GetObjId(&pOssInfo->data.type, dwFlags, &pInfo->Data.pszObjId, &pbExtra, &lRemainExtra);
if (pOssInfo->data.bit_mask & value_present) WVTAsn1GetAny(&pOssInfo->data.value, dwFlags, &pInfo->Data.Value, &pbExtra, &lRemainExtra);
WVTAsn1GetAlgorithm(&pOssInfo->messageDigest.digestAlgorithm, dwFlags, &pInfo->DigestAlgorithm, &pbExtra, &lRemainExtra); WVTAsn1GetOctetString(&pOssInfo->messageDigest.digest, dwFlags, &pInfo->Digest, &pbExtra, &lRemainExtra);
if (lRemainExtra >= 0) *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) goto LengthError; }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD) ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn; ErrorReturn: *pcbInfo = 0; fResult = FALSE; CommonReturn: WVTAsn1InfoFree(SpcIndirectDataContent_PDU, pOssInfo); return fResult; }
BOOL WINAPI WVTAsn1UtcTimeDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT FILETIME * pFileTime, IN OUT DWORD *pcbFileTime ) {
BOOL fResult; UtcTime * putcTime = NULL;
assert(pcbFileTime != NULL);
if(pFileTime == NULL) { *pcbFileTime = sizeof(FILETIME); return(TRUE); }
if (*pcbFileTime < sizeof(FILETIME)) { *pcbFileTime = sizeof(FILETIME); SetLastError((DWORD) ERROR_MORE_DATA); return(FALSE); }
*pcbFileTime = sizeof(FILETIME);
if (!WVTAsn1InfoDecodeAndAlloc( UtcTime_PDU, pbEncoded, cbEncoded, (void **) &putcTime)) goto WVTAsn1InfoDecodeAndAllocError;
if( !PkiAsn1FromUTCTime(putcTime, pFileTime) ) goto PkiAsn1FromUTCTimeError;
fResult = TRUE;
CommonReturn: WVTAsn1InfoFree(UtcTime_PDU, putcTime); return fResult;
ErrorReturn: *pcbFileTime = 0; fResult = FALSE; goto CommonReturn;
TRACE_ERROR_EX(DBG_SS,WVTAsn1InfoDecodeAndAllocError); TRACE_ERROR_EX(DBG_SS,PkiAsn1FromUTCTimeError); }
//+-------------------------------------------------------------------------
// SPC SP Agency Info Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcSpAgencyInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_SP_AGENCY_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { BOOL fResult; SpcSpAgencyInformation OssInfo; memset(&OssInfo, 0, sizeof(OssInfo));
if (pInfo->pPolicyInformation) { if (!WVTAsn1SetSpcLink(pInfo->pPolicyInformation, &OssInfo.policyInformation)) goto ErrorReturn; OssInfo.bit_mask |= policyInformation_present; }
if (pInfo->pwszPolicyDisplayText) { WVTAsn1SetSpcString(pInfo->pwszPolicyDisplayText, &OssInfo.policyDisplayText); OssInfo.bit_mask |= policyDisplayText_present; }
if (pInfo->pLogoImage) { PSPC_IMAGE pImage = pInfo->pLogoImage; if (pImage->pImageLink) { if (!WVTAsn1SetSpcLink(pImage->pImageLink, &OssInfo.logoImage.imageLink)) goto ErrorReturn; OssInfo.logoImage.bit_mask |= imageLink_present; }
if (pImage->Bitmap.cbData != 0) { WVTAsn1SetOctetString(&pImage->Bitmap, &OssInfo.logoImage.bitmap); OssInfo.logoImage.bit_mask |= bitmap_present; } if (pImage->Metafile.cbData != 0) { WVTAsn1SetOctetString(&pImage->Metafile, &OssInfo.logoImage.metafile); OssInfo.logoImage.bit_mask |= metafile_present; } if (pImage->EnhancedMetafile.cbData != 0) { WVTAsn1SetOctetString(&pImage->EnhancedMetafile, &OssInfo.logoImage.enhancedMetafile); OssInfo.logoImage.bit_mask |= enhancedMetafile_present; } if (pImage->GifFile.cbData != 0) { WVTAsn1SetOctetString(&pImage->GifFile, &OssInfo.logoImage.gifFile); OssInfo.logoImage.bit_mask |= gifFile_present; }
OssInfo.bit_mask |= logoImage_present; }
if (pInfo->pLogoLink) { if (!WVTAsn1SetSpcLink(pInfo->pLogoLink, &OssInfo.logoLink)) goto ErrorReturn; OssInfo.bit_mask |= logoLink_present; }
fResult = WVTAsn1InfoEncode( SpcSpAgencyInformation_PDU, &OssInfo, pbEncoded, pcbEncoded );
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE; CommonReturn: WVTAsn1FreeSpcLink(&OssInfo.policyInformation); WVTAsn1FreeSpcLink(&OssInfo.logoImage.imageLink); WVTAsn1FreeSpcLink(&OssInfo.logoLink); return fResult; }
//+-------------------------------------------------------------------------
// SPC SP Agency Info Decode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcSpAgencyInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_SP_AGENCY_INFO pInfo, IN OUT DWORD *pcbInfo ) { BOOL fResult; SpcSpAgencyInformation *pOssInfo = NULL; BYTE *pbExtra; LONG lRemainExtra; LONG lAlignExtra;
if (pInfo == NULL) *pcbInfo = 0;
if (!WVTAsn1InfoDecodeAndAlloc( SpcSpAgencyInformation_PDU, pbEncoded, cbEncoded, (void **) &pOssInfo)) goto ErrorReturn;
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_SP_AGENCY_INFO); if (lRemainExtra < 0) { pbExtra = NULL; } else { // Default all optional fields to zero
memset(pInfo, 0, sizeof(SPC_SP_AGENCY_INFO));
pbExtra = (BYTE *) pInfo + sizeof(SPC_SP_AGENCY_INFO); }
if (pOssInfo->bit_mask & policyInformation_present) { if (!WVTAsn1GetSpcLinkPointer(&pOssInfo->policyInformation, dwFlags, &pInfo->pPolicyInformation, &pbExtra, &lRemainExtra)) goto ErrorReturn; }
if (pOssInfo->bit_mask & policyDisplayText_present) { WVTAsn1GetSpcString(&pOssInfo->policyDisplayText, dwFlags, &pInfo->pwszPolicyDisplayText, &pbExtra, &lRemainExtra); }
if (pOssInfo->bit_mask & logoImage_present) { PSPC_IMAGE pImage; SpcImage *pOssImage = &pOssInfo->logoImage;
lAlignExtra = INFO_LEN_ALIGN(sizeof(SPC_IMAGE)); lRemainExtra -= lAlignExtra; if (lRemainExtra >= 0) { pImage = (PSPC_IMAGE) pbExtra; memset(pImage, 0, sizeof(SPC_IMAGE)); pInfo->pLogoImage = pImage; pbExtra += lAlignExtra; } else pImage = NULL;
if (pOssImage->bit_mask & imageLink_present) { if (!WVTAsn1GetSpcLinkPointer(&pOssImage->imageLink, dwFlags, &pImage->pImageLink, &pbExtra, &lRemainExtra)) goto ErrorReturn; } if (pOssImage->bit_mask & bitmap_present) { WVTAsn1GetOctetString(&pOssImage->bitmap, dwFlags, &pImage->Bitmap, &pbExtra, &lRemainExtra); } if (pOssImage->bit_mask & metafile_present) { WVTAsn1GetOctetString(&pOssImage->metafile, dwFlags, &pImage->Metafile, &pbExtra, &lRemainExtra); } if (pOssImage->bit_mask & enhancedMetafile_present) { WVTAsn1GetOctetString(&pOssImage->enhancedMetafile, dwFlags, &pImage->EnhancedMetafile, &pbExtra, &lRemainExtra); } if (pOssImage->bit_mask & gifFile_present) { WVTAsn1GetOctetString(&pOssImage->gifFile, dwFlags, &pImage->GifFile, &pbExtra, &lRemainExtra); }
}
if (pOssInfo->bit_mask & logoLink_present) { if (!WVTAsn1GetSpcLinkPointer(&pOssInfo->logoLink, dwFlags, &pInfo->pLogoLink, &pbExtra, &lRemainExtra)) goto ErrorReturn; }
if (lRemainExtra >= 0) *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) goto LengthError; }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD) ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn; ErrorReturn: *pcbInfo = 0; fResult = FALSE; CommonReturn: WVTAsn1InfoFree(SpcSpAgencyInformation_PDU, pOssInfo); return fResult; }
//+-------------------------------------------------------------------------
// SPC Minimal Criteria Info Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcMinimalCriteriaInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN BOOL *pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { ossBoolean OssInfo = (ossBoolean) *pInfo; return WVTAsn1InfoEncode( SpcMinimalCriteria_PDU, &OssInfo, pbEncoded, pcbEncoded ); }
//+-------------------------------------------------------------------------
// SPC Minimal Criteria Info Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcMinimalCriteriaInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT BOOL *pInfo, IN OUT DWORD *pcbInfo ) { BOOL fResult; ossBoolean *pOssInfo = NULL;
if (pInfo == NULL) *pcbInfo = 0;
if ((fResult = WVTAsn1InfoDecodeAndAlloc( SpcMinimalCriteria_PDU, pbEncoded, cbEncoded, (void **) &pOssInfo))) { if (*pcbInfo < sizeof(BOOL)) { if (pInfo) { fResult = FALSE; SetLastError((DWORD) ERROR_MORE_DATA); } } else *pInfo = (BOOL) *pOssInfo; *pcbInfo = sizeof(BOOL); } else { if (*pcbInfo >= sizeof(BOOL)) *pInfo = FALSE; *pcbInfo = 0; }
WVTAsn1InfoFree(SpcMinimalCriteria_PDU, pOssInfo);
return fResult; }
//+-------------------------------------------------------------------------
// SPC Financial Criteria Info Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_FINANCIAL_CRITERIA pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { SpcFinancialCriteria OssInfo; OssInfo.financialInfoAvailable = (ossBoolean) pInfo->fFinancialInfoAvailable; OssInfo.meetsCriteria = (ossBoolean) pInfo->fMeetsCriteria;
return WVTAsn1InfoEncode( SpcFinancialCriteria_PDU, &OssInfo, pbEncoded, pcbEncoded ); }
//+-------------------------------------------------------------------------
// SPC Financial Criteria Info Decode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_FINANCIAL_CRITERIA pInfo, IN OUT DWORD *pcbInfo ) { BOOL fResult; SpcFinancialCriteria *pOssInfo = NULL;
if (pInfo == NULL) *pcbInfo = 0;
if ((fResult = WVTAsn1InfoDecodeAndAlloc( SpcFinancialCriteria_PDU, pbEncoded, cbEncoded, (void **) &pOssInfo))) { if (*pcbInfo < sizeof(SPC_FINANCIAL_CRITERIA)) { if (pInfo) { fResult = FALSE; SetLastError((DWORD) ERROR_MORE_DATA); } } else { pInfo->fFinancialInfoAvailable = (BOOL) pOssInfo->financialInfoAvailable; pInfo->fMeetsCriteria = (BOOL) pOssInfo->meetsCriteria; } *pcbInfo = sizeof(SPC_FINANCIAL_CRITERIA); } else *pcbInfo = 0;
WVTAsn1InfoFree(SpcFinancialCriteria_PDU, pOssInfo);
return fResult; }
//+-------------------------------------------------------------------------
// SPC statement type attribute value Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcStatementTypeEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_STATEMENT_TYPE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { BOOL fResult; DWORD cId; LPSTR *ppszId; SpcStatementType OssInfo; ObjectID *pOssId;
cId = pInfo->cKeyPurposeId; ppszId = pInfo->rgpszKeyPurposeId; OssInfo.count = cId; OssInfo.value = NULL;
if (cId > 0) { pOssId = (ObjectID *) SpcAsnAlloc(cId * sizeof(ObjectID)); if (pOssId == NULL) goto ErrorReturn; memset(pOssId, 0, cId * sizeof(ObjectID)); OssInfo.value = pOssId; }
// Array of Object Ids
for ( ; cId > 0; cId--, ppszId++, pOssId++) { if (!WVTAsn1SetObjId(*ppszId, pOssId)) goto ErrorReturn; }
fResult = WVTAsn1InfoEncode( SpcStatementType_PDU, &OssInfo, pbEncoded, pcbEncoded ); goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE; CommonReturn: if (OssInfo.value) SpcAsnFree(OssInfo.value); return fResult; }
//+-------------------------------------------------------------------------
// SPC statement type attribute value Decode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcStatementTypeDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_STATEMENT_TYPE pInfo, IN OUT DWORD *pcbInfo ) { BOOL fResult; SpcStatementType *pOssInfo = NULL; BYTE *pbExtra; LONG lRemainExtra; LONG lAlignExtra;
DWORD cId; LPSTR *ppszId; ObjectID *pOssId;
if (pInfo == NULL) *pcbInfo = 0;
if (!WVTAsn1InfoDecodeAndAlloc( SpcStatementType_PDU, pbEncoded, cbEncoded, (void **) &pOssInfo)) goto ErrorReturn;
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_STATEMENT_TYPE); if (lRemainExtra < 0) { pbExtra = NULL; } else pbExtra = (BYTE *) pInfo + sizeof(SPC_STATEMENT_TYPE);
cId = pOssInfo->count; pOssId = pOssInfo->value; lAlignExtra = INFO_LEN_ALIGN(cId * sizeof(LPSTR)); lRemainExtra -= lAlignExtra; if (lRemainExtra >= 0) { pInfo->cKeyPurposeId = cId; ppszId = (LPSTR *) pbExtra; pInfo->rgpszKeyPurposeId = ppszId; pbExtra += lAlignExtra; } else ppszId = NULL;
// Array of Object Ids
for ( ; cId > 0; cId--, ppszId++, pOssId++) { WVTAsn1GetObjId(pOssId, dwFlags, ppszId, &pbExtra, &lRemainExtra); }
if (lRemainExtra >= 0) *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) goto LengthError; }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD) ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn; ErrorReturn: *pcbInfo = 0; fResult = FALSE; CommonReturn: WVTAsn1InfoFree(SpcStatementType_PDU, pOssInfo); return fResult; }
//+-------------------------------------------------------------------------
// SPC SP Opus info attribute value Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcSpOpusInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_SP_OPUS_INFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded ) { BOOL fResult; SpcSpOpusInfo OssInfo;
memset(&OssInfo, 0, sizeof(OssInfo));
if (pInfo->pwszProgramName) { WVTAsn1SetSpcString((LPWSTR) pInfo->pwszProgramName, &OssInfo.programName); OssInfo.bit_mask |= programName_present; }
if (pInfo->pMoreInfo) { if (!WVTAsn1SetSpcLink(pInfo->pMoreInfo, &OssInfo.moreInfo)) goto ErrorReturn; OssInfo.bit_mask |= moreInfo_present; } if (pInfo->pPublisherInfo) { if (!WVTAsn1SetSpcLink(pInfo->pPublisherInfo, &OssInfo.publisherInfo)) goto ErrorReturn; OssInfo.bit_mask |= publisherInfo_present; }
fResult = WVTAsn1InfoEncode( SpcSpOpusInfo_PDU, &OssInfo, pbEncoded, pcbEncoded );
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE; CommonReturn: WVTAsn1FreeSpcLink(&OssInfo.moreInfo); WVTAsn1FreeSpcLink(&OssInfo.publisherInfo); return fResult; }
//+-------------------------------------------------------------------------
// SPC SP Opus info attribute value Encode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_SP_OPUS_INFO pInfo, IN OUT DWORD *pcbInfo ) { BOOL fResult; SpcSpOpusInfo *pOssInfo = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) *pcbInfo = 0;
if (!WVTAsn1InfoDecodeAndAlloc( SpcSpOpusInfo_PDU, pbEncoded, cbEncoded, (void **) &pOssInfo)) goto ErrorReturn;
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_SP_OPUS_INFO); if (lRemainExtra < 0) { pbExtra = NULL; } else { // Default all optional fields to zero
memset(pInfo, 0, sizeof(SPC_SP_OPUS_INFO));
pbExtra = (BYTE *) pInfo + sizeof(SPC_SP_OPUS_INFO); }
if (pOssInfo->bit_mask & programName_present) { WVTAsn1GetSpcString(&pOssInfo->programName, dwFlags, (LPWSTR*) &pInfo->pwszProgramName, &pbExtra, &lRemainExtra); }
if (pOssInfo->bit_mask & moreInfo_present) { if (!WVTAsn1GetSpcLinkPointer(&pOssInfo->moreInfo, dwFlags, &pInfo->pMoreInfo, &pbExtra, &lRemainExtra)) goto ErrorReturn; } if (pOssInfo->bit_mask & publisherInfo_present) { if (!WVTAsn1GetSpcLinkPointer(&pOssInfo->publisherInfo, dwFlags, &pInfo->pPublisherInfo, &pbExtra, &lRemainExtra)) goto ErrorReturn; }
if (lRemainExtra >= 0) *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) goto LengthError; }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD) ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn; ErrorReturn: *pcbInfo = 0; fResult = FALSE; CommonReturn: WVTAsn1InfoFree(SpcSpOpusInfo_PDU, pOssInfo); return fResult; }
BOOL WINAPI WVTAsn1SpcLinkEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_LINK pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded) { BOOL fResult; SpcLink OssSpcLink;
if (!(WVTAsn1SetSpcLink(pInfo, &OssSpcLink))) { goto ErrorReturn; }
fResult = WVTAsn1InfoEncode(SpcLink_PDU, &OssSpcLink, pbEncoded, pcbEncoded);
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE;
CommonReturn: return(fResult); }
BOOL WINAPI WVTAsn1SpcLinkDecode(IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_LINK pInfo, IN OUT DWORD *pcbInfo) { BOOL fResult; SpcLink *pSpcLink = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) { *pcbInfo = 0; }
if (!(WVTAsn1InfoDecodeAndAlloc(SpcLink_PDU, pbEncoded, cbEncoded, (void **)&pSpcLink))) { goto ErrorReturn; }
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_LINK); if (lRemainExtra < 0) { pbExtra = NULL; } else { pbExtra = (BYTE *) pInfo + sizeof(SPC_LINK); }
if (!(WVTAsn1GetSpcLink(pSpcLink, dwFlags, pInfo, &pbExtra, &lRemainExtra))) { goto ErrorReturn; }
if (lRemainExtra >= 0) { *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; } else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) { goto LengthError; } }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD)ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn;
ErrorReturn: *pcbInfo = 0; fResult = FALSE;
CommonReturn: WVTAsn1InfoFree(SpcLink_PDU, pSpcLink); return fResult; }
BOOL WINAPI WVTAsn1SpcPeImageDataEncode(IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PSPC_PE_IMAGE_DATA pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded) { BOOL fResult; SpcPeImageData OssInfo;
memset(&OssInfo, 0, sizeof(OssInfo));
if (pInfo->Flags.cbData) { // SpcPeImageFlags has its own definition. It has a default
// bit (includeResources). Therefore, can't use the default BITSTRING.
// Note: BITSTRING's length is an unsigned int, while SpcPeImageFlags's
// length is an unsigned short.
BITSTRING OssBitString; WVTAsn1SetBit(&pInfo->Flags, &OssBitString); OssInfo.flags.length = (WORD)OssBitString.length; OssInfo.flags.value = OssBitString.value; OssInfo.bit_mask |= flags_present; }
if (pInfo->pFile) { if (!WVTAsn1SetSpcLink(pInfo->pFile, &OssInfo.file)) { goto ErrorReturn; }
OssInfo.bit_mask |= file_present; }
fResult = WVTAsn1InfoEncode(SpcPeImageData_PDU, &OssInfo, pbEncoded, pcbEncoded);
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE;
CommonReturn: WVTAsn1FreeSpcLink(&OssInfo.file); return(fResult); }
//+-------------------------------------------------------------------------
// SPC Portable Executable (PE) Image Attribute Value Decode (OSS X509)
//--------------------------------------------------------------------------
BOOL WINAPI WVTAsn1SpcPeImageDataDecode(IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PSPC_PE_IMAGE_DATA pInfo, IN OUT DWORD *pcbInfo) { BOOL fResult; SpcPeImageData *pOssInfo = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) { *pcbInfo = 0; }
if (!WVTAsn1InfoDecodeAndAlloc(SpcPeImageData_PDU, pbEncoded, cbEncoded, (void **)&pOssInfo)) { goto ErrorReturn; }
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_PE_IMAGE_DATA); if (lRemainExtra < 0) { pbExtra = NULL; } else { // Default all optional fields to zero
memset(pInfo, 0, sizeof(SPC_PE_IMAGE_DATA));
pbExtra = (BYTE *) pInfo + sizeof(SPC_PE_IMAGE_DATA); }
if (pOssInfo->bit_mask & flags_present) { // See above encode for why we need to do this extra indirect step
BITSTRING OssBitString; OssBitString.length = pOssInfo->flags.length; OssBitString.value = pOssInfo->flags.value; WVTAsn1GetBit(&OssBitString, dwFlags, &pInfo->Flags, &pbExtra, &lRemainExtra); }
if (pOssInfo->bit_mask & file_present) { if (!WVTAsn1GetSpcLinkPointer(&pOssInfo->file, dwFlags, &pInfo->pFile, &pbExtra, &lRemainExtra)) { goto ErrorReturn; } }
if (lRemainExtra >= 0) { *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; } else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) { goto LengthError; } }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD) ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn;
ErrorReturn: *pcbInfo = 0; fResult = FALSE;
CommonReturn: WVTAsn1InfoFree(SpcPeImageData_PDU, pOssInfo); return(fResult); }
BOOL WINAPI WVTAsn1SpcSigInfoEncode(DWORD dwCertEncodingType, LPCSTR lpszStructType, PSPC_SIGINFO pInfo, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL fResult; SpcSigInfo OssSpcSigInfo;
if (!(WVTAsn1SetSpcSigInfo(pInfo, &OssSpcSigInfo))) { goto ErrorReturn; }
fResult = WVTAsn1InfoEncode(SpcSigInfo_PDU, &OssSpcSigInfo, pbEncoded, pcbEncoded);
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE;
CommonReturn: return(fResult); }
BOOL WINAPI WVTAsn1SpcSigInfoDecode(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PSPC_SIGINFO pInfo, OUT DWORD *pcbInfo) { BOOL fResult; SpcSigInfo *pSpcSigInfo = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) { *pcbInfo = 0; }
if (!(WVTAsn1InfoDecodeAndAlloc(SpcSigInfo_PDU, pbEncoded, cbEncoded, (void **)&pSpcSigInfo))) { goto ErrorReturn; }
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(SPC_SIGINFO); if (lRemainExtra < 0) { pbExtra = NULL; } else { pbExtra = (BYTE *) pInfo + sizeof(SPC_SIGINFO); }
if (!(WVTAsn1GetSpcSigInfo(pSpcSigInfo, dwFlags, pInfo, &pbExtra, &lRemainExtra))) { goto ErrorReturn; }
if (lRemainExtra >= 0) { *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; } else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) { goto LengthError; } }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD)ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn;
ErrorReturn: *pcbInfo = 0; fResult = FALSE;
CommonReturn: WVTAsn1InfoFree(SpcSigInfo_PDU, pSpcSigInfo); return fResult; }
BOOL WVTAsn1SetCatNameValue(IN PCAT_NAMEVALUE pInfo, OUT NameValue *pOss) { memset(pOss, 0x00, sizeof(*pOss));
// tag!
WVTAsn1SetBMP(pInfo->pwszTag, &pOss->refname);
// flags
pOss->typeaction = (int)pInfo->fdwFlags;
// value
WVTAsn1SetOctetString(&pInfo->Value, &pOss->value);
return(TRUE); }
BOOL WVTAsn1SetCatMemberInfo(IN PCAT_MEMBERINFO pInfo, OUT MemberInfo *pOss) { memset(pOss, 0x00, sizeof(*pOss));
// subject guid (wide text)
WVTAsn1SetBMP(pInfo->pwszSubjGuid, &pOss->subguid);
// cert version
pOss->certversion = (int)pInfo->dwCertVersion;
return(TRUE); }
BOOL WVTAsn1GetCatNameValue(IN NameValue *pOss, IN DWORD dwFlags, OUT PCAT_NAMEVALUE pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra) { if (*plRemainExtra >= 0) { memset(pInfo, 0, sizeof(*pInfo)); }
WVTAsn1GetOctetString(&pOss->value, dwFlags, &pInfo->Value, ppbExtra, plRemainExtra);
if (*plRemainExtra >= 0) { pInfo->fdwFlags = (DWORD)pOss->typeaction; }
WVTAsn1GetBMP(&pOss->refname, dwFlags, &pInfo->pwszTag, ppbExtra, plRemainExtra);
return(TRUE); }
BOOL WVTAsn1GetCatMemberInfo(IN MemberInfo *pOss, IN DWORD dwFlags, OUT PCAT_MEMBERINFO pInfo, IN OUT BYTE **ppbExtra, IN OUT LONG *plRemainExtra) { if (*plRemainExtra >= 0) { memset(pInfo, 0, sizeof(*pInfo)); }
WVTAsn1GetBMP(&pOss->subguid, dwFlags, &pInfo->pwszSubjGuid, ppbExtra, plRemainExtra);
if (*plRemainExtra >= 0) { pInfo->dwCertVersion = pOss->certversion; }
return(TRUE); }
BOOL WINAPI WVTAsn1CatNameValueEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCAT_NAMEVALUE pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded) { BOOL fResult; NameValue OssNameValue;
if (!(WVTAsn1SetCatNameValue(pInfo, &OssNameValue))) { goto ErrorReturn; }
fResult = WVTAsn1InfoEncode(NameValue_PDU, &OssNameValue, pbEncoded, pcbEncoded);
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE;
CommonReturn: return(fResult); }
BOOL WINAPI WVTAsn1CatMemberInfoEncode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN PCAT_MEMBERINFO pInfo, OUT BYTE *pbEncoded, IN OUT DWORD *pcbEncoded) { BOOL fResult; MemberInfo OssMemberInfo;
if (!(WVTAsn1SetCatMemberInfo(pInfo, &OssMemberInfo))) { goto ErrorReturn; }
fResult = WVTAsn1InfoEncode(MemberInfo_PDU, &OssMemberInfo, pbEncoded, pcbEncoded);
goto CommonReturn;
ErrorReturn: *pcbEncoded = 0; fResult = FALSE;
CommonReturn: return(fResult); }
BOOL WINAPI WVTAsn1CatNameValueDecode(IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCAT_NAMEVALUE pInfo, IN OUT DWORD *pcbInfo) { BOOL fResult; NameValue *pNameValue = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) { *pcbInfo = 0; }
if (!(WVTAsn1InfoDecodeAndAlloc(NameValue_PDU, pbEncoded, cbEncoded, (void **)&pNameValue))) { goto ErrorReturn; }
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(CAT_NAMEVALUE); if (lRemainExtra < 0) { pbExtra = NULL; } else { pbExtra = (BYTE *) pInfo + sizeof(CAT_NAMEVALUE); }
if (!(WVTAsn1GetCatNameValue(pNameValue, dwFlags, pInfo, &pbExtra, &lRemainExtra))) { goto ErrorReturn; }
if (lRemainExtra >= 0) { *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; } else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) { goto LengthError; } }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD)ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn;
ErrorReturn: *pcbInfo = 0; fResult = FALSE;
CommonReturn: WVTAsn1InfoFree(NameValue_PDU, pNameValue); return fResult; }
BOOL WINAPI WVTAsn1CatMemberInfoDecode( IN DWORD dwCertEncodingType, IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, IN DWORD dwFlags, OUT PCAT_MEMBERINFO pInfo, IN OUT DWORD *pcbInfo) { BOOL fResult; MemberInfo *pMemberInfo = NULL; BYTE *pbExtra; LONG lRemainExtra;
if (pInfo == NULL) { *pcbInfo = 0; }
if (!(WVTAsn1InfoDecodeAndAlloc(MemberInfo_PDU, pbEncoded, cbEncoded, (void **)&pMemberInfo))) { goto ErrorReturn; }
// for lRemainExtra < 0, LENGTH_ONLY calculation
lRemainExtra = (LONG) *pcbInfo - sizeof(CAT_MEMBERINFO); if (lRemainExtra < 0) { pbExtra = NULL; } else { pbExtra = (BYTE *) pInfo + sizeof(CAT_MEMBERINFO); }
if (!(WVTAsn1GetCatMemberInfo(pMemberInfo, dwFlags, pInfo, &pbExtra, &lRemainExtra))) { goto ErrorReturn; }
if (lRemainExtra >= 0) { *pcbInfo = *pcbInfo - (DWORD) lRemainExtra; } else { *pcbInfo = *pcbInfo + (DWORD) -lRemainExtra; if (pInfo) { goto LengthError; } }
fResult = TRUE; goto CommonReturn;
LengthError: SetLastError((DWORD)ERROR_MORE_DATA); fResult = FALSE; goto CommonReturn;
ErrorReturn: *pcbInfo = 0; fResult = FALSE;
CommonReturn: WVTAsn1InfoFree(MemberInfo_PDU, pMemberInfo); return fResult; }
|