Juan Lang : wintrust: Implement WVTAsn1SpcFinancialCriteriaInfoDecode.
Alexandre Julliard
julliard at winehq.org
Tue Nov 4 07:29:04 CST 2008
Module: wine
Branch: master
Commit: cbccab6252af22492755759c0a8ddba23c408960
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbccab6252af22492755759c0a8ddba23c408960
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Nov 3 15:05:19 2008 -0800
wintrust: Implement WVTAsn1SpcFinancialCriteriaInfoDecode.
---
dlls/wintrust/asn.c | 68 +++++++++++++++++++++++++++++++++++++++++++-
dlls/wintrust/tests/asn.c | 2 -
2 files changed, 66 insertions(+), 4 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c
index b32f488..0341a7c 100644
--- a/dlls/wintrust/asn.c
+++ b/dlls/wintrust/asn.c
@@ -2186,11 +2186,75 @@ BOOL WINAPI WVTAsn1CatNameValueDecode(DWORD dwCertEncodingType,
return ret;
}
+static BOOL WINAPI CRYPT_AsnDecodeBool(DWORD dwCertEncodingType,
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
+ void *pvStructInfo, DWORD *pcbStructInfo)
+{
+ BOOL ret;
+
+ if (cbEncoded < 3)
+ {
+ SetLastError(CRYPT_E_ASN1_CORRUPT);
+ return FALSE;
+ }
+ if (GET_LEN_BYTES(pbEncoded[1]) > 1)
+ {
+ SetLastError(CRYPT_E_ASN1_CORRUPT);
+ return FALSE;
+ }
+ if (pbEncoded[1] > 1)
+ {
+ SetLastError(CRYPT_E_ASN1_CORRUPT);
+ return FALSE;
+ }
+ if (!pvStructInfo)
+ {
+ *pcbStructInfo = sizeof(BOOL);
+ ret = TRUE;
+ }
+ else if (*pcbStructInfo < sizeof(BOOL))
+ {
+ *pcbStructInfo = sizeof(BOOL);
+ SetLastError(ERROR_MORE_DATA);
+ ret = FALSE;
+ }
+ else
+ {
+ *pcbStructInfo = sizeof(BOOL);
+ *(BOOL *)pvStructInfo = pbEncoded[2] ? TRUE : FALSE;
+ ret = TRUE;
+ }
+ TRACE("returning %d (%08x)\n", ret, GetLastError());
+ return ret;
+}
+
BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoDecode(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
void *pvStructInfo, DWORD *pcbStructInfo)
{
- FIXME("(%p, %d, %08x, %p, %d): stub\n", pbEncoded, cbEncoded, dwFlags,
+ BOOL ret = FALSE;
+
+ TRACE("(%p, %d, %08x, %p, %d)\n", pbEncoded, cbEncoded, dwFlags,
pvStructInfo, *pcbStructInfo);
- return FALSE;
+
+ __TRY
+ {
+ struct AsnDecodeSequenceItem items[] = {
+ { ASN_BOOL, offsetof(SPC_FINANCIAL_CRITERIA, fFinancialInfoAvailable),
+ CRYPT_AsnDecodeBool, sizeof(BOOL), FALSE, FALSE, 0, 0 },
+ { ASN_BOOL, offsetof(SPC_FINANCIAL_CRITERIA, fMeetsCriteria),
+ CRYPT_AsnDecodeBool, sizeof(BOOL), FALSE, FALSE, 0, 0 },
+ };
+
+ ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
+ sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
+ pvStructInfo, pcbStructInfo, NULL);
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ SetLastError(STATUS_ACCESS_VIOLATION);
+ }
+ __ENDTRY
+ TRACE("returning %d\n", ret);
+ return ret;
}
diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c
index bbba1f4..0cc02dc 100644
--- a/dlls/wintrust/tests/asn.c
+++ b/dlls/wintrust/tests/asn.c
@@ -79,7 +79,6 @@ static void test_decodeSPCFinancialCriteria(void)
ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_FINANCIAL_CRITERIA_STRUCT,
falseCriteria, sizeof(falseCriteria), 0, NULL, &criteria, &size);
- todo_wine
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
if (ret)
{
@@ -88,7 +87,6 @@ static void test_decodeSPCFinancialCriteria(void)
}
ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_FINANCIAL_CRITERIA_STRUCT,
trueCriteria, sizeof(trueCriteria), 0, NULL, &criteria, &size);
- todo_wine
ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
if (ret)
{
More information about the wine-cvs
mailing list