Module: wine Branch: master Commit: 598e0a8fcfcbb2669cc66111646b20dbdb1a15a9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=598e0a8fcfcbb2669cc6611164...
Author: Juan Lang juan.lang@gmail.com Date: Thu Aug 6 16:41:13 2009 -0700
wintrust: Implement WVTAsn1SpcSpOpusInfoDecode.
---
dlls/wintrust/asn.c | 69 +++++++++++++++++++++++++++++++++++++++------ dlls/wintrust/tests/asn.c | 4 -- 2 files changed, 60 insertions(+), 13 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index e776cba..ec5c4de 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -2079,15 +2079,6 @@ BOOL WINAPI WVTAsn1SpcIndirectDataContentDecode(DWORD dwCertEncodingType, return ret; }
-BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode(DWORD dwCertEncodingType, - LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, - void *pvStructInfo, DWORD *pcbStructInfo) -{ - FIXME("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags, - pvStructInfo, *pcbStructInfo); - return FALSE; -} - static BOOL WINAPI CRYPT_AsnDecodeBMPString(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo) @@ -2126,6 +2117,66 @@ static BOOL WINAPI CRYPT_AsnDecodeBMPString(DWORD dwCertEncodingType, return ret; }
+static BOOL WINAPI CRYPT_AsnDecodeProgramName(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret = FALSE; + DWORD dataLen; + + TRACE("(%p, %d, %08x, %p, %d)\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, pvStructInfo ? *pcbStructInfo : 0); + + if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen))) + { + BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]); + + ret = CRYPT_AsnDecodeBMPString(dwCertEncodingType, lpszStructType, + pbEncoded + 1 + lenBytes, dataLen, dwFlags, pvStructInfo, + pcbStructInfo); + } + return ret; +} + +BOOL WINAPI WVTAsn1SpcSpOpusInfoDecode(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, + void *pvStructInfo, DWORD *pcbStructInfo) +{ + BOOL ret = FALSE; + + TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, *pcbStructInfo); + + __TRY + { + struct AsnDecodeSequenceItem items[] = { + { ASN_CONSTRUCTOR | ASN_CONTEXT, + offsetof(SPC_SP_OPUS_INFO, pwszProgramName), + CRYPT_AsnDecodeProgramName, sizeof(LPCWSTR), TRUE, TRUE, + offsetof(SPC_SP_OPUS_INFO, pwszProgramName), 0 }, + { ASN_CONSTRUCTOR | ASN_CONTEXT | 1, + offsetof(SPC_SP_OPUS_INFO, pMoreInfo), + CRYPT_AsnDecodeSPCLinkPointer, sizeof(PSPC_LINK), TRUE, TRUE, + offsetof(SPC_SP_OPUS_INFO, pMoreInfo), 0 }, + { ASN_CONSTRUCTOR | ASN_CONTEXT | 2, + offsetof(SPC_SP_OPUS_INFO, pPublisherInfo), + CRYPT_AsnDecodeSPCLinkPointer, sizeof(PSPC_LINK), TRUE, TRUE, + offsetof(SPC_SP_OPUS_INFO, pPublisherInfo), 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; +} + static BOOL CRYPT_AsnDecodeInteger(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo) { diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index a4f4fbb..96bca50 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -878,7 +878,6 @@ static void test_decodeSpOpusInfo(void) ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_SP_OPUS_INFO_STRUCT, emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); - todo_wine ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); if (ret) { @@ -890,7 +889,6 @@ static void test_decodeSpOpusInfo(void) ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_SP_OPUS_INFO_STRUCT, spOpusInfoWithProgramName, sizeof(spOpusInfoWithProgramName), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); - todo_wine ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); if (ret) { @@ -903,7 +901,6 @@ static void test_decodeSpOpusInfo(void) ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_SP_OPUS_INFO_STRUCT, spOpusInfoWithMoreInfo, sizeof(spOpusInfoWithMoreInfo), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); - todo_wine ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); if (ret) { @@ -922,7 +919,6 @@ static void test_decodeSpOpusInfo(void) ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_SP_OPUS_INFO_STRUCT, spOpusInfoWithPublisherInfo, sizeof(spOpusInfoWithPublisherInfo), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); - todo_wine ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); if (ret) {