|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1995 - 1999
//
// File: Certhlp.cpp
//
// Contents: Certificate store management tools helper functions
//
//
// History: July 21st xiaohs created
//
//--------------------------------------------------------------------------
#include "certmgr.h"
//+-------------------------------------------------------------------------
// GetSignAlgids
//--------------------------------------------------------------------------
void GetSignAlgids( IN LPCSTR pszOID, OUT ALG_ID *paiHash, OUT ALG_ID *paiPubKey ) { PCCRYPT_OID_INFO pInfo;
*paiHash = 0; *paiPubKey = 0; if (pInfo = CryptFindOIDInfo( CRYPT_OID_INFO_OID_KEY, (void *) pszOID, CRYPT_SIGN_ALG_OID_GROUP_ID )) { DWORD cExtra = pInfo->ExtraInfo.cbData / sizeof(DWORD); DWORD *pdwExtra = (DWORD *) pInfo->ExtraInfo.pbData;
*paiHash = pInfo->Algid; if (1 <= cExtra) *paiPubKey = pdwExtra[0]; } }
//+-------------------------------------------------------------------------
// GetAlgid
//--------------------------------------------------------------------------
ALG_ID GetAlgid(LPCSTR pszOID, DWORD dwGroupId) { PCCRYPT_OID_INFO pInfo;
if (pInfo = CryptFindOIDInfo( CRYPT_OID_INFO_OID_KEY, (void *) pszOID, dwGroupId )) return pInfo->Algid; return 0; } //+-------------------------------------------------------------------------
//+-------------------------------------------------------------------------
// Allocates and returns the specified cryptographic message parameter.
//--------------------------------------------------------------------------
void *AllocAndGetMsgParam( IN HCRYPTMSG hMsg, IN DWORD dwParamType, IN DWORD dwIndex, OUT DWORD *pcbData ) { void *pvData; DWORD cbData;
if (!CryptMsgGetParam( hMsg, dwParamType, dwIndex, NULL, // pvData
&cbData) || 0 == cbData) goto ErrorReturn; if (NULL == (pvData = ToolUtlAlloc(cbData))) goto ErrorReturn; if (!CryptMsgGetParam( hMsg, dwParamType, dwIndex, pvData, &cbData)) { ToolUtlFree(pvData); goto ErrorReturn; }
CommonReturn: *pcbData = cbData; return pvData; ErrorReturn: pvData = NULL; cbData = 0; goto CommonReturn; }
////////////////////////////////////////////////////////
//
// Convert STR to WSTR
//
HRESULT SZtoWSZ(LPSTR szStr,LPWSTR *pwsz) { DWORD dwSize=0; DWORD dwError=0;
assert(pwsz);
*pwsz=NULL;
//return NULL
if(!szStr) return S_OK;
dwSize=MultiByteToWideChar(0, 0,szStr, -1,NULL,0);
if(dwSize==0) { dwError=GetLastError(); return HRESULT_FROM_WIN32(dwError); }
//allocate memory
*pwsz=(LPWSTR)ToolUtlAlloc(dwSize * sizeof(WCHAR));
if(*pwsz==NULL) return E_OUTOFMEMORY;
if(MultiByteToWideChar(0, 0,szStr, -1, *pwsz,dwSize)) { return S_OK; } else { ToolUtlFree(*pwsz); dwError=GetLastError(); return HRESULT_FROM_WIN32(dwError); } }
//+-------------------------------------------------------------------------
// Decode the object and allocate memory
//--------------------------------------------------------------------------
void *TestNoCopyDecodeObject( IN LPCSTR lpszStructType, IN const BYTE *pbEncoded, IN DWORD cbEncoded, OUT DWORD *pcbInfo ) { BOOL fResult; DWORD cbInfo; void *pvInfo;
if (pcbInfo) *pcbInfo = 0; // Set to bogus value. pvInfo == NULL, should cause it to be ignored.
cbInfo = 0x12345678; fResult = CryptDecodeObject( PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, lpszStructType, pbEncoded, cbEncoded, CRYPT_DECODE_NOCOPY_FLAG, NULL, // pvInfo
&cbInfo ); if (!fResult || cbInfo == 0) return NULL;
if (NULL == (pvInfo = ToolUtlAlloc(cbInfo))) return NULL;
if (!CryptDecodeObject( PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, lpszStructType, pbEncoded, cbEncoded, CRYPT_DECODE_NOCOPY_FLAG, pvInfo, &cbInfo )) { ToolUtlFree(pvInfo); return NULL; }
if (pcbInfo) *pcbInfo = cbInfo; return pvInfo; }
//+-------------------------------------------------------------------------
// Returns TRUE if the CTL is still time valid.
//
// A CTL without a NextUpdate is considered time valid.
//--------------------------------------------------------------------------
BOOL IsTimeValidCtl( IN PCCTL_CONTEXT pCtl ) { PCTL_INFO pCtlInfo = pCtl->pCtlInfo; SYSTEMTIME SystemTime; FILETIME CurrentTime;
// Get current time to be used to determine if CTLs are time valid
GetSystemTime(&SystemTime); SystemTimeToFileTime(&SystemTime, &CurrentTime);
// Note, NextUpdate is optional. When not present, its set to 0
if ((0 == pCtlInfo->NextUpdate.dwLowDateTime && 0 == pCtlInfo->NextUpdate.dwHighDateTime) || CompareFileTime(&pCtlInfo->NextUpdate, &CurrentTime) >= 0) return TRUE; else return FALSE; }
//+-------------------------------------------------------------------------
// Display serial number
//
//--------------------------------------------------------------------------
void DisplaySerialNumber( PCRYPT_INTEGER_BLOB pSerialNumber ) { DWORD cb; BYTE *pb; for (cb = pSerialNumber->cbData, pb = pSerialNumber->pbData + (cb - 1); cb > 0; cb--, pb--) { printf(" %02X", *pb); } }
//+-------------------------------------------------------------------------
// Reverses a buffer of bytes in place
//--------------------------------------------------------------------------
void ReverseBytes( IN OUT PBYTE pbIn, IN DWORD cbIn ) { // reverse in place
PBYTE pbLo; PBYTE pbHi; BYTE bTmp;
for (pbLo = pbIn, pbHi = pbIn + cbIn - 1; pbLo < pbHi; pbHi--, pbLo++) { bTmp = *pbHi; *pbHi = *pbLo; *pbLo = bTmp; } }
|