---
mingw-w64-headers/include/wincrypt.h | 12 +--
mingw-w64-libraries/winstorecompat/Makefile.am | 1 +
mingw-w64-libraries/winstorecompat/src/Crypto.c | 113 ++++++++++++++++++++++++
3 files changed, 121 insertions(+), 5 deletions(-)
create mode 100644 mingw-w64-libraries/winstorecompat/src/Crypto.c
diff --git a/mingw-w64-headers/include/wincrypt.h
b/mingw-w64-headers/include/wincrypt.h
index a4d4055..3bd84ce 100644
--- a/mingw-w64-headers/include/wincrypt.h
+++ b/mingw-w64-headers/include/wincrypt.h
@@ -697,6 +697,13 @@ extern "C" {
#endif
#endif
+#if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) ||
defined(WINSTORECOMPAT)
+ WINIMPM WINBOOL WINAPI CryptAcquireContextA (HCRYPTPROV *phProv, LPCSTR
szContainer, LPCSTR szProvider, DWORD dwProvType, DWORD dwFlags);
+ WINIMPM WINBOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR
szContainer, LPCWSTR szProvider, DWORD dwProvType, DWORD dwFlags);
+#define CryptAcquireContext __MINGW_NAME_AW(CryptAcquireContext)
+ WINIMPM WINBOOL WINAPI CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags);
+ WINIMPM WINBOOL WINAPI CryptGenRandom (HCRYPTPROV hProv, DWORD dwLen, BYTE
*pbBuffer);
+#endif
#if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
typedef struct _CMS_DH_KEY_INFO {
DWORD dwVersion;
@@ -706,7 +713,6 @@ extern "C" {
void *pReserved;
} CMS_DH_KEY_INFO,*PCMS_DH_KEY_INFO;
-#define CryptAcquireContext __MINGW_NAME_AW(CryptAcquireContext)
#define CryptSignHash __MINGW_NAME_AW(CryptSignHash)
#define CryptVerifySignature __MINGW_NAME_AW(CryptVerifySignature)
#define CryptSetProvider __MINGW_NAME_AW(CryptSetProvider)
@@ -715,9 +721,6 @@ extern "C" {
#define CryptEnumProviderTypes __MINGW_NAME_AW(CryptEnumProviderTypes)
#define CryptEnumProviders __MINGW_NAME_AW(CryptEnumProviders)
- WINIMPM WINBOOL WINAPI CryptAcquireContextA (HCRYPTPROV *phProv, LPCSTR
szContainer, LPCSTR szProvider, DWORD dwProvType, DWORD dwFlags);
- WINIMPM WINBOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR
szContainer, LPCWSTR szProvider, DWORD dwProvType, DWORD dwFlags);
- WINIMPM WINBOOL WINAPI CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags);
WINIMPM WINBOOL WINAPI CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD
dwFlags, HCRYPTKEY *phKey);
WINIMPM WINBOOL WINAPI CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid,
HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey);
WINIMPM WINBOOL WINAPI CryptDestroyKey (HCRYPTKEY hKey);
@@ -727,7 +730,6 @@ extern "C" {
WINIMPM WINBOOL WINAPI CryptGetHashParam (HCRYPTHASH hHash, DWORD dwParam,
BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);
WINIMPM WINBOOL WINAPI CryptSetProvParam (HCRYPTPROV hProv, DWORD dwParam,
CONST BYTE *pbData, DWORD dwFlags);
WINIMPM WINBOOL WINAPI CryptGetProvParam (HCRYPTPROV hProv, DWORD dwParam,
BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags);
- WINIMPM WINBOOL WINAPI CryptGenRandom (HCRYPTPROV hProv, DWORD dwLen, BYTE
*pbBuffer);
WINIMPM WINBOOL WINAPI CryptGetUserKey (HCRYPTPROV hProv, DWORD dwKeySpec,
HCRYPTKEY *phUserKey);
WINIMPM WINBOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey,
DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen);
WINIMPM WINBOOL WINAPI CryptImportKey (HCRYPTPROV hProv, CONST BYTE *pbData,
DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey);
diff --git a/mingw-w64-libraries/winstorecompat/Makefile.am
b/mingw-w64-libraries/winstorecompat/Makefile.am
index 332d4bc..dee6f20 100644
--- a/mingw-w64-libraries/winstorecompat/Makefile.am
+++ b/mingw-w64-libraries/winstorecompat/Makefile.am
@@ -34,4 +34,5 @@ libwinstorecompat_a_SOURCES = \
src/Tls.c \
src/SHGetFolderPathW.c \
src/QueueTimer.c \
+ src/Crypto.c \
$(NULL)
diff --git a/mingw-w64-libraries/winstorecompat/src/Crypto.c
b/mingw-w64-libraries/winstorecompat/src/Crypto.c
new file mode 100644
index 0000000..4d58e9e
--- /dev/null
+++ b/mingw-w64-libraries/winstorecompat/src/Crypto.c
@@ -0,0 +1,113 @@
+/*
+ Copyright (c) 2016 mingw-w64 project
+
+ Contributing authors: Steve Lhomme, Hugo Beauzée-Luyssen
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+#define _WIN32_WINNT 0x602
+
+#define CryptAcquireContextW __CryptAcquireContextW
+#define CryptAcquireContextA __CryptAcquireContextA
+#define CryptReleaseContext __CryptReleaseContext
+#define CryptGenRandom __CryptGenRandom
+#define COBJMACROS
+#define INITGUID
+#include <windef.h>
+#include <windows.h>
+#include <windows.security.cryptography.h>
+#include <winstring.h>
+#include <roapi.h>
+#undef CertOpenSystemStore
+#undef CryptGenRandom
+#undef CryptReleaseContext
+#undef CryptAcquireContextA
+#undef CryptAcquireContextW
+
+#define HCRYPTPROV ICryptographicBufferStatics *
+
+BOOL WINAPI CryptAcquireContextW(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;
+}
+
+BOOL WINAPI CryptAcquireContextA(HCRYPTPROV *phProv, LPCTSTR pszContainer,
LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
+{
+ return FALSE;
+}
+
+BOOL WINAPI CryptReleaseContext(HCRYPTPROV phProv, DWORD dwFlags)
+{
+ HRESULT hr = ICryptographicBufferStatics_Release(phProv);
+ return SUCCEEDED(hr) && dwFlags==0;
+}
+
+BOOL WINAPI 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;
+}
+
+#ifndef _WIN64
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptAcquireContextW))(HCRYPTPROV*, LPCTSTR,
LPCTSTR, DWORD, DWORD) asm("__imp__CryptAcquireContextW@20") =
CryptAcquireContextW;
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptAcquireContextA))(HCRYPTPROV*, LPCTSTR,
LPCTSTR, DWORD, DWORD) asm("__imp__CryptAcquireContextA@20") =
CryptAcquireContextA;
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptReleaseContext))(HCRYPTPROV, DWORD)
asm("__imp__CryptReleaseContext@8") = CryptReleaseContext;
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptGenRandom))(HCRYPTPROV, DWORD, BYTE*)
asm("__imp__CryptGenRandom@12") = CryptGenRandom;
+#else
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptAcquireContextW))(HCRYPTPROV*, LPCTSTR,
LPCTSTR, DWORD, DWORD) asm("__imp_CryptAcquireContextW") = CryptAcquireContextW;
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptAcquireContextA))(HCRYPTPROV*, LPCTSTR,
LPCTSTR, DWORD, DWORD) asm("__imp_CryptAcquireContextA") = CryptAcquireContextA;
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptReleaseContext))(HCRYPTPROV, DWORD)
asm("__imp_CryptReleaseContext") = CryptReleaseContext;
+BOOL (WINAPI *__MINGW_IMP_SYMBOL(CryptGenRandom))(HCRYPTPROV, DWORD, BYTE*)
asm("__imp_CryptGenRandom") = CryptGenRandom;
+#endif
--
2.8.0.rc3
------------------------------------------------------------------------------
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public