Juan Lang : crypt32: Separate DecodeInt into an internal and external version.
Alexandre Julliard
julliard at winehq.org
Tue Sep 18 05:31:24 CDT 2007
Module: wine
Branch: master
Commit: 5fbca384e4eb15af4f96fe3e27f6001eee4c5597
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5fbca384e4eb15af4f96fe3e27f6001eee4c5597
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Sep 17 17:03:28 2007 -0700
crypt32: Separate DecodeInt into an internal and external version.
---
dlls/crypt32/decode.c | 93 +++++++++++++++++++++++++++++-------------------
1 files changed, 56 insertions(+), 37 deletions(-)
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index c5cf989..f89fbe5 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -3034,59 +3034,78 @@ static BOOL WINAPI CRYPT_AsnDecodeBits(DWORD dwCertEncodingType,
return ret;
}
+static BOOL CRYPT_AsnDecodeIntInternal(const BYTE *pbEncoded, DWORD cbEncoded,
+ DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded)
+{
+ BOOL ret;
+ BYTE buf[sizeof(CRYPT_INTEGER_BLOB) + sizeof(int)];
+ CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)buf;
+ DWORD size = sizeof(buf);
+
+ blob->pbData = buf + sizeof(CRYPT_INTEGER_BLOB);
+ if (pbEncoded[0] != ASN_INTEGER)
+ {
+ SetLastError(CRYPT_E_ASN1_BADTAG);
+ ret = FALSE;
+ }
+ else
+ ret = CRYPT_AsnDecodeIntegerInternal(X509_ASN_ENCODING, NULL,
+ pbEncoded, cbEncoded, 0, NULL, &buf, &size);
+ if (ret)
+ {
+ if (!pvStructInfo)
+ *pcbStructInfo = sizeof(int);
+ else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, NULL,
+ pvStructInfo, pcbStructInfo, sizeof(int))))
+ {
+ int val, i;
+
+ if (blob->pbData[blob->cbData - 1] & 0x80)
+ {
+ /* initialize to a negative value to sign-extend */
+ val = -1;
+ }
+ else
+ val = 0;
+ for (i = 0; i < blob->cbData; i++)
+ {
+ val <<= 8;
+ val |= blob->pbData[blob->cbData - i - 1];
+ }
+ memcpy(pvStructInfo, &val, sizeof(int));
+ }
+ }
+ else if (GetLastError() == ERROR_MORE_DATA)
+ SetLastError(CRYPT_E_ASN1_LARGE);
+ return ret;
+}
+
static BOOL WINAPI CRYPT_AsnDecodeInt(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
{
BOOL ret;
- if (!pvStructInfo)
- {
- *pcbStructInfo = sizeof(int);
- return TRUE;
- }
__TRY
{
- BYTE buf[sizeof(CRYPT_INTEGER_BLOB) + sizeof(int)];
- CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)buf;
- DWORD size = sizeof(buf);
+ DWORD bytesNeeded;
- blob->pbData = buf + sizeof(CRYPT_INTEGER_BLOB);
- if (pbEncoded[0] != ASN_INTEGER)
- {
- SetLastError(CRYPT_E_ASN1_BADTAG);
- ret = FALSE;
- }
- else
- ret = CRYPT_AsnDecodeIntegerInternal(dwCertEncodingType,
- X509_MULTI_BYTE_INTEGER, pbEncoded, cbEncoded, 0, NULL, &buf,
- &size);
+ ret = CRYPT_AsnDecodeIntInternal(pbEncoded, cbEncoded,
+ dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL);
if (ret)
{
- if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara,
- pvStructInfo, pcbStructInfo, sizeof(int))))
+ if (!pvStructInfo)
+ *pcbStructInfo = bytesNeeded;
+ else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara,
+ pvStructInfo, pcbStructInfo, bytesNeeded)))
{
- int val, i;
-
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
pvStructInfo = *(BYTE **)pvStructInfo;
- if (blob->pbData[blob->cbData - 1] & 0x80)
- {
- /* initialize to a negative value to sign-extend */
- val = -1;
- }
- else
- val = 0;
- for (i = 0; i < blob->cbData; i++)
- {
- val <<= 8;
- val |= blob->pbData[blob->cbData - i - 1];
- }
- memcpy(pvStructInfo, &val, sizeof(int));
+ ret = CRYPT_AsnDecodeIntInternal(pbEncoded, cbEncoded,
+ dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo,
+ &bytesNeeded, NULL);
}
}
- else if (GetLastError() == ERROR_MORE_DATA)
- SetLastError(CRYPT_E_ASN1_LARGE);
}
__EXCEPT_PAGE_FAULT
{
More information about the wine-cvs
mailing list