[CRYPT32_WINETEST] Sync with Wine Staging 3.17. CORE-15127
authorAmine Khaldi <amine.khaldi@reactos.org>
Mon, 1 Oct 2018 11:48:33 +0000 (12:48 +0100)
committerAmine Khaldi <amine.khaldi@reactos.org>
Mon, 1 Oct 2018 11:48:33 +0000 (12:48 +0100)
modules/rostests/winetests/crypt32/base64.c
modules/rostests/winetests/crypt32/cert.c
modules/rostests/winetests/crypt32/chain.c
modules/rostests/winetests/crypt32/encode.c
modules/rostests/winetests/crypt32/main.c
modules/rostests/winetests/crypt32/msg.c
modules/rostests/winetests/crypt32/oid.c
modules/rostests/winetests/crypt32/sip.c
modules/rostests/winetests/crypt32/store.c
modules/rostests/winetests/crypt32/str.c

index e127fc3..4ff7627 100644 (file)
  */
 #include <stdio.h>
 #include <stdarg.h>
-#include <windef.h>
-#include <winbase.h>
-#include <winerror.h>
+#include <windows.h>
 #include <wincrypt.h>
 
+#include "wine/heap.h"
 #include "wine/test.h"
 
 #define CERT_HEADER               "-----BEGIN CERTIFICATE-----\r\n"
@@ -56,6 +55,8 @@ static const BYTE toEncode4[] =
  "abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
  "abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"
  "abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
+static const BYTE toEncode5[] =
+ "abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHI";
 
 static const struct BinTests tests[] = {
  { toEncode1, sizeof(toEncode1), "AA==\r\n", },
@@ -67,6 +68,8 @@ static const struct BinTests tests[] = {
    "d3h5ejAxMjM0NTY3ODkwQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2\r\n"
    "Nzg5MGFiY2RlZmdoaWpsa21ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OTBBQkNERUZH\r\n"
    "SElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkwAA==\r\n" },
+ { toEncode5, sizeof(toEncode5),
+   "YWJjZGVmZ2hpamxrbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5MEFCQ0RFRkdISQA=\r\n" },
 };
 
 static const struct BinTests testsNoCR[] = {
@@ -79,131 +82,284 @@ static const struct BinTests testsNoCR[] = {
    "d3h5ejAxMjM0NTY3ODkwQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2\n"
    "Nzg5MGFiY2RlZmdoaWpsa21ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OTBBQkNERUZH\n"
    "SElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkwAA==\n" },
+ { toEncode5, sizeof(toEncode5),
+   "YWJjZGVmZ2hpamxrbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5MEFCQ0RFRkdISQA=\n" },
 };
 
+static WCHAR *strdupAtoW(const char *str)
+{
+    WCHAR *ret = NULL;
+    DWORD len;
+
+    if (!str) return ret;
+    len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+    ret = heap_alloc(len * sizeof(WCHAR));
+    if (ret)
+        MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
+    return ret;
+}
+
 static void encodeAndCompareBase64_A(const BYTE *toEncode, DWORD toEncodeLen,
  DWORD format, const char *expected, const char *header, const char *trailer)
 {
-    DWORD strLen = 0;
+    DWORD strLen, strLen2, required;
+    const char *ptr;
     LPSTR str = NULL;
     BOOL ret;
 
+    required = strlen(expected) + 1;
+    if (header)
+        required += strlen(header);
+    if (trailer)
+        required += strlen(trailer);
+
+    strLen = 0;
     ret = CryptBinaryToStringA(toEncode, toEncodeLen, format, NULL, &strLen);
     ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
-    str = HeapAlloc(GetProcessHeap(), 0, strLen);
-    if (str)
+    ok(strLen == required, "Unexpected required length %u, expected %u.\n", required, strLen);
+
+    strLen2 = strLen;
+    ret = CryptBinaryToStringA(toEncode, toEncodeLen, format, NULL, &strLen2);
+    ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
+    ok(strLen == strLen2, "Unexpected required length.\n");
+
+    strLen2 = strLen - 1;
+    ret = CryptBinaryToStringA(toEncode, toEncodeLen, format, NULL, &strLen2);
+    ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
+    ok(strLen == strLen2, "Unexpected required length.\n");
+
+    str = heap_alloc(strLen);
+
+    /* Partially filled output buffer. */
+    strLen2 = strLen - 1;
+    str[0] = 0x12;
+    ret = CryptBinaryToStringA(toEncode, toEncodeLen, format, str, &strLen2);
+todo_wine
+    ok((!ret && GetLastError() == ERROR_MORE_DATA) || broken(ret) /* XP */, "CryptBinaryToStringA failed %d, error %d.\n",
+        ret, GetLastError());
+    ok(strLen2 == strLen || broken(strLen2 == strLen - 1), "Expected length %d, got %d\n", strLen - 1, strLen);
+todo_wine {
+    if (header)
+        ok(str[0] == header[0], "Unexpected buffer contents %#x.\n", str[0]);
+    else
+        ok(str[0] == expected[0], "Unexpected buffer contents %#x.\n", str[0]);
+}
+    strLen2 = strLen;
+    ret = CryptBinaryToStringA(toEncode, toEncodeLen, format, str, &strLen2);
+    ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
+    ok(strLen2 == strLen - 1, "Expected length %d, got %d\n", strLen - 1, strLen);
+
+    ptr = str;
+    if (header)
     {
-        DWORD strLen2 = strLen;
-        LPCSTR ptr = str;
+        ok(!strncmp(header, ptr, strlen(header)), "Expected header %s, got %s\n", header, ptr);
+        ptr += strlen(header);
+    }
+    ok(!strncmp(expected, ptr, strlen(expected)), "Expected %s, got %s\n", expected, ptr);
+    ptr += strlen(expected);
+    if (trailer)
+        ok(!strncmp(trailer, ptr, strlen(trailer)), "Expected trailer %s, got %s\n", trailer, ptr);
 
-        ret = CryptBinaryToStringA(toEncode, toEncodeLen, format, str,
-         &strLen2);
-        ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
-        ok(strLen2 == strLen - 1, "Expected length %d, got %d\n",
-         strLen - 1, strLen);
-        if (header)
-        {
-            ok(!strncmp(header, ptr, strlen(header)),
-             "Expected header %s, got %s\n", header, ptr);
-            ptr += strlen(header);
-        }
-        ok(!strncmp(expected, ptr, strlen(expected)),
-         "Expected %s, got %s\n", expected, ptr);
-        ptr += strlen(expected);
-        if (trailer)
-            ok(!strncmp(trailer, ptr, strlen(trailer)),
-             "Expected trailer %s, got %s\n", trailer, ptr);
-        HeapFree(GetProcessHeap(), 0, str);
+    heap_free(str);
+}
+
+static void encode_compare_base64_W(const BYTE *toEncode, DWORD toEncodeLen, DWORD format,
+        const WCHAR *expected, const char *header, const char *trailer)
+{
+    WCHAR *headerW, *trailerW, required;
+    DWORD strLen, strLen2;
+    WCHAR *strW = NULL;
+    const WCHAR *ptr;
+    BOOL ret;
+
+    required = lstrlenW(expected) + 1;
+    if (header)
+        required += strlen(header);
+    if (trailer)
+        required += strlen(trailer);
+
+    strLen = 0;
+    ret = CryptBinaryToStringW(toEncode, toEncodeLen, format, NULL, &strLen);
+    ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+    ok(strLen == required, "Unexpected required length %u, expected %u.\n", strLen, required);
+
+    /* Same call with non-zero length value. */
+    strLen2 = strLen;
+    ret = CryptBinaryToStringW(toEncode, toEncodeLen, format, NULL, &strLen2);
+    ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+    ok(strLen == strLen2, "Unexpected required length.\n");
+
+    strLen2 = strLen - 1;
+    ret = CryptBinaryToStringW(toEncode, toEncodeLen, format, NULL, &strLen2);
+    ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+    ok(strLen == strLen2, "Unexpected required length.\n");
+
+    strLen2 = strLen - 1;
+    ret = CryptBinaryToStringW(toEncode, toEncodeLen, format, NULL, &strLen2);
+    ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+    ok(strLen == strLen2, "Unexpected required length.\n");
+
+    strW = heap_alloc(strLen * sizeof(WCHAR));
+
+    headerW = strdupAtoW(header);
+    trailerW = strdupAtoW(trailer);
+
+    strLen2 = strLen - 1;
+    strW[0] = 0x1234;
+    ret = CryptBinaryToStringW(toEncode, toEncodeLen, format, strW, &strLen2);
+todo_wine
+    ok((!ret && GetLastError() == ERROR_MORE_DATA) || broken(ret) /* XP */, "CryptBinaryToStringW failed, %d, error %d\n",
+        ret, GetLastError());
+    if (headerW)
+        ok(strW[0] == 0x1234, "Unexpected buffer contents %#x.\n", strW[0]);
+    else
+        ok(strW[0] == 0x1234 || broken(strW[0] != 0x1234) /* XP */, "Unexpected buffer contents %#x.\n", strW[0]);
+
+    strLen2 = strLen;
+    ret = CryptBinaryToStringW(toEncode, toEncodeLen, format, strW, &strLen2);
+    ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+
+    ok(strLen2 == strLen - 1, "Expected length %d, got %d\n", strLen - 1, strLen);
+
+    ptr = strW;
+    if (headerW)
+    {
+        ok(!memcmp(headerW, ptr, lstrlenW(headerW)), "Expected header %s, got %s.\n", wine_dbgstr_w(headerW),
+                wine_dbgstr_w(ptr));
+        ptr += lstrlenW(headerW);
     }
+    ok(!memcmp(expected, ptr, lstrlenW(expected)), "Expected %s, got %s.\n", wine_dbgstr_w(expected),
+            wine_dbgstr_w(ptr));
+    ptr += lstrlenW(expected);
+    if (trailerW)
+        ok(!memcmp(trailerW, ptr, lstrlenW(trailerW)), "Expected trailer %s, got %s.\n", wine_dbgstr_w(trailerW),
+                wine_dbgstr_w(ptr));
+
+    heap_free(strW);
+    heap_free(headerW);
+    heap_free(trailerW);
 }
 
-static void testBinaryToStringA(void)
+static void test_CryptBinaryToString(void)
 {
+    DWORD strLen, strLen2, i;
     BOOL ret;
-    DWORD strLen = 0, i;
 
     ret = CryptBinaryToStringA(NULL, 0, 0, NULL, NULL);
     ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
      "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
+
+    strLen = 123;
     ret = CryptBinaryToStringA(NULL, 0, 0, NULL, &strLen);
     ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
      "Expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
-    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+    ok(strLen == 123, "Unexpected length.\n");
+
+    if (0)
+        ret = CryptBinaryToStringW(NULL, 0, 0, NULL, NULL);
+
+    strLen = 123;
+    ret = CryptBinaryToStringW(NULL, 0, 0, NULL, &strLen);
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "Unexpected error %d\n", GetLastError());
+    ok(strLen == 123, "Unexpected length.\n");
+
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
     {
-        DWORD strLen = 0;
+        WCHAR *strW, *encodedW;
         LPSTR str = NULL;
         BOOL ret;
 
-        ret = CryptBinaryToStringA(tests[i].toEncode, tests[i].toEncodeLen,
-         CRYPT_STRING_BINARY, NULL, &strLen);
+        strLen = 0;
+        ret = CryptBinaryToStringA(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, NULL, &strLen);
         ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
-        str = HeapAlloc(GetProcessHeap(), 0, strLen);
-        if (str)
-        {
-            DWORD strLen2 = strLen;
-
-            ret = CryptBinaryToStringA(tests[i].toEncode, tests[i].toEncodeLen,
-             CRYPT_STRING_BINARY, str, &strLen2);
-            ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
-            ok(strLen == strLen2, "Expected length %d, got %d\n", strLen,
-             strLen2);
-            ok(!memcmp(str, tests[i].toEncode, tests[i].toEncodeLen),
-             "Unexpected value\n");
-            HeapFree(GetProcessHeap(), 0, str);
-        }
-        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen,
-         CRYPT_STRING_BASE64, tests[i].base64, NULL, NULL);
-        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen,
-         CRYPT_STRING_BASE64HEADER, tests[i].base64, CERT_HEADER,
-         CERT_TRAILER);
-        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen,
-         CRYPT_STRING_BASE64REQUESTHEADER, tests[i].base64,
-         CERT_REQUEST_HEADER, CERT_REQUEST_TRAILER);
-        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen,
-         CRYPT_STRING_BASE64X509CRLHEADER, tests[i].base64, X509_HEADER,
-         X509_TRAILER);
+        ok(strLen == tests[i].toEncodeLen, "Unexpected required length %u.\n", strLen);
+
+        strLen2 = strLen;
+        str = heap_alloc(strLen);
+        ret = CryptBinaryToStringA(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, str, &strLen2);
+        ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
+        ok(strLen == strLen2, "Expected length %u, got %u\n", strLen, strLen2);
+        ok(!memcmp(str, tests[i].toEncode, tests[i].toEncodeLen), "Unexpected value\n");
+        heap_free(str);
+
+        strLen = 0;
+        ret = CryptBinaryToStringW(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, NULL, &strLen);
+        ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+        ok(strLen == tests[i].toEncodeLen, "Unexpected required length %u.\n", strLen);
+
+        strLen2 = strLen;
+        strW = heap_alloc(strLen);
+        ret = CryptBinaryToStringW(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, strW, &strLen2);
+        ok(ret, "CryptBinaryToStringW failed: %d\n", GetLastError());
+        ok(strLen == strLen2, "Expected length %u, got %u\n", strLen, strLen2);
+        ok(!memcmp(strW, tests[i].toEncode, tests[i].toEncodeLen), "Unexpected value\n");
+        heap_free(strW);
+
+        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64,
+            tests[i].base64, NULL, NULL);
+        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64HEADER,
+            tests[i].base64, CERT_HEADER, CERT_TRAILER);
+        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64REQUESTHEADER,
+            tests[i].base64, CERT_REQUEST_HEADER, CERT_REQUEST_TRAILER);
+        encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64X509CRLHEADER,
+            tests[i].base64, X509_HEADER, X509_TRAILER);
+
+        encodedW = strdupAtoW(tests[i].base64);
+
+        encode_compare_base64_W(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64, encodedW, NULL, NULL);
+        encode_compare_base64_W(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64HEADER, encodedW,
+            CERT_HEADER, CERT_TRAILER);
+        encode_compare_base64_W(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64REQUESTHEADER,
+            encodedW, CERT_REQUEST_HEADER, CERT_REQUEST_TRAILER);
+        encode_compare_base64_W(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64X509CRLHEADER, encodedW,
+            X509_HEADER, X509_TRAILER);
+
+        heap_free(encodedW);
     }
-    for (i = 0; i < sizeof(testsNoCR) / sizeof(testsNoCR[0]); i++)
+
+    for (i = 0; i < ARRAY_SIZE(testsNoCR); i++)
     {
-        DWORD strLen = 0;
         LPSTR str = NULL;
+        WCHAR *encodedW;
         BOOL ret;
 
-        ret = CryptBinaryToStringA(testsNoCR[i].toEncode,
-         testsNoCR[i].toEncodeLen, CRYPT_STRING_BINARY | CRYPT_STRING_NOCR,
-         NULL, &strLen);
+        ret = CryptBinaryToStringA(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BINARY | CRYPT_STRING_NOCR, NULL, &strLen);
         ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
-        str = HeapAlloc(GetProcessHeap(), 0, strLen);
-        if (str)
-        {
-            DWORD strLen2 = strLen;
-
-            ret = CryptBinaryToStringA(testsNoCR[i].toEncode,
-             testsNoCR[i].toEncodeLen, CRYPT_STRING_BINARY | CRYPT_STRING_NOCR,
-             str, &strLen2);
-            ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
-            ok(strLen == strLen2, "Expected length %d, got %d\n", strLen,
-             strLen2);
-            ok(!memcmp(str, testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen),
-             "Unexpected value\n");
-            HeapFree(GetProcessHeap(), 0, str);
-        }
-        encodeAndCompareBase64_A(testsNoCR[i].toEncode,
-         testsNoCR[i].toEncodeLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCR,
-         testsNoCR[i].base64, NULL, NULL);
-        encodeAndCompareBase64_A(testsNoCR[i].toEncode,
-         testsNoCR[i].toEncodeLen,
-         CRYPT_STRING_BASE64HEADER | CRYPT_STRING_NOCR, testsNoCR[i].base64,
-         CERT_HEADER_NOCR, CERT_TRAILER_NOCR);
-        encodeAndCompareBase64_A(testsNoCR[i].toEncode,
-         testsNoCR[i].toEncodeLen,
-         CRYPT_STRING_BASE64REQUESTHEADER | CRYPT_STRING_NOCR,
-         testsNoCR[i].base64, CERT_REQUEST_HEADER_NOCR,
-         CERT_REQUEST_TRAILER_NOCR);
-        encodeAndCompareBase64_A(testsNoCR[i].toEncode,
-         testsNoCR[i].toEncodeLen,
-         CRYPT_STRING_BASE64X509CRLHEADER | CRYPT_STRING_NOCR,
-         testsNoCR[i].base64, X509_HEADER_NOCR, X509_TRAILER_NOCR);
+
+        strLen2 = strLen;
+        str = heap_alloc(strLen);
+        ret = CryptBinaryToStringA(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BINARY | CRYPT_STRING_NOCR, str, &strLen2);
+        ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError());
+        ok(strLen == strLen2, "Expected length %d, got %d\n", strLen, strLen2);
+        ok(!memcmp(str, testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen), "Unexpected value\n");
+        heap_free(str);
+
+        encodeAndCompareBase64_A(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCR,
+            testsNoCR[i].base64, NULL, NULL);
+        encodeAndCompareBase64_A(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64HEADER | CRYPT_STRING_NOCR, testsNoCR[i].base64, CERT_HEADER_NOCR, CERT_TRAILER_NOCR);
+        encodeAndCompareBase64_A(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64REQUESTHEADER | CRYPT_STRING_NOCR, testsNoCR[i].base64, CERT_REQUEST_HEADER_NOCR,
+            CERT_REQUEST_TRAILER_NOCR);
+        encodeAndCompareBase64_A(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64X509CRLHEADER | CRYPT_STRING_NOCR, testsNoCR[i].base64, X509_HEADER_NOCR, X509_TRAILER_NOCR);
+
+        encodedW = strdupAtoW(testsNoCR[i].base64);
+
+        encode_compare_base64_W(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64 | CRYPT_STRING_NOCR, encodedW, NULL, NULL);
+        encode_compare_base64_W(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64HEADER | CRYPT_STRING_NOCR, encodedW, CERT_HEADER_NOCR, CERT_TRAILER_NOCR);
+        encode_compare_base64_W(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64REQUESTHEADER | CRYPT_STRING_NOCR, encodedW, CERT_REQUEST_HEADER_NOCR,
+            CERT_REQUEST_TRAILER_NOCR);
+        encode_compare_base64_W(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen,
+            CRYPT_STRING_BASE64X509CRLHEADER | CRYPT_STRING_NOCR, encodedW,
+            X509_HEADER_NOCR, X509_TRAILER_NOCR);
+
+        heap_free(encodedW);
     }
 }
 
@@ -380,7 +536,7 @@ static void testStringToBinaryA(void)
     ok(!ret && GetLastError() == ERROR_INVALID_DATA,
      "Expected ERROR_INVALID_DATA, got ret=%d le=%u\n", ret, GetLastError());
     /* Bad strings */
-    for (i = 0; i < sizeof(badStrings) / sizeof(badStrings[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(badStrings); i++)
     {
         bufLen = 0;
         ret = CryptStringToBinaryA(badStrings[i].str, 0, badStrings[i].format,
@@ -447,7 +603,7 @@ static void testStringToBinaryA(void)
      ret, bufLen, buf[0]);
 
     /* Good strings */
-    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
     {
         bufLen = 0;
         /* Bogus length--oddly enough, that succeeds, even though it's not
@@ -504,7 +660,7 @@ static void testStringToBinaryA(void)
          */
     }
     /* And again, with no CR--decoding handles this automatically */
-    for (i = 0; i < sizeof(testsNoCR) / sizeof(testsNoCR[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(testsNoCR); i++)
     {
         bufLen = 0;
         /* Bogus length--oddly enough, that succeeds, even though it's not
@@ -545,6 +701,6 @@ static void testStringToBinaryA(void)
 
 START_TEST(base64)
 {
-    testBinaryToStringA();
+    test_CryptBinaryToString();
     testStringToBinaryA();
 }
index e49b2a9..bb0cc52 100644 (file)
@@ -3177,7 +3177,7 @@ static void testCompareIntegerBlob(void)
     DWORD i;
     BOOL ret;
 
-    for (i = 0; i < sizeof(intBlobs) / sizeof(intBlobs[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(intBlobs); i++)
     {
         ret = CertCompareIntegerBlob(&intBlobs[i].blob1, &intBlobs[i].blob2);
         ok(ret == intBlobs[i].areEqual,
index e3b280b..e2a7633 100644 (file)
@@ -2889,59 +2889,6 @@ static const BYTE chain31_1[] = {
 0x43,0x08,0xe5,0x78,0x2b,0x95,0xf3,0x75,0xb6,0x88,0xf0,0x6b,0x5c,0x5b,0x50,
 0x04,0x91,0x3b,0x89,0x5a,0x60,0x1f,0xfc,0x36,0x53,0x32,0x36,0x0a,0x4d,0x03,
 0x2c,0xd7 };
-static const BYTE ecc_crt[] = {
-0x30,0x82,0x01,0x46,0x30,0x81,0xec,0x02,0x09,0x00,0xe7,0x6b,0x26,0x86,0x0a,
-0x82,0xff,0xe9,0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0x02,
-0x30,0x2b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,
-0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x0a,0x0c,0x04,0x57,0x69,0x6e,0x65,
-0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x03,0x0c,0x04,0x57,0x69,0x6e,0x65,
-0x30,0x1e,0x17,0x0d,0x31,0x37,0x30,0x39,0x32,0x37,0x31,0x33,0x34,0x31,0x30,
-0x34,0x5a,0x17,0x0d,0x32,0x37,0x30,0x39,0x32,0x35,0x31,0x33,0x34,0x31,0x30,
-0x34,0x5a,0x30,0x2b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x44,0x45,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x0a,0x0c,0x04,0x54,0x65,
-0x73,0x74,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x03,0x0c,0x04,0x54,0x65,
-0x73,0x74,0x30,0x59,0x30,0x13,0x06,0x07,0x2a,0x86,0x48,0xce,0x3d,0x02,0x01,
-0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,0x42,0x00,0x04,0xed,
-0xfc,0x77,0xd8,0xb9,0xe7,0xf3,0xf8,0xce,0x13,0xb8,0x7f,0x0f,0x78,0xea,0x73,
-0x87,0x29,0x10,0xe1,0x6d,0x10,0xce,0x57,0x60,0x3b,0x3e,0xb4,0x5f,0x0d,0x20,
-0xc1,0xeb,0x6d,0x74,0xe9,0x7b,0x11,0x51,0x9a,0x00,0xe8,0xe9,0x12,0x84,0xb9,
-0x07,0x7e,0x7b,0x62,0x67,0x12,0x67,0x08,0xe5,0x2e,0x27,0xce,0xa2,0x57,0x15,
-0xad,0xc5,0x1f,0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0x02,
-0x03,0x49,0x00,0x30,0x46,0x02,0x21,0x00,0xd7,0x29,0xce,0x5a,0xef,0x74,0x85,
-0xd1,0x18,0x5f,0x6e,0xf1,0xba,0x53,0xd4,0xcd,0xdd,0xe0,0x5d,0xf1,0x5e,0x48,
-0x51,0xea,0x63,0xc0,0xe8,0xe2,0xf6,0xfa,0x4c,0xaf,0x02,0x21,0x00,0xe3,0x94,
-0x15,0x3b,0x6c,0x71,0x6e,0x44,0x22,0xcb,0xa0,0x88,0xcd,0x0a,0x5a,0x50,0x29,
-0x7c,0x5c,0xd6,0x6c,0xd2,0xe0,0x7f,0xcd,0x02,0x92,0x21,0x4c,0x2c,0x92,0xee };
-static const BYTE ecc_ca[] = {
-0x30,0x82,0x01,0x9f,0x30,0x82,0x01,0x46,0xa0,0x03,0x02,0x01,0x02,0x02,0x09,
-0x00,0xf1,0x54,0xae,0x21,0x2e,0x4d,0x31,0x9f,0x30,0x0a,0x06,0x08,0x2a,0x86,
-0x48,0xce,0x3d,0x04,0x03,0x02,0x30,0x2b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,
-0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x0a,
-0x0c,0x04,0x57,0x69,0x6e,0x65,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x03,
-0x0c,0x04,0x57,0x69,0x6e,0x65,0x30,0x1e,0x17,0x0d,0x31,0x37,0x30,0x39,0x32,
-0x37,0x31,0x33,0x33,0x39,0x31,0x35,0x5a,0x17,0x0d,0x32,0x37,0x30,0x39,0x32,
-0x35,0x31,0x33,0x33,0x39,0x31,0x35,0x5a,0x30,0x2b,0x31,0x0b,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,
-0x04,0x0a,0x0c,0x04,0x57,0x69,0x6e,0x65,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,
-0x04,0x03,0x0c,0x04,0x57,0x69,0x6e,0x65,0x30,0x59,0x30,0x13,0x06,0x07,0x2a,
-0x86,0x48,0xce,0x3d,0x02,0x01,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x03,0x01,
-0x07,0x03,0x42,0x00,0x04,0x3b,0x3c,0x34,0xc8,0x3f,0x15,0xea,0x02,0x68,0x46,
-0x69,0xdf,0x0c,0xa6,0xee,0x7a,0xd9,0x82,0x08,0x9b,0x37,0x53,0x42,0xf3,0x13,
-0x63,0xda,0x65,0x79,0xe8,0x04,0x9e,0x8c,0x77,0xc4,0x33,0x77,0xd9,0x5a,0x7f,
-0x60,0x7b,0x98,0xce,0xf3,0x96,0x56,0xd6,0xb5,0x8d,0x87,0x7a,0x00,0x2b,0xf3,
-0x70,0xb3,0x90,0x73,0xa0,0x56,0x06,0x3b,0x22,0xa3,0x53,0x30,0x51,0x30,0x1d,
-0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x26,0xef,0x6f,0xe4,0xb5,0x24,
-0x2f,0x68,0x49,0x84,0xd9,0x89,0xa6,0xab,0x0c,0xf8,0x6d,0xf5,0xe5,0x0c,0x30,
-0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x26,0xef,0x6f,
-0xe4,0xb5,0x24,0x2f,0x68,0x49,0x84,0xd9,0x89,0xa6,0xab,0x0c,0xf8,0x6d,0xf5,
-0xe5,0x0c,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,
-0x03,0x01,0x01,0xff,0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,
-0x02,0x03,0x47,0x00,0x30,0x44,0x02,0x20,0x2b,0x6b,0x23,0x42,0x32,0xf2,0xcb,
-0x71,0xd7,0x5c,0xfa,0x5e,0x6c,0x19,0x31,0xd6,0x74,0xf7,0xc0,0xf8,0xc6,0x39,
-0x38,0xe9,0x79,0x4d,0x84,0x44,0x40,0x13,0x8e,0x43,0x02,0x20,0x34,0xc7,0x61,
-0xbb,0x18,0x1c,0x85,0x34,0xe3,0x4c,0x30,0x28,0x42,0x0e,0x06,0x65,0x68,0x1d,
-0x76,0x53,0x24,0xa0,0x27,0xa5,0x84,0x3b,0x2d,0xf3,0xec,0x27,0x60,0xb2 };
-
 
 typedef struct _CONST_DATA_BLOB
 {
@@ -3139,8 +3086,6 @@ static SYSTEMTIME jun2013 = { 2013, 6, 5, 6, 0, 0, 0, 0 };
 static SYSTEMTIME oct2016 = { 2016, 10, 6, 1, 0, 0, 0, 0 };
 /* Wednesday, Nov 17, 2016 */
 static SYSTEMTIME nov2016 = { 2016, 11, 3, 17, 0, 0, 0, 0 };
-/* Wednesday, Nov 17, 2017 */
-static SYSTEMTIME nov2017 = { 2017, 11, 3, 17, 0, 0, 0, 0 };
 
 typedef struct _ChainCheck
 {
@@ -3160,7 +3105,7 @@ static const CERT_TRUST_STATUS elementStatus0[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus0[] = {
- { sizeof(elementStatus0) / sizeof(elementStatus0[0]), elementStatus0 },
+ { ARRAY_SIZE(elementStatus0), elementStatus0 },
 };
 static CONST_DATA_BLOB chain1[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3173,7 +3118,7 @@ static const CERT_TRUST_STATUS elementStatus1[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus1[] = {
- { sizeof(elementStatus1) / sizeof(elementStatus1[0]), elementStatus1 },
+ { ARRAY_SIZE(elementStatus1), elementStatus1 },
 };
 static CONST_DATA_BLOB chain2[] = {
  { sizeof(chain2_0), chain2_0 },
@@ -3185,7 +3130,7 @@ static const CERT_TRUST_STATUS elementStatus2[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus2[] = {
- { sizeof(elementStatus2) / sizeof(elementStatus2[0]), elementStatus2 },
+ { ARRAY_SIZE(elementStatus2), elementStatus2 },
 };
 static CONST_DATA_BLOB chain3[] = {
  { sizeof(chain3_0), chain3_0 },
@@ -3197,7 +3142,7 @@ static const CERT_TRUST_STATUS elementStatus3[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus3[] = {
- { sizeof(elementStatus3) / sizeof(elementStatus3[0]), elementStatus3 },
+ { ARRAY_SIZE(elementStatus3), elementStatus3 },
 };
 static CONST_DATA_BLOB chain4[] = {
  { sizeof(chain4_0), chain4_0 },
@@ -3211,7 +3156,7 @@ static const CERT_TRUST_STATUS elementStatus4[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus4[] = {
- { sizeof(elementStatus4) / sizeof(elementStatus4[0]), elementStatus4 },
+ { ARRAY_SIZE(elementStatus4), elementStatus4 },
 };
 static CONST_DATA_BLOB chain5[] = {
  { sizeof(chain5_0), chain5_0 },
@@ -3224,7 +3169,7 @@ static const CERT_TRUST_STATUS elementStatus5[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus5[] = {
- { sizeof(elementStatus5) / sizeof(elementStatus5[0]), elementStatus5 },
+ { ARRAY_SIZE(elementStatus5), elementStatus5 },
 };
 static CONST_DATA_BLOB chain6[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3236,7 +3181,7 @@ static const CERT_TRUST_STATUS elementStatus6[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus6[] = {
- { sizeof(elementStatus6) / sizeof(elementStatus6[0]), elementStatus6 },
+ { ARRAY_SIZE(elementStatus6), elementStatus6 },
 };
 static CONST_DATA_BLOB chain7[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3248,7 +3193,7 @@ static const CERT_TRUST_STATUS elementStatus7[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus7[] = {
- { sizeof(elementStatus7) / sizeof(elementStatus7[0]), elementStatus7 },
+ { ARRAY_SIZE(elementStatus7), elementStatus7 },
 };
 static CONST_DATA_BLOB chain8[] = {
  { sizeof(chain8_0), chain8_0 },
@@ -3262,7 +3207,7 @@ static const CERT_TRUST_STATUS elementStatus8[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck simpleStatus8[] = {
- { sizeof(elementStatus8) / sizeof(elementStatus8[0]), elementStatus8 },
+ { ARRAY_SIZE(elementStatus8), elementStatus8 },
 };
 static CONST_DATA_BLOB chain9[] = {
  { sizeof(chain9_0), chain9_0 },
@@ -3275,7 +3220,7 @@ static const CERT_TRUST_STATUS elementStatus9[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus9[] = {
- { sizeof(elementStatus9) / sizeof(elementStatus9[0]), elementStatus9 },
+ { ARRAY_SIZE(elementStatus9), elementStatus9 },
 };
 static CONST_DATA_BLOB chain10[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3288,7 +3233,7 @@ static const CERT_TRUST_STATUS elementStatus10[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus10[] = {
- { sizeof(elementStatus10) / sizeof(elementStatus10[0]), elementStatus10 },
+ { ARRAY_SIZE(elementStatus10), elementStatus10 },
 };
 static CONST_DATA_BLOB chain11[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3305,7 +3250,7 @@ static const CERT_TRUST_STATUS elementStatus12[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus12[] = {
- { sizeof(elementStatus12) / sizeof(elementStatus12[0]), elementStatus12 },
+ { ARRAY_SIZE(elementStatus12), elementStatus12 },
 };
 static CONST_DATA_BLOB chain13[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3317,7 +3262,7 @@ static const CERT_TRUST_STATUS elementStatus13[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus13[] = {
- { sizeof(elementStatus13) / sizeof(elementStatus13[0]), elementStatus13 },
+ { ARRAY_SIZE(elementStatus13), elementStatus13 },
 };
 static CONST_DATA_BLOB chain14[] = {
  { sizeof(chain14_0), chain14_0 },
@@ -3329,7 +3274,7 @@ static const CERT_TRUST_STATUS elementStatus14[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus14[] = {
- { sizeof(elementStatus14) / sizeof(elementStatus14[0]), elementStatus14 },
+ { ARRAY_SIZE(elementStatus14), elementStatus14 },
 };
 static CONST_DATA_BLOB chain15[] = {
  { sizeof(chain15_0), chain15_0 },
@@ -3341,7 +3286,7 @@ static const CERT_TRUST_STATUS elementStatus15[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus15[] = {
- { sizeof(elementStatus15) / sizeof(elementStatus15[0]), elementStatus15 },
+ { ARRAY_SIZE(elementStatus15), elementStatus15 },
 };
 static CONST_DATA_BLOB chain16[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3354,7 +3299,7 @@ static const CERT_TRUST_STATUS elementStatus16[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus16[] = {
- { sizeof(elementStatus16) / sizeof(elementStatus16[0]), elementStatus16 },
+ { ARRAY_SIZE(elementStatus16), elementStatus16 },
 };
 static CONST_DATA_BLOB chain17[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3368,7 +3313,7 @@ static const CERT_TRUST_STATUS elementStatus17[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus17[] = {
- { sizeof(elementStatus17) / sizeof(elementStatus17[0]), elementStatus17 },
+ { ARRAY_SIZE(elementStatus17), elementStatus17 },
 };
 static CONST_DATA_BLOB chain18[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3382,7 +3327,7 @@ static const CERT_TRUST_STATUS elementStatus18[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus18[] = {
- { sizeof(elementStatus18) / sizeof(elementStatus18[0]), elementStatus18 },
+ { ARRAY_SIZE(elementStatus18), elementStatus18 },
 };
 static CONST_DATA_BLOB chain19[] = {
  { sizeof(chain19_0), chain19_0 },
@@ -3395,7 +3340,7 @@ static const CERT_TRUST_STATUS elementStatus19[] = {
    CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS },
 };
 static const SimpleChainStatusCheck simpleStatus19[] = {
- { sizeof(elementStatus19) / sizeof(elementStatus19[0]), elementStatus19 },
+ { ARRAY_SIZE(elementStatus19), elementStatus19 },
 };
 static CONST_DATA_BLOB chain20[] = {
  { sizeof(chain20_0), chain20_0 },
@@ -3407,7 +3352,7 @@ static const CERT_TRUST_STATUS elementStatus20[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus20[] = {
- { sizeof(elementStatus20) / sizeof(elementStatus20[0]), elementStatus20 },
+ { ARRAY_SIZE(elementStatus20), elementStatus20 },
 };
 static CONST_DATA_BLOB chain21[] = {
  { sizeof(chain21_0), chain21_0 },
@@ -3420,7 +3365,7 @@ static const CERT_TRUST_STATUS elementStatus21[] = {
    CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS },
 };
 static const SimpleChainStatusCheck simpleStatus21[] = {
- { sizeof(elementStatus21) / sizeof(elementStatus21[0]), elementStatus21 },
+ { ARRAY_SIZE(elementStatus21), elementStatus21 },
 };
 static CONST_DATA_BLOB chain22[] = {
  { sizeof(chain22_0), chain22_0 },
@@ -3432,7 +3377,7 @@ static const CERT_TRUST_STATUS elementStatus22[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus22[] = {
- { sizeof(elementStatus22) / sizeof(elementStatus22[0]), elementStatus22 },
+ { ARRAY_SIZE(elementStatus22), elementStatus22 },
 };
 static CONST_DATA_BLOB chain23[] = {
  { sizeof(chain23_0), chain23_0 },
@@ -3444,7 +3389,7 @@ static const CERT_TRUST_STATUS elementStatus23[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus23[] = {
- { sizeof(elementStatus23) / sizeof(elementStatus23[0]), elementStatus23 },
+ { ARRAY_SIZE(elementStatus23), elementStatus23 },
 };
 static CONST_DATA_BLOB chain24[] = {
  { sizeof(chain24_0), chain24_0 },
@@ -3456,7 +3401,7 @@ static const CERT_TRUST_STATUS elementStatus24[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus24[] = {
- { sizeof(elementStatus24) / sizeof(elementStatus24[0]), elementStatus24 },
+ { ARRAY_SIZE(elementStatus24), elementStatus24 },
 };
 static CONST_DATA_BLOB chain25[] = {
  { sizeof(chain25_0), chain25_0 },
@@ -3468,7 +3413,7 @@ static const CERT_TRUST_STATUS elementStatus25[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus25[] = {
- { sizeof(elementStatus25) / sizeof(elementStatus25[0]), elementStatus25 },
+ { ARRAY_SIZE(elementStatus25), elementStatus25 },
 };
 static CONST_DATA_BLOB chain26[] = {
  { sizeof(chain26_0), chain26_0 },
@@ -3480,7 +3425,7 @@ static const CERT_TRUST_STATUS elementStatus26[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus26[] = {
- { sizeof(elementStatus26) / sizeof(elementStatus26[0]), elementStatus26 },
+ { ARRAY_SIZE(elementStatus26), elementStatus26 },
 };
 static CONST_DATA_BLOB chain27[] = {
  { sizeof(chain27_0), chain27_0 },
@@ -3493,7 +3438,7 @@ static const CERT_TRUST_STATUS elementStatus27[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus27[] = {
- { sizeof(elementStatus27) / sizeof(elementStatus27[0]), elementStatus27 },
+ { ARRAY_SIZE(elementStatus27), elementStatus27 },
 };
 static const CERT_TRUST_STATUS elementStatus27Broken[] = {
  { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_NAME_MATCH_ISSUER },
@@ -3502,7 +3447,7 @@ static const CERT_TRUST_STATUS elementStatus27Broken[] = {
    CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS },
 };
 static const SimpleChainStatusCheck simpleStatus27Broken[] = {
- { sizeof(elementStatus27Broken) / sizeof(elementStatus27Broken[0]),
+ { ARRAY_SIZE(elementStatus27Broken),
    elementStatus27Broken },
 };
 static CONST_DATA_BLOB chain28[] = {
@@ -3515,7 +3460,7 @@ static const CERT_TRUST_STATUS elementStatus28[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus28[] = {
- { sizeof(elementStatus28) / sizeof(elementStatus28[0]), elementStatus28 },
+ { ARRAY_SIZE(elementStatus28), elementStatus28 },
 };
 static CONST_DATA_BLOB chain29[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3534,7 +3479,7 @@ static const CERT_TRUST_STATUS elementStatus30[] = {
    CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus30[] = {
- { sizeof(elementStatus30) / sizeof(elementStatus30[0]), elementStatus30 },
+ { ARRAY_SIZE(elementStatus30), elementStatus30 },
 };
 static CONST_DATA_BLOB chain31[] = {
  { sizeof(chain0_0), chain0_0 },
@@ -3548,7 +3493,7 @@ static const CERT_TRUST_STATUS selfSignedElementStatus[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
 };
 static const SimpleChainStatusCheck selfSignedSimpleStatus[] = {
- { sizeof(selfSignedElementStatus) / sizeof(selfSignedElementStatus[0]),
+ { ARRAY_SIZE(selfSignedElementStatus),
    selfSignedElementStatus },
 };
 static CONST_DATA_BLOB googleChain[] = {
@@ -3567,7 +3512,7 @@ static const CERT_TRUST_STATUS googleElementStatus[] = {
    CERT_TRUST_HAS_KEY_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_PREFERRED_ISSUER},
 };
 static const SimpleChainStatusCheck googleSimpleStatus[] = {
- { sizeof(googleElementStatus) / sizeof(googleElementStatus[0]),
+ { ARRAY_SIZE(googleElementStatus),
    googleElementStatus },
 };
 static CONST_DATA_BLOB battlenetChain[] = {
@@ -3590,7 +3535,7 @@ static const CERT_TRUST_STATUS opensslElementStatus[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED},
 };
 static const SimpleChainStatusCheck opensslSimpleStatus[] = {
- { sizeof(opensslElementStatus) / sizeof(opensslElementStatus[0]),
+ { ARRAY_SIZE(opensslElementStatus),
    opensslElementStatus },
 };
 /* The OpenSSL chain may not have its root trusted, in which case the chain
@@ -3605,7 +3550,7 @@ static const CERT_TRUST_STATUS incompleteOpensslElementStatus[] = {
  { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_KEY_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck incompleteOpensslSimpleStatus[] = {
- { sizeof(incompleteOpensslElementStatus) / sizeof(incompleteOpensslElementStatus[0]),
+ { ARRAY_SIZE(incompleteOpensslElementStatus),
    incompleteOpensslElementStatus },
 };
 /*
@@ -3625,7 +3570,7 @@ static const CERT_TRUST_STATUS stanfordElementStatus[] = {
    CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED},
 };
 static const SimpleChainStatusCheck stanfordSimpleStatus[] = {
- { sizeof(stanfordElementStatus) / sizeof(stanfordElementStatus[0]),
+ { ARRAY_SIZE(stanfordElementStatus),
    stanfordElementStatus },
 };
 static ChainCheck chainCheck[] = {
@@ -3634,23 +3579,23 @@ static ChainCheck chainCheck[] = {
   * Windows 98/NT4 also set CERT_TRUST_IS_NOT_TIME_NESTED on chains they
   * shouldn't, so ignore those too.
   */
- { { sizeof(chain0) / sizeof(chain0[0]), chain0 },
+ { { ARRAY_SIZE(chain0), chain0 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_VALID, 0 },
      1, simpleStatus0 }, 0, &oct2007 },
- { { sizeof(chain1) / sizeof(chain1[0]), chain1 },
+ { { ARRAY_SIZE(chain1), chain1 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_SIGNATURE_VALID |
        CERT_TRUST_IS_NOT_TIME_VALID, 0 },
      1, simpleStatus1 }, 0, &oct2007 },
- { { sizeof(chain2) / sizeof(chain2[0]), chain2 },
+ { { ARRAY_SIZE(chain2), chain2 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_VALID, 0 },
      1, simpleStatus2 }, 0, &oct2007 },
  /* Earlier versions of Windows incorrectly don't set
   * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain.
   */
- { { sizeof(chain3) / sizeof(chain3[0]), chain3 },
+ { { ARRAY_SIZE(chain3), chain3 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_UNTRUSTED_ROOT |
@@ -3659,7 +3604,7 @@ static ChainCheck chainCheck[] = {
  /* Earlier versions of Windows incorrectly don't set
   * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain.
   */
- { { sizeof(chain4) / sizeof(chain4[0]), chain4 },
+ { { ARRAY_SIZE(chain4), chain4 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_UNTRUSTED_ROOT |
@@ -3670,22 +3615,22 @@ static ChainCheck chainCheck[] = {
   * Similarly, some older versions of Windows incorrectly set
   * CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, ignore that too.
   */
- { { sizeof(chain5) / sizeof(chain5[0]), chain5 },
+ { { ARRAY_SIZE(chain5), chain5 },
    { { CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT |
        CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus5 }, 0, &oct2007 },
- { { sizeof(chain6) / sizeof(chain6[0]), chain6 },
+ { { ARRAY_SIZE(chain6), chain6 },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus6 }, 0, &oct2007 },
- { { sizeof(chain7) / sizeof(chain7[0]), chain7 },
+ { { ARRAY_SIZE(chain7), chain7 },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus7 }, 0, &oct2007 },
  /* Earlier versions of Windows incorrectly don't set
   * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain.
   */
- { { sizeof(chain8) / sizeof(chain8[0]), chain8 },
+ { { ARRAY_SIZE(chain8), chain8 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_UNTRUSTED_ROOT |
@@ -3694,50 +3639,50 @@ static ChainCheck chainCheck[] = {
  /* Earlier versions of Windows incorrectly don't set
   * CERT_TRUST_INVALID_BASIC_CONSTRAINTS on this chain.
   */
- { { sizeof(chain9) / sizeof(chain9[0]), chain9 },
+ { { ARRAY_SIZE(chain9), chain9 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_INVALID_BASIC_CONSTRAINTS,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_PARTIAL_CHAIN |
        CERT_TRUST_INVALID_BASIC_CONSTRAINTS | CERT_TRUST_IS_CYCLIC, 0 },
      1, simpleStatus9 }, 0, &oct2007 },
- { { sizeof(chain10) / sizeof(chain10[0]), chain10 },
+ { { ARRAY_SIZE(chain10), chain10 },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus10 }, 0, &oct2007 },
- { { sizeof(chain11) / sizeof(chain11[0]), chain11 },
+ { { ARRAY_SIZE(chain11), chain11 },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus10 }, 0, &oct2007 },
- { { sizeof(chain12) / sizeof(chain12[0]), chain12 },
+ { { ARRAY_SIZE(chain12), chain12 },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_SIGNATURE_VALID, 0 },
      1, simpleStatus12 }, 0, &oct2007 },
- { { sizeof(chain13) / sizeof(chain13[0]), chain13 },
+ { { ARRAY_SIZE(chain13), chain13 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus13 },
    0, &oct2007 },
- { { sizeof(chain14) / sizeof(chain14[0]), chain14 },
+ { { ARRAY_SIZE(chain14), chain14 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus14 },
    0, &oct2007 },
  /* Earlier versions of crypt32 incorrectly do not complain that the end cert's
   * key usage is invalid, so ignore that error.
   */
- { { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { { ARRAY_SIZE(chain15), chain15 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_VALID_FOR_USAGE, 0 },
      1, simpleStatus15 },
    0, &oct2007 },
- { { sizeof(chain16) / sizeof(chain16[0]), chain16 },
+ { { ARRAY_SIZE(chain16), chain16 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_VALID_FOR_USAGE, 0 },
      1, simpleStatus16 },
    0, &oct2007 },
- { { sizeof(chain17) / sizeof(chain17[0]), chain17 },
+ { { ARRAY_SIZE(chain17), chain17 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, simpleStatus17 },
    0, &oct2007 },
- { { sizeof(chain18) / sizeof(chain18[0]), chain18 },
+ { { ARRAY_SIZE(chain18), chain18 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_VALID_FOR_USAGE, 0 },
@@ -3748,7 +3693,7 @@ static ChainCheck chainCheck[] = {
   * They also do not set CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS, since they
   * incorrectly find a name constraint error.
   */
- { { sizeof(chain19) / sizeof(chain19[0]), chain19 },
+ { { ARRAY_SIZE(chain19), chain19 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT,
        CERT_TRUST_HAS_PREFERRED_ISSUER | CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS
@@ -3760,7 +3705,7 @@ static ChainCheck chainCheck[] = {
   * CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, though they should.  So
   * ignore it (on Windows) but require it (on Wine.)
   */
- { { sizeof(chain20) / sizeof(chain20[0]), chain20 },
+ { { ARRAY_SIZE(chain20), chain20 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3769,7 +3714,7 @@ static ChainCheck chainCheck[] = {
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, 0 },
      1, simpleStatus20 },
    0, &oct2007 },
- { { sizeof(chain21) / sizeof(chain21[0]), chain21 },
+ { { ARRAY_SIZE(chain21), chain21 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT,
        CERT_TRUST_HAS_PREFERRED_ISSUER | CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS
@@ -3777,7 +3722,7 @@ static ChainCheck chainCheck[] = {
      { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS },
      1, simpleStatus21 },
    0, &oct2007 },
- { { sizeof(chain22) / sizeof(chain22[0]), chain22 },
+ { { ARRAY_SIZE(chain22), chain22 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3786,7 +3731,7 @@ static ChainCheck chainCheck[] = {
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, 0 },
      1, simpleStatus22 },
    0, &oct2007 },
- { { sizeof(chain23) / sizeof(chain23[0]), chain23 },
+ { { ARRAY_SIZE(chain23), chain23 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3795,7 +3740,7 @@ static ChainCheck chainCheck[] = {
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, 0 },
      1, simpleStatus23 },
    0, &oct2007 },
- { { sizeof(chain24) / sizeof(chain24[0]), chain24 },
+ { { ARRAY_SIZE(chain24), chain24 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3804,7 +3749,7 @@ static ChainCheck chainCheck[] = {
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, 0 },
      1, simpleStatus24 },
    0, &oct2007 },
- { { sizeof(chain25) / sizeof(chain25[0]), chain25 },
+ { { ARRAY_SIZE(chain25), chain25 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3813,7 +3758,7 @@ static ChainCheck chainCheck[] = {
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT, 0 },
      1, simpleStatus25 },
    0, &oct2007 },
- { { sizeof(chain26) / sizeof(chain26[0]), chain26 },
+ { { ARRAY_SIZE(chain26), chain26 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3823,7 +3768,7 @@ static ChainCheck chainCheck[] = {
      1, simpleStatus26 },
    0, &oct2007 },
  /* chain27 is handled separately elsewhere */
- { { sizeof(chain28) / sizeof(chain28[0]), chain28 },
+ { { ARRAY_SIZE(chain28), chain28 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT,
@@ -3836,7 +3781,7 @@ static ChainCheck chainCheck[] = {
  /* Microsoft incorrectly ignores unknown/unsupported critical extensions on
   * older Windows versions, so ignore the error on Windows.
   */
- { { sizeof(chain30) / sizeof(chain30[0]), chain30 },
+ { { ARRAY_SIZE(chain30), chain30 },
    { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
        CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT |
        CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT |
@@ -3847,7 +3792,7 @@ static ChainCheck chainCheck[] = {
        CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT, 0 },
      1, simpleStatus30 },
    0, &oct2007 },
- { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain },
+ { { ARRAY_SIZE(selfSignedChain), selfSignedChain },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_NOT_TIME_VALID | CERT_TRUST_IS_UNTRUSTED_ROOT, 0 },
      1, selfSignedSimpleStatus }, 0, &oct2007 },
@@ -3858,14 +3803,14 @@ static ChainCheck chainCheck[] = {
   * e.g. has always CERT_TRUST_HAS_NAME_MATCH_ISSUER flag
   * @see CRYPT_CheckSimpleChain
   */
- { { sizeof(googleChain) / sizeof(googleChain[0]), googleChain },
+ { { ARRAY_SIZE(googleChain), googleChain },
    { { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_NESTED,
        CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_NOT_TIME_VALID, 0 },
        1, googleSimpleStatus }, TODO_INFO, &oct2016 },
  /* The stanford chain may or may not have its root trusted, so ignore the error
   */
- { { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain },
+ { { ARRAY_SIZE(stanfordChain), stanfordChain },
    { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_NOT_TIME_VALID, 0 },
        1, stanfordSimpleStatus }, 0, &oct2016 },
@@ -3875,16 +3820,16 @@ static const CERT_TRUST_STATUS elementStatus8NoStore[] = {
  { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_NAME_MATCH_ISSUER },
 };
 static const SimpleChainStatusCheck simpleStatus8NoStore[] = {
- { sizeof(elementStatus8NoStore) / sizeof(elementStatus8NoStore[0]),
+ { ARRAY_SIZE(elementStatus8NoStore),
    elementStatus8NoStore },
 };
 static ChainCheck chainCheckNoStore[] = {
- { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain },
+ { { ARRAY_SIZE(selfSignedChain), selfSignedChain },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_NOT_TIME_VALID | CERT_TRUST_IS_UNTRUSTED_ROOT, 0 },
      1, selfSignedSimpleStatus },
    0 },
- { { sizeof(chain8) / sizeof(chain8[0]), chain8 },
+ { { ARRAY_SIZE(chain8), chain8 },
    { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_PARTIAL_CHAIN, 0 },
      1, simpleStatus8NoStore },
@@ -3894,12 +3839,12 @@ static ChainCheck chainCheckNoStore[] = {
  /* The openssl chain may or may not have its root trusted, so ignore the error
   */
 static ChainCheck opensslChainCheck =
- { { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain },
+ { { ARRAY_SIZE(opensslChain), opensslChain },
    { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_NOT_TIME_VALID, 0 },
        1, opensslSimpleStatus }, 0 };
 static ChainCheck incompleteOpensslChainCheck =
- { { sizeof(incompleteOpensslChain) / sizeof(incompleteOpensslChain[0]),
+ { { ARRAY_SIZE(incompleteOpensslChain),
      incompleteOpensslChain },
    { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER },
      { CERT_TRUST_IS_NOT_TIME_VALID | CERT_TRUST_IS_PARTIAL_CHAIN, 0 },
@@ -3912,7 +3857,7 @@ static ChainCheck incompleteOpensslChainCheck =
  * on the chain's error status.
  */
 static ChainCheck chainCheckEmbeddedNull = {
- { sizeof(chain27) / sizeof(chain27[0]), chain27 },
+ { ARRAY_SIZE(chain27), chain27 },
  { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE,
      CERT_TRUST_HAS_PREFERRED_ISSUER },
    { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_INVALID_NAME_CONSTRAINTS |
@@ -3920,7 +3865,7 @@ static ChainCheck chainCheckEmbeddedNull = {
    1, simpleStatus27 },
  0 };
 static ChainCheck chainCheckEmbeddedNullBroken = {
- { sizeof(chain27) / sizeof(chain27[0]), chain27 },
+ { ARRAY_SIZE(chain27), chain27 },
  { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE |
      CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT,
      CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS | CERT_TRUST_HAS_PREFERRED_ISSUER },
@@ -3928,25 +3873,6 @@ static ChainCheck chainCheckEmbeddedNullBroken = {
      CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS },
    1, simpleStatus27Broken },
  0 };
-static CONST_DATA_BLOB chainECDSA[] = {
- { sizeof(ecc_ca), ecc_ca },
- { sizeof(ecc_crt), ecc_crt },
-};
-static const CERT_TRUST_STATUS elementStatusECDSA[] = {
- { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_NAME_MATCH_ISSUER },
- { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_KEY_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED },
-};
-static const SimpleChainStatusCheck simpleStatusECDSA[] = {
- { sizeof(elementStatusECDSA) / sizeof(elementStatusECDSA[0]), elementStatusECDSA },
-};
-static ChainCheck chainCheckECDSA = {
- { sizeof(chainECDSA) / sizeof(chainECDSA[0]), chainECDSA },
- {
-   { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER },
-   { CERT_TRUST_IS_UNTRUSTED_ROOT, 0 },
-   1, simpleStatusECDSA
- }, 0
-};
 
 #define test_name_blob(a,b) _test_name_blob(__LINE__,a,b)
 static void _test_name_blob(unsigned line, CERT_NAME_BLOB *blob, const char *exdata)
@@ -4091,7 +4017,7 @@ static void testGetCertChain(void)
     CertCloseStore(store, 0);
     CertFreeCertificateContext(cert);
 
-    for (i = 0; i < sizeof(chainCheck) / sizeof(chainCheck[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(chainCheck); i++)
     {
         chain = getChain(NULL, &chainCheck[i].certs, 0, TRUE, chainCheck[i].validfor,
          chainCheck[i].todo, i);
@@ -4124,8 +4050,7 @@ static void testGetCertChain(void)
              0);
         pCertFreeCertificateChain(chain);
     }
-    for (i = 0; i < sizeof(chainCheckNoStore) / sizeof(chainCheckNoStore[0]);
-     i++)
+    for (i = 0; i < ARRAY_SIZE(chainCheckNoStore); i++)
     {
         chain = getChain(NULL, &chainCheckNoStore[i].certs, 0, FALSE, &oct2007,
          chainCheckNoStore[i].todo, i);
@@ -4222,15 +4147,25 @@ static void testGetCertChain(void)
 
     pCertFreeCertificateChain(chain);
 
-    /* Test with ECDSA certificate */
-    chain = getChain(NULL, &chainCheckECDSA.certs, 0, TRUE, &nov2017, FALSE, 0);
-    if (chain)
-    {
-        ok(chain->TrustStatus.dwErrorStatus == CERT_TRUST_IS_UNTRUSTED_ROOT,
-           "unexpected chain error status %08x\n", chain->TrustStatus.dwErrorStatus);
-        checkChainStatus(chain, &chainCheckECDSA.status, chainCheckECDSA.todo, "chainCheckECDSA", 0);
-        pCertFreeCertificateChain(chain);
-    }
+    /* Test revocation flags */
+    ret = CertGetCertificateChain(NULL, cert, &fileTime, store, &para, CERT_CHAIN_REVOCATION_CHECK_END_CERT, NULL,
+                                  &chain);
+    ok(ret, "CertGetCertificateChain failed: %u\n", GetLastError());
+    ok(!chain->TrustStatus.dwErrorStatus, "chain->TrustStatus.dwErrorStatus = %x\n", chain->TrustStatus.dwErrorStatus);
+    pCertFreeCertificateChain(chain);
+
+    ret = CertGetCertificateChain(NULL, cert, &fileTime, store, &para, CERT_CHAIN_REVOCATION_CHECK_CHAIN, NULL, &chain);
+    ok(ret, "CertGetCertificateChain failed: %u\n", GetLastError());
+    ok(!chain->TrustStatus.dwErrorStatus
+           || broken(chain->TrustStatus.dwErrorStatus == CERT_TRUST_REVOCATION_STATUS_UNKNOWN), /* XP */
+       "chain->TrustStatus.dwErrorStatus = %x\n", chain->TrustStatus.dwErrorStatus);
+    pCertFreeCertificateChain(chain);
+
+    ret = CertGetCertificateChain(NULL, cert, &fileTime, store, &para, CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT,
+                                  NULL, &chain);
+    ok(ret, "CertGetCertificateChain failed: %u\n", GetLastError());
+    ok(!chain->TrustStatus.dwErrorStatus, "chain->TrustStatus.dwErrorStatus = %x\n", chain->TrustStatus.dwErrorStatus);
+    pCertFreeCertificateChain(chain);
 
     /* Test HCCE_LOCAL_MACHINE */
     ret = CertGetCertificateChain(HCCE_LOCAL_MACHINE, cert, &fileTime, store, &para, 0, NULL, &chain);
@@ -4288,45 +4223,45 @@ typedef struct _ChainPolicyCheck
 } ChainPolicyCheck;
 
 static const ChainPolicyCheck basePolicyCheck[] = {
- { { sizeof(chain0) / sizeof(chain0[0]), chain0 },
+ { { ARRAY_SIZE(chain0), chain0 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain1) / sizeof(chain1[0]), chain1 },
+ { { ARRAY_SIZE(chain1), chain1 },
    { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, NULL, 0 },
- { { sizeof(chain2) / sizeof(chain2[0]), chain2 },
+ { { ARRAY_SIZE(chain2), chain2 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain3) / sizeof(chain3[0]), chain3 },
+ { { ARRAY_SIZE(chain3), chain3 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain4) / sizeof(chain4[0]), chain4 },
+ { { ARRAY_SIZE(chain4), chain4 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain5) / sizeof(chain5[0]), chain5 },
+ { { ARRAY_SIZE(chain5), chain5 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain6) / sizeof(chain6[0]), chain6 },
+ { { ARRAY_SIZE(chain6), chain6 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain7) / sizeof(chain7[0]), chain7 },
+ { { ARRAY_SIZE(chain7), chain7 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain8) / sizeof(chain8[0]), chain8 },
+ { { ARRAY_SIZE(chain8), chain8 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain9) / sizeof(chain9[0]), chain9 },
+ { { ARRAY_SIZE(chain9), chain9 },
    { 0, CERT_E_CHAINING, 0, -1, NULL }, NULL, 0 },
- { { sizeof(chain10) / sizeof(chain10[0]), chain10 },
+ { { ARRAY_SIZE(chain10), chain10 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain11) / sizeof(chain11[0]), chain11 },
+ { { ARRAY_SIZE(chain11), chain11 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain12) / sizeof(chain12[0]), chain12 },
+ { { ARRAY_SIZE(chain12), chain12 },
    { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain13) / sizeof(chain13[0]), chain13 },
+ { { ARRAY_SIZE(chain13), chain13 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain14) / sizeof(chain14[0]), chain14 },
+ { { ARRAY_SIZE(chain14), chain14 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { { ARRAY_SIZE(chain15), chain15 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain16) / sizeof(chain16[0]), chain16 },
+ { { ARRAY_SIZE(chain16), chain16 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain17) / sizeof(chain17[0]), chain17 },
+ { { ARRAY_SIZE(chain17), chain17 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain18) / sizeof(chain18[0]), chain18 },
+ { { ARRAY_SIZE(chain18), chain18 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain },
+ { { ARRAY_SIZE(selfSignedChain), selfSignedChain },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 },
 };
 
@@ -4338,75 +4273,75 @@ static const CERT_CHAIN_POLICY_STATUS badDateNestingStatus =
  { 0, CERT_E_VALIDITYPERIODNESTING, 0, 0, NULL };
 
 static const ChainPolicyCheck ignoredBadDateNestingBasePolicyCheck = {
- { sizeof(chain2) / sizeof(chain2[0]), chain2 },
+ { ARRAY_SIZE(chain2), chain2 },
  { 0, CERT_E_EXPIRED, 0, 1, NULL}, &badDateNestingStatus, TODO_ELEMENTS
 };
 
 static const ChainPolicyCheck ignoredInvalidDateBasePolicyCheck = {
- { sizeof(googleChain) / sizeof(googleChain[0]), googleChain },
+ { ARRAY_SIZE(googleChain), googleChain },
  { 0, CERT_E_EXPIRED, 0, 1, NULL}, &badDateNestingStatus, TODO_ELEMENTS
 };
 
 static const ChainPolicyCheck ignoredInvalidUsageBasePolicyCheck = {
- { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { ARRAY_SIZE(chain15), chain15 },
  { 0, CERT_E_EXPIRED, 0, 1, NULL}, NULL, TODO_ERROR
 };
 
 static const ChainPolicyCheck invalidUsageBasePolicyCheck = {
- { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { ARRAY_SIZE(chain15), chain15 },
  { 0, CERT_E_WRONG_USAGE, 0, 1, NULL}, NULL, 0
 };
 
 static const ChainPolicyCheck sslPolicyCheck[] = {
- { { sizeof(chain0) / sizeof(chain0[0]), chain0 },
+ { { ARRAY_SIZE(chain0), chain0 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain1) / sizeof(chain1[0]), chain1 },
+ { { ARRAY_SIZE(chain1), chain1 },
    { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, NULL, 0 },
- { { sizeof(chain2) / sizeof(chain2[0]), chain2 },
+ { { ARRAY_SIZE(chain2), chain2 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain3) / sizeof(chain3[0]), chain3 },
+ { { ARRAY_SIZE(chain3), chain3 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain4) / sizeof(chain4[0]), chain4 },
+ { { ARRAY_SIZE(chain4), chain4 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain5) / sizeof(chain5[0]), chain5 },
+ { { ARRAY_SIZE(chain5), chain5 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain6) / sizeof(chain6[0]), chain6 },
+ { { ARRAY_SIZE(chain6), chain6 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain7) / sizeof(chain7[0]), chain7 },
+ { { ARRAY_SIZE(chain7), chain7 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain8) / sizeof(chain8[0]), chain8 },
+ { { ARRAY_SIZE(chain8), chain8 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain9) / sizeof(chain9[0]), chain9 },
+ { { ARRAY_SIZE(chain9), chain9 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, -1, NULL }, NULL, 0 },
- { { sizeof(chain10) / sizeof(chain10[0]), chain10 },
+ { { ARRAY_SIZE(chain10), chain10 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain11) / sizeof(chain11[0]), chain11 },
+ { { ARRAY_SIZE(chain11), chain11 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain12) / sizeof(chain12[0]), chain12 },
+ { { ARRAY_SIZE(chain12), chain12 },
    { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain13) / sizeof(chain13[0]), chain13 },
+ { { ARRAY_SIZE(chain13), chain13 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain14) / sizeof(chain14[0]), chain14 },
+ { { ARRAY_SIZE(chain14), chain14 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { { ARRAY_SIZE(chain15), chain15 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain16) / sizeof(chain16[0]), chain16 },
+ { { ARRAY_SIZE(chain16), chain16 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain17) / sizeof(chain17[0]), chain17 },
+ { { ARRAY_SIZE(chain17), chain17 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain18) / sizeof(chain18[0]), chain18 },
+ { { ARRAY_SIZE(chain18), chain18 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain },
+ { { ARRAY_SIZE(selfSignedChain), selfSignedChain },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 },
 };
 
 static const ChainPolicyCheck ignoredUnknownCAPolicyCheck = {
- { sizeof(chain0) / sizeof(chain0[0]), chain0 },
+ { ARRAY_SIZE(chain0), chain0 },
  { 0, CERT_E_EXPIRED, 0, 0, NULL }, NULL, 0
 };
 
 static const ChainPolicyCheck googlePolicyCheckWithMatchingNameExpired = {
- { sizeof(googleChain) / sizeof(googleChain[0]), googleChain },
+ { ARRAY_SIZE(googleChain), googleChain },
  { 0, CERT_E_EXPIRED, 0, 0, NULL}, NULL, 0
 };
 
@@ -4415,7 +4350,7 @@ static const CERT_CHAIN_POLICY_STATUS expiredStatus =
  { 0, CERT_E_EXPIRED, 0, 0, NULL };
 
 static const ChainPolicyCheck googlePolicyCheckWithMatchingName = {
- { sizeof(googleChain) / sizeof(googleChain[0]), googleChain },
+ { ARRAY_SIZE(googleChain), googleChain },
  { 0, 0, -1, -1, NULL}, &expiredStatus, 0
 };
 
@@ -4424,95 +4359,95 @@ static const CERT_CHAIN_POLICY_STATUS untrustedRootStatus =
  { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL };
 
 static const ChainPolicyCheck opensslPolicyCheckWithMatchingName = {
- { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain },
+ { ARRAY_SIZE(opensslChain), opensslChain },
  { 0, 0, -1, -1, NULL}, &untrustedRootStatus, 0
 };
 
 static const ChainPolicyCheck opensslPolicyCheckWithoutMatchingName = {
- { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain },
+ { ARRAY_SIZE(opensslChain), opensslChain },
  { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, &untrustedRootStatus, 0
 };
 
 static const ChainPolicyCheck winehqPolicyCheckWithMatchingName = {
- { sizeof(chain29) / sizeof(chain29[0]), chain29 },
+ { ARRAY_SIZE(chain29), chain29 },
  { 0, 0, -1, -1, NULL}, NULL, 0
 };
 
 static const ChainPolicyCheck winehqPolicyCheckWithoutMatchingName = {
- { sizeof(chain29) / sizeof(chain29[0]), chain29 },
+ { ARRAY_SIZE(chain29), chain29 },
  { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, NULL, 0
 };
 
 static const ChainPolicyCheck stanfordPolicyCheckWithMatchingName = {
- { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain },
+ { ARRAY_SIZE(stanfordChain), stanfordChain },
  { 0, 0, -1, -1, NULL}, &untrustedRootStatus, 0
 };
 
 static const ChainPolicyCheck stanfordPolicyCheckWithoutMatchingName = {
- { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain },
+ { ARRAY_SIZE(stanfordChain), stanfordChain },
  { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, &untrustedRootStatus, 0
 };
 
 static const ChainPolicyCheck nullTerminatedDomainComponentPolicyCheck = {
- { sizeof(battlenetChain) / sizeof(battlenetChain[0]), battlenetChain },
+ { ARRAY_SIZE(battlenetChain), battlenetChain },
  { 0, 0, -1, -1, NULL}, &untrustedRootStatus, 0
 };
 
 static const ChainPolicyCheck invalidExtensionPolicyCheck = {
- { sizeof(chain30) / sizeof(chain30[0]), chain30 },
+ { ARRAY_SIZE(chain30), chain30 },
  { 0, CERT_E_CRITICAL, 0, 1, NULL}, &badDateNestingStatus, 0
 };
 
 static const ChainPolicyCheck fooPolicyCheckWithMatchingName = {
- { sizeof(chain31) / sizeof(chain31[0]), chain31 },
+ { ARRAY_SIZE(chain31), chain31 },
  { 0, 0, -1, -1, NULL}, NULL, 0
 };
 
 static const ChainPolicyCheck fooPolicyCheckWithoutMatchingName = {
- { sizeof(chain31) / sizeof(chain31[0]), chain31 },
+ { ARRAY_SIZE(chain31), chain31 },
  { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, NULL, 0
 };
 
 static const ChainPolicyCheck authenticodePolicyCheck[] = {
- { { sizeof(chain0) / sizeof(chain0[0]), chain0 },
+ { { ARRAY_SIZE(chain0), chain0 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain1) / sizeof(chain1[0]), chain1 },
+ { { ARRAY_SIZE(chain1), chain1 },
    { 0, TRUST_E_CERT_SIGNATURE, 0, 0, NULL }, NULL, 0 },
- { { sizeof(chain2) / sizeof(chain2[0]), chain2 },
+ { { ARRAY_SIZE(chain2), chain2 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain3) / sizeof(chain3[0]), chain3 },
+ { { ARRAY_SIZE(chain3), chain3 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain4) / sizeof(chain4[0]), chain4 },
+ { { ARRAY_SIZE(chain4), chain4 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain5) / sizeof(chain5[0]), chain5 },
+ { { ARRAY_SIZE(chain5), chain5 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain6) / sizeof(chain6[0]), chain6 },
+ { { ARRAY_SIZE(chain6), chain6 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain7) / sizeof(chain7[0]), chain7 },
+ { { ARRAY_SIZE(chain7), chain7 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain8) / sizeof(chain8[0]), chain8 },
+ { { ARRAY_SIZE(chain8), chain8 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain9) / sizeof(chain9[0]), chain9 },
+ { { ARRAY_SIZE(chain9), chain9 },
    { 0, CERT_E_CHAINING, 0, -1, NULL }, NULL, 0 },
- { { sizeof(chain10) / sizeof(chain10[0]), chain10 },
+ { { ARRAY_SIZE(chain10), chain10 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain11) / sizeof(chain11[0]), chain11 },
+ { { ARRAY_SIZE(chain11), chain11 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain12) / sizeof(chain12[0]), chain12 },
+ { { ARRAY_SIZE(chain12), chain12 },
    { 0, TRUST_E_CERT_SIGNATURE, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain13) / sizeof(chain13[0]), chain13 },
+ { { ARRAY_SIZE(chain13), chain13 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain14) / sizeof(chain14[0]), chain14 },
+ { { ARRAY_SIZE(chain14), chain14 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { { ARRAY_SIZE(chain15), chain15 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain16) / sizeof(chain16[0]), chain16 },
+ { { ARRAY_SIZE(chain16), chain16 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain17) / sizeof(chain17[0]), chain17 },
+ { { ARRAY_SIZE(chain17), chain17 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(chain18) / sizeof(chain18[0]), chain18 },
+ { { ARRAY_SIZE(chain18), chain18 },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, 0 },
- { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain },
+ { { ARRAY_SIZE(selfSignedChain), selfSignedChain },
    { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 },
 };
 
@@ -4524,45 +4459,45 @@ static const CERT_CHAIN_POLICY_STATUS chain4BrokenStatus =
  { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 2, NULL };
 
 static const ChainPolicyCheck basicConstraintsPolicyCheck[] = {
- { { sizeof(chain0) / sizeof(chain0[0]), chain0 },
+ { { ARRAY_SIZE(chain0), chain0 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain1) / sizeof(chain1[0]), chain1 },
+ { { ARRAY_SIZE(chain1), chain1 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain2) / sizeof(chain2[0]), chain2 },
+ { { ARRAY_SIZE(chain2), chain2 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain3) / sizeof(chain3[0]), chain3 },
+ { { ARRAY_SIZE(chain3), chain3 },
    { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain4) / sizeof(chain4[0]), chain4 },
+ { { ARRAY_SIZE(chain4), chain4 },
    { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, &chain4BrokenStatus, 0 },
- { { sizeof(chain5) / sizeof(chain5[0]), chain5 },
+ { { ARRAY_SIZE(chain5), chain5 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain6) / sizeof(chain6[0]), chain6 },
+ { { ARRAY_SIZE(chain6), chain6 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain7) / sizeof(chain7[0]), chain7 },
+ { { ARRAY_SIZE(chain7), chain7 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain8) / sizeof(chain8[0]), chain8 },
+ { { ARRAY_SIZE(chain8), chain8 },
    { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain9) / sizeof(chain9[0]), chain9 },
+ { { ARRAY_SIZE(chain9), chain9 },
    { 0, TRUST_E_BASIC_CONSTRAINTS, 0, 1, NULL }, NULL, 0 },
- { { sizeof(chain10) / sizeof(chain10[0]), chain10 },
+ { { ARRAY_SIZE(chain10), chain10 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain11) / sizeof(chain11[0]), chain11 },
+ { { ARRAY_SIZE(chain11), chain11 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain12) / sizeof(chain12[0]), chain12 },
+ { { ARRAY_SIZE(chain12), chain12 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain13) / sizeof(chain13[0]), chain13 },
+ { { ARRAY_SIZE(chain13), chain13 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain14) / sizeof(chain14[0]), chain14 },
+ { { ARRAY_SIZE(chain14), chain14 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain15) / sizeof(chain15[0]), chain15 },
+ { { ARRAY_SIZE(chain15), chain15 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain16) / sizeof(chain16[0]), chain16 },
+ { { ARRAY_SIZE(chain16), chain16 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain17) / sizeof(chain17[0]), chain17 },
+ { { ARRAY_SIZE(chain17), chain17 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(chain18) / sizeof(chain18[0]), chain18 },
+ { { ARRAY_SIZE(chain18), chain18 },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
- { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain },
+ { { ARRAY_SIZE(selfSignedChain), selfSignedChain },
    { 0, 0, -1, -1, NULL }, NULL, 0 },
 };
 
@@ -4652,7 +4587,7 @@ static void checkChainPolicyStatus(LPCSTR policy, HCERTCHAINENGINE engine,
 #define CHECK_CHAIN_POLICY_STATUS_ARRAY(policy, engine, array, date, para) \
     do { \
         DWORD i; \
-        for (i = 0; i < sizeof(array) / sizeof(array)[0]; i++) \
+        for (i = 0; i < ARRAY_SIZE(array); i++) \
             checkChainPolicyStatus((policy), (engine), &(array)[i], \
              #array, i, (date), (para)); \
     } while(0)
index ad39a35..4a6626a 100644 (file)
@@ -113,7 +113,7 @@ static void test_encodeInt(DWORD dwEncoding)
         ok(!ret && GetLastError() == STATUS_ACCESS_VIOLATION,
          "Expected STATUS_ACCESS_VIOLATION, got %08x\n", GetLastError());
     }
-    for (i = 0; i < sizeof(ints) / sizeof(ints[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(ints); i++)
     {
         /* encode as normal integer */
         ret = pCryptEncodeObjectEx(dwEncoding, X509_INTEGER, &ints[i].val, 0,
@@ -155,7 +155,7 @@ static void test_encodeInt(DWORD dwEncoding)
     /* encode a couple bigger ints, just to show it's little-endian and leading
      * sign bytes are dropped
      */
-    for (i = 0; i < sizeof(bigInts) / sizeof(bigInts[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bigInts); i++)
     {
         blob.cbData = strlen((const char*)bigInts[i].val);
         blob.pbData = (BYTE *)bigInts[i].val;
@@ -178,7 +178,7 @@ static void test_encodeInt(DWORD dwEncoding)
         }
     }
     /* and, encode some uints */
-    for (i = 0; i < sizeof(bigUInts) / sizeof(bigUInts[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bigUInts); i++)
     {
         blob.cbData = strlen((const char*)bigUInts[i].val);
         blob.pbData = (BYTE*)bigUInts[i].val;
@@ -242,7 +242,7 @@ static void test_decodeInt(DWORD dwEncoding)
      GetLastError() == OSS_PDU_MISMATCH /* Win9x */ ),
      "Expected CRYPT_E_ASN1_BADTAG or OSS_PDU_MISMATCH, got %08x\n",
      GetLastError());
-    for (i = 0; i < sizeof(ints) / sizeof(ints[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(ints); i++)
     {
         /* When the output buffer is NULL, this always succeeds */
         SetLastError(0xdeadbeef);
@@ -264,7 +264,7 @@ static void test_decodeInt(DWORD dwEncoding)
             LocalFree(buf);
         }
     }
-    for (i = 0; i < sizeof(bigInts) / sizeof(bigInts[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bigInts); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_MULTI_BYTE_INTEGER,
          bigInts[i].encoded, bigInts[i].encoded[1] + 2, 0, NULL, NULL,
@@ -289,7 +289,7 @@ static void test_decodeInt(DWORD dwEncoding)
             LocalFree(buf);
         }
     }
-    for (i = 0; i < sizeof(bigUInts) / sizeof(bigUInts[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bigUInts); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_MULTI_BYTE_UINT,
          bigUInts[i].encoded, bigUInts[i].encoded[1] + 2, 0, NULL, NULL,
@@ -377,9 +377,9 @@ static void test_encodeEnumerated(DWORD dwEncoding)
 {
     DWORD i, j;
 
-    for (i = 0; i < sizeof(enumeratedTypes) / sizeof(enumeratedTypes[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(enumeratedTypes); i++)
     {
-        for (j = 0; j < sizeof(enums) / sizeof(enums[0]); j++)
+        for (j = 0; j < ARRAY_SIZE(enums); j++)
         {
             BOOL ret;
             BYTE *buf = NULL;
@@ -410,9 +410,9 @@ static void test_decodeEnumerated(DWORD dwEncoding)
 {
     DWORD i, j;
 
-    for (i = 0; i < sizeof(enumeratedTypes) / sizeof(enumeratedTypes[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(enumeratedTypes); i++)
     {
-        for (j = 0; j < sizeof(enums) / sizeof(enums[0]); j++)
+        for (j = 0; j < ARRAY_SIZE(enums); j++)
         {
             BOOL ret;
             DWORD bufSize = sizeof(int);
@@ -563,7 +563,7 @@ static void test_encodeFiletime(DWORD dwEncoding)
 {
     DWORD i;
 
-    for (i = 0; i < sizeof(times) / sizeof(times[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(times); i++)
     {
         testTimeEncoding(dwEncoding, X509_CHOICE_OF_TIME, &times[i]);
         testTimeEncoding(dwEncoding, PKCS_UTC_TIME, &times[i]);
@@ -645,19 +645,19 @@ static void test_decodeFiletime(DWORD dwEncoding)
     ok(!ret && GetLastError() == ERROR_MORE_DATA,
      "Expected ERROR_MORE_DATA, got %d\n", GetLastError());
     /* Normal tests */
-    for (i = 0; i < sizeof(times) / sizeof(times[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(times); i++)
     {
         testTimeDecoding(dwEncoding, X509_CHOICE_OF_TIME, &times[i]);
         testTimeDecoding(dwEncoding, PKCS_UTC_TIME, &times[i]);
         testTimeDecoding(dwEncoding, szOID_RSA_signingTime, &times[i]);
     }
-    for (i = 0; i < sizeof(otherTimes) / sizeof(otherTimes[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(otherTimes); i++)
     {
         testTimeDecoding(dwEncoding, X509_CHOICE_OF_TIME, &otherTimes[i]);
         testTimeDecoding(dwEncoding, PKCS_UTC_TIME, &otherTimes[i]);
         testTimeDecoding(dwEncoding, szOID_RSA_signingTime, &otherTimes[i]);
     }
-    for (i = 0; i < sizeof(bogusTimes) / sizeof(bogusTimes[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bogusTimes); i++)
     {
         size = sizeof(ft1);
         ret = pCryptDecodeObjectEx(dwEncoding, X509_CHOICE_OF_TIME,
@@ -861,7 +861,7 @@ static void test_encodeName(DWORD dwEncoding)
     ok(!ret && GetLastError() == E_INVALIDARG,
      "Expected E_INVALIDARG, got %08x\n", GetLastError());
     /* Test a more complex name */
-    rdn.cRDNAttr = sizeof(rdnAttrs) / sizeof(rdnAttrs[0]);
+    rdn.cRDNAttr = ARRAY_SIZE(rdnAttrs);
     rdn.rgRDNAttr = rdnAttrs;
     info.cRDN = 1;
     info.rgRDN = &rdn;
@@ -1139,7 +1139,7 @@ static void test_decodeName(DWORD dwEncoding)
           (BYTE *)commonName } },
         };
 
-        rdn.cRDNAttr = sizeof(attrs) / sizeof(attrs[0]);
+        rdn.cRDNAttr = ARRAY_SIZE(attrs);
         rdn.rgRDNAttr = attrs;
         compareNames(&info, (CERT_NAME_INFO *)buf);
         LocalFree(buf);
@@ -1157,7 +1157,7 @@ static void test_decodeName(DWORD dwEncoding)
     ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
     if (ret)
     {
-        rdn.cRDNAttr = sizeof(decodedRdnAttrs) / sizeof(decodedRdnAttrs[0]);
+        rdn.cRDNAttr = ARRAY_SIZE(decodedRdnAttrs);
         rdn.rgRDNAttr = decodedRdnAttrs;
         compareNames(&info, (CERT_NAME_INFO *)buf);
         LocalFree(buf);
@@ -1223,7 +1223,7 @@ static void test_decodeUnicodeName(DWORD dwEncoding)
          { lstrlenW(commonNameW) * sizeof(WCHAR), (BYTE *)commonNameW } },
         };
 
-        rdn.cRDNAttr = sizeof(attrs) / sizeof(attrs[0]);
+        rdn.cRDNAttr = ARRAY_SIZE(attrs);
         rdn.rgRDNAttr = attrs;
         compareNames(&info, (CERT_NAME_INFO *)buf);
         LocalFree(buf);
@@ -1332,7 +1332,7 @@ static void test_encodeNameValue(DWORD dwEncoding)
          "Unexpected encoding\n");
         LocalFree(buf);
     }
-    for (i = 0; i < sizeof(nameValues) / sizeof(nameValues[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(nameValues); i++)
     {
         ret = pCryptEncodeObjectEx(dwEncoding, X509_NAME_VALUE,
          &nameValues[i].value, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
@@ -1370,7 +1370,7 @@ static void test_decodeNameValue(DWORD dwEncoding)
     DWORD bufSize = 0;
     BOOL ret;
 
-    for (i = 0; i < sizeof(nameValues) / sizeof(nameValues[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(nameValues); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_NAME_VALUE,
          nameValues[i].encoded, nameValues[i].encoded[1] + 2,
@@ -1866,7 +1866,7 @@ static void test_encodeUnicodeNameValue(DWORD dwEncoding)
      "Expected CRYPT_E_NOT_CHAR_STRING, got %08x\n", GetLastError());
     /* More failure checking */
     value.Value.cbData = 0;
-    for (i = 0; i < sizeof(unicodeErrors) / sizeof(unicodeErrors[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(unicodeErrors); i++)
     {
         value.Value.pbData = (LPBYTE)unicodeErrors[i].str;
         value.dwValueType = unicodeErrors[i].valueType;
@@ -1881,7 +1881,7 @@ static void test_encodeUnicodeNameValue(DWORD dwEncoding)
     }
     /* cbData can be zero if the string is NULL-terminated */
     value.Value.cbData = 0;
-    for (i = 0; i < sizeof(unicodeResults) / sizeof(unicodeResults[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(unicodeResults); i++)
     {
         value.Value.pbData = (LPBYTE)unicodeResults[i].str;
         value.dwValueType = unicodeResults[i].valueType;
@@ -1903,7 +1903,7 @@ static void test_encodeUnicodeNameValue(DWORD dwEncoding)
      * rather than properly encoding it.  Kept separate from the proper results,
      * because the encoded forms won't decode to their original strings.
      */
-    for (i = 0; i < sizeof(unicodeWeirdness) / sizeof(unicodeWeirdness[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(unicodeWeirdness); i++)
     {
         value.Value.pbData = (LPBYTE)unicodeWeirdness[i].str;
         value.dwValueType = unicodeWeirdness[i].valueType;
@@ -1933,7 +1933,7 @@ static void test_decodeUnicodeNameValue(DWORD dwEncoding)
 {
     DWORD i;
 
-    for (i = 0; i < sizeof(unicodeResults) / sizeof(unicodeResults[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(unicodeResults); i++)
     {
         BYTE *buf = NULL;
         BOOL ret;
@@ -1991,7 +1991,7 @@ static void test_encodeOctets(DWORD dwEncoding)
         }
     };
 
-    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
     {
         BYTE *buf = NULL;
         BOOL ret;
@@ -2065,7 +2065,7 @@ static void test_decodeOctets(DWORD dwEncoding)
         }
     };
 
-    for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
     {
         BYTE *buf = NULL;
         BOOL ret;
@@ -2127,7 +2127,7 @@ static void test_encodeBits(DWORD dwEncoding)
 {
     DWORD i;
 
-    for (i = 0; i < sizeof(bits) / sizeof(bits[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bits); i++)
     {
         CRYPT_BIT_BLOB blob;
         BOOL ret;
@@ -2162,7 +2162,7 @@ static void test_decodeBits(DWORD dwEncoding)
     DWORD bufSize = 0;
 
     /* normal cases */
-    for (i = 0; i < sizeof(bits) / sizeof(bits[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(bits); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_BITS, bits[i].encoded,
          bits[i].encoded[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf,
@@ -2249,7 +2249,7 @@ static void test_encodeBasicConstraints(DWORD dwEncoding)
     BYTE *buf = NULL;
 
     /* First test with the simpler info2 */
-    for (i = 0; i < sizeof(constraints2) / sizeof(constraints2[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(constraints2); i++)
     {
         ret = pCryptEncodeObjectEx(dwEncoding, X509_BASIC_CONSTRAINTS2,
          &constraints2[i].info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf,
@@ -2312,7 +2312,7 @@ static void test_decodeBasicConstraints(DWORD dwEncoding)
     DWORD bufSize = 0;
 
     /* First test with simpler info2 */
-    for (i = 0; i < sizeof(constraints2) / sizeof(constraints2[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(constraints2); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_BASIC_CONSTRAINTS2,
          constraints2[i].encoded, constraints2[i].encoded[1] + 2,
@@ -2494,7 +2494,7 @@ static void test_encodeRsaPublicKey(DWORD dwEncoding)
      "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError());
     /* Finally, all valid */
     hdr->aiKeyAlg = CALG_RSA_KEYX;
-    for (i = 0; i < sizeof(rsaPubKeys) / sizeof(rsaPubKeys[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(rsaPubKeys); i++)
     {
         memcpy(toEncode + sizeof(BLOBHEADER) + sizeof(RSAPUBKEY),
          rsaPubKeys[i].modulus, rsaPubKeys[i].modulusLen);
@@ -2540,7 +2540,7 @@ static void test_decodeRsaPublicKey(DWORD dwEncoding)
     ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND,
      "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError());
     /* Now try success cases */
-    for (i = 0; i < sizeof(rsaPubKeys) / sizeof(rsaPubKeys[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(rsaPubKeys); i++)
     {
         bufSize = 0;
         ret = pCryptDecodeObjectEx(dwEncoding, RSA_CSP_PUBLICKEYBLOB,
@@ -2590,7 +2590,7 @@ static const BYTE mixedSequence[] = { 0x30, 0x27, 0x17, 0x0d, 0x30, 0x35, 0x30,
 
 static void test_encodeSequenceOfAny(DWORD dwEncoding)
 {
-    CRYPT_DER_BLOB blobs[sizeof(ints) / sizeof(ints[0])];
+    CRYPT_DER_BLOB blobs[ARRAY_SIZE(ints)];
     CRYPT_SEQUENCE_OF_ANY seq;
     DWORD i;
     BOOL ret;
@@ -2598,12 +2598,12 @@ static void test_encodeSequenceOfAny(DWORD dwEncoding)
     DWORD bufSize = 0;
 
     /* Encode a homogeneous sequence */
-    for (i = 0; i < sizeof(ints) / sizeof(ints[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(ints); i++)
     {
         blobs[i].cbData = ints[i].encoded[1] + 2;
         blobs[i].pbData = (BYTE *)ints[i].encoded;
     }
-    seq.cValue = sizeof(ints) / sizeof(ints[0]);
+    seq.cValue = ARRAY_SIZE(ints);
     seq.rgValue = blobs;
 
     ret = pCryptEncodeObjectEx(dwEncoding, X509_SEQUENCE_OF_ANY, &seq,
@@ -2646,9 +2646,8 @@ static void test_decodeSequenceOfAny(DWORD dwEncoding)
         CRYPT_SEQUENCE_OF_ANY *seq = (CRYPT_SEQUENCE_OF_ANY *)buf;
         DWORD i;
 
-        ok(seq->cValue == sizeof(ints) / sizeof(ints[0]),
-         "Wrong elements %d\n", seq->cValue);
-        for (i = 0; i < min(seq->cValue, sizeof(ints) / sizeof(ints[0])); i++)
+        ok(seq->cValue == ARRAY_SIZE(ints), "Wrong elements %d\n", seq->cValue);
+        for (i = 0; i < min(seq->cValue, ARRAY_SIZE(ints)); i++)
         {
             ok(seq->rgValue[i].cbData == ints[i].encoded[1] + 2,
              "Expected %d bytes, got %d\n", ints[i].encoded[1] + 2,
@@ -2666,8 +2665,7 @@ static void test_decodeSequenceOfAny(DWORD dwEncoding)
     {
         CRYPT_SEQUENCE_OF_ANY *seq = (CRYPT_SEQUENCE_OF_ANY *)buf;
 
-        ok(seq->cValue == sizeof(ints) / sizeof(ints[0]),
-         "Wrong elements %d\n", seq->cValue);
+        ok(seq->cValue == ARRAY_SIZE(ints), "Wrong elements %d\n", seq->cValue);
         /* Just check the first element since it's all that changed */
         ok(seq->rgValue[0].cbData == times[0].encodedTime[1] + 2,
          "Expected %d bytes, got %d\n", times[0].encodedTime[1] + 2,
@@ -2713,7 +2711,7 @@ static void test_encodeExtensions(DWORD dwEncoding)
 {
     DWORD i;
 
-    for (i = 0; i < sizeof(exts) / sizeof(exts[i]); i++)
+    for (i = 0; i < ARRAY_SIZE(exts); i++)
     {
         BOOL ret;
         BYTE *buf = NULL;
@@ -2737,7 +2735,7 @@ static void test_decodeExtensions(DWORD dwEncoding)
 {
     DWORD i;
 
-    for (i = 0; i < sizeof(exts) / sizeof(exts[i]); i++)
+    for (i = 0; i < ARRAY_SIZE(exts); i++)
     {
         BOOL ret;
         BYTE *buf = NULL;
@@ -2851,7 +2849,7 @@ static void test_encodePublicKeyInfo(DWORD dwEncoding)
 {
     DWORD i;
 
-    for (i = 0; i < sizeof(pubKeys) / sizeof(pubKeys[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(pubKeys); i++)
     {
         BOOL ret;
         BYTE *buf = NULL;
@@ -2907,7 +2905,7 @@ static void test_decodePublicKeyInfo(DWORD dwEncoding)
     BYTE *buf = NULL;
     DWORD bufSize = 0;
 
-    for (i = 0; i < sizeof(pubKeys) / sizeof(pubKeys[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(pubKeys); i++)
     {
         /* The NULL form decodes to the decoded member */
         ret = pCryptDecodeObjectEx(dwEncoding, X509_PUBLIC_KEY_INFO,
@@ -3260,7 +3258,7 @@ static void test_decodeCertToBeSigned(DWORD dwEncoding)
      * CRYPT_E_ASN1_BADTAG, because at a minimum a cert must have a non-zero
      * serial number, an issuer, a subject, and a public key.
      */
-    for (i = 0; i < sizeof(corruptCerts) / sizeof(corruptCerts[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(corruptCerts); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED,
          corruptCerts[i], corruptCerts[i][1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL,
@@ -4688,7 +4686,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding)
     BYTE *buf = NULL;
     DWORD size = 0, i;
 
-    for (i = 0; i < sizeof(corruptCRLs) / sizeof(corruptCRLs[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(corruptCRLs); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED,
          corruptCRLs[i], corruptCRLs[i][1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL,
@@ -4854,7 +4852,7 @@ static void test_encodeEnhancedKeyUsage(DWORD dwEncoding)
         LocalFree(buf);
     }
     /* Test with a few usages */
-    usage.cUsageIdentifier = sizeof(keyUsages) / sizeof(keyUsages[0]);
+    usage.cUsageIdentifier = ARRAY_SIZE(keyUsages);
     usage.rgpszUsageIdentifier = (LPSTR *)keyUsages;
     ret = pCryptEncodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, &usage,
      CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size);
@@ -4898,8 +4896,8 @@ static void test_decodeEnhancedKeyUsage(DWORD dwEncoding)
 
         ok(size >= sizeof(CERT_ENHKEY_USAGE),
          "Wrong size %d\n", size);
-        ok(usage->cUsageIdentifier == sizeof(keyUsages) / sizeof(keyUsages[0]),
-         "Wrong CRL entries count %d\n", usage->cUsageIdentifier);
+        ok(usage->cUsageIdentifier == ARRAY_SIZE(keyUsages),
+           "Wrong CRL entries count %d\n", usage->cUsageIdentifier);
         for (i = 0; i < usage->cUsageIdentifier; i++)
             ok(!strcmp(usage->rgpszUsageIdentifier[i], keyUsages[i]),
              "Expected OID %s, got %s\n", keyUsages[i],
@@ -6109,7 +6107,7 @@ static void test_decodePKCSContentInfo(DWORD dwEncoding)
           "1.2.3", content_constructed_abcd + 8, 10 }
     };
 
-    for (i = 0; i < sizeof(tests)/sizeof(*tests); i++)
+    for (i = 0; i < ARRAY_SIZE(tests); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CONTENT_INFO, tests[i].encoded,
             tests[i].encoded_size, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size);
@@ -7397,9 +7395,7 @@ static void test_decodeNameConstraints(DWORD dwEncoding)
     U(IPAddressWithMinSubtree.Base).IPAddress.pbData = (LPBYTE)encodedIPAddr;
     U(IPAddressWithMinMaxSubtree.Base).IPAddress.cbData = sizeof(encodedIPAddr);
     U(IPAddressWithMinMaxSubtree.Base).IPAddress.pbData = (LPBYTE)encodedIPAddr;
-    for (i = 0;
-     i < sizeof(encodedNameConstraints) / sizeof(encodedNameConstraints[0]);
-     i++)
+    for (i = 0; i < ARRAY_SIZE(encodedNameConstraints); i++)
     {
         DWORD size;
 
@@ -7749,7 +7745,7 @@ static void test_encodeCertPolicyMappings(DWORD dwEncoding)
     DWORD size, i;
 
     /* Each of the mapping OIDs is equivalent, so check with all of them */
-    for (i = 0; i < sizeof(mappingOids) / sizeof(mappingOids[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(mappingOids); i++)
     {
         memset(&info, 0, sizeof(info));
         ret = pCryptEncodeObjectEx(dwEncoding, mappingOids[i], &info,
@@ -7814,7 +7810,7 @@ static void test_decodeCertPolicyMappings(DWORD dwEncoding)
     BOOL ret;
 
     /* Each of the mapping OIDs is equivalent, so check with all of them */
-    for (i = 0; i < sizeof(mappingOids) / sizeof(mappingOids[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(mappingOids); i++)
     {
         ret = pCryptDecodeObjectEx(dwEncoding, mappingOids[i],
          emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL,
@@ -8509,173 +8505,6 @@ static void testPortPublicKeyInfo(void)
     ok(ret,"CryptAcquireContextA failed\n");
 }
 
-static const BYTE eccCert[] = {
-0x30,0x82,0x01,0x46,0x30,0x81,0xec,0x02,0x09,0x00,0xe7,0x6b,
-0x26,0x86,0x0a,0x82,0xff,0xe9,0x30,0x0a,0x06,0x08,0x2a,0x86,
-0x48,0xce,0x3d,0x04,0x03,0x02,0x30,0x2b,0x31,0x0b,0x30,0x09,
-0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x0d,0x30,
-0x0b,0x06,0x03,0x55,0x04,0x0a,0x0c,0x04,0x57,0x69,0x6e,0x65,
-0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x03,0x0c,0x04,0x57,
-0x69,0x6e,0x65,0x30,0x1e,0x17,0x0d,0x31,0x37,0x30,0x39,0x32,
-0x37,0x31,0x33,0x34,0x31,0x30,0x34,0x5a,0x17,0x0d,0x32,0x37,
-0x30,0x39,0x32,0x35,0x31,0x33,0x34,0x31,0x30,0x34,0x5a,0x30,
-0x2b,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x44,0x45,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,0x04,0x0a,0x0c,
-0x04,0x54,0x65,0x73,0x74,0x31,0x0d,0x30,0x0b,0x06,0x03,0x55,
-0x04,0x03,0x0c,0x04,0x54,0x65,0x73,0x74,0x30,0x59,0x30,0x13,
-0x06,0x07,0x2a,0x86,0x48,0xce,0x3d,0x02,0x01,0x06,0x08,0x2a,
-0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,0x42,0x00,0x04,0xed,
-0xfc,0x77,0xd8,0xb9,0xe7,0xf3,0xf8,0xce,0x13,0xb8,0x7f,0x0f,
-0x78,0xea,0x73,0x87,0x29,0x10,0xe1,0x6d,0x10,0xce,0x57,0x60,
-0x3b,0x3e,0xb4,0x5f,0x0d,0x20,0xc1,0xeb,0x6d,0x74,0xe9,0x7b,
-0x11,0x51,0x9a,0x00,0xe8,0xe9,0x12,0x84,0xb9,0x07,0x7e,0x7b,
-0x62,0x67,0x12,0x67,0x08,0xe5,0x2e,0x27,0xce,0xa2,0x57,0x15,
-0xad,0xc5,0x1f,0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,
-0x04,0x03,0x02,0x03,0x49,0x00,0x30,0x46,0x02,0x21,0x00,0xd7,
-0x29,0xce,0x5a,0xef,0x74,0x85,0xd1,0x18,0x5f,0x6e,0xf1,0xba,
-0x53,0xd4,0xcd,0xdd,0xe0,0x5d,0xf1,0x5e,0x48,0x51,0xea,0x63,
-0xc0,0xe8,0xe2,0xf6,0xfa,0x4c,0xaf,0x02,0x21,0x00,0xe3,0x94,
-0x15,0x3b,0x6c,0x71,0x6e,0x44,0x22,0xcb,0xa0,0x88,0xcd,0x0a,
-0x5a,0x50,0x29,0x7c,0x5c,0xd6,0x6c,0xd2,0xe0,0x7f,0xcd,0x02,
-0x92,0x21,0x4c,0x2c,0x92,0xee };
-static const BYTE ecdsaSig[] = {
-0x30,0x46,0x02,0x21,0x00,0xd7,0x29,0xce,0x5a,0xef,0x74,0x85,
-0xd1,0x18,0x5f,0x6e,0xf1,0xba,0x53,0xd4,0xcd,0xdd,0xe0,0x5d,
-0xf1,0x5e,0x48,0x51,0xea,0x63,0xc0,0xe8,0xe2,0xf6,0xfa,0x4c,
-0xaf,0x02,0x21,0x00,0xe3,0x94,0x15,0x3b,0x6c,0x71,0x6e,0x44,
-0x22,0xcb,0xa0,0x88,0xcd,0x0a,0x5a,0x50,0x29,0x7c,0x5c,0xd6,
-0x6c,0xd2,0xe0,0x7f,0xcd,0x02,0x92,0x21,0x4c,0x2c,0x92,0xee };
-static const BYTE eccPubKey[] = {
-0x30,0x59,0x30,0x13,0x06,0x07,0x2a,0x86,0x48,0xce,0x3d,0x02,
-0x01,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x03,0x01,0x07,0x03,
-0x42,0x00,0x04,0xed,0xfc,0x77,0xd8,0xb9,0xe7,0xf3,0xf8,0xce,
-0x13,0xb8,0x7f,0x0f,0x78,0xea,0x73,0x87,0x29,0x10,0xe1,0x6d,
-0x10,0xce,0x57,0x60,0x3b,0x3e,0xb4,0x5f,0x0d,0x20,0xc1,0xeb,
-0x6d,0x74,0xe9,0x7b,0x11,0x51,0x9a,0x00,0xe8,0xe9,0x12,0x84,
-0xb9,0x07,0x7e,0x7b,0x62,0x67,0x12,0x67,0x08,0xe5,0x2e,0x27,
-0xce,0xa2,0x57,0x15,0xad,0xc5,0x1f };
-
-static void testECDSACert(void)
-{
-    DWORD decode_flags = CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG;
-    CERT_SIGNED_CONTENT_INFO *info;
-    CERT_PUBLIC_KEY_INFO *pubkey;
-    CERT_ECC_SIGNATURE *ecc_sig;
-    LPSTR *ecc_curve;
-    DWORD size;
-    BOOL ret;
-    int i;
-
-    info = NULL;
-    ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, X509_CERT, eccCert, sizeof(eccCert), decode_flags,
-                               NULL, &info, &size);
-    ok(ret, "CryptDecodeObjectEx failed with %d\n", GetLastError());
-
-    ok(!strcmp(info->SignatureAlgorithm.pszObjId, szOID_ECDSA_SHA256),
-       "Expected 1.2.840.10045.4.3.2, got %s\n", info->SignatureAlgorithm.pszObjId);
-    ok(!info->SignatureAlgorithm.Parameters.cbData,
-       "Expected no parameter data, got %d bytes\n", info->SignatureAlgorithm.Parameters.cbData);
-    ok(!info->SignatureAlgorithm.Parameters.pbData,
-       "Expected no parameter data, got %p pointer\n", info->SignatureAlgorithm.Parameters.pbData);
-
-    ok(info->Signature.cbData == sizeof(ecdsaSig),
-       "Expected %d bytes, got %d\n", (int)sizeof(ecdsaSig), info->Signature.cbData);
-    ok(info->Signature.pbData != NULL, "Got NULL pointer\n");
-    ok(!info->Signature.cUnusedBits, "Expected no unused bytes, got %d\n", info->Signature.cUnusedBits);
-    for (i = 0; i < info->Signature.cbData; i++)
-    {
-        ok(ecdsaSig[i] == info->Signature.pbData[i], "Expected %02x, got %02x at offset %d\n",
-           ecdsaSig[i], info->Signature.pbData[i], i);
-    }
-
-    ecc_sig = NULL;
-    ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, X509_ECC_SIGNATURE, info->Signature.pbData,
-                               info->Signature.cbData, decode_flags, NULL, &ecc_sig, &size);
-    ok(ret, "CryptDecodeObjectEx failed with %d\n", GetLastError());
-    if (ret)
-    {
-        ok(ecc_sig->r.cbData == 32, "Expected 32 bytes, got %d\n", ecc_sig->r.cbData);
-        ok(ecc_sig->r.pbData != NULL, "Got NULL pointer\n");
-        ok(ecc_sig->s.cbData == 32, "Expected 32 bytes, got %d\n", ecc_sig->s.cbData);
-        ok(ecc_sig->s.pbData != NULL, "Got NULL pointer\n");
-        for (i = 0; i < ecc_sig->r.cbData; i++)
-        {
-            ok(ecdsaSig[4+32-i] == ecc_sig->r.pbData[i], "Expected %02x, got %02x at offset %d\n",
-               ecdsaSig[4+32-i], ecc_sig->r.pbData[i], i);
-        }
-        for (i = 0; i < ecc_sig->s.cbData; i++)
-        {
-            ok(ecdsaSig[4+35+32-i] == ecc_sig->s.pbData[i], "Expected %02x, got %02x at offset %d\n",
-               ecdsaSig[4+35+32-i], ecc_sig->s.pbData[i], i);
-        }
-        LocalFree(ecc_sig);
-    }
-
-    LocalFree(info);
-
-    info = NULL;
-    decode_flags &= ~CRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAG;
-    ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, X509_CERT, eccCert, sizeof(eccCert), decode_flags,
-                               NULL, &info, &size);
-    ok(ret, "CryptDecodeObjectEx failed with %d\n", GetLastError());
-
-    ok(info->Signature.cbData == sizeof(ecdsaSig),
-       "Expected %d bytes, got %d\n", (int)sizeof(ecdsaSig), info->Signature.cbData);
-    ok(info->Signature.pbData != NULL, "Got NULL pointer\n");
-    ok(!info->Signature.cUnusedBits, "Expected no unused bytes, got %d\n", info->Signature.cUnusedBits);
-    for (i = 0; i < info->Signature.cbData; i++)
-    {
-        ok(ecdsaSig[sizeof(ecdsaSig)-i-1] == info->Signature.pbData[i], "Expected %02x, got %02x at offset %d\n",
-           ecdsaSig[sizeof(ecdsaSig)-i-1], info->Signature.pbData[i], i);
-    }
-
-    LocalFree(info);
-
-    pubkey = NULL;
-    ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, eccPubKey, sizeof(eccPubKey),
-                               decode_flags, NULL, &pubkey, &size);
-    ok(ret, "CryptDecodeObjectEx failed with %d\n", GetLastError());
-
-    ok(!strcmp(pubkey->Algorithm.pszObjId, szOID_ECC_PUBLIC_KEY),
-       "Expected 1.2.840.10045.2.1, got %s\n", pubkey->Algorithm.pszObjId);
-    ok(pubkey->Algorithm.Parameters.cbData == 10,
-       "Expected 10 bytes parameters, got %d bytes\n", pubkey->Algorithm.Parameters.cbData);
-    ok(pubkey->Algorithm.Parameters.pbData != NULL,
-       "Expected pointer to parameters, got NULL\n");
-
-    ecc_curve = NULL;
-    ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, X509_OBJECT_IDENTIFIER, pubkey->Algorithm.Parameters.pbData,
-                               pubkey->Algorithm.Parameters.cbData, decode_flags, NULL, &ecc_curve, &size);
-    ok(ret || broken(GetLastError() == ERROR_FILE_NOT_FOUND /* < Vista */),
-       "CryptDecodeObjectEx failed with %d\n", GetLastError());
-    if (ret)
-    {
-        ok(!strcmp(*ecc_curve, szOID_ECC_CURVE_P256), "Expected 1.2.840.10045.3.1.7, got %s\n", *ecc_curve);
-        LocalFree(ecc_curve);
-    }
-
-    ecc_curve = NULL;
-    ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, szOID_ECC_PUBLIC_KEY, pubkey->Algorithm.Parameters.pbData,
-                               pubkey->Algorithm.Parameters.cbData, decode_flags, NULL, &ecc_curve, &size);
-    ok(ret || broken(GetLastError() == ERROR_FILE_NOT_FOUND /* < Vista */),
-       "CryptDecodeObjectEx failed with %d\n", GetLastError());
-    if (ret)
-    {
-        ok(!strcmp(*ecc_curve, szOID_ECC_CURVE_P256), "Expected 1.2.840.10045.3.1.7, got %s\n", *ecc_curve);
-        LocalFree(ecc_curve);
-    }
-
-    ok(pubkey->PublicKey.cbData == 65, "Expected 32 bytes parameters, got %d bytes\n", pubkey->PublicKey.cbData);
-    ok(pubkey->PublicKey.pbData != NULL, "Expected pointer to parameters, got NULL\n");
-    for (i = 0; i < pubkey->PublicKey.cbData; i++)
-    {
-        ok(eccPubKey[26+i] == pubkey->PublicKey.pbData[i], "Expected %02x, got %02x at offset %d\n",
-           eccPubKey[26+i], pubkey->PublicKey.pbData[i], i);
-    }
-
-    LocalFree(pubkey);
-}
-
 START_TEST(encode)
 {
     static const DWORD encodings[] = { X509_ASN_ENCODING, PKCS_7_ASN_ENCODING,
@@ -8692,7 +8521,7 @@ START_TEST(encode)
         return;
     }
 
-    for (i = 0; i < sizeof(encodings) / sizeof(encodings[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(encodings); i++)
     {
         test_encodeInt(encodings[i]);
         test_decodeInt(encodings[i]);
@@ -8769,5 +8598,4 @@ START_TEST(encode)
         test_decodeRsaPrivateKey(encodings[i]);
     }
     testPortPublicKeyInfo();
-    testECDSACert();
 }
index a0019b5..11beff1 100644 (file)
@@ -36,7 +36,7 @@ static void test_findAttribute(void)
     BYTE blobbin[] = {0x02,0x01,0x01};
     static CHAR oid[] = "1.2.3";
     CRYPT_ATTR_BLOB blobs[] = { { sizeof blobbin, blobbin }, };
-    CRYPT_ATTRIBUTE attr = { oid, sizeof(blobs) / sizeof(blobs[0]), blobs };
+    CRYPT_ATTRIBUTE attr = { oid, ARRAY_SIZE(blobs), blobs };
 
     /* returns NULL, last error not set */
     SetLastError(0xdeadbeef);
@@ -128,10 +128,8 @@ static void test_findRDNAttr(void)
     CERT_RDN_ATTR attrs[] = {
      { oid, CERT_RDN_IA5_STRING, { sizeof bin, bin } },
     };
-    CERT_RDN rdns[] = {
-     { sizeof(attrs) / sizeof(attrs[0]), attrs },
-    };
-    CERT_NAME_INFO nameInfo = { sizeof(rdns) / sizeof(rdns[0]), rdns };
+    CERT_RDN rdns[] = { { ARRAY_SIZE(attrs), attrs } };
+    CERT_NAME_INFO nameInfo = { ARRAY_SIZE(rdns), rdns };
 
     if (0)
     {
index c240533..b692127 100644 (file)
@@ -575,7 +575,7 @@ static CRYPT_DATA_BLOB b1[] = {
     { sizeof(u2), u2 },
     { sizeof(u2), u2 },
 };
-static const struct update_accum a1 = { sizeof(b1) / sizeof(b1[0]), b1 };
+static const struct update_accum a1 = { ARRAY_SIZE(b1), b1 };
 /* The updates of a definite-length encoded message */
 static BYTE u3[] = { 0x30,0x13,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,
  0x07,0x01,0xa0,0x06,0x04,0x04 };
@@ -583,7 +583,7 @@ static CRYPT_DATA_BLOB b2[] = {
     { sizeof(u3), u3 },
     { sizeof(u2), u2 },
 };
-static const struct update_accum a2 = { sizeof(b2) / sizeof(b2[0]), b2 };
+static const struct update_accum a2 = { ARRAY_SIZE(b2), b2 };
 /* The updates of an indefinite-length encoded message */
 static BYTE u4[] = { 0x30,0x80,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,
  0x07,0x01,0xa0,0x80,0x24,0x80 };
@@ -597,7 +597,7 @@ static CRYPT_DATA_BLOB b3[] = {
     { sizeof(u2), u2 },
     { sizeof(u6), u6 },
 };
-static const struct update_accum a3 = { sizeof(b3) / sizeof(b3[0]), b3 };
+static const struct update_accum a3 = { ARRAY_SIZE(b3), b3 };
 
 static void check_updates(LPCSTR header, const struct update_accum *expected,
  const struct update_accum *got)
index 89d58b7..d6a03c5 100644 (file)
@@ -106,7 +106,7 @@ static void testOIDToAlgID(void)
     alg = CertOIDToAlgId("1.2.3");
     ok(!alg, "Expected failure, got %d\n", alg);
 
-    for (i = 0; i < sizeof(oidToAlgID) / sizeof(oidToAlgID[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(oidToAlgID); i++)
     {
         alg = CertOIDToAlgId(oidToAlgID[i].oid);
         ok(alg == oidToAlgID[i].algID || (oidToAlgID[i].altAlgID && alg == oidToAlgID[i].altAlgID),
@@ -124,7 +124,7 @@ static void testAlgIDToOID(void)
     oid = CertAlgIdToOID(ALG_CLASS_SIGNATURE | ALG_TYPE_ANY | 80);
     ok(!oid && GetLastError() == 0xdeadbeef,
      "Didn't expect last error (%08x) to be set\n", GetLastError());
-    for (i = 0; i < sizeof(algIDToOID) / sizeof(algIDToOID[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(algIDToOID); i++)
     {
         oid = CertAlgIdToOID(algIDToOID[i].algID);
         /* Allow failure, not every version of Windows supports every algo */
@@ -424,7 +424,7 @@ static void test_registerDefaultOIDFunction(void)
         DWORD type, size;
         LPSTR ptr;
 
-        size = sizeof(dllBuf) / sizeof(dllBuf[0]);
+        size = ARRAY_SIZE(dllBuf);
         rc = RegQueryValueExA(key, dllA, NULL, &type, (LPBYTE)dllBuf, &size);
         ok(rc == 0,
          "Expected Dll value to exist, RegQueryValueExA failed: %d\n", rc);
@@ -547,86 +547,63 @@ static void test_findOIDInfo(void)
     static WCHAR sha256ECDSA[] = { 's','h','a','2','5','6','E','C','D','S','A',0 };
     static WCHAR sha1[] = { 's','h','a','1',0 };
     static CHAR oid_rsa_md5[] = szOID_RSA_MD5, oid_sha256[] = szOID_NIST_sha256;
-    static CHAR oid_ecda_sha25[] = szOID_ECDSA_SHA256;
+    static CHAR oid_ecdsa_sha256[] = szOID_ECDSA_SHA256;
     ALG_ID alg = CALG_SHA1;
     ALG_ID algs[2] = { CALG_MD5, CALG_RSA_SIGN };
+    const struct oid_info
+    {
+        DWORD key_type;
+        void *key;
+        const char *oid;
+        ALG_ID algid;
+        ALG_ID broken_algid;
+    } oid_test_info [] =
+    {
+        { CRYPT_OID_INFO_OID_KEY, oid_rsa_md5, szOID_RSA_MD5, CALG_MD5 },
+        { CRYPT_OID_INFO_NAME_KEY, sha1, szOID_OIWSEC_sha1, CALG_SHA1 },
+        { CRYPT_OID_INFO_ALGID_KEY, &alg, szOID_OIWSEC_sha1, CALG_SHA1 },
+        { CRYPT_OID_INFO_SIGN_KEY, algs, szOID_RSA_MD5RSA, CALG_MD5 },
+        { CRYPT_OID_INFO_OID_KEY, oid_sha256, szOID_NIST_sha256, CALG_SHA_256, -1 },
+    };
     PCCRYPT_OID_INFO info;
-
-    static const WCHAR sha256W[] = {'s','h','a','2','5','6',0};
+    int i;
 
     info = CryptFindOIDInfo(0, NULL, 0);
     ok(info == NULL, "Expected NULL\n");
-    info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_rsa_md5, 0);
-    ok(info != NULL, "Expected to find szOID_RSA_MD5\n");
-    if (info)
-    {
-        ok(!strcmp(info->pszOID, szOID_RSA_MD5), "Expected %s, got %s\n",
-         szOID_RSA_MD5, info->pszOID);
-        ok(U(*info).Algid == CALG_MD5, "Expected CALG_MD5, got %d\n",
-           U(*info).Algid);
-    }
-    info = CryptFindOIDInfo(CRYPT_OID_INFO_NAME_KEY, sha1, 0);
-    ok(info != NULL, "Expected to find sha1\n");
-    if (info)
-    {
-        ok(!strcmp(info->pszOID, szOID_OIWSEC_sha1), "Expected %s, got %s\n",
-         szOID_OIWSEC_sha1, info->pszOID);
-        ok(U(*info).Algid == CALG_SHA1, "Expected CALG_SHA1, got %d\n",
-           U(*info).Algid);
-    }
-    info = CryptFindOIDInfo(CRYPT_OID_INFO_ALGID_KEY, &alg, 0);
-    ok(info != NULL, "Expected to find sha1\n");
-    if (info)
-    {
-        ok(!strcmp(info->pszOID, szOID_OIWSEC_sha1), "Expected %s, got %s\n",
-         szOID_OIWSEC_sha1, info->pszOID);
-        ok(U(*info).Algid == CALG_SHA1, "Expected CALG_SHA1, got %d\n",
-           U(*info).Algid);
-    }
-    info = CryptFindOIDInfo(CRYPT_OID_INFO_SIGN_KEY, algs, 0);
-    ok(info != NULL, "Expected to find md5RSA\n");
-    if (info)
-    {
-        ok(!strcmp(info->pszOID, szOID_RSA_MD5RSA), "Expected %s, got %s\n",
-         szOID_RSA_MD5RSA, info->pszOID);
-        ok(U(*info).Algid == CALG_MD5, "Expected CALG_MD5, got %d\n",
-           U(*info).Algid);
-    }
 
-    info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_sha256, 0);
-    ok(info != NULL, "Expected to find szOID_RSA_MD5\n");
-    if (info)
+    for (i = 0; i < ARRAY_SIZE(oid_test_info); i++)
     {
-        ok(!strcmp(info->pszOID, szOID_NIST_sha256), "Expected %s, got %s\n",
-         szOID_NIST_sha256, info->pszOID);
-        ok(!lstrcmpW(info->pwszName, sha256W), "pwszName = %s\n", wine_dbgstr_w(info->pwszName));
-        ok(U(*info).Algid == CALG_SHA_256 || U(*info).Algid == -1,
-           "Expected CALG_MD5 or -1, got %d\n", U(*info).Algid);
+        const struct oid_info *test = &oid_test_info[i];
+
+        info = CryptFindOIDInfo(test->key_type, test->key, 0);
+        ok(info != NULL, "Failed to find %s.\n", test->oid);
+        if (info)
+        {
+            ok(!strcmp(info->pszOID, test->oid), "Unexpected OID %s, expected %s\n", info->pszOID, test->oid);
+            ok(U(*info).Algid == test->algid || broken(U(*info).Algid == test->broken_algid),
+                "Unexpected Algid %d, expected %d\n", U(*info).Algid, test->algid);
+        }
     }
 
-    info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_ecda_sha25, 0);
+    info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_ecdsa_sha256, 0);
     if (info)
     {
         DWORD *data;
 
-        ok(info->cbSize == sizeof(*info),
-           "Expected %d, got %d\n", (int)sizeof(*info), info->cbSize);
-        ok(!strcmp(info->pszOID, oid_ecda_sha25),
-           "Expected %s, got %s\n", oid_ecda_sha25, info->pszOID);
-        ok(!lstrcmpW(info->pwszName, sha256ECDSA),
-           "Expected %s, got %s\n", wine_dbgstr_w(sha256ECDSA), wine_dbgstr_w(info->pwszName));
+        ok(info->cbSize == sizeof(*info), "Unexpected structure size %d.\n", info->cbSize);
+        ok(!strcmp(info->pszOID, oid_ecdsa_sha256), "Expected %s, got %s\n", oid_ecdsa_sha256, info->pszOID);
+        ok(!lstrcmpW(info->pwszName, sha256ECDSA), "Expected %s, got %s\n",
+            wine_dbgstr_w(sha256ECDSA), wine_dbgstr_w(info->pwszName));
         ok(info->dwGroupId == CRYPT_SIGN_ALG_OID_GROUP_ID,
            "Expected CRYPT_SIGN_ALG_OID_GROUP_ID, got %u\n", info->dwGroupId);
         ok(U(*info).Algid == CALG_OID_INFO_CNG_ONLY,
            "Expected CALG_OID_INFO_CNG_ONLY, got %d\n", U(*info).Algid);
 
         data = (DWORD *)info->ExtraInfo.pbData;
-        ok(info->ExtraInfo.cbData == 8,
-           "Expected 8, got %d\n", info->ExtraInfo.cbData);
-        ok(data[0] == CALG_OID_INFO_PARAMETERS,
-           "Expected CALG_OID_INFO_PARAMETERS, got %x\n", data[0]);
+        ok(info->ExtraInfo.cbData == 8, "Expected 8, got %d\n", info->ExtraInfo.cbData);
+        ok(data[0] == CALG_OID_INFO_PARAMETERS, "Expected CALG_OID_INFO_PARAMETERS, got %x\n", data[0]);
         ok(data[1] == CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG,
-           "Expected CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG, got %x\n", data[1]);
+            "Expected CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG, got %x\n", data[1]);
 
         ok(!lstrcmpW(info->pwszCNGAlgid, BCRYPT_SHA256_ALGORITHM), "Expected %s, got %s\n",
            wine_dbgstr_w(BCRYPT_SHA256_ALGORITHM), wine_dbgstr_w(info->pwszCNGAlgid));
index e2ec2f4..d8d6a87 100644 (file)
@@ -187,9 +187,8 @@ static void test_SIPRetrieveSubjectGUID(void)
     ok (ret > 0, "expected GEVA(windir) to succeed, last error %d\n", GetLastError());
     strcat(regeditPath, "\\");
     strcat(regeditPath, regeditExe);
-    MultiByteToWideChar( CP_ACP, 0, regeditPath,
-                         strlen(regeditPath)+1, regeditPathW,
-                         sizeof(regeditPathW)/sizeof(regeditPathW[0]) );
+    MultiByteToWideChar(CP_ACP, 0, regeditPath, strlen(regeditPath)+1, regeditPathW,
+                        ARRAY_SIZE(regeditPathW));
 
     SetLastError(0xdeadbeef);
     memset(&subject, 1, sizeof(GUID));
@@ -221,9 +220,7 @@ static void test_SIPRetrieveSubjectGUID(void)
     /* Now with an empty file */
     GetTempPathA(sizeof(path), path);
     GetTempFileNameA(path, "sip", 0 , tempfile);
-    MultiByteToWideChar( CP_ACP, 0, tempfile,
-                         strlen(tempfile)+1, tempfileW,
-                         sizeof(tempfileW)/sizeof(tempfileW[0]) );
+    MultiByteToWideChar(CP_ACP, 0, tempfile, strlen(tempfile)+1, tempfileW, ARRAY_SIZE(tempfileW));
 
     SetLastError(0xdeadbeef);
     memset(&subject, 1, sizeof(GUID));
index 47cd0b3..9915482 100644 (file)
@@ -385,7 +385,7 @@ static void testRegStoreSavedCerts(void)
     BOOL ret;
     DWORD res,i;
 
-    for (i = 0; i < sizeof(reg_store_saved_certs) / sizeof(reg_store_saved_certs[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(reg_store_saved_certs); i++)
     {
         DWORD err;
 
@@ -2081,7 +2081,7 @@ static void testCertRegisterSystemStore(void)
     const CERT_CONTEXT *cert, *cert2;
     unsigned int i;
 
-    for (i = 0; i < sizeof(reg_system_store_test_data) / sizeof(reg_system_store_test_data[0]); i++) {
+    for (i = 0; i < ARRAY_SIZE(reg_system_store_test_data); i++) {
         cur_flag = reg_system_store_test_data[i].cert_store;
         ret = CertRegisterSystemStore(WineTestW, cur_flag, NULL, NULL);
         if (!ret)
@@ -2469,7 +2469,7 @@ static void delete_test_key(void)
     RegQueryInfoKeyW(test_key, NULL, NULL, NULL, &num_subkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
     for (idx = num_subkeys; idx-- > 0;)
     {
-        subkey_name_len = sizeof(subkey_name)/sizeof(WCHAR);
+        subkey_name_len = ARRAY_SIZE(subkey_name);
         RegEnumKeyExW(test_key, idx, subkey_name, &subkey_name_len, NULL, NULL, NULL, NULL);
         RegDeleteKeyW(test_key, subkey_name);
     }
index 5245885..d382c0e 100644 (file)
@@ -250,7 +250,7 @@ static void test_CertRDNValueToStrA(void)
     ok(ret == 1 && GetLastError() == 0xdeadbeef, "Expected empty string\n");
     ok(!buffer[0], "Expected empty string\n");
 
-    for (i = 0; i < sizeof(attrs) / sizeof(attrs[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(attrs); i++)
     {
         ret = pCertRDNValueToStrA(attrs[i].dwValueType, &attrs[i].Value,
          buffer, sizeof(buffer));
@@ -341,15 +341,13 @@ static void test_CertRDNValueToStrW(void)
     SetLastError(0xdeadbeef);
     ret = pCertRDNValueToStrW(0, &blob, NULL, 0);
     ok(ret == 1 && GetLastError() == 0xdeadbeef, "Expected empty string\n");
-    ret = pCertRDNValueToStrW(0, &blob, buffer,
-     sizeof(buffer) / sizeof(buffer[0]));
+    ret = pCertRDNValueToStrW(0, &blob, buffer, ARRAY_SIZE(buffer));
     ok(ret == 1 && GetLastError() == 0xdeadbeef, "Expected empty string\n");
     ok(!buffer[0], "Expected empty string\n");
 
-    for (i = 0; i < sizeof(attrs) / sizeof(attrs[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(attrs); i++)
     {
-        ret = pCertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value,
-         buffer, sizeof(buffer) / sizeof(buffer[0]));
+        ret = pCertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value, buffer, ARRAY_SIZE(buffer));
         todo_wine_if (attrs[i].todo)
         {
             ok(ret == lstrlenW(attrs[i].str) + 1,
@@ -550,8 +548,7 @@ static void test_NameToStrConversionW(PCERT_NAME_BLOB pName, DWORD dwStrType,
     todo_wine_if (todo)
         ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n",
          lstrlenW(expected) + 1, i);
-    i = pCertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, buffer,
-     sizeof(buffer) / sizeof(buffer[0]));
+    i = pCertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, buffer, ARRAY_SIZE(buffer));
     todo_wine_if (todo)
         ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n",
          lstrlenW(expected) + 1, i);
@@ -795,7 +792,7 @@ static void test_CertStrToNameA(void)
                           &size, NULL);
     ok(!ret && GetLastError() == ERROR_MORE_DATA,
                  "Expected ERROR_MORE_DATA, got %08x\n", GetLastError());
-    for (i = 0; i < sizeof(namesA) / sizeof(namesA[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(namesA); i++)
     {
         size = sizeof(buf);
         ret = pCertStrToNameA(X509_ASN_ENCODING, namesA[i].x500, 0, NULL, buf,
@@ -889,7 +886,7 @@ static void test_CertStrToNameW(void)
     ok(!ret && GetLastError() == CRYPT_E_INVALID_X500_STRING,
      "Expected CRYPT_E_INVALID_X500_STRING, got %08x\n", GetLastError());
     ok(errorPtr && *errorPtr == '1', "Expected first error character was 1\n");
-    for (i = 0; i < sizeof(namesW) / sizeof(namesW[0]); i++)
+    for (i = 0; i < ARRAY_SIZE(namesW); i++)
     {
         size = sizeof(buf);
         ret = pCertStrToNameW(X509_ASN_ENCODING, namesW[i].x500, 0, NULL, buf,