Sync to Wine-0_9_3: Juan Lang juan_lang@yahoo.com - Implement more OID support functions. Use the exported OID support functions internally. Move OID support functions and stubs to a separate file. - Fix parameter count on some stubs (thanks to Marcus Meissner for spotting that.) Add a few more stubs. - Fix some memory leaks. Stefan Leichter Stefan.Leichter@camLine.com - Added stub for CryptVerifyMessageSignature. Modified: trunk/reactos/lib/crypt32/cert.c Modified: trunk/reactos/lib/crypt32/crypt32.spec Modified: trunk/reactos/lib/crypt32/crypt32.xml Modified: trunk/reactos/lib/crypt32/crypt32_private.h Modified: trunk/reactos/lib/crypt32/encode.c Modified: trunk/reactos/lib/crypt32/main.c Added: trunk/reactos/lib/crypt32/oid.c Modified: trunk/reactos/w32api/include/wincrypt.h _____
Modified: trunk/reactos/lib/crypt32/cert.c --- trunk/reactos/lib/crypt32/cert.c 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/lib/crypt32/cert.c 2005-12-12 22:56:08 UTC (rev 20131) @@ -3285,15 +3285,12 @@
return ret; }
-HCRYPTOIDFUNCSET WINAPI CryptInitOIDFunctionSet(LPCSTR pszFuncName, DWORD dwFlags) +BOOL WINAPI CryptVerifyMessageSignature(/*PCRYPT_VERIFY_MESSAGE_PARA*/ void* pVerifyPara, + DWORD dwSignerIndex, const BYTE* pbSignedBlob, DWORD cbSignedBlob, + BYTE* pbDecoded, DWORD* pcbDecoded, PCCERT_CONTEXT* ppSignerCert) { - FIXME("stub: %s %lx\n", debugstr_a(pszFuncName), dwFlags); - return NULL; -} - -BOOL WINAPI CryptUnregisterDefaultOIDFunction(DWORD dwEncodingType, - LPCSTR pszFuncName, LPCWSTR pwszDll) -{ - FIXME("stub: %lx %s %s\n", dwEncodingType, debugstr_a(pszFuncName), debugstr_w(pwszDll)); + FIXME("stub: %p, %ld, %p, %ld, %p, %p, %p\n", + pVerifyPara, dwSignerIndex, pbSignedBlob, cbSignedBlob, + pbDecoded, pcbDecoded, ppSignerCert); return FALSE; } _____
Modified: trunk/reactos/lib/crypt32/crypt32.spec --- trunk/reactos/lib/crypt32/crypt32.spec 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/lib/crypt32/crypt32.spec 2005-12-12 22:56:08 UTC (rev 20131) @@ -105,13 +105,13 @@
@ stdcall CryptExportPublicKeyInfoEx(long long long str long ptr ptr ptr) @ stub CryptFindOIDInfo @ stub CryptFormatObject -@ stub CryptFreeOIDFunctionAddress +@ stdcall CryptFreeOIDFunctionAddress(long long) @ stub CryptGetAsyncParam -@ stub CryptGetDefaultOIDDllList -@ stub CryptGetDefaultOIDFunctionAddress +@ stdcall CryptGetDefaultOIDDllList(long long ptr ptr) +@ stdcall CryptGetDefaultOIDFunctionAddress(long long wstr long ptr ptr) @ stub CryptGetMessageCertificates @ stub CryptGetMessageSignerCount -@ stub CryptGetOIDFunctionAddress +@ stdcall CryptGetOIDFunctionAddress(long long str long ptr ptr) @ stdcall CryptGetOIDFunctionValue(long str str wstr ptr ptr ptr) @ stdcall CryptHashCertificate(long long long ptr long ptr ptr) @ stub CryptHashMessage @@ -121,7 +121,7 @@ @ stdcall CryptImportPublicKeyInfo(long long ptr ptr) @ stdcall CryptImportPublicKeyInfoEx(long long ptr long long ptr ptr) @ stdcall CryptInitOIDFunctionSet(str long) -@ stub CryptInstallOIDFunctionAddress +@ stdcall CryptInstallOIDFunctionAddress(ptr long str long ptr long) @ stub CryptLoadSip @ stdcall CryptMemAlloc(long) @ stdcall CryptMemFree(ptr) @@ -165,16 +165,16 @@ @ stub CryptVerifyDetachedMessageHash @ stub CryptVerifyDetachedMessageSignature @ stub CryptVerifyMessageHash -@ stub CryptVerifyMessageSignature +@ stdcall CryptVerifyMessageSignature(ptr long ptr long ptr ptr ptr) @ stub CryptVerifyMessageSignatureWithKey @ stub CryptVerifySignatureU @ stdcall I_CryptAllocTls() -@ stdcall I_CryptCreateLruCache(long long) +@ stdcall I_CryptCreateLruCache(ptr ptr) @ stub I_CryptCreateLruEntry @ stdcall I_CryptDetachTls(long) -@ stdcall I_CryptFindLruEntryData(long) -@ stdcall I_CryptFlushLruCache(long) -@ stdcall I_CryptFreeLruCache(long) +@ stdcall I_CryptFindLruEntryData(long long long) +@ stdcall I_CryptFlushLruCache(ptr long long) +@ stdcall I_CryptFreeLruCache(ptr long long) @ stdcall I_CryptFreeTls(long long) @ stub I_CryptGetDefaultCryptProv @ stub I_CryptGetDefaultCryptProvForEncrypt _____
Modified: trunk/reactos/lib/crypt32/crypt32.xml --- trunk/reactos/lib/crypt32/crypt32.xml 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/lib/crypt32/crypt32.xml 2005-12-12 22:56:08 UTC (rev 20131) @@ -11,6 +11,7 @@
<file>main.c</file> <file>encode.c</file> <file>cert.c</file> + <file>oid.c</file> <file>protectdata.c</file> <file>crypt32.rc</file> <file>crypt32.spec</file> _____
Modified: trunk/reactos/lib/crypt32/crypt32_private.h --- trunk/reactos/lib/crypt32/crypt32_private.h 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/lib/crypt32/crypt32_private.h 2005-12-12 22:56:08 UTC (rev 20131) @@ -24,4 +24,7 @@
*/ HCRYPTPROV CRYPT_GetDefaultProvider(void);
+void CRYPT_InitFunctionSets(void); +void CRYPT_FreeFunctionSets(void); + #endif _____
Modified: trunk/reactos/lib/crypt32/encode.c --- trunk/reactos/lib/crypt32/encode.c 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/lib/crypt32/encode.c 2005-12-12 22:56:08 UTC (rev 20131) @@ -1,5 +1,4 @@
/* - * Copyright 2002 Mike McCormack for CodeWeavers * Copyright 2005 Juan Lang * * This library is free software; you can redistribute it and/or @@ -67,8 +66,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
-static const WCHAR szDllName[] = { 'D','l','l',0 }; - typedef BOOL (WINAPI *CryptEncodeObjectFunc)(DWORD, LPCSTR, const void *, BYTE *, DWORD *); typedef BOOL (WINAPI *CryptEncodeObjectExFunc)(DWORD, LPCSTR, const void *, @@ -182,260 +179,12 @@ return EXCEPTION_CONTINUE_SEARCH; }
-static char *CRYPT_GetKeyName(DWORD dwEncodingType, LPCSTR pszFuncName, - LPCSTR pszOID) -{ - static const char szEncodingTypeFmt[] = - "Software\Microsoft\Cryptography\OID\EncodingType %ld\%s\%s"; - UINT len; - char numericOID[7]; /* enough for "#65535" */ - const char *oid; - LPSTR szKey; - - /* MSDN says the encoding type is a mask, but it isn't treated that way. - * (E.g., if dwEncodingType were 3, the key names "EncodingType 1" and - * "EncodingType 2" would be expected if it were a mask. Instead native - * stores values in "EncodingType 3". - */ - if (!HIWORD(pszOID)) - { - snprintf(numericOID, sizeof(numericOID), "#%d", LOWORD(pszOID)); - oid = numericOID; - } - else - oid = pszOID; - - /* This is enough: the lengths of the two string parameters are explicitly - * counted, and we need up to five additional characters for the encoding - * type. These are covered by the "%d", "%s", and "%s" characters in the - * format specifier that are removed by sprintf. - */ - len = sizeof(szEncodingTypeFmt) + lstrlenA(pszFuncName) + lstrlenA(oid); - szKey = CryptMemAlloc(len); - if (szKey) - sprintf(szKey, szEncodingTypeFmt, dwEncodingType, pszFuncName, oid); - return szKey; -} - -BOOL WINAPI CryptRegisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, - LPCSTR pszOID, LPCWSTR pwszDll, LPCSTR pszOverrideFuncName) -{ - LONG r; - HKEY hKey; - LPSTR szKey; - - TRACE("%lx %s %s %s %s\n", dwEncodingType, pszFuncName, pszOID, - debugstr_w(pwszDll), pszOverrideFuncName); - - /* This only registers functions for encoding certs, not messages */ - if (!GET_CERT_ENCODING_TYPE(dwEncodingType)) - return TRUE; - - /* Native does nothing pwszDll is NULL */ - if (!pwszDll) - return TRUE; - - /* I'm not matching MS bug for bug here, because I doubt any app depends on - * it: - * - native "succeeds" if pszFuncName is NULL, but the nonsensical entry - * it creates would never be used - * - native returns an HRESULT rather than a Win32 error if pszOID is NULL. - * Instead I disallow both of these with ERROR_INVALID_PARAMETER. - */ - if (!pszFuncName || !pszOID) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - szKey = CRYPT_GetKeyName(dwEncodingType, pszFuncName, pszOID); - TRACE("Key name is %s\n", debugstr_a(szKey)); - - if (!szKey) - return FALSE; - - r = RegCreateKeyA(HKEY_LOCAL_MACHINE, szKey, &hKey); - CryptMemFree(szKey); - if(r != ERROR_SUCCESS) - return FALSE; - - /* write the values */ - if (pszOverrideFuncName) - RegSetValueExA(hKey, "FuncName", 0, REG_SZ, (const BYTE*)pszOverrideFuncName, - lstrlenA(pszOverrideFuncName) + 1); - RegSetValueExW(hKey, szDllName, 0, REG_SZ, (const BYTE*) pwszDll, - (lstrlenW(pwszDll) + 1) * sizeof (WCHAR)); - - RegCloseKey(hKey); - return TRUE; -} - -BOOL WINAPI CryptUnregisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, - LPCSTR pszOID) -{ - LPSTR szKey; - LONG rc; - - TRACE("%lx %s %s\n", dwEncodingType, pszFuncName, pszOID); - - if (!GET_CERT_ENCODING_TYPE(dwEncodingType)) - return TRUE; - - if (!pszFuncName || !pszOID) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - szKey = CRYPT_GetKeyName(dwEncodingType, pszFuncName, pszOID); - rc = RegDeleteKeyA(HKEY_LOCAL_MACHINE, szKey); - CryptMemFree(szKey); - if (rc) - SetLastError(rc); - return rc ? FALSE : TRUE; -} - -BOOL WINAPI CryptGetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName, - LPCSTR pszOID, LPCWSTR pwszValueName, DWORD *pdwValueType, BYTE *pbValueData, - DWORD *pcbValueData) -{ - LPSTR szKey; - LONG rc; - HKEY hKey; - - TRACE("%lx %s %s %s %p %p %p\n", dwEncodingType, debugstr_a(pszFuncName), - debugstr_a(pszOID), debugstr_w(pwszValueName), pdwValueType, pbValueData, - pcbValueData); - - if (!GET_CERT_ENCODING_TYPE(dwEncodingType)) - return TRUE; - - if (!pszFuncName || !pszOID || !pwszValueName) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - szKey = CRYPT_GetKeyName(dwEncodingType, pszFuncName, pszOID); - rc = RegOpenKeyA(HKEY_LOCAL_MACHINE, szKey, &hKey); - CryptMemFree(szKey); - if (rc) - SetLastError(rc); - else - { - rc = RegQueryValueExW(hKey, pwszValueName, NULL, pdwValueType, - pbValueData, pcbValueData); - if (rc) - SetLastError(rc); - RegCloseKey(hKey); - } - return rc ? FALSE : TRUE; -} - -BOOL WINAPI CryptSetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName, - LPCSTR pszOID, LPCWSTR pwszValueName, DWORD dwValueType, - const BYTE *pbValueData, DWORD cbValueData) -{ - LPSTR szKey; - LONG rc; - HKEY hKey; - - TRACE("%lx %s %s %s %ld %p %ld\n", dwEncodingType, debugstr_a(pszFuncName), - debugstr_a(pszOID), debugstr_w(pwszValueName), dwValueType, pbValueData, - cbValueData); - - if (!GET_CERT_ENCODING_TYPE(dwEncodingType)) - return TRUE; - - if (!pszFuncName || !pszOID || !pwszValueName) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - szKey = CRYPT_GetKeyName(dwEncodingType, pszFuncName, pszOID); - rc = RegOpenKeyA(HKEY_LOCAL_MACHINE, szKey, &hKey); - CryptMemFree(szKey); - if (rc) - SetLastError(rc); - else - { - rc = RegSetValueExW(hKey, pwszValueName, 0, dwValueType, pbValueData, - cbValueData); - if (rc) - SetLastError(rc); - RegCloseKey(hKey); - } - return rc ? FALSE : TRUE; -} - -/* Gets the registered function named szFuncName for dwCertEncodingType and - * lpszStructType, or NULL if one could not be found. *lib will be set to the - * handle of the module it's in, or NULL if no module was loaded. If the - * return value is NULL, *lib will also be NULL, to simplify error handling. - */ -static void *CRYPT_GetFunc(DWORD dwCertEncodingType, LPCSTR lpszStructType, - LPCSTR szFuncName, HMODULE *lib) -{ - void *ret = NULL; - char *szKey = CRYPT_GetKeyName(dwCertEncodingType, szFuncName, - lpszStructType); - const char *funcName; - long r; - HKEY hKey; - DWORD type, size = 0; - - TRACE("(%08lx %s %s %p)\n", dwCertEncodingType, debugstr_a(lpszStructType), - debugstr_a(szFuncName), lib); - - *lib = NULL; - r = RegOpenKeyA(HKEY_LOCAL_MACHINE, szKey, &hKey); - CryptMemFree(szKey); - if(r != ERROR_SUCCESS) - return NULL; - - RegQueryValueExA(hKey, "FuncName", NULL, &type, NULL, &size); - if (GetLastError() == ERROR_MORE_DATA && type == REG_SZ) - { - funcName = CryptMemAlloc(size); - RegQueryValueExA(hKey, "FuncName", NULL, &type, (LPBYTE)funcName, - &size); - } - else - funcName = szFuncName; - RegQueryValueExW(hKey, szDllName, NULL, &type, NULL, &size); - if (GetLastError() == ERROR_MORE_DATA && type == REG_SZ) - { - LPWSTR dllName = CryptMemAlloc(size); - - RegQueryValueExW(hKey, szDllName, NULL, &type, (LPBYTE)dllName, - &size); - *lib = LoadLibraryW(dllName); - if (*lib) - { - ret = GetProcAddress(*lib, funcName); - if (!ret) - { - /* Unload the library, the caller doesn't want to unload it - * when the return value is NULL. - */ - FreeLibrary(*lib); - *lib = NULL; - } - } - CryptMemFree(dllName); - } - if (funcName != szFuncName) - CryptMemFree((char *)funcName); - TRACE("returning %p\n", ret); - return ret; -} - BOOL WINAPI CryptEncodeObject(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded) { + static HCRYPTOIDFUNCSET set = NULL; BOOL ret = FALSE; - HMODULE lib; + HCRYPTOIDFUNCADDR hFunc; CryptEncodeObjectFunc pCryptEncodeObject;
TRACE("(0x%08lx, %s, %p, %p, %p)\n", dwCertEncodingType, @@ -449,14 +198,15 @@ }
/* Try registered DLL first.. */ - pCryptEncodeObject = - (CryptEncodeObjectFunc)CRYPT_GetFunc(dwCertEncodingType, - lpszStructType, CRYPT_OID_ENCODE_OBJECT_FUNC, &lib); + if (!set) + set = CryptInitOIDFunctionSet(CRYPT_OID_ENCODE_OBJECT_FUNC, 0); + CryptGetOIDFunctionAddress(set, dwCertEncodingType, lpszStructType, 0, + (void **)&pCryptEncodeObject, &hFunc); if (pCryptEncodeObject) { ret = pCryptEncodeObject(dwCertEncodingType, lpszStructType, pvStructInfo, pbEncoded, pcbEncoded); - FreeLibrary(lib); + CryptFreeOIDFunctionAddress(hFunc, 0); } else { @@ -2272,9 +2022,10 @@ const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, void *pvEncoded, DWORD *pcbEncoded) { + static HCRYPTOIDFUNCSET set = NULL; BOOL ret = FALSE; - HMODULE lib = NULL; CryptEncodeObjectExFunc encodeFunc = NULL; + HCRYPTOIDFUNCADDR hFunc = NULL;
TRACE("(0x%08lx, %s, %p, 0x%08lx, %p, %p, %p)\n", dwCertEncodingType, debugstr_a(lpszStructType), pvStructInfo, dwFlags, pEncodePara, @@ -2384,15 +2135,19 @@ TRACE("OID %s not found or unimplemented, looking for DLL\n", debugstr_a(lpszStructType)); if (!encodeFunc) - encodeFunc = (CryptEncodeObjectExFunc)CRYPT_GetFunc(dwCertEncodingType, - lpszStructType, CRYPT_OID_ENCODE_OBJECT_EX_FUNC, &lib); + { + if (!set) + set = CryptInitOIDFunctionSet(CRYPT_OID_ENCODE_OBJECT_EX_FUNC, 0); + CryptGetOIDFunctionAddress(set, dwCertEncodingType, lpszStructType, 0, + (void **)&encodeFunc, &hFunc); + } if (encodeFunc) ret = encodeFunc(dwCertEncodingType, lpszStructType, pvStructInfo, dwFlags, pEncodePara, pvEncoded, pcbEncoded); else SetLastError(ERROR_FILE_NOT_FOUND); - if (lib) - FreeLibrary(lib); + if (hFunc) + CryptFreeOIDFunctionAddress(hFunc, 0); return ret; }
@@ -2400,9 +2155,10 @@ const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo) { + static HCRYPTOIDFUNCSET set = NULL; BOOL ret = FALSE; - HMODULE lib; CryptDecodeObjectFunc pCryptDecodeObject; + HCRYPTOIDFUNCADDR hFunc;
TRACE("(0x%08lx, %s, %p, %ld, 0x%08lx, %p, %p)\n", dwCertEncodingType, debugstr_a(lpszStructType), pbEncoded, cbEncoded, dwFlags, @@ -2415,14 +2171,15 @@ }
/* Try registered DLL first.. */ - pCryptDecodeObject = - (CryptDecodeObjectFunc)CRYPT_GetFunc(dwCertEncodingType, - lpszStructType, CRYPT_OID_DECODE_OBJECT_FUNC, &lib); + if (!set) + set = CryptInitOIDFunctionSet(CRYPT_OID_DECODE_OBJECT_FUNC, 0); + CryptGetOIDFunctionAddress(set, dwCertEncodingType, lpszStructType, 0, + (void **)&pCryptDecodeObject, &hFunc); if (pCryptDecodeObject) { ret = pCryptDecodeObject(dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo); - FreeLibrary(lib); + CryptFreeOIDFunctionAddress(hFunc, 0); } else { @@ -5386,9 +5143,10 @@ const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) { + static HCRYPTOIDFUNCSET set = NULL; BOOL ret = FALSE; - HMODULE lib = NULL; CryptDecodeObjectExFunc decodeFunc = NULL; + HCRYPTOIDFUNCADDR hFunc = NULL;
TRACE("(0x%08lx, %s, %p, %ld, 0x%08lx, %p, %p, %p)\n", dwCertEncodingType, debugstr_a(lpszStructType), pbEncoded, @@ -5508,15 +5266,19 @@ TRACE("OID %s not found or unimplemented, looking for DLL\n", debugstr_a(lpszStructType)); if (!decodeFunc) - decodeFunc = (CryptDecodeObjectExFunc)CRYPT_GetFunc(dwCertEncodingType, - lpszStructType, CRYPT_OID_DECODE_OBJECT_EX_FUNC, &lib); + { + if (!set) + set = CryptInitOIDFunctionSet(CRYPT_OID_DECODE_OBJECT_EX_FUNC, 0); + CryptGetOIDFunctionAddress(set, dwCertEncodingType, lpszStructType, 0, + (void **)&decodeFunc, &hFunc); + } if (decodeFunc) ret = decodeFunc(dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo); else SetLastError(ERROR_FILE_NOT_FOUND); - if (lib) - FreeLibrary(lib); + if (hFunc) + CryptFreeOIDFunctionAddress(hFunc, 0); return ret; }
@@ -5609,9 +5371,10 @@ DWORD dwCertEncodingType, LPSTR pszPublicKeyObjId, DWORD dwFlags, void *pvAuxInfo, PCERT_PUBLIC_KEY_INFO pInfo, DWORD *pcbInfo) { + static HCRYPTOIDFUNCSET set = NULL; BOOL ret; ExportPublicKeyInfoExFunc exportFunc = NULL; - HMODULE lib = NULL; + HCRYPTOIDFUNCADDR hFunc = NULL;
TRACE("(%ld, %ld, %08lx, %s, %08lx, %p, %p, %p)\n", hCryptProv, dwKeySpec, dwCertEncodingType, debugstr_a(pszPublicKeyObjId), dwFlags, pvAuxInfo, @@ -5624,14 +5387,19 @@ }
if (pszPublicKeyObjId) - exportFunc = CRYPT_GetFunc(dwCertEncodingType, pszPublicKeyObjId, - CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC, &lib); + { + if (!set) + set = CryptInitOIDFunctionSet(CRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNC, + 0); + CryptGetOIDFunctionAddress(set, dwCertEncodingType, pszPublicKeyObjId, + 0, (void **)&exportFunc, &hFunc); + } if (!exportFunc) exportFunc = CRYPT_ExportRsaPublicKeyInfoEx; ret = exportFunc(hCryptProv, dwKeySpec, dwCertEncodingType, pszPublicKeyObjId, dwFlags, pvAuxInfo, pInfo, pcbInfo); - if (lib) - FreeLibrary(lib); + if (hFunc) + CryptFreeOIDFunctionAddress(hFunc, 0); return ret; }
@@ -5682,20 +5450,23 @@ DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo, ALG_ID aiKeyAlg, DWORD dwFlags, void *pvAuxInfo, HCRYPTKEY *phKey) { + static HCRYPTOIDFUNCSET set = NULL; BOOL ret; ImportPublicKeyInfoExFunc importFunc = NULL; - HMODULE lib = NULL; + HCRYPTOIDFUNCADDR hFunc = NULL;
TRACE("(%ld, %ld, %p, %d, %08lx, %p, %p)\n", hCryptProv, dwCertEncodingType, pInfo, aiKeyAlg, dwFlags, pvAuxInfo, phKey);
- importFunc = CRYPT_GetFunc(dwCertEncodingType, pInfo->Algorithm.pszObjId, - CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC, &lib); + if (!set) + set = CryptInitOIDFunctionSet(CRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNC, 0); + CryptGetOIDFunctionAddress(set, dwCertEncodingType, + pInfo->Algorithm.pszObjId, 0, (void **)&importFunc, &hFunc); if (!importFunc) importFunc = CRYPT_ImportRsaPublicKeyInfoEx; ret = importFunc(hCryptProv, dwCertEncodingType, pInfo, aiKeyAlg, dwFlags, pvAuxInfo, phKey); - if (lib) - FreeLibrary(lib); + if (hFunc) + CryptFreeOIDFunctionAddress(hFunc, 0); return ret; } _____
Modified: trunk/reactos/lib/crypt32/main.c --- trunk/reactos/lib/crypt32/main.c 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/lib/crypt32/main.c 2005-12-12 22:56:08 UTC (rev 20131) @@ -38,7 +38,11 @@
{ switch (fdwReason) { + case DLL_PROCESS_ATTACH: + CRYPT_InitFunctionSets(); + break; case DLL_PROCESS_DETACH: + CRYPT_FreeFunctionSets(); if (hDefProv) CryptReleaseContext(hDefProv, 0); break; } @@ -53,30 +57,37 @@ return hDefProv; }
-/* this function is called by Internet Explorer when it is about to verify a downloaded component */ -BOOL WINAPI I_CryptCreateLruCache(DWORD x, DWORD y) +typedef void * HLRUCACHE; + +/* this function is called by Internet Explorer when it is about to verify a + * downloaded component. The first parameter appears to be a pointer to an + * unknown type, native fails unless it points to a buffer of at least 20 bytes. + * The second parameter appears to be an out parameter, whatever it's set to is + * passed (by cryptnet.dll) to I_CryptFlushLruCache. + */ +BOOL WINAPI I_CryptCreateLruCache(void *unknown, HLRUCACHE *out) { - FIXME("stub!\n"); - return FALSE; + FIXME("(%p, %p): stub!\n", unknown, out); + *out = (void *)0xbaadf00d; + return TRUE; }
-/* these functions all have an unknown number of args */ -BOOL WINAPI I_CryptFindLruEntryData(DWORD x) +BOOL WINAPI I_CryptFindLruEntryData(DWORD unk0, DWORD unk1, DWORD unk2) { - FIXME("stub!\n"); + FIXME("(%08lx, %08lx, %08lx): stub!\n", unk0, unk1, unk2); return FALSE; }
-BOOL WINAPI I_CryptFlushLruCache(DWORD x) +DWORD WINAPI I_CryptFlushLruCache(HLRUCACHE h, DWORD unk0, DWORD unk1) { - FIXME("stub!\n"); - return FALSE; + FIXME("(%p, %08lx, %08lx): stub!\n", h, unk0, unk1); + return 0; }
-BOOL WINAPI I_CryptFreeLruCache(DWORD x) +HLRUCACHE WINAPI I_CryptFreeLruCache(HLRUCACHE h, DWORD unk0, DWORD unk1) { - FIXME("stub!\n"); - return FALSE; + FIXME("(%p, %08lx, %08lx): stub!\n", h, unk0, unk1); + return h; }
BOOL WINAPI CryptSIPRemoveProvider(GUID *pgProv) @@ -206,15 +217,6 @@ return FALSE; }
-BOOL WINAPI CryptRegisterDefaultOIDFunction(DWORD dwEncodingType, - LPCSTR pszFuncName, DWORD dwIndex, - LPCWSTR pwszDll) -{ - FIXME("(%lx,%s,%lx,%s) stub!\n", dwEncodingType, pszFuncName, dwIndex, - debugstr_w(pwszDll)); - return FALSE; -} - struct OIDToAlgID { LPCSTR oid; _____
Copied: trunk/reactos/lib/crypt32/oid.c (from rev 20129, vendor/wine/dlls/crypt32/current/oid.c) Property changes on: trunk/reactos/lib/crypt32/oid.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Modified: trunk/reactos/w32api/include/wincrypt.h --- trunk/reactos/w32api/include/wincrypt.h 2005-12-12 22:52:16 UTC (rev 20130) +++ trunk/reactos/w32api/include/wincrypt.h 2005-12-12 22:56:08 UTC (rev 20131) @@ -967,6 +967,8 @@
#define CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAG \ CERT_RDN_DISABLE_IE4_UTF8_FLAG
+#define CRYPT_GET_INSTALLED_OID_FUNC_FLAG 0x1 + /* types for CertOpenStore dwEncodingType */ #define CERT_ENCODING_TYPE_MASK 0x0000ffff #define CMSG_ENCODING_TYPE_MASK 0xffff0000 @@ -1699,6 +1701,16 @@ typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_CONTROL)(HCERTSTOREPROV hStoreProv, DWORD dwFlags, DWORD dwCtrlType, void const *pvCtrlPara);
+typedef struct _CRYPT_OID_FUNC_ENTRY { + LPCSTR pszOID; + void *pvFuncAddr; +} CRYPT_OID_FUNC_ENTRY, *PCRYPT_OID_FUNC_ENTRY; + +typedef BOOL (WINAPI *PFN_CRYPT_ENUM_OID_FUNC)(DWORD dwEncodingType, + LPCSTR pszFuncName, LPCSTR pszOID, DWORD cValue, const DWORD rgdwValueType[], + LPCWSTR const rgpwszValueName[], const BYTE * const rgpbValueData[], + const DWORD rgcbValueData[], void *pvArg); + /* subject types for CryptVerifyCertificateSignatureEx */ #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB 1 #define CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT 2 @@ -1817,6 +1829,34 @@ BOOL WINAPI CryptEncodeObject(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, BYTE *pbEncoded, DWORD *pcbEncoded); BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, void *pvEncoded, DWORD *pcbEncoded);
+BOOL WINAPI CryptRegisterDefaultOIDFunction(DWORD,LPCSTR,DWORD,LPCWSTR); +BOOL WINAPI CryptRegisterOIDFunction(DWORD,LPCSTR,LPCSTR,LPCWSTR,LPCSTR); +BOOL WINAPI CryptGetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName, + LPCSTR pszOID, LPCWSTR szValueName, DWORD *pdwValueType, + BYTE *pbValueData, DWORD *pcbValueData); +BOOL WINAPI CryptSetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName, + LPCSTR pszOID, LPCWSTR pwszValueName, DWORD dwValueType, + const BYTE *pbValueData, DWORD cbValueData); +BOOL WINAPI CryptUnregisterDefaultOIDFunction(DWORD,LPCSTR,LPCWSTR); +BOOL WINAPI CryptUnregisterOIDFunction(DWORD,LPCSTR,LPCSTR); +BOOL WINAPI CryptEnumOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, + LPCSTR pszOID, DWORD dwFlags, void *pvArg, + PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc); +HCRYPTOIDFUNCSET WINAPI CryptInitOIDFunctionSet(LPCSTR,DWORD); +BOOL WINAPI CryptGetDefaultOIDDllList(HCRYPTOIDFUNCSET hFuncSet, + DWORD dwEncodingType, LPWSTR pwszDllList, DWORD *pcchDllList); +BOOL WINAPI CryptGetDefaultOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet, + DWORD dwEncodingType, LPCWSTR pwszDll, DWORD dwFlags, void *ppvFuncAddr, + HCRYPTOIDFUNCADDR *phFuncAddr); +BOOL WINAPI CryptGetOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet, + DWORD dwEncodingType, LPCSTR pszOID, DWORD dwFlags, void **ppvFuncAddr, + HCRYPTOIDFUNCADDR *phFuncAddr); +BOOL WINAPI CryptFreeOIDFunctionAddress(HCRYPTOIDFUNCADDR hFuncAddr, + DWORD dwFlags); +BOOL WINAPI CryptInstallOIDFunctionAddress(HMODULE hModule, + DWORD dwEncodingType, LPCSTR pszFuncName, DWORD cFuncEntry, + const CRYPT_OID_FUNC_ENTRY rgFuncEntry[], DWORD dwFlags); + #ifdef UNICODE #define CertNameToStr CertNameToStrW #define CryptAcquireContext CryptAcquireContextW