From f94d49dcd4c161d38b8568ee8c9a5d4dd5358f64 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 25 May 2006 19:43:30 -0700 Subject: [PATCH] crypt32: Implement CertSerializeCRLStoreElement. --- dlls/crypt32/crypt32.spec | 2 +- dlls/crypt32/crypt32_private.h | 2 + dlls/crypt32/serialize.c | 76 +++++++++++++++++++--------------- dlls/crypt32/store.c | 10 +++++ 4 files changed, 55 insertions(+), 35 deletions(-) diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec index 88dba5b91a1..8900bec0978 100644 --- a/dlls/crypt32/crypt32.spec +++ b/dlls/crypt32/crypt32.spec @@ -30,7 +30,7 @@ @ stdcall CertDuplicateStore(ptr) @ stdcall CertEnumCRLContextProperties(ptr long) @ stdcall CertEnumCRLsInStore(ptr ptr) -@ stub CertEnumCTLContextProperties +@ stdcall CertEnumCTLContextProperties(ptr long) @ stdcall CertEnumCTLsInStore(ptr ptr) @ stdcall CertEnumCertificateContextProperties(ptr long) @ stdcall CertEnumCertificatesInStore(long ptr) diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h index 5b39b1237d7..67306b36b5c 100644 --- a/dlls/crypt32/crypt32_private.h +++ b/dlls/crypt32/crypt32_private.h @@ -56,6 +56,7 @@ typedef BOOL (WINAPI *AddEncodedContextToStoreFunc)(HCERTSTORE hCertStore, typedef const void *(WINAPI *DuplicateContextFunc)(const void *context); typedef const void *(WINAPI *EnumContextsInStoreFunc)(HCERTSTORE hCertStore, const void *pPrevContext); +typedef DWORD (WINAPI *EnumPropertiesFunc)(const void *context, DWORD dwPropId); typedef BOOL (WINAPI *GetContextPropertyFunc)(const void *context, DWORD dwPropID, void *pvData, DWORD *pcbData); typedef BOOL (WINAPI *SetContextPropertyFunc)(const void *context, @@ -73,6 +74,7 @@ typedef struct _WINE_CONTEXT_INTERFACE AddEncodedContextToStoreFunc addEncodedToStore; DuplicateContextFunc duplicate; EnumContextsInStoreFunc enumContextsInStore; + EnumPropertiesFunc enumProps; GetContextPropertyFunc getProp; SetContextPropertyFunc setProp; SerializeElementFunc serialize; diff --git a/dlls/crypt32/serialize.c b/dlls/crypt32/serialize.c index f1f39898a0c..b0765a71c98 100644 --- a/dlls/crypt32/serialize.c +++ b/dlls/crypt32/serialize.c @@ -36,45 +36,29 @@ typedef struct _WINE_CERT_PROP_HEADER DWORD cb; } WINE_CERT_PROP_HEADER, *PWINE_CERT_PROP_HEADER; -BOOL WINAPI CertSerializeCRLStoreElement(PCCRL_CONTEXT pCrlContext, - DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement) -{ - FIXME("(%p, %08lx, %p, %p): stub\n", pCrlContext, dwFlags, pbElement, - pcbElement); - return FALSE; -} - -BOOL WINAPI CertSerializeCTLStoreElement(PCCTL_CONTEXT pCtlContext, - DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement) -{ - FIXME("(%p, %08lx, %p, %p): stub\n", pCtlContext, dwFlags, pbElement, - pcbElement); - return FALSE; -} - -BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext, - DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement) +static BOOL CRYPT_SerializeStoreElement(const void *context, + const BYTE *encodedContext, DWORD cbEncodedContext, DWORD contextPropID, + PCWINE_CONTEXT_INTERFACE contextInterface, DWORD dwFlags, BYTE *pbElement, + DWORD *pcbElement) { BOOL ret; - TRACE("(%p, %08lx, %p, %p)\n", pCertContext, dwFlags, pbElement, - pcbElement); + TRACE("(%p, %p, %08lx, %p, %p)\n", context, contextInterface, dwFlags, + pbElement, pcbElement); - if (pCertContext) + if (context) { - DWORD bytesNeeded = sizeof(WINE_CERT_PROP_HEADER) + - pCertContext->cbCertEncoded; + DWORD bytesNeeded = sizeof(WINE_CERT_PROP_HEADER) + cbEncodedContext; DWORD prop = 0; ret = TRUE; do { - prop = CertEnumCertificateContextProperties(pCertContext, prop); + prop = contextInterface->enumProps(context, prop); if (prop) { DWORD propSize = 0; - ret = CertGetCertificateContextProperty(pCertContext, - prop, NULL, &propSize); + ret = contextInterface->getProp(context, prop, NULL, &propSize); if (ret) bytesNeeded += sizeof(WINE_CERT_PROP_HEADER) + propSize; } @@ -99,13 +83,13 @@ BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext, prop = 0; do { - prop = CertEnumCertificateContextProperties(pCertContext, prop); + prop = contextInterface->enumProps(context, prop); if (prop) { DWORD propSize = 0; - ret = CertGetCertificateContextProperty(pCertContext, - prop, NULL, &propSize); + ret = contextInterface->getProp(context, prop, NULL, + &propSize); if (ret) { if (bufSize < propSize) @@ -118,8 +102,8 @@ BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext, } if (buf) { - ret = CertGetCertificateContextProperty( - pCertContext, prop, buf, &propSize); + ret = contextInterface->getProp(context, prop, buf, + &propSize); if (ret) { hdr = (PWINE_CERT_PROP_HEADER)pbElement; @@ -142,11 +126,11 @@ BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext, CryptMemFree(buf); hdr = (PWINE_CERT_PROP_HEADER)pbElement; - hdr->propID = CERT_CERT_PROP_ID; + hdr->propID = contextPropID; hdr->unknown = 1; - hdr->cb = pCertContext->cbCertEncoded; + hdr->cb = cbEncodedContext; memcpy(pbElement + sizeof(WINE_CERT_PROP_HEADER), - pCertContext->pbCertEncoded, pCertContext->cbCertEncoded); + encodedContext, cbEncodedContext); } } else @@ -154,6 +138,30 @@ BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext, return ret; } +BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext, + DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement) +{ + return CRYPT_SerializeStoreElement(pCertContext, + pCertContext->pbCertEncoded, pCertContext->cbCertEncoded, + CERT_CERT_PROP_ID, pCertInterface, dwFlags, pbElement, pcbElement); +} + +BOOL WINAPI CertSerializeCRLStoreElement(PCCRL_CONTEXT pCrlContext, + DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement) +{ + return CRYPT_SerializeStoreElement(pCrlContext, + pCrlContext->pbCrlEncoded, pCrlContext->cbCrlEncoded, + CERT_CRL_PROP_ID, pCRLInterface, dwFlags, pbElement, pcbElement); +} + +BOOL WINAPI CertSerializeCTLStoreElement(PCCTL_CONTEXT pCtlContext, + DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement) +{ + return CRYPT_SerializeStoreElement(pCtlContext, + pCtlContext->pbCtlEncoded, pCtlContext->cbCtlEncoded, + CERT_CTL_PROP_ID, pCRLInterface, dwFlags, pbElement, pcbElement); +} + /* Looks for the property with ID propID in the buffer buf. Returns a pointer * to its header if a valid header is found, NULL if not. Valid means the * length of thte property won't overrun buf, and the unknown field is 1. diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index 774d2b386d2..6d3a1be5cbb 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -47,6 +47,7 @@ static const WINE_CONTEXT_INTERFACE gCertInterface = { (AddEncodedContextToStoreFunc)CertAddEncodedCertificateToStore, (DuplicateContextFunc)CertDuplicateCertificateContext, (EnumContextsInStoreFunc)CertEnumCertificatesInStore, + (EnumPropertiesFunc)CertEnumCertificateContextProperties, (GetContextPropertyFunc)CertGetCertificateContextProperty, (SetContextPropertyFunc)CertSetCertificateContextProperty, (SerializeElementFunc)CertSerializeCertificateStoreElement, @@ -61,6 +62,7 @@ static const WINE_CONTEXT_INTERFACE gCRLInterface = { (AddEncodedContextToStoreFunc)CertAddEncodedCRLToStore, (DuplicateContextFunc)CertDuplicateCRLContext, (EnumContextsInStoreFunc)CertEnumCRLsInStore, + (EnumPropertiesFunc)CertEnumCRLContextProperties, (GetContextPropertyFunc)CertGetCRLContextProperty, (SetContextPropertyFunc)CertSetCRLContextProperty, (SerializeElementFunc)CertSerializeCRLStoreElement, @@ -75,6 +77,7 @@ static const WINE_CONTEXT_INTERFACE gCTLInterface = { (AddEncodedContextToStoreFunc)CertAddEncodedCTLToStore, (DuplicateContextFunc)CertDuplicateCTLContext, (EnumContextsInStoreFunc)CertEnumCTLsInStore, + (EnumPropertiesFunc)CertEnumCTLContextProperties, (GetContextPropertyFunc)CertGetCTLContextProperty, (SetContextPropertyFunc)CertSetCTLContextProperty, (SerializeElementFunc)CertSerializeCTLStoreElement, @@ -2240,6 +2243,13 @@ BOOL WINAPI CertControlStore(HCERTSTORE hCertStore, DWORD dwFlags, return ret; } +DWORD WINAPI CertEnumCTLContextProperties(PCCTL_CONTEXT pCTLContext, + DWORD dwPropId) +{ + FIXME("(%p, %ld): stub\n", pCTLContext, dwPropId); + return 0; +} + BOOL WINAPI CertGetCTLContextProperty(PCCTL_CONTEXT pCTLContext, DWORD dwPropId, void *pvData, DWORD *pcbData) {