Juan Lang : crypt32:
Separate construction of signer handles from signer info.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Aug 21 15:22:25 CDT 2007
Module: wine
Branch: master
Commit: bfbc159d1e0bb55de630748c65c98a22a3fc8a61
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bfbc159d1e0bb55de630748c65c98a22a3fc8a61
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Aug 20 17:47:02 2007 -0700
crypt32: Separate construction of signer handles from signer info.
---
dlls/crypt32/msg.c | 128 +++++++++++++++++++++++++++-------------------------
1 files changed, 66 insertions(+), 62 deletions(-)
diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c
index 27d0007..2d0299c 100644
--- a/dlls/crypt32/msg.c
+++ b/dlls/crypt32/msg.c
@@ -617,14 +617,6 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer)
return TRUE;
}
-typedef struct _CSignerHandles
-{
- HCRYPTPROV prov;
- HCRYPTHASH contentHash;
- HCRYPTHASH authAttrHash;
- HCRYPTKEY key;
-} CSignerHandles;
-
static BOOL CRYPT_ConstructBlob(CRYPT_DATA_BLOB *out, const CRYPT_DATA_BLOB *in)
{
BOOL ret = TRUE;
@@ -722,62 +714,33 @@ static BOOL CRYPT_ConstructAttributes(CRYPT_ATTRIBUTES *out,
return ret;
}
-/* Constructs a CSignerHandles with a copy of crypt_prov (not add-ref'ed - the
- * caller must do this if necessary), a hash handle based on HashAlgorithm, and
- * an authenticated attributes hash handle if hasAuthAttrs is TRUE.
- */
-static BOOL CSignerHandles_Construct(CSignerHandles *handles,
- HCRYPTPROV crypt_prov, CRYPT_ALGORITHM_IDENTIFIER *HashAlgorithm,
- BOOL hasAuthAttrs)
-{
- ALG_ID algID;
- BOOL ret;
-
- handles->prov = crypt_prov;
- algID = CertOIDToAlgId(HashAlgorithm->pszObjId);
- ret = CryptCreateHash(handles->prov, algID, 0, 0, &handles->contentHash);
- if (ret && hasAuthAttrs)
- ret = CryptCreateHash(handles->prov, algID, 0, 0,
- &handles->authAttrHash);
- return ret;
-}
-
-/* Constructs both a CSignerHandles and a CMSG_SIGNER_INFO from a
- * CMSG_SIGNER_ENCODE_INFO_WITH_CMS.
- */
-static BOOL CSignerInfo_Construct(CSignerHandles *handles,
- CMSG_SIGNER_INFO *info, CMSG_SIGNER_ENCODE_INFO_WITH_CMS *in, DWORD open_flags)
+/* Constructs a CMSG_SIGNER_INFO from a CMSG_SIGNER_ENCODE_INFO_WITH_CMS. */
+static BOOL CSignerInfo_Construct(CMSG_SIGNER_INFO *info,
+ CMSG_SIGNER_ENCODE_INFO_WITH_CMS *in)
{
BOOL ret;
- if (!(open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG))
- CryptContextAddRef(in->hCryptProv, NULL, 0);
- ret = CSignerHandles_Construct(handles, in->hCryptProv, &in->HashAlgorithm,
- in->cAuthAttr > 0);
+ /* Note: needs to change if CMS fields are supported */
+ info->dwVersion = CMSG_SIGNER_INFO_V1;
+ ret = CRYPT_ConstructBlob(&info->Issuer, &in->pCertInfo->Issuer);
if (ret)
- {
- /* Note: needs to change if CMS fields are supported */
- info->dwVersion = CMSG_SIGNER_INFO_V1;
- ret = CRYPT_ConstructBlob(&info->Issuer, &in->pCertInfo->Issuer);
- if (ret)
- ret = CRYPT_ConstructBlob(&info->SerialNumber,
- &in->pCertInfo->SerialNumber);
- /* Assumption: algorithm IDs will point to static strings, not
- * stack-based ones, so copying the pointer values is safe.
- */
- info->HashAlgorithm.pszObjId = in->HashAlgorithm.pszObjId;
- if (ret)
- ret = CRYPT_ConstructBlob(&info->HashAlgorithm.Parameters,
- &in->HashAlgorithm.Parameters);
- memset(&info->HashEncryptionAlgorithm, 0,
- sizeof(info->HashEncryptionAlgorithm));
- if (ret)
- ret = CRYPT_ConstructAttributes(&info->AuthAttrs,
- (CRYPT_ATTRIBUTES *)&in->cAuthAttr);
- if (ret)
- ret = CRYPT_ConstructAttributes(&info->UnauthAttrs,
- (CRYPT_ATTRIBUTES *)&in->cUnauthAttr);
- }
+ ret = CRYPT_ConstructBlob(&info->SerialNumber,
+ &in->pCertInfo->SerialNumber);
+ /* Assumption: algorithm IDs will point to static strings, not
+ * stack-based ones, so copying the pointer values is safe.
+ */
+ info->HashAlgorithm.pszObjId = in->HashAlgorithm.pszObjId;
+ if (ret)
+ ret = CRYPT_ConstructBlob(&info->HashAlgorithm.Parameters,
+ &in->HashAlgorithm.Parameters);
+ memset(&info->HashEncryptionAlgorithm, 0,
+ sizeof(info->HashEncryptionAlgorithm));
+ if (ret)
+ ret = CRYPT_ConstructAttributes(&info->AuthAttrs,
+ (CRYPT_ATTRIBUTES *)&in->cAuthAttr);
+ if (ret)
+ ret = CRYPT_ConstructAttributes(&info->UnauthAttrs,
+ (CRYPT_ATTRIBUTES *)&in->cUnauthAttr);
return ret;
}
@@ -807,6 +770,14 @@ static void CSignerInfo_Free(CMSG_SIGNER_INFO *info)
CryptMemFree(info->UnauthAttrs.rgAttr);
}
+typedef struct _CSignerHandles
+{
+ HCRYPTPROV prov;
+ HCRYPTHASH contentHash;
+ HCRYPTHASH authAttrHash;
+ HCRYPTKEY key;
+} CSignerHandles;
+
typedef struct _CSignedMsgData
{
CRYPT_SIGNED_INFO *info;
@@ -820,6 +791,26 @@ typedef struct _CSignedEncodeMsg
CSignedMsgData msg_data;
} CSignedEncodeMsg;
+/* Constructs a CSignerHandles with a copy of crypt_prov (not add-ref'ed - the
+ * caller must do this if necessary), a hash handle based on HashAlgorithm, and
+ * an authenticated attributes hash handle if hasAuthAttrs is TRUE.
+ */
+static BOOL CSignerHandles_Construct(CSignerHandles *handles,
+ HCRYPTPROV crypt_prov, CRYPT_ALGORITHM_IDENTIFIER *HashAlgorithm,
+ BOOL hasAuthAttrs)
+{
+ ALG_ID algID;
+ BOOL ret;
+
+ handles->prov = crypt_prov;
+ algID = CertOIDToAlgId(HashAlgorithm->pszObjId);
+ ret = CryptCreateHash(handles->prov, algID, 0, 0, &handles->contentHash);
+ if (ret && hasAuthAttrs)
+ ret = CryptCreateHash(handles->prov, algID, 0, 0,
+ &handles->authAttrHash);
+ return ret;
+}
+
static void CSignedMsgData_CloseHandles(CSignedMsgData *msg_data)
{
DWORD i;
@@ -1217,9 +1208,22 @@ static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
memset(msg->msg_data.info->rgSignerInfo, 0,
msg->msg_data.info->cSignerInfo * sizeof(CMSG_SIGNER_INFO));
for (i = 0; ret && i < msg->msg_data.info->cSignerInfo; i++)
- ret = CSignerInfo_Construct(&msg->msg_data.signerHandles[i],
+ {
+ ret = CSignerInfo_Construct(
&msg->msg_data.info->rgSignerInfo[i],
- &info->rgSigners[i], dwFlags);
+ &info->rgSigners[i]);
+ if (ret)
+ {
+ if (!(dwFlags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG))
+ CryptContextAddRef(info->rgSigners[i].hCryptProv,
+ NULL, 0);
+ ret = CSignerHandles_Construct(
+ &msg->msg_data.signerHandles[i],
+ info->rgSigners[i].hCryptProv,
+ &info->rgSigners[i].HashAlgorithm,
+ info->rgSigners[i].cAuthAttr > 0);
+ }
+ }
}
else
ret = FALSE;
More information about the wine-cvs
mailing list