wintrust: Implement WVTAsn1SpcSpOpusInfoDecode

Juan Lang juan.lang at gmail.com
Fri Jun 12 19:52:34 CDT 2009


Another one I'm just finally getting around to.  Easy since I'd
already written tests!  Fixes bug 17696.
--Juan
-------------- next part --------------
From 47a9d0918f3b1bf28b85ddf8bd255ddc122e1cc1 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Fri, 12 Jun 2009 17:49:05 -0700
Subject: [PATCH 3/3] Implement WVTAsn1SpcSpOpusInfoDecode

---
 dlls/wintrust/asn.c       |   85 ++++++++++++++++++++++++++++++++++++++++-----
 dlls/wintrust/tests/asn.c |    4 --
 2 files changed, 76 insertions(+), 13 deletions(-)

diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c
index e776cba..1bf6581 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,82 @@ 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;
+
+    if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)))
+    {
+        BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]);
+        DWORD size;
+        SPC_LINK **pLink = pvStructInfo;
+
+        ret = CRYPT_AsnDecodeBMPString(dwCertEncodingType, lpszStructType,
+         pbEncoded + 1 + lenBytes, dataLen, dwFlags, NULL, &size);
+        if (ret)
+        {
+            if (!pvStructInfo)
+                *pcbStructInfo = size + sizeof(LPWSTR);
+            else if (*pcbStructInfo < size + sizeof(LPWSTR))
+            {
+                *pcbStructInfo = size + sizeof(LPWSTR);
+                SetLastError(ERROR_MORE_DATA);
+                ret = FALSE;
+            }
+            else
+            {
+                *pcbStructInfo = size + sizeof(LPWSTR);
+                ret = CRYPT_AsnDecodeBMPString(dwCertEncodingType,
+                 lpszStructType, pbEncoded + 1 + lenBytes, dataLen, dwFlags,
+                 *pLink, 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 308fb8b..3239d2e 100644
--- a/dlls/wintrust/tests/asn.c
+++ b/dlls/wintrust/tests/asn.c
@@ -874,7 +874,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)
     {
@@ -886,7 +885,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)
     {
@@ -899,7 +897,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)
     {
@@ -918,7 +915,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)
     {
-- 
1.6.3.2


More information about the wine-patches mailing list