You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
23fd2d0f93 | ||
|
f61b8570b8 | ||
|
738fd3fd35 | ||
|
8ed2ef6f5c | ||
|
686ab91ec6 | ||
|
d53fc8ece0 | ||
|
a505e3815f | ||
|
51b6a46ce0 | ||
|
729a9ebadd | ||
|
4e57013325 | ||
|
19db07f062 | ||
|
74b35082b3 | ||
|
24f0fcf07d | ||
|
59948639b6 | ||
|
2bf4df0d11 | ||
|
ba6b6642fb | ||
|
da5cec25df | ||
|
5e51e13900 | ||
|
82eedec6ed | ||
|
7c9f9bc0c1 | ||
|
c3a5e9290e | ||
|
01a9cda461 | ||
|
7d7e852679 | ||
|
78878ee3b9 | ||
|
b27ebc675a | ||
|
6499b77447 | ||
|
c9eaabbba9 | ||
|
ae4862e0fb | ||
|
a755842e30 | ||
|
3168a74745 | ||
|
91b1d2470a | ||
|
03cdc2f2c8 | ||
|
12fb928da8 |
@@ -1,7 +1,8 @@
|
||||
From 59f0bb786dc3ec4e77cb43ea4410743ecd317bbf Mon Sep 17 00:00:00 2001
|
||||
From 42dbdf9479e2e09734fa183b854d5ddfe987f203 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Tue, 22 Mar 2016 23:08:30 +0100
|
||||
Subject: include: Check element type in CONTAINING_RECORD and similar macros.
|
||||
Subject: [PATCH] include: Check element type in CONTAINING_RECORD and
|
||||
similar macros.
|
||||
|
||||
---
|
||||
include/wine/list.h | 10 ++++++++--
|
||||
@@ -30,10 +31,10 @@ index b4d681f..287ad39 100644
|
||||
|
||||
#endif /* __WINE_SERVER_LIST_H */
|
||||
diff --git a/include/wine/rbtree.h b/include/wine/rbtree.h
|
||||
index 13452d9..554d239 100644
|
||||
index dc50b5e..8130deb 100644
|
||||
--- a/include/wine/rbtree.h
|
||||
+++ b/include/wine/rbtree.h
|
||||
@@ -22,8 +22,14 @@
|
||||
@@ -23,8 +23,14 @@
|
||||
#ifndef __WINE_WINE_RBTREE_H
|
||||
#define __WINE_WINE_RBTREE_H
|
||||
|
||||
@@ -51,10 +52,10 @@ index 13452d9..554d239 100644
|
||||
struct wine_rb_entry
|
||||
{
|
||||
diff --git a/include/winnt.h b/include/winnt.h
|
||||
index 559a719..4a711f4 100644
|
||||
index 7f822c4..ccfe73b 100644
|
||||
--- a/include/winnt.h
|
||||
+++ b/include/winnt.h
|
||||
@@ -753,8 +753,14 @@ typedef struct _MEMORY_BASIC_INFORMATION
|
||||
@@ -756,8 +756,14 @@ typedef struct _MEMORY_BASIC_INFORMATION
|
||||
|
||||
#define FIELD_OFFSET(type, field) ((LONG)offsetof(type, field))
|
||||
|
||||
@@ -69,8 +70,8 @@ index 559a719..4a711f4 100644
|
||||
+ ((type *)((PCHAR)(address) - offsetof(type, field)))
|
||||
+#endif
|
||||
|
||||
/* Types */
|
||||
|
||||
#ifdef __WINESRC__
|
||||
# define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
--
|
||||
2.7.1
|
||||
1.9.1
|
||||
|
||||
|
@@ -1,29 +0,0 @@
|
||||
From 6f561502fe458837f3a5b27f477b1a52f33d88ba Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Andr=C3=A9=20Hentschel?= <nerv@dawncrow.de>
|
||||
Date: Mon, 16 Nov 2015 22:36:40 +0100
|
||||
Subject: sfnt2fon: Don't leak output name if specified multiple times
|
||||
(Coverity)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: André Hentschel <nerv@dawncrow.de>
|
||||
---
|
||||
tools/sfnt2fon/sfnt2fon.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/tools/sfnt2fon/sfnt2fon.c b/tools/sfnt2fon/sfnt2fon.c
|
||||
index 7612bc2..f825ae4 100644
|
||||
--- a/tools/sfnt2fon/sfnt2fon.c
|
||||
+++ b/tools/sfnt2fon/sfnt2fon.c
|
||||
@@ -654,6 +654,7 @@ static char **parse_options( int argc, char **argv )
|
||||
option_defchar = atoi( optarg );
|
||||
break;
|
||||
case 'o':
|
||||
+ free( option_output );
|
||||
option_output = strdup( optarg );
|
||||
break;
|
||||
case 'q':
|
||||
--
|
||||
2.6.2
|
||||
|
@@ -1,30 +0,0 @@
|
||||
From 792e99d66b40481fb81042d51a12c861d8b33b51 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Andr=C3=A9=20Hentschel?= <nerv@dawncrow.de>
|
||||
Date: Mon, 16 Nov 2015 22:36:38 +0100
|
||||
Subject: winedump: Free debug string in case it was not freed in for-loop
|
||||
(Coverity)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: André Hentschel <nerv@dawncrow.de>
|
||||
---
|
||||
tools/winedump/msc.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c
|
||||
index 5890b29..3f1fd98 100644
|
||||
--- a/tools/winedump/msc.c
|
||||
+++ b/tools/winedump/msc.c
|
||||
@@ -1378,6 +1378,8 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
|
||||
dump_data((const void*)sym, sym->generic.len + 2, " ");
|
||||
}
|
||||
}
|
||||
+
|
||||
+ free(curr_func);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
--
|
||||
2.6.2
|
||||
|
@@ -1,21 +1,5 @@
|
||||
Fixes: Add api-ms-win-core-quirks-l1-1-0 dll
|
||||
Fixes: Add api-ms-win-appmodel-runtime-l1-1-1 dll
|
||||
Fixes: Add api-ms-win-core-apiquery-l1-1-0 dll
|
||||
Fixes: Add api-ms-win-core-heap-l2-1-0 dll
|
||||
Fixes: Add api-ms-win-shcore-obsolete-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-xaml-pal-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-appmodel-usercontext-l1-1-0 dll
|
||||
Fixes: Add api-ms-win-shcore-thread-l1-1-0 dll
|
||||
Fixes: Add api-ms-win-core-memory-l1-1-2 dll
|
||||
Fixes: Add api-ms-win-core-shlwapi-obsolete-l1-2-0 dll
|
||||
Fixes: Add api-ms-win-shcore-stream-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-ntuser-mouse-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-uxtheme-themes-l1-1-0 dll
|
||||
Fixes: Add api-ms-win-rtcore-ntuser-window-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-rtcore-ntuser-syscolors-l1-1-0 dll
|
||||
Fixes: Add api-ms-win-rtcore-ntuser-draw-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-rtcore-ntuser-sysparams-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-kernel32-package-current-l1-1-0 dll
|
||||
Fixes: Add ext-ms-win-xaml-pal-l1-1-0 dll and XamlBehaviourEnabled() stub
|
||||
Fixes: Add ext-ms-win-xaml-pal-l1-1-0.GetThemeServices() stub
|
||||
Fixes: Add ext-ms-win-appmodel-usercontext-l1-1-0 dll and UserContextExtInitialize() stub
|
||||
Fixes: Add iertutil dll
|
||||
Fixes: Add shcore dll
|
||||
Fixes: [40451] Add feclient dll
|
||||
Fixes: Return dummy interface in some uiautomationcore functions
|
@@ -1,18 +1,17 @@
|
||||
From 929e67829c47d2fcb99f0aac8ac983f0c3a56836 Mon Sep 17 00:00:00 2001
|
||||
From 484fbc0054dadaf4a410ae3497ccf3338ef7d81c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Wed, 27 Sep 2017 18:31:07 +0200
|
||||
Subject: crypt32/tests: Basic tests for decoding ECDSA signed certificate.
|
||||
|
||||
---
|
||||
dlls/crypt32/tests/encode.c | 168 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/wincrypt.h | 15 ++++
|
||||
2 files changed, 183 insertions(+)
|
||||
1 file changed, 168 insertions(+)
|
||||
|
||||
diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
|
||||
index 8cb384c3395..fa389c41ff1 100644
|
||||
index a4daec0..729f3e4 100644
|
||||
--- a/dlls/crypt32/tests/encode.c
|
||||
+++ b/dlls/crypt32/tests/encode.c
|
||||
@@ -8352,6 +8352,173 @@ static void testPortPublicKeyInfo(void)
|
||||
@@ -8509,6 +8509,173 @@ static void testPortPublicKeyInfo(void)
|
||||
ok(ret,"CryptAcquireContextA failed\n");
|
||||
}
|
||||
|
||||
@@ -186,66 +185,12 @@ index 8cb384c3395..fa389c41ff1 100644
|
||||
START_TEST(encode)
|
||||
{
|
||||
static const DWORD encodings[] = { X509_ASN_ENCODING, PKCS_7_ASN_ENCODING,
|
||||
@@ -8445,4 +8612,5 @@ START_TEST(encode)
|
||||
@@ -8602,4 +8769,5 @@ START_TEST(encode)
|
||||
test_decodeRsaPrivateKey(encodings[i]);
|
||||
}
|
||||
testPortPublicKeyInfo();
|
||||
+ testECDSACert();
|
||||
}
|
||||
diff --git a/include/wincrypt.h b/include/wincrypt.h
|
||||
index 8b120206cd8..22ff350923a 100644
|
||||
--- a/include/wincrypt.h
|
||||
+++ b/include/wincrypt.h
|
||||
@@ -288,6 +288,11 @@ typedef struct _CERT_KEY_ATTRIBUTES_INFO {
|
||||
PCERT_PRIVATE_KEY_VALIDITY pPrivateKeyUsagePeriod;
|
||||
} CERT_KEY_ATTRIBUTES_INFO, *PCERT_KEY_ATTRIBUTES_INFO;
|
||||
|
||||
+typedef struct _CERT_ECC_SIGNATURE {
|
||||
+ CRYPT_UINT_BLOB r;
|
||||
+ CRYPT_UINT_BLOB s;
|
||||
+} CERT_ECC_SIGNATURE, *PCERT_ECC_SIGNATURE;
|
||||
+
|
||||
/* byte 0 */
|
||||
#define CERT_DIGITAL_SIGNATURE_KEY_USAGE 0x80
|
||||
#define CERT_NON_REPUDIATION_KEY_USAGE 0x40
|
||||
@@ -2878,6 +2883,12 @@ typedef struct _CTL_FIND_SUBJECT_PARA
|
||||
#define szOID_X957 "1.2.840.10040"
|
||||
#define szOID_X957_DSA "1.2.840.10040.4.1"
|
||||
#define szOID_X957_SHA1DSA "1.2.840.10040.4.3"
|
||||
+#define szOID_ECC_PUBLIC_KEY "1.2.840.10045.2.1"
|
||||
+#define szOID_ECC_CURVE_P256 "1.2.840.10045.3.1.7"
|
||||
+#define szOID_ECDSA_SPECIFIED "1.2.840.10045.4.3"
|
||||
+#define szOID_ECDSA_SHA256 "1.2.840.10045.4.3.2"
|
||||
+#define szOID_ECDSA_SHA384 "1.2.840.10045.4.3.3"
|
||||
+#define szOID_ECDSA_SHA512 "1.2.840.10045.4.3.4"
|
||||
#define szOID_DS "2.5"
|
||||
#define szOID_DSALG "2.5.8"
|
||||
#define szOID_DSALG_CRPT "2.5.8.1"
|
||||
@@ -2919,6 +2930,8 @@ typedef struct _CTL_FIND_SUBJECT_PARA
|
||||
#define szOID_OIWDIR_SIGN "1.3.14.7.2.3"
|
||||
#define szOID_OIWDIR_md2 "1.3.14.7.2.2.1"
|
||||
#define szOID_OIWDIR_md2RSA "1.3.14.7.2.3.1"
|
||||
+#define szOID_ECC_CURVE_P384 "1.3.132.0.34"
|
||||
+#define szOID_ECC_CURVE_P521 "1.3.132.0.35"
|
||||
#define szOID_INFOSEC "2.16.840.1.101.2.1"
|
||||
#define szOID_INFOSEC_sdnsSignature "2.16.840.1.101.2.1.1.1"
|
||||
#define szOID_INFOSEC_mosaicSignature "2.16.840.1.101.2.1.1.2"
|
||||
@@ -3224,6 +3237,7 @@ typedef struct _CTL_FIND_SUBJECT_PARA
|
||||
#define X509_PKIX_POLICY_QUALIFIER_USERNOTICE ((LPCSTR)46)
|
||||
#define X509_DH_PUBLICKEY X509_MULTI_BYTE_UINT
|
||||
#define X509_DH_PARAMETERS ((LPCSTR)47)
|
||||
+#define X509_ECC_SIGNATURE ((LPCSTR)47)
|
||||
#define PKCS_ATTRIBUTES ((LPCSTR)48)
|
||||
#define PKCS_SORTED_CTL ((LPCSTR)49)
|
||||
#define X942_DH_PARAMETERS ((LPCSTR)50)
|
||||
@@ -3241,6 +3255,7 @@ typedef struct _CTL_FIND_SUBJECT_PARA
|
||||
#define CMC_ADD_EXTENSIONS ((LPCSTR)62)
|
||||
#define CMC_ADD_ATTRIBUTES ((LPCSTR)63)
|
||||
#define X509_CERTIFICATE_TEMPLATE ((LPCSTR)64)
|
||||
+#define X509_OBJECT_IDENTIFIER ((LPCSTR)73)
|
||||
#define PKCS7_SIGNER_INFO ((LPCSTR)500)
|
||||
#define CMS_SIGNER_INFO ((LPCSTR)501)
|
||||
|
||||
--
|
||||
2.14.1
|
||||
2.7.4
|
||||
|
||||
|
@@ -1,109 +0,0 @@
|
||||
From e271981b27492ce0612b5c2b7b0c18fd747ce2a7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Wed, 27 Sep 2017 19:08:43 +0200
|
||||
Subject: crypt32: Implement decoding of X509_OBJECT_IDENTIFIER.
|
||||
|
||||
---
|
||||
dlls/crypt32/decode.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
dlls/crypt32/tests/encode.c | 8 ++++----
|
||||
2 files changed, 49 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
|
||||
index ddeb0552906..6b124f9db7d 100644
|
||||
--- a/dlls/crypt32/decode.c
|
||||
+++ b/dlls/crypt32/decode.c
|
||||
@@ -5890,6 +5890,46 @@ BOOL CRYPT_AsnDecodePKCSEnvelopedData(const BYTE *pbEncoded, DWORD cbEncoded,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static BOOL WINAPI CRYPT_AsnDecodeObjectIdentifier(DWORD dwCertEncodingType,
|
||||
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||
+ PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||
+{
|
||||
+ DWORD bytesNeeded = 0;
|
||||
+ BOOL ret;
|
||||
+
|
||||
+ __TRY
|
||||
+ {
|
||||
+ ret = CRYPT_AsnDecodeOidInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG,
|
||||
+ NULL, &bytesNeeded, NULL);
|
||||
+ if (ret)
|
||||
+ {
|
||||
+ if (!pvStructInfo)
|
||||
+ *pcbStructInfo = bytesNeeded;
|
||||
+ else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, bytesNeeded)))
|
||||
+ {
|
||||
+ LPSTR *info;
|
||||
+
|
||||
+ if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
|
||||
+ pvStructInfo = *(BYTE **)pvStructInfo;
|
||||
+
|
||||
+ info = pvStructInfo;
|
||||
+ *info = (void *)((BYTE *)info + sizeof(*info));
|
||||
+ ret = CRYPT_AsnDecodeOidInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG,
|
||||
+ pvStructInfo, &bytesNeeded, NULL);
|
||||
+ if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG))
|
||||
+ CRYPT_FreeSpace(pDecodePara, info);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ __EXCEPT_PAGE_FAULT
|
||||
+ {
|
||||
+ SetLastError(STATUS_ACCESS_VIOLATION);
|
||||
+ ret = FALSE;
|
||||
+ }
|
||||
+ __ENDTRY
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||
LPCSTR lpszStructType)
|
||||
{
|
||||
@@ -6029,6 +6069,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||
case LOWORD(CMS_SIGNER_INFO):
|
||||
decodeFunc = CRYPT_AsnDecodeCMSSignerInfo;
|
||||
break;
|
||||
+ case LOWORD(X509_OBJECT_IDENTIFIER):
|
||||
+ decodeFunc = CRYPT_AsnDecodeObjectIdentifier;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
else if (!strcmp(lpszStructType, szOID_CERT_EXTENSIONS))
|
||||
@@ -6083,6 +6126,8 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||
decodeFunc = CRYPT_AsnDecodePolicyQualifierUserNotice;
|
||||
else if (!strcmp(lpszStructType, szOID_CTL))
|
||||
decodeFunc = CRYPT_AsnDecodeCTL;
|
||||
+ else if (!strcmp(lpszStructType, szOID_ECC_PUBLIC_KEY))
|
||||
+ decodeFunc = CRYPT_AsnDecodeObjectIdentifier;
|
||||
return decodeFunc;
|
||||
}
|
||||
|
||||
diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
|
||||
index fa389c41ff1..574b1e95351 100644
|
||||
--- a/dlls/crypt32/tests/encode.c
|
||||
+++ b/dlls/crypt32/tests/encode.c
|
||||
@@ -8489,8 +8489,8 @@ static void testECDSACert(void)
|
||||
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);
|
||||
- todo_wine ok(ret || broken(GetLastError() == ERROR_FILE_NOT_FOUND /* < Vista */),
|
||||
- "CryptDecodeObjectEx failed with %d\n", GetLastError());
|
||||
+ 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);
|
||||
@@ -8500,8 +8500,8 @@ static void testECDSACert(void)
|
||||
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);
|
||||
- todo_wine ok(ret || broken(GetLastError() == ERROR_FILE_NOT_FOUND /* < Vista */),
|
||||
- "CryptDecodeObjectEx failed with %d\n", GetLastError());
|
||||
+ 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);
|
||||
--
|
||||
2.14.1
|
||||
|
@@ -1,76 +0,0 @@
|
||||
From 4f3a56480857ec2b17c6bb6dd53f40420aebdc3b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Thu, 28 Sep 2017 05:35:49 +0200
|
||||
Subject: crypt32: Implement decoding of X509_ECC_SIGNATURE.
|
||||
|
||||
---
|
||||
dlls/crypt32/decode.c | 32 ++++++++++++++++++++++++++++++++
|
||||
dlls/crypt32/tests/encode.c | 2 +-
|
||||
2 files changed, 33 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c
|
||||
index 6b124f9db7d..02392ec6bf0 100644
|
||||
--- a/dlls/crypt32/decode.c
|
||||
+++ b/dlls/crypt32/decode.c
|
||||
@@ -5930,6 +5930,35 @@ static BOOL WINAPI CRYPT_AsnDecodeObjectIdentifier(DWORD dwCertEncodingType,
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static BOOL WINAPI CRYPT_AsnDecodeEccSignature(DWORD dwCertEncodingType,
|
||||
+ LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
|
||||
+ PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
|
||||
+{
|
||||
+ BOOL ret;
|
||||
+ struct AsnDecodeSequenceItem items[] = {
|
||||
+ { ASN_INTEGER, offsetof(CERT_ECC_SIGNATURE, r),
|
||||
+ CRYPT_AsnDecodeUnsignedIntegerInternal, sizeof(CRYPT_UINT_BLOB), FALSE,
|
||||
+ TRUE, offsetof(CERT_ECC_SIGNATURE, r.pbData), 0 },
|
||||
+ { ASN_INTEGER, offsetof(CERT_ECC_SIGNATURE, s),
|
||||
+ CRYPT_AsnDecodeUnsignedIntegerInternal, sizeof(CRYPT_UINT_BLOB), FALSE,
|
||||
+ TRUE, offsetof(CERT_ECC_SIGNATURE, s.pbData), 0 },
|
||||
+ };
|
||||
+
|
||||
+ __TRY
|
||||
+ {
|
||||
+ ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]),
|
||||
+ pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo,
|
||||
+ pcbStructInfo, NULL, NULL);
|
||||
+ }
|
||||
+ __EXCEPT_PAGE_FAULT
|
||||
+ {
|
||||
+ SetLastError(STATUS_ACCESS_VIOLATION);
|
||||
+ ret = FALSE;
|
||||
+ }
|
||||
+ __ENDTRY
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||
LPCSTR lpszStructType)
|
||||
{
|
||||
@@ -6072,6 +6101,9 @@ static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType,
|
||||
case LOWORD(X509_OBJECT_IDENTIFIER):
|
||||
decodeFunc = CRYPT_AsnDecodeObjectIdentifier;
|
||||
break;
|
||||
+ case LOWORD(X509_ECC_SIGNATURE):
|
||||
+ decodeFunc = CRYPT_AsnDecodeEccSignature;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
else if (!strcmp(lpszStructType, szOID_CERT_EXTENSIONS))
|
||||
diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c
|
||||
index 574b1e95351..5ab828151fa 100644
|
||||
--- a/dlls/crypt32/tests/encode.c
|
||||
+++ b/dlls/crypt32/tests/encode.c
|
||||
@@ -8434,7 +8434,7 @@ static void testECDSACert(void)
|
||||
ecc_sig = NULL;
|
||||
ret = pCryptDecodeObjectEx(X509_ASN_ENCODING, X509_ECC_SIGNATURE, info->Signature.pbData,
|
||||
info->Signature.cbData, decode_flags, NULL, &ecc_sig, &size);
|
||||
- todo_wine ok(ret, "CryptDecodeObjectEx failed with %d\n", GetLastError());
|
||||
+ 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);
|
||||
--
|
||||
2.14.1
|
||||
|
@@ -1,108 +0,0 @@
|
||||
From e8fdbe56cb46f23d730bcc32a15510cc770b4ce6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Fri, 29 Sep 2017 22:17:15 +0200
|
||||
Subject: [PATCH] crypt32/tests: Add basic test for ecdsa oid.
|
||||
|
||||
---
|
||||
dlls/crypt32/tests/oid.c | 35 +++++++++++++++++++++++++++++++++++
|
||||
include/wincrypt.h | 15 +++++++++++++++
|
||||
2 files changed, 50 insertions(+)
|
||||
|
||||
diff --git a/dlls/crypt32/tests/oid.c b/dlls/crypt32/tests/oid.c
|
||||
index 8fc67b3..e14f240 100644
|
||||
--- a/dlls/crypt32/tests/oid.c
|
||||
+++ b/dlls/crypt32/tests/oid.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <winerror.h>
|
||||
+#define CRYPT_OID_INFO_HAS_EXTRA_FIELDS
|
||||
#include <wincrypt.h>
|
||||
#include <winreg.h>
|
||||
|
||||
@@ -543,8 +544,10 @@ static void test_enumOIDInfo(void)
|
||||
|
||||
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;
|
||||
ALG_ID alg = CALG_SHA1;
|
||||
ALG_ID algs[2] = { CALG_MD5, CALG_RSA_SIGN };
|
||||
PCCRYPT_OID_INFO info;
|
||||
@@ -600,6 +603,38 @@ static void test_findOIDInfo(void)
|
||||
ok(U(*info).Algid == CALG_SHA_256 || U(*info).Algid == -1,
|
||||
"Expected CALG_MD5 or -1, got %d\n", U(*info).Algid);
|
||||
}
|
||||
+
|
||||
+ info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, oid_ecda_sha25, 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->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(data[1] == CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG,
|
||||
+ "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));
|
||||
+ ok(!lstrcmpW(info->pwszCNGExtraAlgid, CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM), "Expected %s, got %s\n",
|
||||
+ wine_dbgstr_w(CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM), wine_dbgstr_w(info->pwszCNGExtraAlgid));
|
||||
+ }
|
||||
+ else
|
||||
+ todo_wine win_skip("Host does not support ECDSA_SHA256, skipping test\n");
|
||||
}
|
||||
|
||||
START_TEST(oid)
|
||||
diff --git a/include/wincrypt.h b/include/wincrypt.h
|
||||
index a7c24e7..373acac 100644
|
||||
--- a/include/wincrypt.h
|
||||
+++ b/include/wincrypt.h
|
||||
@@ -1244,6 +1244,17 @@ typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_FUNC)(DWORD dwEncodingType,
|
||||
|
||||
#define CRYPT_MATCH_ANY_ENCODING_TYPE 0xffffffff
|
||||
|
||||
+#define CALG_OID_INFO_CNG_ONLY 0xffffffff
|
||||
+#define CALG_OID_INFO_PARAMETERS 0xfffffffe
|
||||
+
|
||||
+#define CRYPT_OID_INFO_HASH_PARAMETERS_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','H','a','s','h','P','a','r','a','m','e','t','e','r','s',0}
|
||||
+#define CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','E','C','C','P','a','r','a','m','e','t','e','r','s',0}
|
||||
+#define CRYPT_OID_INFO_MGF1_PARAMETERS_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','M','g','f','1','P','a','r','a','m','e','t','e','r','s',0}
|
||||
+#define CRYPT_OID_INFO_NO_SIGN_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','N','o','S','i','g','n',0}
|
||||
+#define CRYPT_OID_INFO_OAEP_PARAMETERS_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','O','A','E','P','P','a','r','a','m','e','t','e','r','s',0}
|
||||
+#define CRYPT_OID_INFO_ECC_WRAP_PARAMETERS_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','E','C','C','W','r','a','p','P','a','r','a','m','e','t','e','r','s',0}
|
||||
+#define CRYPT_OID_INFO_NO_PARAMETERS_ALGORITHM (const WCHAR []){'C','r','y','p','t','O','I','D','I','n','f','o','N','o','P','a','r','a','m','e','t','e','r','s',0}
|
||||
+
|
||||
typedef struct _CRYPT_OID_INFO {
|
||||
DWORD cbSize;
|
||||
LPCSTR pszOID;
|
||||
@@ -1255,6 +1266,10 @@ typedef struct _CRYPT_OID_INFO {
|
||||
DWORD dwLength;
|
||||
} DUMMYUNIONNAME;
|
||||
CRYPT_DATA_BLOB ExtraInfo;
|
||||
+#ifdef CRYPT_OID_INFO_HAS_EXTRA_FIELDS
|
||||
+ LPCWSTR pwszCNGAlgid;
|
||||
+ LPCWSTR pwszCNGExtraAlgid;
|
||||
+#endif
|
||||
} CRYPT_OID_INFO, *PCRYPT_OID_INFO;
|
||||
typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO;
|
||||
|
||||
--
|
||||
1.9.1
|
||||
|
@@ -1,102 +0,0 @@
|
||||
From 46195d1c3633ba489f99a896012283b467df7fc2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Fri, 29 Sep 2017 22:42:56 +0200
|
||||
Subject: crypt32: Add oids for sha256ECDSA and sha384ECDSA.
|
||||
|
||||
---
|
||||
dlls/crypt32/oid.c | 17 +++++++++++++++++
|
||||
dlls/crypt32/tests/oid.c | 2 +-
|
||||
2 files changed, 18 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/crypt32/oid.c b/dlls/crypt32/oid.c
|
||||
index 7c07b9fcd99..b34c5980d65 100644
|
||||
--- a/dlls/crypt32/oid.c
|
||||
+++ b/dlls/crypt32/oid.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#define NONAMELESSUNION
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
+#define CRYPT_OID_INFO_HAS_EXTRA_FIELDS
|
||||
#include "wincrypt.h"
|
||||
#include "winreg.h"
|
||||
#include "winuser.h"
|
||||
@@ -1080,6 +1081,8 @@ static const WCHAR sha384RSA[] = { 's','h','a','3','8','4','R','S','A',0 };
|
||||
static const WCHAR sha512RSA[] = { 's','h','a','5','1','2','R','S','A',0 };
|
||||
static const WCHAR mosaicUpdatedSig[] =
|
||||
{ 'm','o','s','a','i','c','U','p','d','a','t','e','d','S','i','g',0 };
|
||||
+static const WCHAR sha256ECDSA[] = { 's','h','a','2','5','6','E','C','D','S','A',0 };
|
||||
+static const WCHAR sha384ECDSA[] = { 's','h','a','3','8','4','E','C','D','S','A',0 };
|
||||
static const WCHAR CN[] = { 'C','N',0 };
|
||||
static const WCHAR L[] = { 'L',0 };
|
||||
static const WCHAR O[] = { 'O',0 };
|
||||
@@ -1126,12 +1129,16 @@ static const DWORD dssSign[2] = { CALG_DSS_SIGN,
|
||||
static const DWORD mosaicSign[2] = { CALG_DSS_SIGN,
|
||||
CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG |
|
||||
CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG };
|
||||
+static const DWORD ecdsaSign[2] = { CALG_OID_INFO_PARAMETERS,
|
||||
+ CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG };
|
||||
static const CRYPT_DATA_BLOB rsaSignBlob = { sizeof(rsaSign),
|
||||
(LPBYTE)&rsaSign };
|
||||
static const CRYPT_DATA_BLOB dssSignBlob = { sizeof(dssSign),
|
||||
(LPBYTE)dssSign };
|
||||
static const CRYPT_DATA_BLOB mosaicSignBlob = { sizeof(mosaicSign),
|
||||
(LPBYTE)mosaicSign };
|
||||
+static const CRYPT_DATA_BLOB ecdsaSignBlob = { sizeof(ecdsaSign),
|
||||
+ (LPBYTE)ecdsaSign };
|
||||
|
||||
static const DWORD ia5String[] = { CERT_RDN_IA5_STRING, 0 };
|
||||
static const DWORD numericString[] = { CERT_RDN_NUMERIC_STRING, 0 };
|
||||
@@ -1153,6 +1160,8 @@ static const struct OIDInfoConstructor {
|
||||
UINT Algid;
|
||||
LPCWSTR pwszName;
|
||||
const CRYPT_DATA_BLOB *blob;
|
||||
+ LPCWSTR pwszCNGAlgid;
|
||||
+ LPCWSTR pwszCNGExtraAlgid;
|
||||
} oidInfoConstructors[] = {
|
||||
{ 1, szOID_OIWSEC_sha1, CALG_SHA1, sha1, NULL },
|
||||
{ 1, szOID_OIWSEC_sha1, CALG_SHA1, sha, NULL },
|
||||
@@ -1207,6 +1216,10 @@ static const struct OIDInfoConstructor {
|
||||
{ 4, szOID_OIWSEC_dsaSHA1, CALG_SHA1, dsaSHA1, &dssSignBlob },
|
||||
{ 4, szOID_INFOSEC_mosaicUpdatedSig, CALG_SHA1, mosaicUpdatedSig,
|
||||
&mosaicSignBlob },
|
||||
+ { 4, szOID_ECDSA_SHA256, CALG_OID_INFO_CNG_ONLY, sha256ECDSA, &ecdsaSignBlob,
|
||||
+ BCRYPT_SHA256_ALGORITHM, CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM },
|
||||
+ { 4, szOID_ECDSA_SHA384, CALG_OID_INFO_CNG_ONLY, sha384ECDSA, &ecdsaSignBlob,
|
||||
+ BCRYPT_SHA384_ALGORITHM, CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM },
|
||||
|
||||
{ 5, szOID_COMMON_NAME, 0, CN, NULL },
|
||||
{ 5, szOID_LOCALITY_NAME, 0, L, NULL },
|
||||
@@ -1422,6 +1435,8 @@ static void init_oid_info(void)
|
||||
info->info.ExtraInfo.pbData =
|
||||
oidInfoConstructors[i].blob->pbData;
|
||||
}
|
||||
+ info->info.pwszCNGAlgid = oidInfoConstructors[i].pwszCNGAlgid;
|
||||
+ info->info.pwszCNGExtraAlgid = oidInfoConstructors[i].pwszCNGExtraAlgid;
|
||||
list_add_tail(&oidInfo, &info->entry);
|
||||
}
|
||||
}
|
||||
@@ -1454,6 +1469,8 @@ static void init_oid_info(void)
|
||||
info->info.ExtraInfo.pbData =
|
||||
oidInfoConstructors[i].blob->pbData;
|
||||
}
|
||||
+ info->info.pwszCNGAlgid = oidInfoConstructors[i].pwszCNGAlgid;
|
||||
+ info->info.pwszCNGExtraAlgid = oidInfoConstructors[i].pwszCNGExtraAlgid;
|
||||
list_add_tail(&oidInfo, &info->entry);
|
||||
}
|
||||
}
|
||||
diff --git a/dlls/crypt32/tests/oid.c b/dlls/crypt32/tests/oid.c
|
||||
index 567658d515d..fa885efb742 100644
|
||||
--- a/dlls/crypt32/tests/oid.c
|
||||
+++ b/dlls/crypt32/tests/oid.c
|
||||
@@ -619,7 +619,7 @@ static void test_findOIDInfo(void)
|
||||
wine_dbgstr_w(CRYPT_OID_INFO_ECC_PARAMETERS_ALGORITHM), wine_dbgstr_w(info->pwszCNGExtraAlgid));
|
||||
}
|
||||
else
|
||||
- todo_wine win_skip("Host does not support ECDSA_SHA256, skipping test\n");
|
||||
+ win_skip("Host does not support ECDSA_SHA256, skipping test\n");
|
||||
}
|
||||
|
||||
START_TEST(oid)
|
||||
--
|
||||
2.14.1
|
||||
|
@@ -1,146 +0,0 @@
|
||||
From ad4623778a56ea3278bb9c81a951af14575b9ac0 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sat, 30 Sep 2017 03:02:15 +0200
|
||||
Subject: crypt32: Correctly return how the issuer of a self signed certificate
|
||||
was checked.
|
||||
|
||||
---
|
||||
dlls/crypt32/cert.c | 2 +-
|
||||
dlls/crypt32/chain.c | 20 ++++++++++++++------
|
||||
dlls/crypt32/crypt32_private.h | 2 +-
|
||||
3 files changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
|
||||
index a4b43ff1555..0cfa46788f3 100644
|
||||
--- a/dlls/crypt32/cert.c
|
||||
+++ b/dlls/crypt32/cert.c
|
||||
@@ -1884,7 +1884,7 @@ PCCERT_CONTEXT WINAPI CertGetIssuerCertificateFromStore(HCERTSTORE hCertStore,
|
||||
CertFreeCertificateContext(ret);
|
||||
ret = NULL;
|
||||
}
|
||||
- if (CRYPT_IsCertificateSelfSigned(pSubjectContext))
|
||||
+ if (CRYPT_IsCertificateSelfSigned(pSubjectContext, NULL))
|
||||
{
|
||||
CertFreeCertificateContext(ret);
|
||||
ret = NULL;
|
||||
diff --git a/dlls/crypt32/chain.c b/dlls/crypt32/chain.c
|
||||
index 80b6513ab1e..89a8ddb95f4 100644
|
||||
--- a/dlls/crypt32/chain.c
|
||||
+++ b/dlls/crypt32/chain.c
|
||||
@@ -265,7 +265,7 @@ typedef struct _CertificateChain
|
||||
LONG ref;
|
||||
} CertificateChain;
|
||||
|
||||
-BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
|
||||
+BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert, DWORD *type)
|
||||
{
|
||||
PCERT_EXTENSION ext;
|
||||
DWORD size;
|
||||
@@ -300,6 +300,7 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
|
||||
&directoryName->u.DirectoryName, &cert->pCertInfo->Issuer)
|
||||
&& CertCompareIntegerBlob(&info->AuthorityCertSerialNumber,
|
||||
&cert->pCertInfo->SerialNumber);
|
||||
+ if (type) *type = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -321,6 +322,7 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
|
||||
CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
|
||||
ret = !memcmp(buf, info->KeyId.pbData, size);
|
||||
CryptMemFree(buf);
|
||||
+ if (type) *type = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
|
||||
}
|
||||
else
|
||||
ret = FALSE;
|
||||
@@ -348,6 +350,7 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
|
||||
&info->CertIssuer, &cert->pCertInfo->Issuer) &&
|
||||
CertCompareIntegerBlob(&info->CertSerialNumber,
|
||||
&cert->pCertInfo->SerialNumber);
|
||||
+ if (type) *type = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
|
||||
}
|
||||
else if (info->KeyId.cbData)
|
||||
{
|
||||
@@ -363,6 +366,7 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
|
||||
CERT_KEY_IDENTIFIER_PROP_ID, buf, &size);
|
||||
ret = !memcmp(buf, info->KeyId.pbData, size);
|
||||
CryptMemFree(buf);
|
||||
+ if (type) *type = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
|
||||
}
|
||||
else
|
||||
ret = FALSE;
|
||||
@@ -376,8 +380,11 @@ BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert)
|
||||
}
|
||||
}
|
||||
else
|
||||
+ {
|
||||
ret = CertCompareCertificateName(cert->dwCertEncodingType,
|
||||
&cert->pCertInfo->Subject, &cert->pCertInfo->Issuer);
|
||||
+ if (type) *type = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
|
||||
+ }
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1320,7 +1327,7 @@ static void CRYPT_CheckChainNameConstraints(PCERT_SIMPLE_CHAIN chain)
|
||||
* constraints checked unless they're the end cert.
|
||||
*/
|
||||
if (j == 0 || !CRYPT_IsCertificateSelfSigned(
|
||||
- chain->rgpElement[j]->pCertContext))
|
||||
+ chain->rgpElement[j]->pCertContext, NULL))
|
||||
{
|
||||
CRYPT_CheckNameConstraints(nameConstraints,
|
||||
chain->rgpElement[j]->pCertContext->pCertInfo,
|
||||
@@ -1893,6 +1900,7 @@ static void CRYPT_CheckSimpleChain(CertificateChainEngine *engine,
|
||||
int i;
|
||||
BOOL pathLengthConstraintViolated = FALSE;
|
||||
CERT_BASIC_CONSTRAINTS2_INFO constraints = { FALSE, FALSE, 0 };
|
||||
+ DWORD type;
|
||||
|
||||
TRACE_(chain)("checking chain with %d elements for time %s\n",
|
||||
chain->cElement, filetime_to_str(time));
|
||||
@@ -1904,7 +1912,7 @@ static void CRYPT_CheckSimpleChain(CertificateChainEngine *engine,
|
||||
dump_element(chain->rgpElement[i]->pCertContext);
|
||||
if (i == chain->cElement - 1)
|
||||
isRoot = CRYPT_IsCertificateSelfSigned(
|
||||
- chain->rgpElement[i]->pCertContext);
|
||||
+ chain->rgpElement[i]->pCertContext, NULL);
|
||||
else
|
||||
isRoot = FALSE;
|
||||
if (!CRYPT_IsCertVersionValid(chain->rgpElement[i]->pCertContext))
|
||||
@@ -1980,10 +1988,10 @@ static void CRYPT_CheckSimpleChain(CertificateChainEngine *engine,
|
||||
}
|
||||
CRYPT_CheckChainNameConstraints(chain);
|
||||
CRYPT_CheckChainPolicies(chain);
|
||||
- if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext))
|
||||
+ if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext, &type))
|
||||
{
|
||||
rootElement->TrustStatus.dwInfoStatus |=
|
||||
- CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER;
|
||||
+ CERT_TRUST_IS_SELF_SIGNED | type;
|
||||
CRYPT_CheckRootCert(engine->hRoot, rootElement);
|
||||
}
|
||||
CRYPT_CombineTrustStatus(&chain->TrustStatus, &rootElement->TrustStatus);
|
||||
@@ -2195,7 +2203,7 @@ static BOOL CRYPT_BuildSimpleChain(const CertificateChainEngine *engine,
|
||||
PCCERT_CONTEXT cert = chain->rgpElement[chain->cElement - 1]->pCertContext;
|
||||
|
||||
while (ret && !CRYPT_IsSimpleChainCyclic(chain) &&
|
||||
- !CRYPT_IsCertificateSelfSigned(cert))
|
||||
+ !CRYPT_IsCertificateSelfSigned(cert, NULL))
|
||||
{
|
||||
PCCERT_CONTEXT issuer = CRYPT_GetIssuer(engine, world, cert, NULL, flags,
|
||||
&chain->rgpElement[chain->cElement - 1]->TrustStatus.dwInfoStatus);
|
||||
diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h
|
||||
index 8b1b003a120..5c08369f007 100644
|
||||
--- a/dlls/crypt32/crypt32_private.h
|
||||
+++ b/dlls/crypt32/crypt32_private.h
|
||||
@@ -341,7 +341,7 @@ void CRYPT_ImportSystemRootCertsToReg(void) DECLSPEC_HIDDEN;
|
||||
BOOL CRYPT_SerializeContextsToReg(HKEY key, DWORD flags, const WINE_CONTEXT_INTERFACE *contextInterface,
|
||||
HCERTSTORE memStore) DECLSPEC_HIDDEN;
|
||||
|
||||
-BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert) DECLSPEC_HIDDEN;
|
||||
+BOOL CRYPT_IsCertificateSelfSigned(PCCERT_CONTEXT cert, DWORD *type) DECLSPEC_HIDDEN;
|
||||
|
||||
/* Allocates and initializes a certificate chain engine, but without creating
|
||||
* the root store. Instead, it uses root, and assumes the caller has done any
|
||||
--
|
||||
2.14.1
|
||||
|
@@ -1,384 +0,0 @@
|
||||
From 2da87110b4a7637cada56e5e188f2d6ccafc97e4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sat, 30 Sep 2017 03:10:08 +0200
|
||||
Subject: crypt32: Implement verification of ECDSA signatures.
|
||||
|
||||
---
|
||||
dlls/crypt32/Makefile.in | 2 +-
|
||||
dlls/crypt32/cert.c | 292 ++++++++++++++++++++++++++++++++++++++++++---
|
||||
dlls/crypt32/tests/chain.c | 4 +-
|
||||
3 files changed, 280 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/dlls/crypt32/Makefile.in b/dlls/crypt32/Makefile.in
|
||||
index d3a409fcae6..09342221192 100644
|
||||
--- a/dlls/crypt32/Makefile.in
|
||||
+++ b/dlls/crypt32/Makefile.in
|
||||
@@ -1,7 +1,7 @@
|
||||
EXTRADEFS = -D_CRYPT32_
|
||||
MODULE = crypt32.dll
|
||||
IMPORTLIB = crypt32
|
||||
-IMPORTS = user32 advapi32
|
||||
+IMPORTS = user32 advapi32 bcrypt
|
||||
DELAYIMPORTS = cryptnet
|
||||
EXTRALIBS = $(SECURITY_LIBS)
|
||||
|
||||
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
|
||||
index 0cfa46788f3..d2aa182ff6e 100644
|
||||
--- a/dlls/crypt32/cert.c
|
||||
+++ b/dlls/crypt32/cert.c
|
||||
@@ -21,9 +21,14 @@
|
||||
#include <stdarg.h>
|
||||
|
||||
#define NONAMELESSUNION
|
||||
+#include "ntstatus.h"
|
||||
+#define WIN32_NO_STATUS
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
+#include "winternl.h"
|
||||
+#define CRYPT_OID_INFO_HAS_EXTRA_FIELDS
|
||||
#include "wincrypt.h"
|
||||
+#include "bcrypt.h"
|
||||
#include "winnls.h"
|
||||
#include "rpc.h"
|
||||
#include "wine/debug.h"
|
||||
@@ -2409,36 +2414,29 @@ BOOL WINAPI CryptVerifyCertificateSignature(HCRYPTPROV_LEGACY hCryptProv,
|
||||
CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY, pPublicKey, 0, NULL);
|
||||
}
|
||||
|
||||
-static BOOL CRYPT_VerifyCertSignatureFromPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv,
|
||||
- DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pubKeyInfo,
|
||||
- const CERT_SIGNED_CONTENT_INFO *signedCert)
|
||||
+static BOOL verify_signature_crypt(HCRYPTPROV_LEGACY hCryptProv,
|
||||
+ DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pubKeyInfo,
|
||||
+ const CERT_SIGNED_CONTENT_INFO *signedCert, PCCRYPT_OID_INFO info)
|
||||
{
|
||||
- BOOL ret;
|
||||
- HCRYPTKEY key;
|
||||
- PCCRYPT_OID_INFO info;
|
||||
ALG_ID pubKeyID, hashID;
|
||||
+ HCRYPTHASH hash;
|
||||
+ HCRYPTKEY key;
|
||||
+ BOOL ret;
|
||||
|
||||
- info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
|
||||
- signedCert->SignatureAlgorithm.pszObjId, 0);
|
||||
- if (!info || info->dwGroupId != CRYPT_SIGN_ALG_OID_GROUP_ID)
|
||||
- {
|
||||
- SetLastError(NTE_BAD_ALGID);
|
||||
- return FALSE;
|
||||
- }
|
||||
hashID = info->u.Algid;
|
||||
if (info->ExtraInfo.cbData >= sizeof(ALG_ID))
|
||||
pubKeyID = *(ALG_ID *)info->ExtraInfo.pbData;
|
||||
else
|
||||
pubKeyID = hashID;
|
||||
+
|
||||
/* Load the default provider if necessary */
|
||||
if (!hCryptProv)
|
||||
hCryptProv = CRYPT_GetDefaultProvider();
|
||||
+
|
||||
ret = CryptImportPublicKeyInfoEx(hCryptProv, dwCertEncodingType,
|
||||
pubKeyInfo, pubKeyID, 0, NULL, &key);
|
||||
if (ret)
|
||||
{
|
||||
- HCRYPTHASH hash;
|
||||
-
|
||||
ret = CryptCreateHash(hCryptProv, hashID, 0, 0, &hash);
|
||||
if (ret)
|
||||
{
|
||||
@@ -2454,6 +2452,270 @@ static BOOL CRYPT_VerifyCertSignatureFromPublicKeyInfo(HCRYPTPROV_LEGACY hCryptP
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static BOOL calculate_hash_bcrypt(const WCHAR *algorithm,
|
||||
+ const CERT_SIGNED_CONTENT_INFO *signedCert, BYTE **hash_value, DWORD *hash_len)
|
||||
+{
|
||||
+ BCRYPT_HASH_HANDLE hash = NULL;
|
||||
+ BCRYPT_ALG_HANDLE alg = NULL;
|
||||
+ NTSTATUS status;
|
||||
+ DWORD size;
|
||||
+ BOOL ret = FALSE;
|
||||
+
|
||||
+ if ((status = BCryptOpenAlgorithmProvider(&alg, algorithm, NULL, 0)))
|
||||
+ goto done;
|
||||
+
|
||||
+ if ((status = BCryptCreateHash(alg, &hash, NULL, 0, NULL, 0, 0)))
|
||||
+ goto done;
|
||||
+
|
||||
+ if ((status = BCryptHashData(hash, signedCert->ToBeSigned.pbData, signedCert->ToBeSigned.cbData, 0)))
|
||||
+ goto done;
|
||||
+
|
||||
+ if ((status = BCryptGetProperty(hash, BCRYPT_HASH_LENGTH, (BYTE *)hash_len, sizeof(*hash_len), &size, 0)))
|
||||
+ goto done;
|
||||
+
|
||||
+ if (!(*hash_value = CryptMemAlloc(*hash_len)))
|
||||
+ {
|
||||
+ status = STATUS_NO_MEMORY;
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ if ((status = BCryptFinishHash(hash, *hash_value, *hash_len, 0)))
|
||||
+ {
|
||||
+ CryptMemFree(*hash_value);
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ ret = TRUE;
|
||||
+
|
||||
+done:
|
||||
+ if (hash) BCryptDestroyHash(hash);
|
||||
+ if (alg) BCryptCloseAlgorithmProvider(alg, 0);
|
||||
+ if (status) SetLastError(RtlNtStatusToDosError(status));
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static BOOL import_bcrypt_pubkey_ecc(PCERT_PUBLIC_KEY_INFO pubKeyInfo, BCRYPT_KEY_HANDLE *key)
|
||||
+{
|
||||
+ DWORD blob_magic, ecckey_len, size;
|
||||
+ NTSTATUS status = STATUS_SUCCESS;
|
||||
+ BCRYPT_ECCKEY_BLOB *ecckey;
|
||||
+ const WCHAR *sign_algo;
|
||||
+ BCRYPT_ALG_HANDLE alg;
|
||||
+ LPSTR *ecc_curve;
|
||||
+
|
||||
+ if (!pubKeyInfo->PublicKey.cbData)
|
||||
+ {
|
||||
+ SetLastError(NTE_BAD_ALGID);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (pubKeyInfo->PublicKey.pbData[0] != 0x4)
|
||||
+ {
|
||||
+ FIXME("Compressed ECC curves (%02x) not yet supported\n", pubKeyInfo->PublicKey.pbData[0]);
|
||||
+ SetLastError(NTE_BAD_ALGID);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_OBJECT_IDENTIFIER,
|
||||
+ pubKeyInfo->Algorithm.Parameters.pbData,
|
||||
+ pubKeyInfo->Algorithm.Parameters.cbData,
|
||||
+ CRYPT_DECODE_ALLOC_FLAG, NULL, &ecc_curve, &size))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ if (!strcmp(*ecc_curve, szOID_ECC_CURVE_P256))
|
||||
+ {
|
||||
+ sign_algo = BCRYPT_ECDSA_P256_ALGORITHM;
|
||||
+ blob_magic = BCRYPT_ECDSA_PUBLIC_P256_MAGIC;
|
||||
+ }
|
||||
+ else if(!strcmp(*ecc_curve, szOID_ECC_CURVE_P384))
|
||||
+ {
|
||||
+ sign_algo = BCRYPT_ECDSA_P384_ALGORITHM;
|
||||
+ blob_magic = BCRYPT_ECDSA_PUBLIC_P384_MAGIC;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ FIXME("Unsupported ecc curve type: %s\n", *ecc_curve);
|
||||
+ sign_algo = NULL;
|
||||
+ blob_magic = 0;
|
||||
+ }
|
||||
+ LocalFree(ecc_curve);
|
||||
+
|
||||
+ if (!sign_algo)
|
||||
+ {
|
||||
+ SetLastError(NTE_BAD_ALGID);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if ((status = BCryptOpenAlgorithmProvider(&alg, sign_algo, NULL, 0)))
|
||||
+ {
|
||||
+ SetLastError(RtlNtStatusToDosError(status));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ ecckey_len = sizeof(BCRYPT_ECCKEY_BLOB) + pubKeyInfo->PublicKey.cbData - 1;
|
||||
+ if (!(ecckey = CryptMemAlloc(ecckey_len)))
|
||||
+ {
|
||||
+ BCryptCloseAlgorithmProvider(alg, 0);
|
||||
+ SetLastError(ERROR_OUTOFMEMORY);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ ecckey->dwMagic = blob_magic;
|
||||
+ ecckey->cbKey = (pubKeyInfo->PublicKey.cbData - 1) / 2;
|
||||
+ memcpy(ecckey + 1, pubKeyInfo->PublicKey.pbData + 1, pubKeyInfo->PublicKey.cbData - 1);
|
||||
+
|
||||
+ status = BCryptImportKeyPair(alg, NULL, BCRYPT_ECCPUBLIC_BLOB, key, (BYTE*)ecckey, ecckey_len, 0);
|
||||
+ BCryptCloseAlgorithmProvider(alg, 0);
|
||||
+ if (status)
|
||||
+ {
|
||||
+ SetLastError(RtlNtStatusToDosError(status));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static BOOL import_bcrypt_pubkey(PCERT_PUBLIC_KEY_INFO pubKeyInfo, BCRYPT_KEY_HANDLE *key)
|
||||
+{
|
||||
+ if (!strcmp(pubKeyInfo->Algorithm.pszObjId, szOID_ECC_PUBLIC_KEY))
|
||||
+ return import_bcrypt_pubkey_ecc(pubKeyInfo, key);
|
||||
+
|
||||
+ FIXME("Unsupported public key type: %s\n", debugstr_a(pubKeyInfo->Algorithm.pszObjId));
|
||||
+ SetLastError(NTE_BAD_ALGID);
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
+static BOOL prepare_bcrypt_signature_ecc(BYTE *encoded_sig, DWORD encoded_size,
|
||||
+ BYTE **sig_value, DWORD *sig_len)
|
||||
+{
|
||||
+ CERT_ECC_SIGNATURE *ecc_sig;
|
||||
+ DWORD size;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_ECC_SIGNATURE,
|
||||
+ encoded_sig, encoded_size,
|
||||
+ CRYPT_DECODE_ALLOC_FLAG, NULL, &ecc_sig, &size))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ if (!ecc_sig->r.cbData || !ecc_sig->s.cbData)
|
||||
+ {
|
||||
+ LocalFree(ecc_sig);
|
||||
+ SetLastError(ERROR_INVALID_DATA);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ *sig_len = ecc_sig->r.cbData + ecc_sig->s.cbData;
|
||||
+ if (!(*sig_value = CryptMemAlloc(*sig_len)))
|
||||
+ {
|
||||
+ LocalFree(ecc_sig);
|
||||
+ SetLastError(ERROR_OUTOFMEMORY);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < ecc_sig->r.cbData; i++)
|
||||
+ (*sig_value)[i] = ecc_sig->r.pbData[ecc_sig->r.cbData - i - 1];
|
||||
+ for (i = 0; i < ecc_sig->s.cbData; i++)
|
||||
+ (*sig_value)[ecc_sig->r.cbData + i] = ecc_sig->s.pbData[ecc_sig->s.cbData - i - 1];
|
||||
+
|
||||
+ LocalFree(ecc_sig);
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static BOOL prepare_bcrypt_signature(PCERT_PUBLIC_KEY_INFO pubKeyInfo,
|
||||
+ const CERT_SIGNED_CONTENT_INFO *signedCert, BYTE **sig_value, DWORD *sig_len)
|
||||
+{
|
||||
+ BYTE *encoded_sig;
|
||||
+ BOOL ret = FALSE;
|
||||
+ int i;
|
||||
+
|
||||
+ if (!signedCert->Signature.cbData)
|
||||
+ {
|
||||
+ SetLastError(ERROR_INVALID_DATA);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!(encoded_sig = CryptMemAlloc(signedCert->Signature.cbData)))
|
||||
+ {
|
||||
+ SetLastError(ERROR_OUTOFMEMORY);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < signedCert->Signature.cbData; i++)
|
||||
+ encoded_sig[i] = signedCert->Signature.pbData[signedCert->Signature.cbData - i - 1];
|
||||
+
|
||||
+ if (!strcmp(pubKeyInfo->Algorithm.pszObjId, szOID_ECC_PUBLIC_KEY))
|
||||
+ ret = prepare_bcrypt_signature_ecc(encoded_sig, signedCert->Signature.cbData, sig_value, sig_len);
|
||||
+ else
|
||||
+ {
|
||||
+ FIXME("Unsupported public key type: %s\n", debugstr_a(pubKeyInfo->Algorithm.pszObjId));
|
||||
+ SetLastError(NTE_BAD_ALGID);
|
||||
+ }
|
||||
+
|
||||
+ CryptMemFree(encoded_sig);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static BOOL verify_signature_bcrypt(HCRYPTPROV_LEGACY hCryptProv,
|
||||
+ DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pubKeyInfo,
|
||||
+ const CERT_SIGNED_CONTENT_INFO *signedCert, PCCRYPT_OID_INFO info)
|
||||
+{
|
||||
+ BCRYPT_KEY_HANDLE key = NULL;
|
||||
+ BYTE *hash_value, *sig_value;
|
||||
+ DWORD hash_len, sig_len;
|
||||
+ NTSTATUS status;
|
||||
+
|
||||
+ if (!calculate_hash_bcrypt(info->pwszCNGAlgid, signedCert, &hash_value, &hash_len))
|
||||
+ return FALSE;
|
||||
+
|
||||
+ if (!import_bcrypt_pubkey(pubKeyInfo, &key))
|
||||
+ {
|
||||
+ CryptMemFree(hash_value);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (!prepare_bcrypt_signature(pubKeyInfo, signedCert, &sig_value, &sig_len))
|
||||
+ {
|
||||
+ CryptMemFree(hash_value);
|
||||
+ BCryptDestroyKey(key);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ status = BCryptVerifySignature(key, NULL, hash_value, hash_len, sig_value, sig_len, 0);
|
||||
+
|
||||
+ BCryptDestroyKey(key);
|
||||
+ CryptMemFree(hash_value);
|
||||
+ CryptMemFree(sig_value);
|
||||
+
|
||||
+ if (status)
|
||||
+ {
|
||||
+ FIXME("Failed to verify signature: %08x\n", status);
|
||||
+ SetLastError(RtlNtStatusToDosError(status));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ return TRUE;
|
||||
+}
|
||||
+
|
||||
+static BOOL CRYPT_VerifyCertSignatureFromPublicKeyInfo(HCRYPTPROV_LEGACY hCryptProv,
|
||||
+ DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pubKeyInfo,
|
||||
+ const CERT_SIGNED_CONTENT_INFO *signedCert)
|
||||
+{
|
||||
+ PCCRYPT_OID_INFO info;
|
||||
+
|
||||
+ info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
|
||||
+ signedCert->SignatureAlgorithm.pszObjId, 0);
|
||||
+ if (!info || info->dwGroupId != CRYPT_SIGN_ALG_OID_GROUP_ID)
|
||||
+ {
|
||||
+ SetLastError(NTE_BAD_ALGID);
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ if (info->u.Algid == CALG_OID_INFO_CNG_ONLY)
|
||||
+ return verify_signature_bcrypt(hCryptProv, dwCertEncodingType, pubKeyInfo, signedCert, info);
|
||||
+ else
|
||||
+ return verify_signature_crypt(hCryptProv, dwCertEncodingType, pubKeyInfo, signedCert, info);
|
||||
+}
|
||||
+
|
||||
BOOL WINAPI CryptVerifyCertificateSignatureEx(HCRYPTPROV_LEGACY hCryptProv,
|
||||
DWORD dwCertEncodingType, DWORD dwSubjectType, void *pvSubject,
|
||||
DWORD dwIssuerType, void *pvIssuer, DWORD dwFlags, void *pvReserved)
|
||||
diff --git a/dlls/crypt32/tests/chain.c b/dlls/crypt32/tests/chain.c
|
||||
index 1279735e496..e3b280b0884 100644
|
||||
--- a/dlls/crypt32/tests/chain.c
|
||||
+++ b/dlls/crypt32/tests/chain.c
|
||||
@@ -3945,7 +3945,7 @@ static ChainCheck chainCheckECDSA = {
|
||||
{ CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER },
|
||||
{ CERT_TRUST_IS_UNTRUSTED_ROOT, 0 },
|
||||
1, simpleStatusECDSA
|
||||
- }, TODO_ERROR
|
||||
+ }, 0
|
||||
};
|
||||
|
||||
#define test_name_blob(a,b) _test_name_blob(__LINE__,a,b)
|
||||
@@ -4226,7 +4226,7 @@ static void testGetCertChain(void)
|
||||
chain = getChain(NULL, &chainCheckECDSA.certs, 0, TRUE, &nov2017, FALSE, 0);
|
||||
if (chain)
|
||||
{
|
||||
- todo_wine ok(chain->TrustStatus.dwErrorStatus == CERT_TRUST_IS_UNTRUSTED_ROOT,
|
||||
+ 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);
|
||||
--
|
||||
2.14.1
|
||||
|
@@ -1,4 +1,5 @@
|
||||
Fixes: [42191] Add semi-stub for D3D11 deferred context implementation
|
||||
Fixes: [43743] No 3D graphics in Wolcen: Lords of Mayhem
|
||||
Fixes: [44089] Correcly align the mapinfo buffer.
|
||||
#This is pretty dumb.
|
||||
Depends: nvapi-Stub_DLL
|
||||
|
@@ -1,3 +1,3 @@
|
||||
# Causes regression on latest nVidia Driver
|
||||
Fixes: [45066] - Enable CPU access for dynamic buffers.
|
||||
# Written for bug 45066, but causes regression on latest nVidia drivers.
|
||||
Fixes: Enable CPU access for dynamic buffers.
|
||||
Disabled: true
|
||||
|
@@ -1,7 +1,7 @@
|
||||
From 46fa101a9cab46e4a0ed28e8cb9e4e199b0a0f81 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Costa <titan.costa@gmail.com>
|
||||
Date: Sat, 1 Nov 2014 13:08:05 +0100
|
||||
Subject: [PATCH] d3dx9_36: Add dxtn support.
|
||||
From 9acf83e4be20fe0ce12df7c966a748bf8524f26f Mon Sep 17 00:00:00 2001
|
||||
From: Kyle Devir <kyle.devir@mykolab.com>
|
||||
Date: Fri, 30 Mar 2018 08:22:02 +0000
|
||||
Subject: [PATCH] d3dx9_36: add DXTn support
|
||||
|
||||
---
|
||||
dlls/d3dx9_24/Makefile.in | 2 +-
|
||||
@@ -17,7 +17,7 @@ Subject: [PATCH] d3dx9_36: Add dxtn support.
|
||||
dlls/d3dx9_34/Makefile.in | 2 +-
|
||||
dlls/d3dx9_35/Makefile.in | 2 +-
|
||||
dlls/d3dx9_36/Makefile.in | 2 +-
|
||||
dlls/d3dx9_36/surface.c | 103 +++++++++++++++++++++++++++++++++++++++---
|
||||
dlls/d3dx9_36/surface.c | 100 +++++++++++++++++++++++++++++++++++++++---
|
||||
dlls/d3dx9_36/tests/surface.c | 8 ++--
|
||||
dlls/d3dx9_37/Makefile.in | 2 +-
|
||||
dlls/d3dx9_38/Makefile.in | 2 +-
|
||||
@@ -26,10 +26,10 @@ Subject: [PATCH] d3dx9_36: Add dxtn support.
|
||||
dlls/d3dx9_41/Makefile.in | 2 +-
|
||||
dlls/d3dx9_42/Makefile.in | 2 +-
|
||||
dlls/d3dx9_43/Makefile.in | 2 +-
|
||||
22 files changed, 120 insertions(+), 31 deletions(-)
|
||||
22 files changed, 117 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/dlls/d3dx9_24/Makefile.in b/dlls/d3dx9_24/Makefile.in
|
||||
index 482c92d..d969a55 100644
|
||||
index 482c92d64e..d969a55b10 100644
|
||||
--- a/dlls/d3dx9_24/Makefile.in
|
||||
+++ b/dlls/d3dx9_24/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -41,7 +41,7 @@ index 482c92d..d969a55 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_25/Makefile.in b/dlls/d3dx9_25/Makefile.in
|
||||
index be4c769..b232290 100644
|
||||
index be4c76980e..b232290d25 100644
|
||||
--- a/dlls/d3dx9_25/Makefile.in
|
||||
+++ b/dlls/d3dx9_25/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -53,7 +53,7 @@ index be4c769..b232290 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_26/Makefile.in b/dlls/d3dx9_26/Makefile.in
|
||||
index c5e9e85..525009d 100644
|
||||
index c5e9e85bfb..525009d292 100644
|
||||
--- a/dlls/d3dx9_26/Makefile.in
|
||||
+++ b/dlls/d3dx9_26/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -65,7 +65,7 @@ index c5e9e85..525009d 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_27/Makefile.in b/dlls/d3dx9_27/Makefile.in
|
||||
index ee7f0e2..da98482 100644
|
||||
index ee7f0e2449..da98482d24 100644
|
||||
--- a/dlls/d3dx9_27/Makefile.in
|
||||
+++ b/dlls/d3dx9_27/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -77,7 +77,7 @@ index ee7f0e2..da98482 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_28/Makefile.in b/dlls/d3dx9_28/Makefile.in
|
||||
index 0944200..d50e035 100644
|
||||
index 094420013d..d50e035853 100644
|
||||
--- a/dlls/d3dx9_28/Makefile.in
|
||||
+++ b/dlls/d3dx9_28/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -89,7 +89,7 @@ index 0944200..d50e035 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_29/Makefile.in b/dlls/d3dx9_29/Makefile.in
|
||||
index 88cb110..cfc1a15 100644
|
||||
index 88cb110ff5..cfc1a15034 100644
|
||||
--- a/dlls/d3dx9_29/Makefile.in
|
||||
+++ b/dlls/d3dx9_29/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -101,7 +101,7 @@ index 88cb110..cfc1a15 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_30/Makefile.in b/dlls/d3dx9_30/Makefile.in
|
||||
index 6ab2ff2..726c92e 100644
|
||||
index 6ab2ff2451..726c92e8fd 100644
|
||||
--- a/dlls/d3dx9_30/Makefile.in
|
||||
+++ b/dlls/d3dx9_30/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -113,7 +113,7 @@ index 6ab2ff2..726c92e 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_31/Makefile.in b/dlls/d3dx9_31/Makefile.in
|
||||
index 3d44da1..2014301 100644
|
||||
index 3d44da147d..201430127c 100644
|
||||
--- a/dlls/d3dx9_31/Makefile.in
|
||||
+++ b/dlls/d3dx9_31/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -125,7 +125,7 @@ index 3d44da1..2014301 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_32/Makefile.in b/dlls/d3dx9_32/Makefile.in
|
||||
index 37cc279..442258d 100644
|
||||
index 37cc2797af..442258d8f3 100644
|
||||
--- a/dlls/d3dx9_32/Makefile.in
|
||||
+++ b/dlls/d3dx9_32/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -137,7 +137,7 @@ index 37cc279..442258d 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_33/Makefile.in b/dlls/d3dx9_33/Makefile.in
|
||||
index 5b03ec1..cc98ed2 100644
|
||||
index 5b03ec134d..cc98ed2501 100644
|
||||
--- a/dlls/d3dx9_33/Makefile.in
|
||||
+++ b/dlls/d3dx9_33/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -149,7 +149,7 @@ index 5b03ec1..cc98ed2 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_34/Makefile.in b/dlls/d3dx9_34/Makefile.in
|
||||
index b7f9c46..4862fe9 100644
|
||||
index b7f9c46d5e..4862fe94af 100644
|
||||
--- a/dlls/d3dx9_34/Makefile.in
|
||||
+++ b/dlls/d3dx9_34/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -161,7 +161,7 @@ index b7f9c46..4862fe9 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_35/Makefile.in b/dlls/d3dx9_35/Makefile.in
|
||||
index 9c196ea..3f529c9 100644
|
||||
index 9c196ea038..3f529c9915 100644
|
||||
--- a/dlls/d3dx9_35/Makefile.in
|
||||
+++ b/dlls/d3dx9_35/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -173,7 +173,7 @@ index 9c196ea..3f529c9 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in
|
||||
index da8098d..166031e 100644
|
||||
index da8098dd8d..166031e6a4 100644
|
||||
--- a/dlls/d3dx9_36/Makefile.in
|
||||
+++ b/dlls/d3dx9_36/Makefile.in
|
||||
@@ -1,7 +1,7 @@
|
||||
@@ -186,7 +186,7 @@ index da8098d..166031e 100644
|
||||
C_SRCS = \
|
||||
animation.c \
|
||||
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
|
||||
index d1af90c..a1e56bd 100644
|
||||
index d1af90ccd1..73a1cbde1a 100644
|
||||
--- a/dlls/d3dx9_36/surface.c
|
||||
+++ b/dlls/d3dx9_36/surface.c
|
||||
@@ -27,6 +27,8 @@
|
||||
@@ -198,7 +198,7 @@ index d1af90c..a1e56bd 100644
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
|
||||
|
||||
|
||||
@@ -1817,6 +1819,27 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic
|
||||
@@ -1817,6 +1819,24 @@ void point_filter_argb_pixels(const BYTE *src, UINT src_row_pitch, UINT src_slic
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,13 +210,10 @@ index d1af90c..a1e56bd 100644
|
||||
+ switch (format)
|
||||
+ {
|
||||
+ case D3DFMT_DXT1:
|
||||
+ if (!wined3d_dxtn_supported()) return NULL;
|
||||
+ return encode ? wined3d_dxt1_encode : wined3d_dxt1_decode;
|
||||
+ case D3DFMT_DXT3:
|
||||
+ if (!wined3d_dxtn_supported()) return NULL;
|
||||
+ return encode ? wined3d_dxt3_encode : wined3d_dxt3_decode;
|
||||
+ case D3DFMT_DXT5:
|
||||
+ if (!wined3d_dxtn_supported()) return NULL;
|
||||
+ return encode ? wined3d_dxt5_encode : wined3d_dxt5_decode;
|
||||
+ default:
|
||||
+ return NULL;
|
||||
@@ -226,7 +223,7 @@ index d1af90c..a1e56bd 100644
|
||||
/************************************************************
|
||||
* D3DXLoadSurfaceFromMemory
|
||||
*
|
||||
@@ -1858,6 +1881,7 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
@@ -1858,6 +1878,7 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
D3DSURFACE_DESC surfdesc;
|
||||
D3DLOCKED_RECT lockrect;
|
||||
struct volume src_size, dst_size;
|
||||
@@ -234,7 +231,7 @@ index d1af90c..a1e56bd 100644
|
||||
|
||||
TRACE("(%p, %p, %s, %p, %#x, %u, %p, %s, %#x, 0x%08x)\n",
|
||||
dst_surface, dst_palette, wine_dbgstr_rect(dst_rect), src_memory, src_format,
|
||||
@@ -1939,8 +1963,15 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
@@ -1939,8 +1960,15 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
}
|
||||
else /* Stretching or format conversion. */
|
||||
{
|
||||
@@ -252,7 +249,7 @@ index d1af90c..a1e56bd 100644
|
||||
{
|
||||
FIXME("Unsupported format conversion %#x -> %#x.\n", src_format, surfdesc.Format);
|
||||
return E_NOTIMPL;
|
||||
@@ -1949,10 +1980,52 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
@@ -1949,10 +1977,52 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
if (FAILED(IDirect3DSurface9_LockRect(dst_surface, &lockrect, dst_rect, 0)))
|
||||
return D3DXERR_INVALIDDATA;
|
||||
|
||||
@@ -307,7 +304,7 @@ index d1af90c..a1e56bd 100644
|
||||
}
|
||||
else /* if ((filter & 0xf) == D3DX_FILTER_POINT) */
|
||||
{
|
||||
@@ -1961,14 +2034,30 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
@@ -1961,14 +2031,30 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
|
||||
|
||||
/* Always apply a point filter until D3DX_FILTER_LINEAR,
|
||||
* D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented. */
|
||||
@@ -342,7 +339,7 @@ index d1af90c..a1e56bd 100644
|
||||
|
||||
/************************************************************
|
||||
diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c
|
||||
index 753b302..680f59c 100644
|
||||
index 753b30273d..680f59ca21 100644
|
||||
--- a/dlls/d3dx9_36/tests/surface.c
|
||||
+++ b/dlls/d3dx9_36/tests/surface.c
|
||||
@@ -1205,7 +1205,7 @@ static void test_D3DXLoadSurface(IDirect3DDevice9 *device)
|
||||
@@ -377,7 +374,7 @@ index 753b302..680f59c 100644
|
||||
check_release((IUnknown*)newsurf, 1);
|
||||
check_release((IUnknown*)tex, 0);
|
||||
diff --git a/dlls/d3dx9_37/Makefile.in b/dlls/d3dx9_37/Makefile.in
|
||||
index ab790a4..51382c7 100644
|
||||
index ab790a4d5c..51382c7109 100644
|
||||
--- a/dlls/d3dx9_37/Makefile.in
|
||||
+++ b/dlls/d3dx9_37/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -389,7 +386,7 @@ index ab790a4..51382c7 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_38/Makefile.in b/dlls/d3dx9_38/Makefile.in
|
||||
index 6125c2d..f6257cb 100644
|
||||
index 6125c2da67..f6257cbdec 100644
|
||||
--- a/dlls/d3dx9_38/Makefile.in
|
||||
+++ b/dlls/d3dx9_38/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -401,7 +398,7 @@ index 6125c2d..f6257cb 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_39/Makefile.in b/dlls/d3dx9_39/Makefile.in
|
||||
index d97a787..a68ee9f 100644
|
||||
index d97a787c67..a68ee9f3ad 100644
|
||||
--- a/dlls/d3dx9_39/Makefile.in
|
||||
+++ b/dlls/d3dx9_39/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -413,7 +410,7 @@ index d97a787..a68ee9f 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_40/Makefile.in b/dlls/d3dx9_40/Makefile.in
|
||||
index 36c5a21..7f2cfe1 100644
|
||||
index 36c5a210cd..7f2cfe1a47 100644
|
||||
--- a/dlls/d3dx9_40/Makefile.in
|
||||
+++ b/dlls/d3dx9_40/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -425,7 +422,7 @@ index 36c5a21..7f2cfe1 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_41/Makefile.in b/dlls/d3dx9_41/Makefile.in
|
||||
index d4552cf..c5c3ab1 100644
|
||||
index d4552cf608..c5c3ab1aae 100644
|
||||
--- a/dlls/d3dx9_41/Makefile.in
|
||||
+++ b/dlls/d3dx9_41/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -437,7 +434,7 @@ index d4552cf..c5c3ab1 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_42/Makefile.in b/dlls/d3dx9_42/Makefile.in
|
||||
index 5806fce..e9a8e89 100644
|
||||
index 5806fce66c..e9a8e89da5 100644
|
||||
--- a/dlls/d3dx9_42/Makefile.in
|
||||
+++ b/dlls/d3dx9_42/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -449,7 +446,7 @@ index 5806fce..e9a8e89 100644
|
||||
|
||||
C_SRCS = \
|
||||
diff --git a/dlls/d3dx9_43/Makefile.in b/dlls/d3dx9_43/Makefile.in
|
||||
index 72ba8b4..33185bf 100644
|
||||
index 72ba8b4c1e..33185bf7a8 100644
|
||||
--- a/dlls/d3dx9_43/Makefile.in
|
||||
+++ b/dlls/d3dx9_43/Makefile.in
|
||||
@@ -1,6 +1,6 @@
|
||||
@@ -461,5 +458,5 @@ index 72ba8b4..33185bf 100644
|
||||
|
||||
C_SRCS = \
|
||||
--
|
||||
1.9.1
|
||||
2.16.3
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
From e8e425059101d8c719a8aea674f1c1da3d9a1085 Mon Sep 17 00:00:00 2001
|
||||
From b1655e88c9c7b4b87ae87d06261ce3db4fac1432 Mon Sep 17 00:00:00 2001
|
||||
From: Christian Costa <titan.costa@gmail.com>
|
||||
Date: Sun, 26 May 2013 19:42:08 +0200
|
||||
Subject: d3dx9_36: Implement ID3DXFontImpl_DrawText.
|
||||
Subject: [PATCH] d3dx9_36: Implement ID3DXFontImpl_DrawText.
|
||||
|
||||
Changes by Sebastian Lackner <sebastian@fds-team.de>:
|
||||
* Use pitch value for locked buffer instead of assuming that pitch = width * bytesperpixel
|
||||
@@ -21,10 +21,10 @@ Changes by Sebastian Lackner <sebastian@fds-team.de>:
|
||||
1 file changed, 210 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/dlls/d3dx9_36/font.c b/dlls/d3dx9_36/font.c
|
||||
index dd1243e..7152dab 100644
|
||||
index 5522dea..916ce4c 100644
|
||||
--- a/dlls/d3dx9_36/font.c
|
||||
+++ b/dlls/d3dx9_36/font.c
|
||||
@@ -36,8 +36,29 @@ struct d3dx_font
|
||||
@@ -35,8 +35,29 @@ struct d3dx_font
|
||||
|
||||
HDC hdc;
|
||||
HFONT hfont;
|
||||
@@ -54,7 +54,7 @@ index dd1243e..7152dab 100644
|
||||
static inline struct d3dx_font *impl_from_ID3DXFont(ID3DXFont *iface)
|
||||
{
|
||||
return CONTAINING_RECORD(iface, struct d3dx_font, ID3DXFont_iface);
|
||||
@@ -64,19 +85,27 @@ static HRESULT WINAPI ID3DXFontImpl_QueryInterface(ID3DXFont *iface, REFIID riid
|
||||
@@ -63,19 +84,27 @@ static HRESULT WINAPI ID3DXFontImpl_QueryInterface(ID3DXFont *iface, REFIID riid
|
||||
static ULONG WINAPI ID3DXFontImpl_AddRef(ID3DXFont *iface)
|
||||
{
|
||||
struct d3dx_font *This = impl_from_ID3DXFont(iface);
|
||||
@@ -85,7 +85,7 @@ index dd1243e..7152dab 100644
|
||||
DeleteObject(This->hfont);
|
||||
DeleteDC(This->hdc);
|
||||
IDirect3DDevice9_Release(This->device);
|
||||
@@ -179,17 +208,170 @@ static HRESULT WINAPI ID3DXFontImpl_PreloadTextW(ID3DXFont *iface, const WCHAR *
|
||||
@@ -178,17 +207,170 @@ static HRESULT WINAPI ID3DXFontImpl_PreloadTextW(ID3DXFont *iface, const WCHAR *
|
||||
static INT WINAPI ID3DXFontImpl_DrawTextA(ID3DXFont *iface, ID3DXSprite *sprite,
|
||||
const char *string, INT count, RECT *rect, DWORD format, D3DCOLOR color)
|
||||
{
|
||||
@@ -260,7 +260,7 @@ index dd1243e..7152dab 100644
|
||||
}
|
||||
|
||||
static HRESULT WINAPI ID3DXFontImpl_OnLostDevice(ID3DXFont *iface)
|
||||
@@ -303,46 +485,55 @@ HRESULT WINAPI D3DXCreateFontIndirectW(IDirect3DDevice9 *device, const D3DXFONT_
|
||||
@@ -302,46 +484,55 @@ HRESULT WINAPI D3DXCreateFontIndirectW(IDirect3DDevice9 *device, const D3DXFONT_
|
||||
|
||||
TRACE("(%p, %p, %p)\n", device, desc, font);
|
||||
|
||||
@@ -329,5 +329,5 @@ index dd1243e..7152dab 100644
|
||||
return D3D_OK;
|
||||
}
|
||||
--
|
||||
2.4.5
|
||||
1.9.1
|
||||
|
||||
|
@@ -1,19 +1,20 @@
|
||||
From f28e6a98185ce7dd1137f2f04861c097e75e72a9 Mon Sep 17 00:00:00 2001
|
||||
From 657fcdbe239c1c1b37414acb82df75a27f643f38 Mon Sep 17 00:00:00 2001
|
||||
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
Date: Fri, 4 Dec 2015 09:22:35 +1100
|
||||
Subject: d3dx9_36: Support NULL terminated strings in ID3DXFont_DrawText
|
||||
Subject: [PATCH] d3dx9_36: Support NULL terminated strings in
|
||||
ID3DXFont_DrawText
|
||||
|
||||
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
||||
---
|
||||
dlls/d3dx9_36/font.c | 10 ++++++++--
|
||||
dlls/d3dx9_36/tests/core.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 53 insertions(+), 3 deletions(-)
|
||||
dlls/d3dx9_36/tests/core.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 52 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/d3dx9_36/font.c b/dlls/d3dx9_36/font.c
|
||||
index d6dcd6c..63aa828 100644
|
||||
index 921dada..518a9dc 100644
|
||||
--- a/dlls/d3dx9_36/font.c
|
||||
+++ b/dlls/d3dx9_36/font.c
|
||||
@@ -214,9 +214,12 @@ static INT WINAPI ID3DXFontImpl_DrawTextA(ID3DXFont *iface, ID3DXSprite *sprite,
|
||||
@@ -213,9 +213,12 @@ static INT WINAPI ID3DXFontImpl_DrawTextA(ID3DXFont *iface, ID3DXSprite *sprite,
|
||||
TRACE("iface %p, sprite %p, string %s, count %d, rect %s, format %#x, color 0x%08x\n",
|
||||
iface, sprite, debugstr_a(string), count, wine_dbgstr_rect(rect), format, color);
|
||||
|
||||
@@ -27,7 +28,7 @@ index d6dcd6c..63aa828 100644
|
||||
countW = MultiByteToWideChar(CP_ACP, 0, string, count, NULL, 0);
|
||||
stringW = HeapAlloc(GetProcessHeap(), 0, countW * sizeof(WCHAR));
|
||||
if (stringW)
|
||||
@@ -239,9 +242,12 @@ static INT WINAPI ID3DXFontImpl_DrawTextW(ID3DXFont *iface, ID3DXSprite *sprite,
|
||||
@@ -238,9 +241,12 @@ static INT WINAPI ID3DXFontImpl_DrawTextW(ID3DXFont *iface, ID3DXSprite *sprite,
|
||||
TRACE("iface %p, sprite %p, string %s, count %d, rect %s, format %#x, color 0x%08x\n",
|
||||
iface, sprite, debugstr_w(string), count, wine_dbgstr_rect(rect), format, color);
|
||||
|
||||
@@ -42,28 +43,19 @@ index d6dcd6c..63aa828 100644
|
||||
while (count > 0 && !string[count-1])
|
||||
count--;
|
||||
diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
|
||||
index 1c379fb..c931260 100644
|
||||
index 91e458b..b95c23f 100644
|
||||
--- a/dlls/d3dx9_36/tests/core.c
|
||||
+++ b/dlls/d3dx9_36/tests/core.c
|
||||
@@ -321,6 +321,8 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
|
||||
{ 12, 256, 5 },
|
||||
{ 72, 256, 8 }
|
||||
};
|
||||
+ static const WCHAR testW[] = {'t','e','s','t',0};
|
||||
@@ -306,6 +306,7 @@ static void test_ID3DXSprite(IDirect3DDevice9 *device)
|
||||
static void test_ID3DXFont(IDirect3DDevice9 *device)
|
||||
{
|
||||
static const WCHAR testW[] = {'t','e','s','t',0};
|
||||
+ static const char testA[] = "test";
|
||||
static const struct
|
||||
{
|
||||
int font_height;
|
||||
@@ -637,6 +638,49 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
|
||||
|
||||
|
||||
/* D3DXCreateFont */
|
||||
@@ -463,7 +465,6 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
|
||||
/* ID3DXFont_PreloadText */
|
||||
hr = D3DXCreateFontA(device, 12, 0, FW_DONTCARE, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial", &font);
|
||||
if(SUCCEEDED(hr)) {
|
||||
- const WCHAR testW[] = {'t','e','s','t',0};
|
||||
|
||||
todo_wine {
|
||||
hr = ID3DXFont_PreloadTextA(font, NULL, -1);
|
||||
@@ -591,6 +592,49 @@ static void test_ID3DXFont(IDirect3DDevice9 *device)
|
||||
}
|
||||
ID3DXFont_Release(font);
|
||||
}
|
||||
+
|
||||
@@ -113,5 +105,5 @@ index 1c379fb..c931260 100644
|
||||
|
||||
static void test_D3DXCreateRenderToSurface(IDirect3DDevice9 *device)
|
||||
--
|
||||
2.6.2
|
||||
1.9.1
|
||||
|
||||
|
@@ -1,16 +1,17 @@
|
||||
From 342951349469b7a84f3226d02f04ca5401982273 Mon Sep 17 00:00:00 2001
|
||||
From 51ba80615215fac54b251e56a374dfab9a2b834b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sat, 15 Aug 2015 02:59:17 +0200
|
||||
Subject: dxdiagn: Enumerate DirectSound devices and add some basic properties.
|
||||
Subject: [PATCH] dxdiagn: Enumerate DirectSound devices and add some basic
|
||||
properties.
|
||||
|
||||
---
|
||||
dlls/dxdiagn/Makefile.in | 2 +-
|
||||
dlls/dxdiagn/provider.c | 91 ++++++++++++++++++++++++++
|
||||
dlls/dxdiagn/tests/container.c | 141 +++++++++++++++++++++++++++++++++++++++++
|
||||
dlls/dxdiagn/provider.c | 91 +++++++++++++++++++++
|
||||
dlls/dxdiagn/tests/container.c | 141 +++++++++++++++++++++++++++++++++
|
||||
3 files changed, 233 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in
|
||||
index 3a1017e9d0a..87f6177aadf 100644
|
||||
index c16396e464b..e926d3b2a8a 100644
|
||||
--- a/dlls/dxdiagn/Makefile.in
|
||||
+++ b/dlls/dxdiagn/Makefile.in
|
||||
@@ -1,5 +1,5 @@
|
||||
@@ -21,18 +22,18 @@ index 3a1017e9d0a..87f6177aadf 100644
|
||||
C_SRCS = \
|
||||
container.c \
|
||||
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
|
||||
index 5665d01d5b8..20998bc9aba 100644
|
||||
index 1fdab5e2db0..6fb9e585dbd 100644
|
||||
--- a/dlls/dxdiagn/provider.c
|
||||
+++ b/dlls/dxdiagn/provider.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "fil_data.h"
|
||||
#include "wine/fil_data.h"
|
||||
#include "psapi.h"
|
||||
#include "wbemcli.h"
|
||||
+#include "dsound.h"
|
||||
|
||||
#include "wine/debug.h"
|
||||
|
||||
@@ -1195,11 +1196,85 @@ static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node)
|
||||
@@ -1354,11 +1355,85 @@ static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node)
|
||||
return fill_display_information_fallback(node);
|
||||
}
|
||||
|
||||
@@ -118,7 +119,7 @@ index 5665d01d5b8..20998bc9aba 100644
|
||||
IDxDiagContainerImpl_Container *cont;
|
||||
|
||||
cont = allocate_information_node(DxDiag_SoundDevices);
|
||||
@@ -1208,12 +1283,28 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
|
||||
@@ -1367,12 +1442,28 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
|
||||
|
||||
add_subcontainer(node, cont);
|
||||
|
||||
@@ -148,7 +149,7 @@ index 5665d01d5b8..20998bc9aba 100644
|
||||
}
|
||||
|
||||
diff --git a/dlls/dxdiagn/tests/container.c b/dlls/dxdiagn/tests/container.c
|
||||
index 5bc5161635a..2ffe0fb685b 100644
|
||||
index 936707632a4..c80717cd392 100644
|
||||
--- a/dlls/dxdiagn/tests/container.c
|
||||
+++ b/dlls/dxdiagn/tests/container.c
|
||||
@@ -36,6 +36,11 @@ static IDxDiagContainer *pddc;
|
||||
@@ -163,7 +164,7 @@ index 5bc5161635a..2ffe0fb685b 100644
|
||||
|
||||
/* Based on debugstr_variant in dlls/jscript/jsutils.c. */
|
||||
static const char *debugstr_variant(const VARIANT *var)
|
||||
@@ -1020,6 +1025,140 @@ cleanup:
|
||||
@@ -1022,6 +1027,140 @@ cleanup:
|
||||
IDxDiagProvider_Release(pddp);
|
||||
}
|
||||
|
||||
@@ -304,7 +305,7 @@ index 5bc5161635a..2ffe0fb685b 100644
|
||||
START_TEST(container)
|
||||
{
|
||||
CoInitialize(NULL);
|
||||
@@ -1034,5 +1173,7 @@ START_TEST(container)
|
||||
@@ -1036,5 +1175,7 @@ START_TEST(container)
|
||||
test_root_children();
|
||||
test_DxDiag_SystemInfo();
|
||||
test_DxDiag_DisplayDevices();
|
||||
@@ -313,5 +314,5 @@ index 5bc5161635a..2ffe0fb685b 100644
|
||||
CoUninitialize();
|
||||
}
|
||||
--
|
||||
2.11.0
|
||||
2.18.0
|
||||
|
||||
|
@@ -1,18 +1,18 @@
|
||||
From 8f0f5577096155171dceb98ee28c570533a9a89c Mon Sep 17 00:00:00 2001
|
||||
From a539993bd7c60424fb6d592be8cb5040959e1b48 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Sun, 17 Apr 2016 19:58:15 +0800
|
||||
Subject: kernel32/tests: Add some tests for GetLongPathName/GetShortPathName
|
||||
called with a wildcard.
|
||||
Subject: [PATCH] kernel32/tests: Add some tests for
|
||||
GetLongPathName/GetShortPathName called with a wildcard.
|
||||
|
||||
---
|
||||
dlls/kernel32/tests/path.c | 24 ++++++++++++++++++++++--
|
||||
1 file changed, 22 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
|
||||
index 079820f..0dc8802 100644
|
||||
index ca1cbf3..1e698bf 100644
|
||||
--- a/dlls/kernel32/tests/path.c
|
||||
+++ b/dlls/kernel32/tests/path.c
|
||||
@@ -1170,7 +1170,7 @@ static void test_GetTempPath(void)
|
||||
@@ -1186,7 +1186,7 @@ static void test_GetTempPath(void)
|
||||
static void test_GetLongPathNameA(void)
|
||||
{
|
||||
DWORD length, explength, hostsize;
|
||||
@@ -21,7 +21,7 @@ index 079820f..0dc8802 100644
|
||||
char longpath[MAX_PATH];
|
||||
char unc_prefix[MAX_PATH];
|
||||
char unc_short[MAX_PATH], unc_long[MAX_PATH];
|
||||
@@ -1181,7 +1181,17 @@ static void test_GetLongPathNameA(void)
|
||||
@@ -1197,7 +1197,17 @@ static void test_GetLongPathNameA(void)
|
||||
return;
|
||||
|
||||
GetTempPathA(MAX_PATH, tempfile);
|
||||
@@ -40,7 +40,7 @@ index 079820f..0dc8802 100644
|
||||
|
||||
file = CreateFileA(tempfile, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
CloseHandle(file);
|
||||
@@ -1385,6 +1395,7 @@ static void test_GetShortPathNameW(void)
|
||||
@@ -1401,6 +1411,7 @@ static void test_GetShortPathNameW(void)
|
||||
static const WCHAR name[] = { 't', 'e', 's', 't', 0 };
|
||||
static const WCHAR backSlash[] = { '\\', 0 };
|
||||
static const WCHAR a_bcdeW[] = {'a','.','b','c','d','e',0};
|
||||
@@ -48,8 +48,8 @@ index 079820f..0dc8802 100644
|
||||
WCHAR path[MAX_PATH], tmppath[MAX_PATH], *ptr;
|
||||
WCHAR short_path[MAX_PATH];
|
||||
DWORD length;
|
||||
@@ -1447,6 +1458,15 @@ static void test_GetShortPathNameW(void)
|
||||
length = GetShortPathNameW( path, short_path, sizeof(short_path)/sizeof(*short_path) );
|
||||
@@ -1463,6 +1474,15 @@ static void test_GetShortPathNameW(void)
|
||||
length = GetShortPathNameW( path, short_path, ARRAY_SIZE( short_path ));
|
||||
ok( length, "GetShortPathNameW failed: %u.\n", GetLastError() );
|
||||
|
||||
+ lstrcpyW(ptr, wildW);
|
||||
@@ -65,5 +65,5 @@ index 079820f..0dc8802 100644
|
||||
ok( ret, "Cannot delete file.\n" );
|
||||
*ptr = 0;
|
||||
--
|
||||
2.7.1
|
||||
1.9.1
|
||||
|
||||
|
@@ -1,28 +0,0 @@
|
||||
From 46302575f68264f8b097a663bee06e8624fa69ad Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 1 May 2016 16:45:31 +0200
|
||||
Subject: kernel32: Fill stack with meaningful values in call_process_entry
|
||||
mis-align workaround.
|
||||
|
||||
---
|
||||
dlls/kernel32/process.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
|
||||
index 4771108..28ec659 100644
|
||||
--- a/dlls/kernel32/process.c
|
||||
+++ b/dlls/kernel32/process.c
|
||||
@@ -1064,7 +1064,9 @@ __ASM_GLOBAL_FUNC( call_process_entry,
|
||||
__ASM_CFI(".cfi_rel_offset %ebp,0\n\t")
|
||||
"movl %esp,%ebp\n\t"
|
||||
__ASM_CFI(".cfi_def_cfa_register %ebp\n\t")
|
||||
- "subl $12,%esp\n\t" /* deliberately mis-align the stack by 8, Doom 3 needs this */
|
||||
+ "pushl 4(%ebp)\n\t" /* deliberately mis-align the stack by 8, Doom 3 needs this */
|
||||
+ "pushl 4(%ebp)\n\t" /* Driller expects readable address at this offset */
|
||||
+ "pushl 4(%ebp)\n\t"
|
||||
"pushl 8(%ebp)\n\t"
|
||||
"call *12(%ebp)\n\t"
|
||||
"leave\n\t"
|
||||
--
|
||||
2.8.0
|
||||
|
@@ -1 +0,0 @@
|
||||
Fixes: [24374] Fill stack with meaningful values in call_process_entry mis-align workaround
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user