From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/wintrust/tests/asn.c | 148 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+)
diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index f5eb77d4d95..ee70cbabf3b 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -527,6 +527,153 @@ static void test_decodeSPCPEImage(void) } }
+static const BYTE emptyIndirectData[] = { + 0x30,0x0c,0x30,0x02,0x06,0x00,0x30,0x06,0x30,0x02,0x06,0x00,0x04,0x00 }; +static const BYTE spcidcWithOnlyDigest[] = { + 0x30,0x20,0x30,0x02,0x06,0x00,0x30,0x1a,0x30,0x02,0x06,0x00,0x04,0x14,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12, + 0x13,0x14 }; +static const BYTE spcidcWithDigestAndAlgorithm[] = { + 0x30,0x27,0x30,0x02,0x06,0x00,0x30,0x21,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02, + 0x1a,0x05,0x00,0x04,0x14,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b, + 0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14 }; +static const BYTE spcidcWithDigestAndAlgorithmParams[] = { + 0x30,0x29,0x30,0x02,0x06,0x00,0x30,0x23,0x30,0x0b,0x06,0x05,0x2b,0x0e,0x03,0x02, + 0x1a,0x74,0x65,0x73,0x74,0x04,0x14,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, + 0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14 }; +static const BYTE spcidcWithEverythingExceptDataValue[] = { + 0x30,0x33,0x30,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0f, + 0x30,0x23,0x30,0x0b,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x74,0x65,0x73,0x74,0x04, + 0x14,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, + 0x10,0x11,0x12,0x13,0x14 }; +static const BYTE spcidcWithEverything[] = { + 0x30,0x35,0x30,0x0e,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0f, + 0x30,0x00,0x30,0x23,0x30,0x0b,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x74,0x65,0x73, + 0x74,0x04,0x14,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d, + 0x0e,0x0f,0x10,0x11,0x12,0x13,0x14 }; + +static void test_encodeSPCIndirectDataContent(void) +{ + static char SPC_PE_IMAGE_DATA_OBJID_[] = SPC_PE_IMAGE_DATA_OBJID; + static char szOID_OIWSEC_sha1_[] = szOID_OIWSEC_sha1; + + static BYTE fakeDigest[] = { + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, + 0x11,0x12,0x13,0x14 }; + static BYTE parameters[] = { 't','e','s','t' }; + + SPC_INDIRECT_DATA_CONTENT indirectData = { { 0 } }; + DWORD size = 0; + LPBYTE buf; + BOOL ret; + + if (!pCryptEncodeObjectEx) + { + win_skip("CryptEncodeObjectEx() is not available. Skipping the encodeSPCIndirectDataContent tests\n"); + return; + } + + ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + todo_wine + ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + todo_wine + ok(size == sizeof(emptyIndirectData), "Unexpected size %ld\n", size); + if (size == sizeof(emptyIndirectData)) + todo_wine + ok(!memcmp(buf, emptyIndirectData, sizeof(emptyIndirectData)), + "Unexpected value\n"); + LocalFree(buf); + } + /* With only digest */ + indirectData.Digest.cbData = sizeof(fakeDigest); + indirectData.Digest.pbData = fakeDigest; + ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + todo_wine + ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + todo_wine + ok(size == sizeof(spcidcWithOnlyDigest), "Unexpected size %ld\n", size); + if (size == sizeof(spcidcWithOnlyDigest)) + todo_wine + ok(!memcmp(buf, spcidcWithOnlyDigest, sizeof(spcidcWithOnlyDigest)), + "Unexpected value\n"); + LocalFree(buf); + } + /* With digest and digest algorithm */ + indirectData.DigestAlgorithm.pszObjId = szOID_OIWSEC_sha1_; + ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + todo_wine + ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + todo_wine + ok(size == sizeof(spcidcWithDigestAndAlgorithm), "Unexpected size %ld\n", + size); + if (size == sizeof(spcidcWithDigestAndAlgorithm)) + ok(!memcmp(buf, spcidcWithDigestAndAlgorithm, + sizeof(spcidcWithDigestAndAlgorithm)), + "Unexpected value\n"); + LocalFree(buf); + } + /* With digest algorithm parameters */ + indirectData.DigestAlgorithm.Parameters.cbData = sizeof(parameters); + indirectData.DigestAlgorithm.Parameters.pbData = parameters; + ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + todo_wine + ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + todo_wine + ok(size == sizeof(spcidcWithDigestAndAlgorithmParams), + "Unexpected size %ld\n", size); + if (size == sizeof(spcidcWithDigestAndAlgorithmParams)) + ok(!memcmp(buf, spcidcWithDigestAndAlgorithmParams, + sizeof(spcidcWithDigestAndAlgorithmParams)), + "Unexpected value\n"); + LocalFree(buf); + } + /* With everything except Data.Value */ + indirectData.Data.pszObjId = SPC_PE_IMAGE_DATA_OBJID_; + ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + todo_wine + ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + todo_wine + ok(size == sizeof(spcidcWithEverythingExceptDataValue), + "Unexpected size %ld\n", size); + if (size == sizeof(spcidcWithEverythingExceptDataValue)) + ok(!memcmp(buf, spcidcWithEverythingExceptDataValue, + sizeof(spcidcWithEverythingExceptDataValue)), + "Unexpected value\n"); + LocalFree(buf); + } + /* With everything */ + indirectData.Data.Value.cbData = sizeof(emptySequence); + indirectData.Data.Value.pbData = (void*)emptySequence; + ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); + todo_wine + ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + todo_wine + ok(size == sizeof(spcidcWithEverything), "Unexpected size %ld\n", size); + if (size == sizeof(spcidcWithEverything)) + ok(!memcmp(buf, spcidcWithEverything, sizeof(spcidcWithEverything)), + "Unexpected value\n"); + LocalFree(buf); + } +} + static WCHAR foo[] = { 'f','o','o',0 }; static WCHAR guidStr[] = { '{','8','b','c','9','6','b','0','0','-', '8','d','a','1','-','1','1','c','f','-','8','7','3','6','-','0','0', @@ -948,6 +1095,7 @@ START_TEST(asn) test_decodeSPCLink(); test_encodeSPCPEImage(); test_decodeSPCPEImage(); + test_encodeSPCIndirectDataContent(); test_encodeCatMemberInfo(); test_decodeCatMemberInfo(); test_encodeCatNameValue();
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/wintrust/tests/asn.c | 119 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 5 deletions(-)
diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index ee70cbabf3b..88778e990f1 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -552,16 +552,16 @@ static const BYTE spcidcWithEverything[] = { 0x74,0x04,0x14,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d, 0x0e,0x0f,0x10,0x11,0x12,0x13,0x14 };
+static BYTE fakeDigest[] = { + 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, + 0x11,0x12,0x13,0x14 }; +static BYTE parameters[] = { 't','e','s','t' }; + static void test_encodeSPCIndirectDataContent(void) { static char SPC_PE_IMAGE_DATA_OBJID_[] = SPC_PE_IMAGE_DATA_OBJID; static char szOID_OIWSEC_sha1_[] = szOID_OIWSEC_sha1;
- static BYTE fakeDigest[] = { - 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, - 0x11,0x12,0x13,0x14 }; - static BYTE parameters[] = { 't','e','s','t' }; - SPC_INDIRECT_DATA_CONTENT indirectData = { { 0 } }; DWORD size = 0; LPBYTE buf; @@ -674,6 +674,114 @@ static void test_encodeSPCIndirectDataContent(void) } }
+static void test_decodeSPCIndirectDataContent(void) +{ + static const BYTE asn1Null[] = { 0x05,0x00 }; + + BOOL ret; + LPBYTE buf = NULL; + DWORD size = 0; + SPC_INDIRECT_DATA_CONTENT *indirectData; + + if (!pCryptDecodeObjectEx) + { + win_skip("CryptDecodeObjectEx() is not available. Skipping the decodeSPCIndirectDataContent tests\n"); + return; + } + + ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + emptyIndirectData, sizeof(emptyIndirectData), + CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + indirectData = (SPC_INDIRECT_DATA_CONTENT *)buf; + todo_wine + ok(indirectData->Data.pszObjId != NULL, "Expected non-NULL data objid\n"); + if (indirectData->Data.pszObjId) + ok(!strcmp(indirectData->Data.pszObjId, ""), + "Expected empty data objid\n"); + ok(indirectData->Data.Value.cbData == 0, "Expected no data value\n"); + todo_wine + ok(indirectData->DigestAlgorithm.pszObjId != NULL, + "Expected non-NULL digest algorithm objid\n"); + if (indirectData->DigestAlgorithm.pszObjId) + ok(!strcmp(indirectData->DigestAlgorithm.pszObjId, ""), + "Expected empty digest algorithm objid\n"); + ok(indirectData->DigestAlgorithm.Parameters.cbData == 0, + "Expected no digest algorithm parameters\n"); + ok(indirectData->Digest.cbData == 0, "Expected no digest\n"); + LocalFree(buf); + } + ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + spcidcWithOnlyDigest, sizeof(spcidcWithOnlyDigest), + CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + indirectData = (SPC_INDIRECT_DATA_CONTENT *)buf; + ok(indirectData->Digest.cbData == sizeof(fakeDigest), + "Unexpected digest size %ld\n", indirectData->Digest.cbData); + if (indirectData->Digest.cbData == sizeof(fakeDigest)) + ok(!memcmp(indirectData->Digest.pbData, fakeDigest, + sizeof(fakeDigest)), + "Unexpected flags\n"); + LocalFree(buf); + } + ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + spcidcWithDigestAndAlgorithm, sizeof(spcidcWithDigestAndAlgorithm), + CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); + if (ret) + { + indirectData = (SPC_INDIRECT_DATA_CONTENT *)buf; + ok(indirectData->DigestAlgorithm.pszObjId != NULL, + "Expected non-NULL digest algorithm objid\n"); + if (indirectData->DigestAlgorithm.pszObjId) + ok(!strcmp(indirectData->DigestAlgorithm.pszObjId, szOID_OIWSEC_sha1), + "Expected szOID_OIWSEC_sha1, got "%s"\n", + indirectData->DigestAlgorithm.pszObjId); + ok(indirectData->DigestAlgorithm.Parameters.cbData == sizeof(asn1Null), + "Unexpected digest algorithm parameters size %ld\n", + indirectData->DigestAlgorithm.Parameters.cbData); + if (indirectData->DigestAlgorithm.Parameters.cbData == sizeof(asn1Null)) + ok(!memcmp(indirectData->DigestAlgorithm.Parameters.pbData, + asn1Null, sizeof(asn1Null)), + "Unexpected digest algorithm parameters\n"); + ok(indirectData->Digest.cbData == sizeof(fakeDigest), + "Unexpected digest size %ld\n", indirectData->Digest.cbData); + if (indirectData->Digest.cbData == sizeof(fakeDigest)) + ok(!memcmp(indirectData->Digest.pbData, fakeDigest, + sizeof(fakeDigest)), + "Unexpected flags\n"); + LocalFree(buf); + } + ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + spcidcWithDigestAndAlgorithmParams, sizeof(spcidcWithDigestAndAlgorithmParams), + CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); + /* what? */ + ok(!ret && GetLastError () == CRYPT_E_ASN1_EOD, + "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError()); + if (ret) + LocalFree(buf); + ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + spcidcWithEverythingExceptDataValue, sizeof(spcidcWithEverythingExceptDataValue), + CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); + /* huh??? */ + ok(!ret && GetLastError () == CRYPT_E_ASN1_EOD, + "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError()); + if (ret) + LocalFree(buf); + ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, + spcidcWithEverything, sizeof(spcidcWithEverything), + CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); + /* ?????? */ + ok(!ret && GetLastError () == CRYPT_E_ASN1_EOD, + "Expected CRYPT_E_ASN1_EOD, got %08lx\n", GetLastError()); + if (ret) + LocalFree(buf); +} + static WCHAR foo[] = { 'f','o','o',0 }; static WCHAR guidStr[] = { '{','8','b','c','9','6','b','0','0','-', '8','d','a','1','-','1','1','c','f','-','8','7','3','6','-','0','0', @@ -1096,6 +1204,7 @@ START_TEST(asn) test_encodeSPCPEImage(); test_decodeSPCPEImage(); test_encodeSPCIndirectDataContent(); + test_decodeSPCIndirectDataContent(); test_encodeCatMemberInfo(); test_decodeCatMemberInfo(); test_encodeCatNameValue();
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/wintrust/asn.c | 2 +- dlls/wintrust/tests/asn.c | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index 27a77629b11..7846ccb5e2e 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -681,7 +681,7 @@ static BOOL WINAPI CRYPT_AsnEncodeAttributeTypeValue(DWORD dwCertEncodingType, { const CRYPT_ATTRIBUTE_TYPE_VALUE *typeValue = pvStructInfo; struct AsnEncodeSequenceItem items[] = { - { &typeValue->pszObjId, CRYPT_AsnEncodeOid, 0 }, + { typeValue->pszObjId, CRYPT_AsnEncodeOid, 0 }, { &typeValue->Value, CRYPT_CopyEncodedBlob, 0 }, };
diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index 88778e990f1..09a00ea393a 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -575,11 +575,9 @@ static void test_encodeSPCIndirectDataContent(void)
ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(emptyIndirectData), "Unexpected size %ld\n", size); if (size == sizeof(emptyIndirectData)) todo_wine @@ -592,11 +590,9 @@ static void test_encodeSPCIndirectDataContent(void) indirectData.Digest.pbData = fakeDigest; ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(spcidcWithOnlyDigest), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithOnlyDigest)) todo_wine @@ -608,7 +604,6 @@ static void test_encodeSPCIndirectDataContent(void) indirectData.DigestAlgorithm.pszObjId = szOID_OIWSEC_sha1_; ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { @@ -626,7 +621,6 @@ static void test_encodeSPCIndirectDataContent(void) indirectData.DigestAlgorithm.Parameters.pbData = parameters; ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { @@ -643,7 +637,6 @@ static void test_encodeSPCIndirectDataContent(void) indirectData.Data.pszObjId = SPC_PE_IMAGE_DATA_OBJID_; ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { @@ -661,7 +654,6 @@ static void test_encodeSPCIndirectDataContent(void) indirectData.Data.Value.pbData = (void*)emptySequence; ret = pCryptEncodeObjectEx(X509_ASN_ENCODING, SPC_INDIRECT_DATA_CONTENT_STRUCT, &indirectData, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - todo_wine ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) {
From: Torge Matthies openglfreak@googlemail.com
Instead of raw data. See SpcIndirectDataContent specification.
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/wintrust/asn.c | 2 +- dlls/wintrust/tests/asn.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index 7846ccb5e2e..71a2025c461 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -702,7 +702,7 @@ static BOOL WINAPI CRYPT_AsnEncodeSPCDigest(DWORD dwCertEncodingType, const struct SPCDigest *digest = pvStructInfo; struct AsnEncodeSequenceItem items[] = { { &digest->DigestAlgorithm, CRYPT_AsnEncodeAlgorithmIdWithNullParams, 0 }, - { &digest->Digest, CRYPT_CopyEncodedBlob, 0 }, + { &digest->Digest, CRYPT_AsnEncodeOctets, 0 }, };
return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, ARRAY_SIZE(items), diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index 09a00ea393a..fa0716a2d4d 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -578,6 +578,7 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { + todo_wine ok(size == sizeof(emptyIndirectData), "Unexpected size %ld\n", size); if (size == sizeof(emptyIndirectData)) todo_wine @@ -593,6 +594,7 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { + todo_wine ok(size == sizeof(spcidcWithOnlyDigest), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithOnlyDigest)) todo_wine @@ -607,7 +609,6 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(spcidcWithDigestAndAlgorithm), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithDigestAndAlgorithm)) @@ -624,7 +625,6 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(spcidcWithDigestAndAlgorithmParams), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithDigestAndAlgorithmParams)) @@ -640,7 +640,6 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(spcidcWithEverythingExceptDataValue), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithEverythingExceptDataValue)) @@ -657,7 +656,6 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(spcidcWithEverything), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithEverything)) ok(!memcmp(buf, spcidcWithEverything, sizeof(spcidcWithEverything)),
From: Torge Matthies openglfreak@googlemail.com
The only user of this function is CRYPT_AsnEncodeSPCDigest, whose only user is WVTAsn1SpcIndirectDataContentEncode, so this behavior might be specific to that function.
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/wintrust/asn.c | 8 ++++++-- dlls/wintrust/tests/asn.c | 4 ---- 2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index 71a2025c461..87deff72245 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -652,6 +652,7 @@ static BOOL WINAPI CRYPT_CopyEncodedBlob(DWORD dwCertEncodingType, return ret; }
+/* Different from the one in crypt32 */ static BOOL WINAPI CRYPT_AsnEncodeAlgorithmIdWithNullParams( DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded) @@ -665,12 +666,15 @@ static BOOL WINAPI CRYPT_AsnEncodeAlgorithmIdWithNullParams( { algo->pszObjId, CRYPT_AsnEncodeOid, 0 }, { NULL, CRYPT_CopyEncodedBlob, 0 }, }; + DWORD cItem = 2;
if (algo->Parameters.cbData) items[1].pvStructInfo = &algo->Parameters; - else + else if (algo->pszObjId) items[1].pvStructInfo = &nullBlob; - ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, ARRAY_SIZE(items), + else + cItem -= 1; + ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, cItem, pbEncoded, pcbEncoded); return ret; } diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index fa0716a2d4d..deaaf40e64b 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -578,10 +578,8 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(emptyIndirectData), "Unexpected size %ld\n", size); if (size == sizeof(emptyIndirectData)) - todo_wine ok(!memcmp(buf, emptyIndirectData, sizeof(emptyIndirectData)), "Unexpected value\n"); LocalFree(buf); @@ -594,10 +592,8 @@ static void test_encodeSPCIndirectDataContent(void) ok(ret, "CryptEncodeObjectEx failed: %08lx\n", GetLastError()); if (ret) { - todo_wine ok(size == sizeof(spcidcWithOnlyDigest), "Unexpected size %ld\n", size); if (size == sizeof(spcidcWithOnlyDigest)) - todo_wine ok(!memcmp(buf, spcidcWithOnlyDigest, sizeof(spcidcWithOnlyDigest)), "Unexpected value\n"); LocalFree(buf);
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/wintrust/asn.c | 9 +++++---- dlls/wintrust/tests/asn.c | 2 -- 2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/dlls/wintrust/asn.c b/dlls/wintrust/asn.c index 87deff72245..f6c4086b508 100644 --- a/dlls/wintrust/asn.c +++ b/dlls/wintrust/asn.c @@ -1878,6 +1878,8 @@ static BOOL WINAPI CRYPT_AsnDecodeOidIgnoreTag(DWORD dwCertEncodingType, } } } + else + bytesNeeded += 1; if (!pvStructInfo) *pcbStructInfo = bytesNeeded; else if (*pcbStructInfo < bytesNeeded) @@ -1888,12 +1890,13 @@ static BOOL WINAPI CRYPT_AsnDecodeOidIgnoreTag(DWORD dwCertEncodingType, } else { + LPSTR pszObjId = *(LPSTR *)pvStructInfo; + + *pszObjId = 0; if (dataLen) { const BYTE *ptr; - LPSTR pszObjId = *(LPSTR *)pvStructInfo;
- *pszObjId = 0; pszObjId += sprintf(pszObjId, "%d.%d", pbEncoded[1 + lenBytes] / 40, pbEncoded[1 + lenBytes] - (pbEncoded[1 + lenBytes] / 40) * 40); @@ -1914,8 +1917,6 @@ static BOOL WINAPI CRYPT_AsnDecodeOidIgnoreTag(DWORD dwCertEncodingType, pszObjId += sprintf(pszObjId, ".%d", val); } } - else - *(LPSTR *)pvStructInfo = NULL; *pcbStructInfo = bytesNeeded; } } diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index deaaf40e64b..5f75ec3298e 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -682,13 +682,11 @@ static void test_decodeSPCIndirectDataContent(void) if (ret) { indirectData = (SPC_INDIRECT_DATA_CONTENT *)buf; - todo_wine ok(indirectData->Data.pszObjId != NULL, "Expected non-NULL data objid\n"); if (indirectData->Data.pszObjId) ok(!strcmp(indirectData->Data.pszObjId, ""), "Expected empty data objid\n"); ok(indirectData->Data.Value.cbData == 0, "Expected no data value\n"); - todo_wine ok(indirectData->DigestAlgorithm.pszObjId != NULL, "Expected non-NULL digest algorithm objid\n"); if (indirectData->DigestAlgorithm.pszObjId)