Juan Lang : crypt32: Allow a sequence to have an indefinite-length encoding .

Alexandre Julliard julliard at winehq.org
Tue Sep 18 05:31:29 CDT 2007


Module: wine
Branch: master
Commit: 4fd90ddad335c3eb6f9ae74bebce95d65d97e960
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4fd90ddad335c3eb6f9ae74bebce95d65d97e960

Author: Juan Lang <juan.lang at gmail.com>
Date:   Mon Sep 17 17:20:52 2007 -0700

crypt32: Allow a sequence to have an indefinite-length encoding.

---

 dlls/crypt32/decode.c |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
index fab4b9a..9fba88c 100644
--- a/dlls/crypt32/decode.c
+++ b/dlls/crypt32/decode.c
@@ -425,13 +425,15 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[],
     {
         DWORD dataLen;
 
-        if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)))
+        if ((ret = CRYPT_GetLengthIndefinite(pbEncoded, cbEncoded, &dataLen)))
         {
             DWORD lenBytes = GET_LEN_BYTES(pbEncoded[1]), cbDecoded;
             const BYTE *ptr = pbEncoded + 1 + lenBytes;
 
             cbEncoded -= 1 + lenBytes;
-            if (cbEncoded < dataLen)
+            if (dataLen == CMSG_INDEFINITE_LENGTH)
+                cbEncoded = dataLen;
+            else if (cbEncoded < dataLen)
             {
                 TRACE("dataLen %d exceeds cbEncoded %d, failing\n", dataLen,
                  cbEncoded);
@@ -439,11 +441,33 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[],
                 ret = FALSE;
             }
             else
+                cbEncoded = dataLen;
+            if (ret)
+            {
                 ret = CRYPT_AsnDecodeSequenceItems(items, cItem,
                  ptr, cbEncoded, dwFlags, NULL, NULL, &cbDecoded);
-            if (ret && cbDecoded != dataLen)
+                if (ret && dataLen == CMSG_INDEFINITE_LENGTH)
+                {
+                    if (cbDecoded > cbEncoded - 2)
+                    {
+                        /* Not enough space for 0 TLV */
+                        SetLastError(CRYPT_E_ASN1_CORRUPT);
+                        ret = FALSE;
+                    }
+                    else if (*(ptr + cbDecoded) != 0 ||
+                     *(ptr + cbDecoded + 1) != 0)
+                    {
+                        TRACE("expected 0 TLV\n");
+                        SetLastError(CRYPT_E_ASN1_CORRUPT);
+                        ret = FALSE;
+                    }
+                    else
+                        cbDecoded += 2;
+                }
+            }
+            if (ret && cbDecoded != cbEncoded)
             {
-                TRACE("expected %d decoded, got %d, failing\n", dataLen,
+                TRACE("expected %d decoded, got %d, failing\n", cbEncoded,
                  cbDecoded);
                 SetLastError(CRYPT_E_ASN1_CORRUPT);
                 ret = FALSE;




More information about the wine-cvs mailing list