Module: wine Branch: master Commit: bbecd6913c7f61ca2941ed0f7c33b7d131382263 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbecd6913c7f61ca2941ed0f7c...
Author: Juan Lang juan.lang@gmail.com Date: Mon Nov 3 14:55:00 2008 -0800
wintrust: Implement WVTAsn1SpcFinancialCriteriaInfoEncode.
---
dlls/wintrust/asn.c | 55 +++++++++++++++++++++++++++++++++++++++++++- dlls/wintrust/tests/asn.c | 2 - 2 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index d64a9e3..56aeddc 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -49,6 +49,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(cryptasn);
#endif
+#define ASN_BOOL (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x01) #define ASN_BITSTRING (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x03) #define ASN_BMPSTRING (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x1e)
@@ -936,13 +937,63 @@ BOOL WINAPI WVTAsn1CatNameValueEncode(DWORD dwCertEncodingType, return ret; }
+static BOOL WINAPI CRYPT_AsnEncodeBool(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, + DWORD *pcbEncoded) +{ + BOOL val = *(const BOOL *)pvStructInfo, ret; + + TRACE("%d\n", val); + + if (!pbEncoded) + { + *pcbEncoded = 3; + ret = TRUE; + } + else if (*pcbEncoded < 3) + { + *pcbEncoded = 3; + SetLastError(ERROR_MORE_DATA); + ret = FALSE; + } + else + { + *pcbEncoded = 3; + *pbEncoded++ = ASN_BOOL; + *pbEncoded++ = 1; + *pbEncoded++ = val ? 0xff : 0; + ret = TRUE; + } + TRACE("returning %d (%08x)\n", ret, GetLastError()); + return ret; +} + BOOL WINAPI WVTAsn1SpcFinancialCriteriaInfoEncode(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded) { - FIXME("(0x%08x, %s, %p, %p, %p): stub\n", dwCertEncodingType, + BOOL ret = FALSE; + + TRACE("(0x%08x, %s, %p, %p, %p)\n", dwCertEncodingType, debugstr_a(lpszStructType), pvStructInfo, pbEncoded, pcbEncoded); - return FALSE; + + __TRY + { + const SPC_FINANCIAL_CRITERIA *criteria = pvStructInfo; + struct AsnEncodeSequenceItem items[] = { + { &criteria->fFinancialInfoAvailable, CRYPT_AsnEncodeBool, 0 }, + { &criteria->fMeetsCriteria, CRYPT_AsnEncodeBool, 0 }, + }; + + ret = CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, + items, sizeof(items) / sizeof(items[0]), pbEncoded, pcbEncoded); + } + __EXCEPT_PAGE_FAULT + { + SetLastError(STATUS_ACCESS_VIOLATION); + } + __ENDTRY + return ret; }
/* Gets the number of length bytes from the given (leading) length byte */ diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index 00553ec..288c4d7 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -46,7 +46,6 @@ static void test_encodeSPCFinancialCriteria(void) } ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_FINANCIAL_CRITERIA_STRUCT, &criteria, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (ret) { @@ -57,7 +56,6 @@ static void test_encodeSPCFinancialCriteria(void) criteria.fFinancialInfoAvailable = criteria.fMeetsCriteria = TRUE; ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_FINANCIAL_CRITERIA_STRUCT, &criteria, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); if (ret) {