Juan Lang : wintrust: Add tests for encoding/decoding SPC links.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 13 06:31:24 CDT 2007


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Aug 10 11:15:39 2007 -0700

wintrust: Add tests for encoding/decoding SPC links.

---

 dlls/wintrust/tests/Makefile.in |    3 +-
 dlls/wintrust/tests/asn.c       |  236 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 238 insertions(+), 1 deletions(-)

diff --git a/dlls/wintrust/tests/Makefile.in b/dlls/wintrust/tests/Makefile.in
index 50fadcc..59a7716 100644
--- a/dlls/wintrust/tests/Makefile.in
+++ b/dlls/wintrust/tests/Makefile.in
@@ -3,9 +3,10 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = wintrust.dll
-IMPORTS   = user32 advapi32 kernel32
+IMPORTS   = crypt32 user32 advapi32 kernel32
 
 CTESTS = \
+	asn.c \
 	crypt.c \
 	register.c
 
diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c
new file mode 100644
index 0000000..da83b5f
--- /dev/null
+++ b/dlls/wintrust/tests/asn.c
@@ -0,0 +1,236 @@
+/* Unit test suite for wintrust asn functions
+ *
+ * Copyright 2007 Juan Lang
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "wincrypt.h"
+#include "wintrust.h"
+
+#include "wine/test.h"
+
+static WCHAR url[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.',
+ 'o','r','g',0 };
+static const WCHAR nihongoURL[] = { 'h','t','t','p',':','/','/',0x226f,
+ 0x575b, 0 };
+static const BYTE emptyURLSPCLink[] = { 0x80,0x00 };
+static const BYTE urlSPCLink[] = {
+0x80,0x11,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x69,0x6e,0x65,0x68,0x71,
+0x2e,0x6f,0x72,0x67};
+static const BYTE fileSPCLink[] = {
+0xa2,0x14,0x80,0x12,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,
+0x2f,0x00,0x2f,0x22,0x6f,0x57,0x5b };
+static const BYTE emptyMonikerSPCLink[] = {
+0xa1,0x14,0x04,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x04,0x00 };
+static BYTE data[] = { 0xba, 0xad, 0xf0, 0x0d };
+static const BYTE monikerSPCLink[] = {
+0xa1,0x18,0x04,0x10,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,
+0xea,0xea,0xea,0xea,0xea,0x04,0x04,0xba,0xad,0xf0,0x0d };
+
+static void test_encodeSPCLink(void)
+{
+    BOOL ret;
+    DWORD size = 0;
+    LPBYTE buf;
+    SPC_LINK link = { 0 };
+
+    SetLastError(0xdeadbeef);
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(!ret && GetLastError() == E_INVALIDARG,
+     "Expected E_INVALIDARG, got %08x\n", GetLastError());
+    link.dwLinkChoice = SPC_URL_LINK_CHOICE;
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        ok(size == sizeof(emptyURLSPCLink), "Unexpected size %d\n", size);
+        ok(!memcmp(buf, emptyURLSPCLink, size), "Unexpected value\n");
+        LocalFree(buf);
+    }
+    /* With an invalid char: */
+    link.pwszUrl = (LPWSTR)nihongoURL;
+    size = 1;
+    SetLastError(0xdeadbeef);
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_INVALID_IA5_STRING,
+     "Expected CRYPT_E_INVALID_IA5_STRING, got %08x\n", GetLastError());
+    /* Unlike the crypt32 string encoding routines, size is not set to the
+     * index of the first invalid character.
+     */
+    todo_wine
+    ok(size == 0, "Expected size 0, got %d\n", size);
+    link.pwszUrl = url;
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        ok(size == sizeof(urlSPCLink), "Unexpected size %d\n", size);
+        ok(!memcmp(buf, urlSPCLink, size), "Unexpected value\n");
+        LocalFree(buf);
+    }
+    link.dwLinkChoice = SPC_FILE_LINK_CHOICE;
+    link.pwszFile = (LPWSTR)nihongoURL;
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        ok(size == sizeof(fileSPCLink), "Unexpected size %d\n", size);
+        ok(!memcmp(buf, fileSPCLink, size), "Unexpected value\n");
+        LocalFree(buf);
+    }
+    link.dwLinkChoice = SPC_MONIKER_LINK_CHOICE;
+    memset(&link.Moniker, 0, sizeof(link.Moniker));
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        ok(size == sizeof(emptyMonikerSPCLink), "Unexpected size %d\n", size);
+        ok(!memcmp(buf, emptyMonikerSPCLink, size), "Unexpected value\n");
+        LocalFree(buf);
+    }
+    memset(&link.Moniker.ClassId, 0xea, sizeof(link.Moniker.ClassId));
+    link.Moniker.SerializedData.pbData = data;
+    link.Moniker.SerializedData.cbData = sizeof(data);
+    ret = CryptEncodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT, &link,
+     CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        ok(size == sizeof(monikerSPCLink), "Unexpected size %d\n", size);
+        ok(!memcmp(buf, monikerSPCLink, size), "Unexpected value\n");
+        LocalFree(buf);
+    }
+}
+
+static const BYTE badMonikerSPCLink[] = {
+0xa1,0x19,0x04,0x11,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,0xea,
+0xea,0xea,0xea,0xea,0xea,0xea,0x04,0x04,0xba,0xad,0xf0,0x0d };
+
+static void test_decodeSPCLink(void)
+{
+    BOOL ret;
+    LPBYTE buf = NULL;
+    DWORD size = 0;
+    SPC_LINK *link;
+
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT,
+     emptyURLSPCLink, sizeof(emptyURLSPCLink), CRYPT_DECODE_ALLOC_FLAG, NULL,
+     (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        link = (SPC_LINK *)buf;
+        ok(link->dwLinkChoice == SPC_URL_LINK_CHOICE,
+         "Expected SPC_URL_LINK_CHOICE, got %d\n", link->dwLinkChoice);
+        ok(lstrlenW(link->pwszUrl) == 0, "Expected empty string\n");
+        LocalFree(buf);
+    }
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT,
+     urlSPCLink, sizeof(urlSPCLink), CRYPT_DECODE_ALLOC_FLAG, NULL,
+     (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        link = (SPC_LINK *)buf;
+        ok(link->dwLinkChoice == SPC_URL_LINK_CHOICE,
+         "Expected SPC_URL_LINK_CHOICE, got %d\n", link->dwLinkChoice);
+        ok(!lstrcmpW(link->pwszUrl, url), "Unexpected URL\n");
+        LocalFree(buf);
+    }
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT,
+     fileSPCLink, sizeof(fileSPCLink), CRYPT_DECODE_ALLOC_FLAG, NULL,
+     (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        link = (SPC_LINK *)buf;
+        ok(link->dwLinkChoice == SPC_FILE_LINK_CHOICE,
+         "Expected SPC_FILE_LINK_CHOICE, got %d\n", link->dwLinkChoice);
+        ok(!lstrcmpW(link->pwszFile, nihongoURL), "Unexpected file\n");
+        LocalFree(buf);
+    }
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT,
+     emptyMonikerSPCLink, sizeof(emptyMonikerSPCLink), CRYPT_DECODE_ALLOC_FLAG,
+     NULL, (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        SPC_SERIALIZED_OBJECT emptyMoniker = { { 0 } };
+
+        link = (SPC_LINK *)buf;
+        ok(link->dwLinkChoice == SPC_MONIKER_LINK_CHOICE,
+         "Expected SPC_MONIKER_LINK_CHOICE, got %d\n", link->dwLinkChoice);
+        ok(!memcmp(&link->Moniker, &emptyMoniker, sizeof(emptyMoniker)),
+         "Unexpected value\n");
+        LocalFree(buf);
+    }
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT,
+     monikerSPCLink, sizeof(monikerSPCLink), CRYPT_DECODE_ALLOC_FLAG, NULL,
+     (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        SPC_UUID id;
+
+        link = (SPC_LINK *)buf;
+        ok(link->dwLinkChoice == SPC_MONIKER_LINK_CHOICE,
+         "Expected SPC_MONIKER_LINK_CHOICE, got %d\n", link->dwLinkChoice);
+        memset(&id, 0xea, sizeof(id));
+        ok(!memcmp(&link->Moniker.ClassId, &id, sizeof(id)),
+         "Unexpected value\n");
+        ok(link->Moniker.SerializedData.cbData == sizeof(data),
+         "Unexpected data size %d\n", link->Moniker.SerializedData.cbData);
+        ok(!memcmp(link->Moniker.SerializedData.pbData, data, sizeof(data)),
+         "Unexpected value\n");
+        LocalFree(buf);
+    }
+    SetLastError(0xdeadbeef);
+    ret = CryptDecodeObjectEx(X509_ASN_ENCODING, SPC_LINK_STRUCT,
+     badMonikerSPCLink, sizeof(badMonikerSPCLink), CRYPT_DECODE_ALLOC_FLAG,
+     NULL, (BYTE *)&buf, &size);
+    todo_wine
+    ok(!ret && GetLastError() == CRYPT_E_BAD_ENCODE,
+     "Expected CRYPT_E_BAD_ENCODE, got %08x\n", GetLastError());
+}
+
+START_TEST(asn)
+{
+    test_encodeSPCLink();
+    test_decodeSPCLink();
+}




More information about the wine-cvs mailing list