crypt32: Move digested data encoding to encode.c.

This commit is contained in:
Juan Lang 2007-07-17 07:22:50 -07:00 committed by Alexandre Julliard
parent d212adbf10
commit 703a0f6fce
3 changed files with 57 additions and 51 deletions

View File

@ -67,23 +67,21 @@ BOOL WINAPI CRYPT_AsnEncodeConstructed(DWORD dwCertEncodingType,
BOOL WINAPI CRYPT_AsnEncodeOid(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
BOOL WINAPI CRYPT_AsnEncodeInt(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
/* Like CRYPT_AsnEncodeAlgorithmId, but encodes parameters as an asn.1 NULL
* if they are empty.
*/
BOOL WINAPI CRYPT_AsnEncodeAlgorithmIdWithNullParams(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
/* Like CRYPT_AsnEncodePKCSContentInfo, but allows the OID to be NULL */
BOOL WINAPI CRYPT_AsnEncodePKCSContentInfoInternal(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
BOOL WINAPI CRYPT_AsnEncodeOctets(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
typedef struct _CRYPT_DIGESTED_DATA
{
DWORD version;
CRYPT_ALGORITHM_IDENTIFIER DigestAlgorithm;
CRYPT_CONTENT_INFO ContentInfo;
CRYPT_HASH_BLOB hash;
} CRYPT_DIGESTED_DATA;
BOOL CRYPT_AsnEncodePKCSDigestedData(CRYPT_DIGESTED_DATA *digestedData,
void *pvData, DWORD *pcbData);
/* Helper function to check *pcbEncoded, set it to the required size, and
* optionally to allocate memory. Assumes pbEncoded is not NULL.
* If CRYPT_ENCODE_ALLOC_FLAG is set in dwFlags, *pbEncoded will be set to a

View File

@ -78,6 +78,9 @@ static BOOL WINAPI CRYPT_AsnEncodeBits(DWORD dwCertEncodingType,
static BOOL WINAPI CRYPT_AsnEncodeBitsSwapBytes(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
static BOOL WINAPI CRYPT_AsnEncodeInt(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
static BOOL WINAPI CRYPT_AsnEncodeInteger(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
@ -388,9 +391,13 @@ static BOOL WINAPI CRYPT_AsnEncodeValidity(DWORD dwCertEncodingType,
return ret;
}
BOOL WINAPI CRYPT_AsnEncodeAlgorithmIdWithNullParams(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
/* Like CRYPT_AsnEncodeAlgorithmId, but encodes parameters as an asn.1 NULL
* if they are empty.
*/
static BOOL WINAPI CRYPT_AsnEncodeAlgorithmIdWithNullParams(
DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo,
DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded,
DWORD *pcbEncoded)
{
const CRYPT_ALGORITHM_IDENTIFIER *algo =
(const CRYPT_ALGORITHM_IDENTIFIER *)pvStructInfo;
@ -1439,9 +1446,11 @@ static BOOL WINAPI CRYPT_AsnEncodePKCSAttributes(DWORD dwCertEncodingType,
return ret;
}
BOOL WINAPI CRYPT_AsnEncodePKCSContentInfoInternal(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
/* Like CRYPT_AsnEncodePKCSContentInfo, but allows the OID to be NULL */
static BOOL WINAPI CRYPT_AsnEncodePKCSContentInfoInternal(
DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo,
DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded,
DWORD *pcbEncoded)
{
const CRYPT_CONTENT_INFO *info = (const CRYPT_CONTENT_INFO *)pvStructInfo;
struct AsnEncodeSequenceItem items[2] = {
@ -1464,6 +1473,21 @@ BOOL WINAPI CRYPT_AsnEncodePKCSContentInfoInternal(DWORD dwCertEncodingType,
cItem, dwFlags, pEncodePara, pbEncoded, pcbEncoded);
}
BOOL CRYPT_AsnEncodePKCSDigestedData(CRYPT_DIGESTED_DATA *digestedData,
void *pvData, DWORD *pcbData)
{
struct AsnEncodeSequenceItem items[] = {
{ &digestedData->version, CRYPT_AsnEncodeInt, 0 },
{ &digestedData->DigestAlgorithm, CRYPT_AsnEncodeAlgorithmIdWithNullParams,
0 },
{ &digestedData->ContentInfo, CRYPT_AsnEncodePKCSContentInfoInternal, 0 },
{ &digestedData->hash, CRYPT_AsnEncodeOctets, 0 },
};
return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items,
sizeof(items) / sizeof(items[0]), 0, NULL, pvData, pcbData);
}
static BOOL WINAPI CRYPT_AsnEncodePKCSContentInfo(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)

View File

@ -347,56 +347,40 @@ static BOOL CRYPT_EncodePKCSDigestedData(CHashEncodeMsg *msg, void *pvData,
ret = CryptGetHashParam(msg->hash, HP_ALGID, (BYTE *)&algID, &size, 0);
if (ret)
{
CRYPT_ALGORITHM_IDENTIFIER algoId = { 0 };
DWORD version = CMSG_HASHED_DATA_PKCS_1_5_VERSION;
struct AsnEncodeSequenceItem items[7] = { { 0 } };
DWORD cItem = 0;
CRYPT_DATA_BLOB hash = { 0, NULL };
CRYPT_CONTENT_INFO contentInfo = { NULL, { 0, NULL } };
CRYPT_DIGESTED_DATA digestedData = { 0 };
char oid_rsa_data[] = szOID_RSA_data;
items[cItem].pvStructInfo = &version;
items[cItem].encodeFunc = CRYPT_AsnEncodeInt;
cItem++;
algoId.pszObjId = (LPSTR)CertAlgIdToOID(algID);
/* FIXME: what about algoId.Parameters? */
items[cItem].pvStructInfo = &algoId;
items[cItem].encodeFunc = CRYPT_AsnEncodeAlgorithmIdWithNullParams;
cItem++;
digestedData.version = CMSG_HASHED_DATA_PKCS_1_5_VERSION;
digestedData.DigestAlgorithm.pszObjId = (LPSTR)CertAlgIdToOID(algID);
/* FIXME: what about digestedData.DigestAlgorithm.Parameters? */
/* Quirk: OID is only encoded messages if an update has happened */
if (msg->base.state != MsgStateInit)
contentInfo.pszObjId = oid_rsa_data;
digestedData.ContentInfo.pszObjId = oid_rsa_data;
if (!(msg->base.open_flags & CMSG_DETACHED_FLAG) && msg->data.cbData)
{
ret = CRYPT_AsnEncodeOctets(0, NULL, &msg->data,
CRYPT_ENCODE_ALLOC_FLAG, NULL,
(LPBYTE)&contentInfo.Content.pbData,
&contentInfo.Content.cbData);
(LPBYTE)&digestedData.ContentInfo.Content.pbData,
&digestedData.ContentInfo.Content.cbData);
}
items[cItem].pvStructInfo = &contentInfo;
items[cItem].encodeFunc =
CRYPT_AsnEncodePKCSContentInfoInternal;
cItem++;
if (msg->base.state == MsgStateFinalized)
{
size = sizeof(DWORD);
ret = CryptGetHashParam(msg->hash, HP_HASHSIZE,
(LPBYTE)&hash.cbData, &size, 0);
(LPBYTE)&digestedData.hash.cbData, &size, 0);
if (ret)
{
hash.pbData = CryptMemAlloc(hash.cbData);
ret = CryptGetHashParam(msg->hash, HP_HASHVAL, hash.pbData,
&hash.cbData, 0);
digestedData.hash.pbData = CryptMemAlloc(
digestedData.hash.cbData);
ret = CryptGetHashParam(msg->hash, HP_HASHVAL,
digestedData.hash.pbData, &digestedData.hash.cbData, 0);
}
}
items[cItem].pvStructInfo = &hash;
items[cItem].encodeFunc = CRYPT_AsnEncodeOctets;
cItem++;
if (ret)
ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, cItem,
0, NULL, pvData, pcbData);
CryptMemFree(hash.pbData);
LocalFree(contentInfo.Content.pbData);
ret = CRYPT_AsnEncodePKCSDigestedData(&digestedData, pvData,
pcbData);
CryptMemFree(digestedData.hash.pbData);
LocalFree(digestedData.ContentInfo.Content.pbData);
}
return ret;
}