crypt32: Support reading a serialized store object from memory in CryptQueryObject.
This commit is contained in:
parent
51a1f5a642
commit
9928e2e1c5
|
@ -282,6 +282,12 @@ const void *CRYPT_ReadSerializedElement(const BYTE *pbElement,
|
|||
*/
|
||||
BOOL CRYPT_ReadSerializedStoreFromFile(HANDLE file, HCERTSTORE store);
|
||||
|
||||
/* Reads contexts serialized in the blob into the memory store. Returns FALSE
|
||||
* if the file is not of the expected format.
|
||||
*/
|
||||
BOOL CRYPT_ReadSerializedStoreFromBlob(const CRYPT_DATA_BLOB *blob,
|
||||
HCERTSTORE store);
|
||||
|
||||
/* Fixes up the pointers in info, where info is assumed to be a
|
||||
* CRYPT_KEY_PROV_INFO, followed by its container name, provider name, and any
|
||||
* provider parameters, in a contiguous buffer, but where info's pointers are
|
||||
|
|
|
@ -283,20 +283,13 @@ end:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static BOOL CRYPT_QuerySerializedStoreObject(DWORD dwObjectType,
|
||||
const void *pvObject, DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType,
|
||||
static BOOL CRYPT_QuerySerializedStoreFromFile(LPCWSTR fileName,
|
||||
DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType,
|
||||
HCERTSTORE *phCertStore, HCRYPTMSG *phMsg)
|
||||
{
|
||||
LPCWSTR fileName = pvObject;
|
||||
HANDLE file;
|
||||
BOOL ret = FALSE;
|
||||
|
||||
if (dwObjectType != CERT_QUERY_OBJECT_FILE)
|
||||
{
|
||||
FIXME("unimplemented for non-file type %d\n", dwObjectType);
|
||||
SetLastError(E_INVALIDARG); /* FIXME: is this the correct error? */
|
||||
return FALSE;
|
||||
}
|
||||
TRACE("%s\n", debugstr_w(fileName));
|
||||
file = CreateFileW(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, 0, NULL);
|
||||
|
@ -322,6 +315,50 @@ static BOOL CRYPT_QuerySerializedStoreObject(DWORD dwObjectType,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static BOOL CRYPT_QuerySerializedStoreFromBlob(const CRYPT_DATA_BLOB *blob,
|
||||
DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType,
|
||||
HCERTSTORE *phCertStore, HCRYPTMSG *phMsg)
|
||||
{
|
||||
HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
|
||||
CERT_STORE_CREATE_NEW_FLAG, NULL);
|
||||
BOOL ret;
|
||||
|
||||
TRACE("(%d, %p)\n", blob->cbData, blob->pbData);
|
||||
|
||||
ret = CRYPT_ReadSerializedStoreFromBlob(blob, store);
|
||||
if (ret)
|
||||
{
|
||||
if (pdwMsgAndCertEncodingType)
|
||||
*pdwMsgAndCertEncodingType = X509_ASN_ENCODING;
|
||||
if (pdwContentType)
|
||||
*pdwContentType = CERT_QUERY_CONTENT_SERIALIZED_STORE;
|
||||
if (phCertStore)
|
||||
*phCertStore = CertDuplicateStore(store);
|
||||
}
|
||||
CertCloseStore(store, 0);
|
||||
TRACE("returning %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static BOOL CRYPT_QuerySerializedStoreObject(DWORD dwObjectType,
|
||||
const void *pvObject, DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType,
|
||||
HCERTSTORE *phCertStore, HCRYPTMSG *phMsg)
|
||||
{
|
||||
switch (dwObjectType)
|
||||
{
|
||||
case CERT_QUERY_OBJECT_FILE:
|
||||
return CRYPT_QuerySerializedStoreFromFile(pvObject,
|
||||
pdwMsgAndCertEncodingType, pdwContentType, phCertStore, phMsg);
|
||||
case CERT_QUERY_OBJECT_BLOB:
|
||||
return CRYPT_QuerySerializedStoreFromBlob(pvObject,
|
||||
pdwMsgAndCertEncodingType, pdwContentType, phCertStore, phMsg);
|
||||
default:
|
||||
FIXME("unimplemented for type %d\n", dwObjectType);
|
||||
SetLastError(E_INVALIDARG); /* FIXME: is this the correct error? */
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static BOOL CRYPT_QuerySignedMessage(const CRYPT_DATA_BLOB *blob,
|
||||
DWORD *pdwMsgAndCertEncodingType, DWORD *pdwContentType, HCRYPTMSG *phMsg)
|
||||
{
|
||||
|
|
|
@ -534,6 +534,37 @@ BOOL CRYPT_ReadSerializedStoreFromFile(HANDLE file, HCERTSTORE store)
|
|||
return CRYPT_ReadSerializedStore(file, read_file_wrapper, store);
|
||||
}
|
||||
|
||||
struct BlobReader
|
||||
{
|
||||
const CRYPT_DATA_BLOB *blob;
|
||||
DWORD current;
|
||||
};
|
||||
|
||||
static BOOL read_blob_wrapper(void *handle, void *buffer, DWORD bytesToRead,
|
||||
DWORD *bytesRead)
|
||||
{
|
||||
struct BlobReader *reader = handle;
|
||||
BOOL ret;
|
||||
|
||||
if (reader->current < reader->blob->cbData)
|
||||
{
|
||||
*bytesRead = min(bytesToRead, reader->blob->cbData - reader->current);
|
||||
memcpy(buffer, reader->blob->pbData + reader->current, *bytesRead);
|
||||
ret = TRUE;
|
||||
}
|
||||
else
|
||||
ret = FALSE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
BOOL CRYPT_ReadSerializedStoreFromBlob(const CRYPT_DATA_BLOB *blob,
|
||||
HCERTSTORE store)
|
||||
{
|
||||
struct BlobReader reader = { blob, 0 };
|
||||
|
||||
return CRYPT_ReadSerializedStore(&reader, read_blob_wrapper, store);
|
||||
}
|
||||
|
||||
static BOOL WINAPI CRYPT_SerializeCertNoHash(PCCERT_CONTEXT pCertContext,
|
||||
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue