[vlc-devel] [PATCH 1/7] contrib: fix gnutls usage on Winstore builds
Steve Lhomme
robux4 at gmail.com
Mon Sep 14 14:40:40 CEST 2015
---
contrib/src/gnutls/rules.mak | 3 +
contrib/src/gnutls/winstore.patch | 221 ++++++++++++++++++++++++++++++++++++++
2 files changed, 224 insertions(+)
create mode 100644 contrib/src/gnutls/winstore.patch
diff --git a/contrib/src/gnutls/rules.mak b/contrib/src/gnutls/rules.mak
index 5bd49b6..ccb7ae1 100644
--- a/contrib/src/gnutls/rules.mak
+++ b/contrib/src/gnutls/rules.mak
@@ -31,6 +31,9 @@ endif
ifdef HAVE_MACOSX
$(APPLY) $(SRC)/gnutls/gnutls-pkgconfig-osx.patch
endif
+ifdef HAVE_WINRT
+ $(APPLY) $(SRC)/gnutls/winstore.patch
+endif
$(call pkg_static,"lib/gnutls.pc.in")
$(UPDATE_AUTOCONFIG)
$(MOVE)
diff --git a/contrib/src/gnutls/winstore.patch b/contrib/src/gnutls/winstore.patch
new file mode 100644
index 0000000..578bac8
--- /dev/null
+++ b/contrib/src/gnutls/winstore.patch
@@ -0,0 +1,221 @@
+--- gnutls/lib/nettle/rnd.c 2014-10-14 21:06:59.000000000 +0200
++++ gnutls/lib/nettle/rnd.c.winstore 2015-08-19 16:36:04.611989100 +0200
+@@ -151,7 +151,88 @@
+ #ifdef _WIN32
+
+ #include <windows.h>
++#include <winapifamily.h>
++#if (WINAPI_FAMILY == WINAPI_FAMILY_PC_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
++
++# define COBJMACROS
++# define INITGUID
++# include <winstring.h>
++# include <windows.security.cryptography.h>
++# ifndef _MSC_VER /* roapi.h is a C++ include file that doesn't work with C files */
++# include <roapi.h>
++# else /* _MSC_VER */
++DECLSPEC_IMPORT HRESULT WINAPI RoGetActivationFactory(HSTRING activatableClassId, REFIID iid, void **factory);
++typedef __x_ABI_CWindows_CSecurity_CCryptography_CICryptographicBufferStatics ICryptographicBufferStatics;
++typedef __x_ABI_CWindows_CStorage_CStreams_CIBuffer IBuffer;
++# define ICryptographicBufferStatics_Release __x_ABI_CWindows_CSecurity_CCryptography_CICryptographicBufferStatics_Release
++# define ICryptographicBufferStatics_CopyToByteArray __x_ABI_CWindows_CSecurity_CCryptography_CICryptographicBufferStatics_CopyToByteArray
++# define IBuffer_Release __x_ABI_CWindows_CStorage_CStreams_CIBuffer_Release
++# define ICryptographicBufferStatics_GenerateRandom __x_ABI_CWindows_CSecurity_CCryptography_CICryptographicBufferStatics_GenerateRandom
++DEFINE_GUID(IID_ICryptographicBufferStatics, 0x320b7e22, 0x3cb0, 0x4cdf, 0x86,0x63, 0x1d,0x28,0x91,0x00,0x65,0xeb);
++# endif /* _MSC_VER */
++
++#define PROV_RSA_FULL 1
++#define MS_DEF_PROV L"Microsoft Base Cryptographic Provider v1.0"
++#define CRYPT_SILENT 0x40
++#define CRYPT_VERIFYCONTEXT 0xF0000000
++
++typedef ICryptographicBufferStatics *HCRYPTPROV;
++
++/* __forceinline */ BOOL CryptAcquireContext(HCRYPTPROV *phProv, LPCTSTR pszContainer, LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
++{
++ static const WCHAR *className = L"Windows.Security.Cryptography.CryptographicBuffer";
++ const UINT32 clen = wcslen(className);
++
++ HSTRING hClassName = NULL;
++ HSTRING_HEADER header;
++ HRESULT hr = WindowsCreateStringReference(className, clen, &header, &hClassName);
++ if (FAILED(hr)) {
++ WindowsDeleteString(hClassName);
++ return FALSE;
++ }
++
++ ICryptographicBufferStatics *cryptoStatics = NULL;
++ hr = RoGetActivationFactory(hClassName, &IID_ICryptographicBufferStatics, (void**)&cryptoStatics);
++ WindowsDeleteString(hClassName);
++
++ if (FAILED(hr))
++ return FALSE;
++
++ *phProv = cryptoStatics;
++
++ return TRUE;
++}
++
++/* __forceinline */ BOOL CryptReleaseContext(HCRYPTPROV phProv, DWORD dwFlags)
++{
++ HRESULT hr = ICryptographicBufferStatics_Release(phProv);
++ return SUCCEEDED(hr) && dwFlags==0;
++}
++
++/* __forceinline */ BOOL CryptGenRandom(HCRYPTPROV phProv, DWORD dwLen, BYTE *pbBuffer)
++{
++ IBuffer *buffer = NULL;
++ HRESULT hr = ICryptographicBufferStatics_GenerateRandom(phProv, dwLen, &buffer);
++ if (FAILED(hr)) {
++ return FALSE;
++ }
++
++ UINT32 olength;
++ unsigned char *rnd = NULL;
++ hr = ICryptographicBufferStatics_CopyToByteArray(phProv, buffer, &olength, (BYTE**)&rnd);
++ if (FAILED(hr)) {
++ IBuffer_Release(buffer);
++ return FALSE;
++ }
++ memcpy(pbBuffer, rnd, dwLen);
++
++ IBuffer_Release(buffer);
++ return TRUE;
++}
++
++#else
+ #include <wincrypt.h>
++#endif
+
+ #define DEVICE_READ_SIZE 16
+ #define DEVICE_READ_SIZE_MAX 32
+@@ -205,6 +286,7 @@
+ {
+ RND_LOCK;
+ CryptReleaseContext(device_fd, 0);
++ device_fd = 0;
+ RND_UNLOCK;
+
+ gnutls_mutex_deinit(&rnd_mutex);
+--- gnutls/lib/system.c 2015-08-19 17:14:07.987028900 +0200
++++ gnutls/lib/system.c.winstore 2015-08-19 17:34:15.699992400 +0200
+@@ -34,6 +34,111 @@
+
+ #ifdef _WIN32
+ #include <windows.h>
++#include <winapifamily.h>
++#if (WINAPI_FAMILY == WINAPI_FAMILY_PC_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
++# define COBJMACROS
++# define INITGUID
++# include <winstring.h>
++# include <windows.security.cryptography.core.h>
++
++# ifdef _MSC_VER /* roapi.h is a C++ include file that doesn't work with C files */
++DECLSPEC_IMPORT HRESULT WINAPI RoGetActivationFactory(HSTRING activatableClassId, REFIID iid, void **factory);
++# else /* _MSC_VER */
++# include <roapi.h>
++# endif /* _MSC_VER */
++typedef __x_ABI_CWindows_CSecurity_CCryptography_CCertificates_CICertificateStore ICertificateStore;
++typedef __x_ABI_CWindows_CSecurity_CCryptography_CCertificates_CICertificateStoresStatics ICertificateStoresStatics;
++#define ICertificateStoresStatics_Release __x_ABI_CWindows_CSecurity_CCryptography_CCertificates_CICertificateStoresStatics_Release
++#define ICertificateStoresStatics_get_TrustedRootCertificationAuthorities __x_ABI_CWindows_CSecurity_CCryptography_CCertificates_CICertificateStoresStatics_get_TrustedRootCertificationAuthorities
++#define ICertificateStoresStatics_get_IntermediateCertificationAuthorities __x_ABI_CWindows_CSecurity_CCryptography_CCertificates_CICertificateStoresStatics_get_IntermediateCertificationAuthorities
++DEFINE_GUID(IID_ICertificateStoresStatics, 0xFBECC739, 0xC6FE, 0x4DE7, 0x99, 0xCF, 0x74, 0xC3, 0xE5, 0x96, 0xE0, 0x32);
++
++typedef void *HCRYPTPROV_LEGACY;
++typedef ICertificateStore *HCERTSTORE;
++
++typedef struct {
++ DWORD dwCertEncodingType;
++ BYTE *pbCertEncoded;
++ DWORD cbCertEncoded;
++} CERT_CONTEXT;
++typedef const CERT_CONTEXT *PCCERT_CONTEXT;
++typedef struct {
++ DWORD dwCertEncodingType;
++ BYTE *pbCrlEncoded;
++ DWORD cbCrlEncoded;
++} CRL_CONTEXT;
++typedef const CRL_CONTEXT *PCCRL_CONTEXT;
++
++#define X509_ASN_ENCODING 1
++
++
++/* __forceinline */ HCERTSTORE CertOpenSystemStore(HCRYPTPROV_LEGACY hprov, LPCSTR szSubsystemProtocol)
++{
++ static const WCHAR *className = L"Windows.Security.Cryptography.Certificates";
++ const UINT32 clen = wcslen(className);
++
++ HSTRING hClassName = NULL;
++ HSTRING_HEADER header;
++ HRESULT hr = WindowsCreateStringReference(className, clen, &header, &hClassName);
++ if (FAILED(hr)) {
++ WindowsDeleteString(hClassName);
++ return NULL;
++ }
++
++ ICertificateStoresStatics *certStoresStatics = NULL;
++ hr = RoGetActivationFactory(hClassName, &IID_ICertificateStoresStatics, (void**)&certStoresStatics);
++ WindowsDeleteString(hClassName);
++
++ if (FAILED(hr))
++ return NULL;
++
++ if (!strcmp(szSubsystemProtocol, "ROOT"))
++ {
++ ICertificateStore *result;
++ hr = ICertificateStoresStatics_get_TrustedRootCertificationAuthorities(certStoresStatics, &result);
++ ICertificateStoresStatics_Release(certStoresStatics);
++ if (SUCCEEDED(hr))
++ {
++ return result;
++ }
++ }
++ else if (!strcmp(szSubsystemProtocol, "CA"))
++ {
++ ICertificateStore *result;
++ hr = ICertificateStoresStatics_get_IntermediateCertificationAuthorities(certStoresStatics, &result);
++ ICertificateStoresStatics_Release(certStoresStatics);
++ if (SUCCEEDED(hr))
++ {
++ return result;
++ }
++ }
++ else
++ {
++ ICertificateStoresStatics_Release(certStoresStatics);
++ }
++
++ return NULL;
++}
++
++/* __forceinline */ BOOL WINAPI CertCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
++{
++ HRESULT hr = ICertificateStoresStatics_Release(hCertStore);
++ return SUCCEEDED(hr);
++}
++
++__forceinline PCCERT_CONTEXT CertEnumCertificatesInStore(HCERTSTORE hCertStore, PCCERT_CONTEXT pPrevCertContext)
++{
++ return NULL;
++}
++
++__forceinline PCCRL_CONTEXT CertEnumCRLsInStore(HCERTSTORE hCertStore, PCCRL_CONTEXT pPrevCrlContext)
++{
++ return NULL;
++}
++
++#define Loaded_CertEnumCRLsInStore CertEnumCRLsInStore
++
++#else /* WINAPI_FAMILY */
+ #include <wincrypt.h>
+ #if defined(__MINGW32__) && !defined(__MINGW64__) && __MINGW32_MAJOR_VERSION <= 3 && __MINGW32_MINOR_VERSION <= 20
+ typedef PCCRL_CONTEXT WINAPI(*Type_CertEnumCRLsInStore) (HCERTSTORE
+@@ -45,6 +150,7 @@
+ #else
+ #define Loaded_CertEnumCRLsInStore CertEnumCRLsInStore
+ #endif
++#endif /* WINAPI_FAMILY */
+ #else
+ #ifdef HAVE_PTHREAD_LOCKS
+ #include <pthread.h>
--
2.5.1
More information about the vlc-devel
mailing list