Juan Lang : crypt32: Add tests for encoding/ decoding PKCS_SMIME_CAPABILITIES. With help from Huw Davies.

Alexandre Julliard julliard at winehq.org
Thu Aug 21 10:02:14 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Wed Aug 20 12:10:57 2008 -0700

crypt32: Add tests for encoding/decoding PKCS_SMIME_CAPABILITIES. With help from Huw Davies.

---

 dlls/crypt32/tests/encode.c |  166 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 166 insertions(+), 0 deletions(-)

diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
index 28542aa..efb72f3 100644
--- a/dlls/crypt32/tests/encode.c
+++ b/dlls/crypt32/tests/encode.c
@@ -5160,6 +5160,170 @@ static void test_decodePKCSAttributes(DWORD dwEncoding)
     }
 }
 
+static const BYTE singleCapability[] = {
+0x30,0x06,0x30,0x04,0x06,0x02,0x2d,0x06 };
+static const BYTE twoCapabilities[] = {
+0x30,0x0c,0x30,0x04,0x06,0x02,0x2d,0x06,0x30,0x04,0x06,0x02,0x2a,0x03 };
+static const BYTE singleCapabilitywithNULL[] = {
+0x30,0x08,0x30,0x06,0x06,0x02,0x2d,0x06,0x05,0x00 };
+
+static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding)
+{
+    static char oid1[] = "1.5.6", oid2[] = "1.2.3";
+    BOOL ret;
+    LPBYTE buf = NULL;
+    DWORD size = 0;
+    CRYPT_SMIME_CAPABILITY capability[2];
+    CRYPT_SMIME_CAPABILITIES capabilities;
+
+    /* An empty capabilities is allowed */
+    capabilities.cCapability = 0;
+    ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (buf)
+    {
+        ok(size == sizeof(emptySequence), "unexpected size %d\n", size);
+        ok(!memcmp(buf, emptySequence, size), "unexpected value\n");
+        LocalFree(buf);
+    }
+    /* A non-empty capabilities with an empty capability (lacking an OID) is
+     * not allowed
+     */
+    capability[0].pszObjId = NULL;
+    capability[0].Parameters.cbData = 0;
+    capabilities.cCapability = 1;
+    capabilities.rgCapability = capability;
+    SetLastError(0xdeadbeef);
+    ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size);
+    todo_wine
+    ok(!ret && GetLastError() == E_INVALIDARG,
+     "expected E_INVALIDARG, got %08x\n", GetLastError());
+    capability[0].pszObjId = oid1;
+    ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (buf)
+    {
+        ok(size == sizeof(singleCapability), "unexpected size %d\n", size);
+        ok(!memcmp(buf, singleCapability, size), "unexpected value\n");
+        LocalFree(buf);
+    }
+    capability[1].pszObjId = oid2;
+    capability[1].Parameters.cbData = 0;
+    capabilities.cCapability = 2;
+    ret = CryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size);
+    todo_wine
+    ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError());
+    if (buf)
+    {
+        ok(size == sizeof(twoCapabilities), "unexpected size %d\n", size);
+        ok(!memcmp(buf, twoCapabilities, size), "unexpected value\n");
+        LocalFree(buf);
+    }
+}
+
+static void compareSMimeCapabilities(LPCSTR header,
+ const CRYPT_SMIME_CAPABILITIES *expected, const CRYPT_SMIME_CAPABILITIES *got)
+{
+    DWORD i;
+
+    ok(got->cCapability == expected->cCapability,
+     "%s: expected %d capabilities, got %d\n", header, expected->cCapability,
+     got->cCapability);
+    for (i = 0; i < expected->cCapability; i++)
+    {
+        ok(!strcmp(expected->rgCapability[i].pszObjId,
+         got->rgCapability[i].pszObjId), "%s[%d]: expected %s, got %s\n",
+         header, i, expected->rgCapability[i].pszObjId,
+         got->rgCapability[i].pszObjId);
+        ok(expected->rgCapability[i].Parameters.cbData ==
+         got->rgCapability[i].Parameters.cbData,
+         "%s[%d]: expected %d bytes, got %d\n", header, i,
+         expected->rgCapability[i].Parameters.cbData,
+         got->rgCapability[i].Parameters.cbData);
+        if (expected->rgCapability[i].Parameters.cbData)
+            ok(!memcmp(expected->rgCapability[i].Parameters.pbData,
+             got->rgCapability[i].Parameters.pbData,
+             expected->rgCapability[i].Parameters.cbData),
+             "%s[%d]: unexpected value\n", header, i);
+    }
+}
+
+static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding)
+{
+    static char oid1[] = "1.5.6", oid2[] = "1.2.3";
+    BOOL ret;
+    DWORD size = 0;
+    CRYPT_SMIME_CAPABILITY capability[2];
+    CRYPT_SMIME_CAPABILITIES capabilities, *ptr;
+
+    SetLastError(0xdeadbeef);
+    ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     emptySequence, sizeof(emptySequence),
+     CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&ptr, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        capabilities.cCapability = 0;
+        compareSMimeCapabilities("empty capabilities", &capabilities, ptr);
+        LocalFree(ptr);
+    }
+    SetLastError(0xdeadbeef);
+    ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     singleCapability, sizeof(singleCapability), CRYPT_DECODE_ALLOC_FLAG, NULL,
+     (BYTE *)&ptr, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        capability[0].pszObjId = oid1;
+        capability[0].Parameters.cbData = 0;
+        capabilities.cCapability = 1;
+        capabilities.rgCapability = capability;
+        compareSMimeCapabilities("single capability", &capabilities, ptr);
+        LocalFree(ptr);
+    }
+    SetLastError(0xdeadbeef);
+    ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+     singleCapabilitywithNULL, sizeof(singleCapabilitywithNULL),
+     CRYPT_DECODE_ALLOC_FLAG, NULL, (BYTE *)&ptr, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        BYTE NULLparam[] = {0x05, 0x00};
+        capability[0].pszObjId = oid1;
+        capability[0].Parameters.cbData = 2;
+        capability[0].Parameters.pbData = NULLparam;
+        capabilities.cCapability = 1;
+        capabilities.rgCapability = capability;
+        compareSMimeCapabilities("single capability with NULL", &capabilities,
+         ptr);
+        LocalFree(ptr);
+    }
+    SetLastError(0xdeadbeef);
+    ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES,
+    twoCapabilities, sizeof(twoCapabilities), CRYPT_DECODE_ALLOC_FLAG, NULL,
+    (BYTE *)&ptr, &size);
+    todo_wine
+    ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError());
+    if (ret)
+    {
+        capability[0].Parameters.cbData = 0;
+        capability[1].pszObjId = oid2;
+        capability[1].Parameters.cbData = 0;
+        capabilities.cCapability = 2;
+        compareSMimeCapabilities("two capabilities", &capabilities, ptr);
+        LocalFree(ptr);
+    }
+}
+
 static BYTE encodedCommonNameNoNull[] = { 0x30,0x14,0x31,0x12,0x30,0x10,
  0x06,0x03,0x55,0x04,0x03,0x13,0x09,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,
  0x67 };
@@ -6283,6 +6447,8 @@ START_TEST(encode)
         test_decodePKCSAttribute(encodings[i]);
         test_encodePKCSAttributes(encodings[i]);
         test_decodePKCSAttributes(encodings[i]);
+        test_encodePKCSSMimeCapabilities(encodings[i]);
+        test_decodePKCSSMimeCapabilities(encodings[i]);
         test_encodePKCSSignerInfo(encodings[i]);
         test_decodePKCSSignerInfo(encodings[i]);
         test_encodeCMSSignerInfo(encodings[i]);




More information about the wine-cvs mailing list