crypt32: Add a helper function to construct a signer handles structure.

This commit is contained in:
Juan Lang 2007-08-20 17:46:13 -07:00 committed by Alexandre Julliard
parent de88fedcce
commit c4dd74d84c
1 changed files with 23 additions and 8 deletions

View File

@ -722,23 +722,38 @@ static BOOL CRYPT_ConstructAttributes(CRYPT_ATTRIBUTES *out,
return ret; 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 /* Constructs both a CSignerHandles and a CMSG_SIGNER_INFO from a
* CMSG_SIGNER_ENCODE_INFO_WITH_CMS. * CMSG_SIGNER_ENCODE_INFO_WITH_CMS.
*/ */
static BOOL CSignerInfo_Construct(CSignerHandles *handles, static BOOL CSignerInfo_Construct(CSignerHandles *handles,
CMSG_SIGNER_INFO *info, CMSG_SIGNER_ENCODE_INFO_WITH_CMS *in, DWORD open_flags) CMSG_SIGNER_INFO *info, CMSG_SIGNER_ENCODE_INFO_WITH_CMS *in, DWORD open_flags)
{ {
ALG_ID algID;
BOOL ret; BOOL ret;
handles->prov = in->hCryptProv;
if (!(open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)) if (!(open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG))
CryptContextAddRef(handles->prov, NULL, 0); CryptContextAddRef(in->hCryptProv, NULL, 0);
algID = CertOIDToAlgId(in->HashAlgorithm.pszObjId); ret = CSignerHandles_Construct(handles, in->hCryptProv, &in->HashAlgorithm,
ret = CryptCreateHash(handles->prov, algID, 0, 0, &handles->contentHash); in->cAuthAttr > 0);
if (ret && in->cAuthAttr)
ret = CryptCreateHash(handles->prov, algID, 0, 0,
&handles->authAttrHash);
if (ret) if (ret)
{ {
/* Note: needs to change if CMS fields are supported */ /* Note: needs to change if CMS fields are supported */