Reactos

[CRYPT32] Sync with Wine Staging 4.0. CORE-15682

+584 -127
+65 -35
dll/win32/crypt32/cert.c
··· 28 28 #include "wine/winternl.h" 29 29 #define CRYPT_OID_INFO_HAS_EXTRA_FIELDS 30 30 #include "wincrypt.h" 31 + #include "snmp.h" 31 32 #include "bcrypt.h" 32 33 #include "winnls.h" 33 34 #include "rpc.h" ··· 532 533 provNameLen = (lstrlenW(info->pwszProvName) + 1) * sizeof(WCHAR); 533 534 data += provNameLen; 534 535 535 - info->rgProvParam = (PCRYPT_KEY_PROV_PARAM)data; 536 - data += info->cProvParam * sizeof(CRYPT_KEY_PROV_PARAM); 536 + if (info->cProvParam) 537 + { 538 + info->rgProvParam = (PCRYPT_KEY_PROV_PARAM)data; 539 + data += info->cProvParam * sizeof(CRYPT_KEY_PROV_PARAM); 537 540 538 - for (i = 0; i < info->cProvParam; i++) 539 - { 540 - info->rgProvParam[i].pbData = data; 541 - data += info->rgProvParam[i].cbData; 541 + for (i = 0; i < info->cProvParam; i++) 542 + { 543 + info->rgProvParam[i].pbData = data; 544 + data += info->rgProvParam[i].cbData; 545 + } 542 546 } 547 + else 548 + info->rgProvParam = NULL; 543 549 } 544 550 545 551 BOOL WINAPI CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext, ··· 1242 1248 1243 1249 TRACE("(%08x, %p, %p)\n", dwCertEncodingType, pPublicKey1, pPublicKey2); 1244 1250 1251 + /* RSA public key data should start with ASN_SEQUENCE, 1252 + * otherwise it's not a RSA_CSP_PUBLICKEYBLOB. 1253 + */ 1254 + if (!pPublicKey1->PublicKey.cbData || pPublicKey1->PublicKey.pbData[0] != ASN_SEQUENCE) 1255 + dwCertEncodingType = 0; 1256 + 1245 1257 switch (GET_CERT_ENCODING_TYPE(dwCertEncodingType)) 1246 1258 { 1247 1259 case 0: /* Seems to mean "raw binary bits" */ ··· 1267 1279 ret = FALSE; 1268 1280 if (CryptDecodeObject(dwCertEncodingType, RSA_CSP_PUBLICKEYBLOB, 1269 1281 pPublicKey1->PublicKey.pbData, pPublicKey1->PublicKey.cbData, 1270 - 0, NULL, &length)) 1282 + CRYPT_DECODE_ALLOC_FLAG, &pblob1, &length)) 1271 1283 { 1272 - pblob1 = CryptMemAlloc(length); 1273 1284 if (CryptDecodeObject(dwCertEncodingType, RSA_CSP_PUBLICKEYBLOB, 1274 - pPublicKey1->PublicKey.pbData, pPublicKey1->PublicKey.cbData, 1275 - 0, pblob1, &length)) 1285 + pPublicKey2->PublicKey.pbData, pPublicKey2->PublicKey.cbData, 1286 + CRYPT_DECODE_ALLOC_FLAG, &pblob2, &length)) 1276 1287 { 1277 - if (CryptDecodeObject(dwCertEncodingType, RSA_CSP_PUBLICKEYBLOB, 1278 - pPublicKey2->PublicKey.pbData, pPublicKey2->PublicKey.cbData, 1279 - 0, NULL, &length)) 1280 - { 1281 - pblob2 = CryptMemAlloc(length); 1282 - if (CryptDecodeObject(dwCertEncodingType, RSA_CSP_PUBLICKEYBLOB, 1283 - pPublicKey2->PublicKey.pbData, pPublicKey2->PublicKey.cbData, 1284 - 0, pblob2, &length)) 1285 - { 1286 - /* The RSAPUBKEY structure directly follows the BLOBHEADER */ 1287 - RSAPUBKEY *pk1 = (LPVOID)(pblob1 + 1), 1288 - *pk2 = (LPVOID)(pblob2 + 1); 1289 - ret = (pk1->bitlen == pk2->bitlen) && (pk1->pubexp == pk2->pubexp) 1290 - && !memcmp(pk1 + 1, pk2 + 1, pk1->bitlen/8); 1291 - } 1292 - CryptMemFree(pblob2); 1293 - } 1288 + /* The RSAPUBKEY structure directly follows the BLOBHEADER */ 1289 + RSAPUBKEY *pk1 = (LPVOID)(pblob1 + 1), 1290 + *pk2 = (LPVOID)(pblob2 + 1); 1291 + ret = (pk1->bitlen == pk2->bitlen) && (pk1->pubexp == pk2->pubexp) 1292 + && !memcmp(pk1 + 1, pk2 + 1, pk1->bitlen/8); 1293 + 1294 + LocalFree(pblob2); 1294 1295 } 1295 - CryptMemFree(pblob1); 1296 + LocalFree(pblob1); 1296 1297 } 1297 1298 1298 1299 break; ··· 1321 1322 } 1322 1323 else 1323 1324 { 1325 + PCCRYPT_OID_INFO info; 1324 1326 DWORD size; 1325 1327 PBYTE buf; 1326 - BOOL ret = CryptDecodeObjectEx(dwCertEncodingType, 1328 + BOOL ret; 1329 + 1330 + info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, pPublicKey->Algorithm.pszObjId, 0); 1331 + if (info) 1332 + { 1333 + HCRYPTKEY key; 1334 + 1335 + TRACE("public key algid %#x (%s)\n", info->u.Algid, debugstr_a(pPublicKey->Algorithm.pszObjId)); 1336 + 1337 + ret = CryptImportPublicKeyInfo(I_CryptGetDefaultCryptProv(info->u.Algid), dwCertEncodingType, pPublicKey, &key); 1338 + if (ret) 1339 + { 1340 + size = sizeof(len); 1341 + ret = CryptGetKeyParam(key, KP_KEYLEN, (BYTE *)&len, &size, 0); 1342 + CryptDestroyKey(key); 1343 + return len; 1344 + } 1345 + /* fallback to RSA */ 1346 + } 1347 + 1348 + ret = CryptDecodeObjectEx(dwCertEncodingType, 1327 1349 RSA_CSP_PUBLICKEYBLOB, pPublicKey->PublicKey.pbData, 1328 1350 pPublicKey->PublicKey.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, 1329 1351 &size); ··· 1794 1816 } 1795 1817 1796 1818 if (find) 1797 - ret = find(hCertStore, dwFlags, dwType, pvPara, pPrevCertContext); 1819 + ret = find(hCertStore, dwType, dwFlags, pvPara, pPrevCertContext); 1798 1820 else if (compare) 1799 1821 ret = cert_compare_certs_in_store(hCertStore, pPrevCertContext, 1800 1822 compare, dwType, dwFlags, pvPara); ··· 2173 2195 pbEncoded, cbEncoded, pbComputedHash, pcbComputedHash); 2174 2196 2175 2197 if (!hCryptProv) 2176 - hCryptProv = CRYPT_GetDefaultProvider(); 2198 + hCryptProv = I_CryptGetDefaultCryptProv(0); 2177 2199 if (!Algid) 2178 2200 Algid = CALG_SHA1; 2179 2201 if (ret) ··· 2202 2224 dwCertEncodingType, pInfo, pbComputedHash, pcbComputedHash); 2203 2225 2204 2226 if (!hCryptProv) 2205 - hCryptProv = CRYPT_GetDefaultProvider(); 2227 + hCryptProv = I_CryptGetDefaultCryptProv(0); 2206 2228 if (!Algid) 2207 2229 Algid = CALG_MD5; 2208 2230 if ((dwCertEncodingType & CERT_ENCODING_TYPE_MASK) != X509_ASN_ENCODING) ··· 2254 2276 HCRYPTHASH hHash; 2255 2277 2256 2278 if (!hCryptProv) 2257 - hCryptProv = CRYPT_GetDefaultProvider(); 2279 + hCryptProv = I_CryptGetDefaultCryptProv(0); 2258 2280 oidInfo = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, 2259 2281 info->SignatureAlgorithm.pszObjId, 0); 2260 2282 if (!oidInfo) ··· 2303 2325 if (info->dwGroupId == CRYPT_HASH_ALG_OID_GROUP_ID) 2304 2326 { 2305 2327 if (!hCryptProv) 2306 - hCryptProv = CRYPT_GetDefaultProvider(); 2328 + hCryptProv = I_CryptGetDefaultCryptProv(0); 2307 2329 ret = CryptCreateHash(hCryptProv, info->u.Algid, 0, 0, &hHash); 2308 2330 if (ret) 2309 2331 { ··· 2427 2449 pubKeyID = hashID; 2428 2450 /* Load the default provider if necessary */ 2429 2451 if (!hCryptProv) 2430 - hCryptProv = CRYPT_GetDefaultProvider(); 2452 + hCryptProv = I_CryptGetDefaultCryptProv(0); 2431 2453 ret = CryptImportPublicKeyInfoEx(hCryptProv, dwCertEncodingType, 2432 2454 pubKeyInfo, pubKeyID, 0, NULL, &key); 2433 2455 if (ret) ··· 3685 3707 return NULL; 3686 3708 } 3687 3709 } 3710 + 3711 + BOOL WINAPI CryptSetKeyIdentifierProperty(const CRYPT_HASH_BLOB *pKeyIdentifier, DWORD dwPropId, 3712 + DWORD dwFlags, LPCWSTR pwszComputerName, void *pvReserved, const void *pvData) 3713 + { 3714 + FIXME("(%p, 0x%x, 0x%x, %s, %p, %p): stub\n", pKeyIdentifier, dwPropId, dwFlags, 3715 + debugstr_w(pwszComputerName), pvReserved, pvData); 3716 + return FALSE; 3717 + }
+2 -1
dll/win32/crypt32/crypt32.spec
··· 180 180 @ stdcall CryptSIPRetrieveSubjectGuidForCatalogFile(wstr long ptr) 181 181 @ stdcall CryptSIPVerifyIndirectData(ptr ptr) 182 182 @ stub CryptSetAsyncParam 183 + @ stdcall CryptSetKeyIdentifierProperty(ptr long long wstr ptr ptr) 183 184 @ stdcall CryptSetOIDFunctionValue(long str str wstr long ptr long) 184 185 @ stub CryptSetProviderU 185 186 @ stdcall CryptSignAndEncodeCertificate(long long long str ptr ptr ptr ptr ptr) ··· 194 195 @ stdcall CryptUnprotectMemory(ptr long long) 195 196 @ stdcall CryptUnregisterDefaultOIDFunction(long str wstr) 196 197 @ stdcall CryptUnregisterOIDFunction(long str str) 197 - @ stub CryptUnregisterOIDInfo 198 + @ stdcall CryptUnregisterOIDInfo(ptr) 198 199 @ stdcall CryptVerifyCertificateSignature(long long ptr long ptr) 199 200 @ stdcall CryptVerifyCertificateSignatureEx(long long long ptr long ptr long ptr) 200 201 @ stdcall CryptVerifyDetachedMessageHash(ptr ptr long long ptr ptr ptr ptr)
+2 -1
dll/win32/crypt32/crypt32_private.h
··· 116 116 CRYPT_CONTENT_INFO content; 117 117 DWORD cSignerInfo; 118 118 PCMSG_CMS_SIGNER_INFO rgSignerInfo; 119 + PDWORD signerKeySpec; 119 120 } CRYPT_SIGNED_INFO; 120 121 121 122 BOOL CRYPT_AsnEncodeCMSSignedInfo(CRYPT_SIGNED_INFO *, void *pvData, ··· 149 150 /* Returns a handle to the default crypto provider; loads it if necessary. 150 151 * Returns NULL on failure. 151 152 */ 152 - HCRYPTPROV CRYPT_GetDefaultProvider(void) DECLSPEC_HIDDEN; 153 + HCRYPTPROV WINAPI I_CryptGetDefaultCryptProv(ALG_ID); 153 154 154 155 HINSTANCE hInstance DECLSPEC_HIDDEN; 155 156
+4 -44
dll/win32/crypt32/decode.c
··· 215 215 if (pDecodePara && pDecodePara->pfnAlloc) 216 216 *(BYTE **)pvStructInfo = pDecodePara->pfnAlloc(bytesNeeded); 217 217 else 218 - *(BYTE **)pvStructInfo = LocalAlloc(0, bytesNeeded); 218 + *(BYTE **)pvStructInfo = LocalAlloc(LPTR, bytesNeeded); 219 219 if (!*(BYTE **)pvStructInfo) 220 220 ret = FALSE; 221 221 else ··· 1550 1550 case ASN_UTF8STRING: 1551 1551 valueType = CERT_RDN_UTF8_STRING; 1552 1552 bytesNeeded += MultiByteToWideChar(CP_UTF8, 0, 1553 - (LPCSTR)pbEncoded + 1 + lenBytes, dataLen, NULL, 0) * 2; 1553 + (LPCSTR)pbEncoded + 1 + lenBytes, dataLen, NULL, 0) * sizeof(WCHAR); 1554 1554 break; 1555 1555 default: 1556 1556 SetLastError(CRYPT_E_ASN1_BADTAG); ··· 6279 6279 const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, 6280 6280 DWORD *pcbStructInfo) 6281 6281 { 6282 - BOOL ret = FALSE; 6283 - CryptDecodeObjectFunc pCryptDecodeObject = NULL; 6284 - CryptDecodeObjectExFunc pCryptDecodeObjectEx = NULL; 6285 - HCRYPTOIDFUNCADDR hFunc = NULL; 6286 - 6287 - TRACE_(crypt)("(0x%08x, %s, %p, %d, 0x%08x, %p, %p)\n", dwCertEncodingType, 6288 - debugstr_a(lpszStructType), pbEncoded, cbEncoded, dwFlags, 6289 - pvStructInfo, pcbStructInfo); 6290 - 6291 - if (!pvStructInfo && !pcbStructInfo) 6292 - { 6293 - SetLastError(ERROR_INVALID_PARAMETER); 6294 - return FALSE; 6295 - } 6296 - if (cbEncoded > MAX_ENCODED_LEN) 6297 - { 6298 - SetLastError(CRYPT_E_ASN1_LARGE); 6299 - return FALSE; 6300 - } 6301 - 6302 - if (!(pCryptDecodeObjectEx = CRYPT_GetBuiltinDecoder(dwCertEncodingType, 6303 - lpszStructType))) 6304 - { 6305 - TRACE_(crypt)("OID %s not found or unimplemented, looking for DLL\n", 6306 - debugstr_a(lpszStructType)); 6307 - pCryptDecodeObject = CRYPT_LoadDecoderFunc(dwCertEncodingType, 6308 - lpszStructType, &hFunc); 6309 - if (!pCryptDecodeObject) 6310 - pCryptDecodeObjectEx = CRYPT_LoadDecoderExFunc(dwCertEncodingType, 6311 - lpszStructType, &hFunc); 6312 - } 6313 - if (pCryptDecodeObject) 6314 - ret = pCryptDecodeObject(dwCertEncodingType, lpszStructType, 6315 - pbEncoded, cbEncoded, dwFlags, pvStructInfo, pcbStructInfo); 6316 - else if (pCryptDecodeObjectEx) 6317 - ret = pCryptDecodeObjectEx(dwCertEncodingType, lpszStructType, 6318 - pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, 6319 - pvStructInfo, pcbStructInfo); 6320 - if (hFunc) 6321 - CryptFreeOIDFunctionAddress(hFunc, 0); 6322 - TRACE_(crypt)("returning %d\n", ret); 6323 - return ret; 6282 + return CryptDecodeObjectEx(dwCertEncodingType, lpszStructType, 6283 + pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo); 6324 6284 } 6325 6285 6326 6286 BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
+112 -13
dll/win32/crypt32/encode.c
··· 4779 4779 NULL, 0, NULL, pInfo, pcbInfo); 4780 4780 } 4781 4781 4782 - static BOOL WINAPI CRYPT_ExportRsaPublicKeyInfoEx(HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProv, 4782 + typedef BOOL (WINAPI *EncodePublicKeyAndParametersFunc)(DWORD dwCertEncodingType, 4783 + LPSTR pszPublicKeyObjId, BYTE *pbPubKey, DWORD cbPubKey, DWORD dwFlags, void *pvAuxInfo, 4784 + BYTE **ppPublicKey, DWORD *pcbPublicKey, BYTE **ppbParams, DWORD *pcbParams); 4785 + 4786 + static BOOL WINAPI CRYPT_ExportPublicKeyInfoEx(HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCryptProv, 4783 4787 DWORD dwKeySpec, DWORD dwCertEncodingType, LPSTR pszPublicKeyObjId, 4784 4788 DWORD dwFlags, void *pvAuxInfo, PCERT_PUBLIC_KEY_INFO pInfo, DWORD *pcbInfo) 4785 4789 { 4786 4790 BOOL ret; 4787 4791 HCRYPTKEY key; 4788 - static CHAR oid[] = szOID_RSA_RSA; 4792 + static CHAR rsa_oid[] = szOID_RSA_RSA; 4789 4793 4790 4794 TRACE_(crypt)("(%08lx, %d, %08x, %s, %08x, %p, %p, %d)\n", hCryptProv, 4791 4795 dwKeySpec, dwCertEncodingType, debugstr_a(pszPublicKeyObjId), dwFlags, 4792 4796 pvAuxInfo, pInfo, pInfo ? *pcbInfo : 0); 4793 4797 4794 - if (!pszPublicKeyObjId) 4795 - pszPublicKeyObjId = oid; 4796 4798 if ((ret = CryptGetUserKey(hCryptProv, dwKeySpec, &key))) 4797 4799 { 4798 4800 DWORD keySize = 0; ··· 4800 4802 ret = CryptExportKey(key, 0, PUBLICKEYBLOB, 0, NULL, &keySize); 4801 4803 if (ret) 4802 4804 { 4803 - LPBYTE pubKey = CryptMemAlloc(keySize); 4805 + PUBLICKEYSTRUC *pubKey = CryptMemAlloc(keySize); 4804 4806 4805 4807 if (pubKey) 4806 4808 { 4807 - ret = CryptExportKey(key, 0, PUBLICKEYBLOB, 0, pubKey, 4808 - &keySize); 4809 + ret = CryptExportKey(key, 0, PUBLICKEYBLOB, 0, (BYTE *)pubKey, &keySize); 4809 4810 if (ret) 4810 4811 { 4811 - DWORD encodedLen = 0; 4812 + DWORD encodedLen; 4813 + 4814 + if (!pszPublicKeyObjId) 4815 + { 4816 + static HCRYPTOIDFUNCSET set; 4817 + EncodePublicKeyAndParametersFunc encodeFunc = NULL; 4818 + HCRYPTOIDFUNCADDR hFunc = NULL; 4819 + 4820 + pszPublicKeyObjId = (LPSTR)CertAlgIdToOID(pubKey->aiKeyAlg); 4821 + TRACE("public key algid %#x (%s)\n", pubKey->aiKeyAlg, debugstr_a(pszPublicKeyObjId)); 4822 + 4823 + if (!set) /* FIXME: there is no a public macro */ 4824 + set = CryptInitOIDFunctionSet("CryptDllEncodePublicKeyAndParameters", 0); 4825 + 4826 + CryptGetOIDFunctionAddress(set, dwCertEncodingType, pszPublicKeyObjId, 0, (void **)&encodeFunc, &hFunc); 4827 + if (encodeFunc) 4828 + { 4829 + BYTE *key_data = NULL; 4830 + DWORD key_size = 0; 4831 + BYTE *params = NULL; 4832 + DWORD params_size = 0; 4833 + 4834 + ret = encodeFunc(dwCertEncodingType, pszPublicKeyObjId, (BYTE *)pubKey, keySize, 4835 + dwFlags, pvAuxInfo, &key_data, &key_size, &params, &params_size); 4836 + if (ret) 4837 + { 4838 + DWORD oid_size = strlen(pszPublicKeyObjId) + 1; 4839 + DWORD size_needed = sizeof(*pInfo) + oid_size + key_size + params_size; 4840 + 4841 + if (!pInfo) 4842 + *pcbInfo = size_needed; 4843 + else if (*pcbInfo < size_needed) 4844 + { 4845 + *pcbInfo = size_needed; 4846 + SetLastError(ERROR_MORE_DATA); 4847 + ret = FALSE; 4848 + } 4849 + else 4850 + { 4851 + *pcbInfo = size_needed; 4852 + pInfo->Algorithm.pszObjId = (char *)(pInfo + 1); 4853 + lstrcpyA(pInfo->Algorithm.pszObjId, pszPublicKeyObjId); 4854 + if (params) 4855 + { 4856 + pInfo->Algorithm.Parameters.cbData = params_size; 4857 + pInfo->Algorithm.Parameters.pbData = (BYTE *)pInfo->Algorithm.pszObjId + oid_size; 4858 + memcpy(pInfo->Algorithm.Parameters.pbData, params, params_size); 4859 + } 4860 + else 4861 + { 4862 + pInfo->Algorithm.Parameters.cbData = 0; 4863 + pInfo->Algorithm.Parameters.pbData = NULL; 4864 + } 4865 + pInfo->PublicKey.pbData = (BYTE *)pInfo->Algorithm.pszObjId + oid_size + params_size; 4866 + pInfo->PublicKey.cbData = key_size; 4867 + memcpy(pInfo->PublicKey.pbData, key_data, key_size); 4868 + pInfo->PublicKey.cUnusedBits = 0; 4869 + } 4870 + 4871 + CryptMemFree(key_data); 4872 + CryptMemFree(params); 4873 + } 4812 4874 4875 + CryptMemFree(pubKey); 4876 + CryptFreeOIDFunctionAddress(hFunc, 0); 4877 + return ret; 4878 + } 4879 + 4880 + /* fallback to RSA */ 4881 + pszPublicKeyObjId = rsa_oid; 4882 + } 4883 + 4884 + encodedLen = 0; 4813 4885 ret = CryptEncodeObject(dwCertEncodingType, 4814 4886 RSA_CSP_PUBLICKEYBLOB, pubKey, NULL, &encodedLen); 4815 4887 if (ret) ··· 4887 4959 0, (void **)&exportFunc, &hFunc); 4888 4960 } 4889 4961 if (!exportFunc) 4890 - exportFunc = CRYPT_ExportRsaPublicKeyInfoEx; 4962 + exportFunc = CRYPT_ExportPublicKeyInfoEx; 4891 4963 ret = exportFunc(hCryptProv, dwKeySpec, dwCertEncodingType, 4892 4964 pszPublicKeyObjId, dwFlags, pvAuxInfo, pInfo, pcbInfo); 4893 4965 if (hFunc) ··· 4902 4974 0, 0, NULL, phKey); 4903 4975 } 4904 4976 4905 - static BOOL WINAPI CRYPT_ImportRsaPublicKeyInfoEx(HCRYPTPROV hCryptProv, 4977 + typedef BOOL (WINAPI *ConvertPublicKeyInfoFunc)(DWORD dwCertEncodingType, 4978 + PCERT_PUBLIC_KEY_INFO pInfo, ALG_ID aiKeyAlg, DWORD dwFlags, 4979 + BYTE **ppbData, DWORD *dwDataLen); 4980 + 4981 + static BOOL WINAPI CRYPT_ImportPublicKeyInfoEx(HCRYPTPROV hCryptProv, 4906 4982 DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo, ALG_ID aiKeyAlg, 4907 4983 DWORD dwFlags, void *pvAuxInfo, HCRYPTKEY *phKey) 4908 4984 { 4985 + static HCRYPTOIDFUNCSET set = NULL; 4986 + ConvertPublicKeyInfoFunc convertFunc = NULL; 4987 + HCRYPTOIDFUNCADDR hFunc = NULL; 4909 4988 BOOL ret; 4910 - DWORD pubKeySize = 0; 4989 + DWORD pubKeySize; 4990 + LPBYTE pubKey; 4911 4991 4912 4992 TRACE_(crypt)("(%08lx, %08x, %p, %08x, %08x, %p, %p)\n", hCryptProv, 4913 4993 dwCertEncodingType, pInfo, aiKeyAlg, dwFlags, pvAuxInfo, phKey); 4914 4994 4995 + if (!set) 4996 + set = CryptInitOIDFunctionSet(CRYPT_OID_CONVERT_PUBLIC_KEY_INFO_FUNC, 0); 4997 + CryptGetOIDFunctionAddress(set, dwCertEncodingType, pInfo->Algorithm.pszObjId, 4998 + 0, (void **)&convertFunc, &hFunc); 4999 + if (convertFunc) 5000 + { 5001 + pubKey = NULL; 5002 + pubKeySize = 0; 5003 + ret = convertFunc(dwCertEncodingType, pInfo, aiKeyAlg, dwFlags, &pubKey, &pubKeySize); 5004 + if (ret) 5005 + { 5006 + ret = CryptImportKey(hCryptProv, pubKey, pubKeySize, 0, 0, phKey); 5007 + CryptMemFree(pubKey); 5008 + } 5009 + 5010 + CryptFreeOIDFunctionAddress(hFunc, 0); 5011 + return ret; 5012 + } 5013 + 4915 5014 ret = CryptDecodeObject(dwCertEncodingType, RSA_CSP_PUBLICKEYBLOB, 4916 5015 pInfo->PublicKey.pbData, pInfo->PublicKey.cbData, 0, NULL, &pubKeySize); 4917 5016 if (ret) 4918 5017 { 4919 - LPBYTE pubKey = CryptMemAlloc(pubKeySize); 5018 + pubKey = CryptMemAlloc(pubKeySize); 4920 5019 4921 5020 if (pubKey) 4922 5021 { ··· 4959 5058 CryptGetOIDFunctionAddress(set, dwCertEncodingType, 4960 5059 pInfo->Algorithm.pszObjId, 0, (void **)&importFunc, &hFunc); 4961 5060 if (!importFunc) 4962 - importFunc = CRYPT_ImportRsaPublicKeyInfoEx; 5061 + importFunc = CRYPT_ImportPublicKeyInfoEx; 4963 5062 ret = importFunc(hCryptProv, dwCertEncodingType, pInfo, aiKeyAlg, dwFlags, 4964 5063 pvAuxInfo, phKey); 4965 5064 if (hFunc)
+67 -8
dll/win32/crypt32/main.c
··· 35 35 static HCRYPTPROV hDefProv; 36 36 HINSTANCE hInstance; 37 37 38 + static CRITICAL_SECTION prov_param_cs; 39 + static CRITICAL_SECTION_DEBUG prov_param_cs_debug = 40 + { 41 + 0, 0, &prov_param_cs, 42 + { &prov_param_cs_debug.ProcessLocksList, 43 + &prov_param_cs_debug.ProcessLocksList }, 44 + 0, 0, { (DWORD_PTR)(__FILE__ ": prov_param_cs") } 45 + }; 46 + static CRITICAL_SECTION prov_param_cs = { &prov_param_cs_debug, -1, 0, 0, 0, 0 }; 47 + 38 48 BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved) 39 49 { 40 50 switch (fdwReason) ··· 56 66 return TRUE; 57 67 } 58 68 59 - HCRYPTPROV CRYPT_GetDefaultProvider(void) 69 + static HCRYPTPROV CRYPT_GetDefaultProvider(void) 60 70 { 61 71 if (!hDefProv) 62 72 { ··· 174 184 return FALSE; 175 185 } 176 186 177 - HCRYPTPROV WINAPI I_CryptGetDefaultCryptProv(DWORD reserved) 187 + static BOOL is_supported_algid(HCRYPTPROV prov, ALG_ID algid) 178 188 { 179 - HCRYPTPROV ret; 189 + PROV_ENUMALGS prov_algs; 190 + DWORD size = sizeof(prov_algs); 191 + BOOL ret = FALSE; 180 192 181 - TRACE("(%08x)\n", reserved); 193 + /* This enumeration is not thread safe */ 194 + EnterCriticalSection(&prov_param_cs); 195 + if (CryptGetProvParam(prov, PP_ENUMALGS, (BYTE *)&prov_algs, &size, CRYPT_FIRST)) 196 + { 197 + do 198 + { 199 + if (prov_algs.aiAlgid == algid) 200 + { 201 + ret = TRUE; 202 + break; 203 + } 204 + } while (CryptGetProvParam(prov, PP_ENUMALGS, (BYTE *)&prov_algs, &size, CRYPT_NEXT)); 205 + } 206 + LeaveCriticalSection(&prov_param_cs); 207 + return ret; 208 + } 182 209 183 - if (reserved) 210 + HCRYPTPROV WINAPI DECLSPEC_HOTPATCH I_CryptGetDefaultCryptProv(ALG_ID algid) 211 + { 212 + HCRYPTPROV prov, defprov; 213 + 214 + TRACE("(%08x)\n", algid); 215 + 216 + defprov = CRYPT_GetDefaultProvider(); 217 + 218 + if (algid && !is_supported_algid(defprov, algid)) 184 219 { 220 + DWORD i = 0, type, size; 221 + 222 + while (CryptEnumProvidersW(i, NULL, 0, &type, NULL, &size)) 223 + { 224 + WCHAR *name = CryptMemAlloc(size); 225 + if (name) 226 + { 227 + if (CryptEnumProvidersW(i, NULL, 0, &type, name, &size)) 228 + { 229 + if (CryptAcquireContextW(&prov, NULL, name, type, CRYPT_VERIFYCONTEXT)) 230 + { 231 + if (is_supported_algid(prov, algid)) 232 + { 233 + CryptMemFree(name); 234 + return prov; 235 + } 236 + CryptReleaseContext(prov, 0); 237 + } 238 + } 239 + CryptMemFree(name); 240 + } 241 + i++; 242 + } 243 + 185 244 SetLastError(E_INVALIDARG); 186 245 return 0; 187 246 } 188 - ret = CRYPT_GetDefaultProvider(); 189 - CryptContextAddRef(ret, NULL, 0); 190 - return ret; 247 + 248 + CryptContextAddRef(defprov, NULL, 0); 249 + return defprov; 191 250 } 192 251 193 252 BOOL WINAPI I_CryptReadTrustedPublisherDWORDValueFromRegistry(LPCWSTR name,
+41 -17
dll/win32/crypt32/msg.c
··· 567 567 prov = info->hCryptProv; 568 568 else 569 569 { 570 - prov = CRYPT_GetDefaultProvider(); 570 + prov = I_CryptGetDefaultCryptProv(algID); 571 + if (!prov) 572 + { 573 + SetLastError(E_INVALIDARG); 574 + return NULL; 575 + } 571 576 dwFlags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG; 572 577 } 573 578 msg = CryptMemAlloc(sizeof(CHashEncodeMsg)); ··· 921 926 * been constructed. 922 927 */ 923 928 static BOOL CSignedMsgData_ConstructSignerHandles(CSignedMsgData *msg_data, 924 - DWORD signerIndex, HCRYPTPROV crypt_prov) 929 + DWORD signerIndex, HCRYPTPROV *crypt_prov, DWORD *flags) 925 930 { 926 931 ALG_ID algID; 927 932 BOOL ret; 928 933 929 934 algID = CertOIDToAlgId( 930 935 msg_data->info->rgSignerInfo[signerIndex].HashAlgorithm.pszObjId); 931 - ret = CryptCreateHash(crypt_prov, algID, 0, 0, 936 + 937 + if (!*crypt_prov) 938 + { 939 + *crypt_prov = I_CryptGetDefaultCryptProv(algID); 940 + if (!*crypt_prov) return FALSE; 941 + *flags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG; 942 + } 943 + 944 + ret = CryptCreateHash(*crypt_prov, algID, 0, 0, 932 945 &msg_data->signerHandles->contentHash); 933 946 if (ret && msg_data->info->rgSignerInfo[signerIndex].AuthAttrs.cAttr > 0) 934 - ret = CryptCreateHash(crypt_prov, algID, 0, 0, 947 + ret = CryptCreateHash(*crypt_prov, algID, 0, 0, 935 948 &msg_data->signerHandles->authAttrHash); 936 949 return ret; 937 950 } ··· 1125 1138 for (i = 0; ret && i < msg_data->info->cSignerInfo; i++) 1126 1139 { 1127 1140 HCRYPTHASH hash; 1141 + DWORD keySpec = msg_data->info->signerKeySpec[i]; 1128 1142 1143 + if (!keySpec) 1144 + keySpec = AT_SIGNATURE; 1129 1145 if (msg_data->info->rgSignerInfo[i].AuthAttrs.cAttr) 1130 1146 hash = msg_data->signerHandles[i].authAttrHash; 1131 1147 else 1132 1148 hash = msg_data->signerHandles[i].contentHash; 1133 - ret = CryptSignHashW(hash, AT_SIGNATURE, NULL, 0, NULL, 1149 + ret = CryptSignHashW(hash, keySpec, NULL, 0, NULL, 1134 1150 &msg_data->info->rgSignerInfo[i].EncryptedHash.cbData); 1135 1151 if (ret) 1136 1152 { ··· 1139 1155 msg_data->info->rgSignerInfo[i].EncryptedHash.cbData); 1140 1156 if (msg_data->info->rgSignerInfo[i].EncryptedHash.pbData) 1141 1157 { 1142 - ret = CryptSignHashW(hash, AT_SIGNATURE, NULL, 0, 1158 + ret = CryptSignHashW(hash, keySpec, NULL, 0, 1143 1159 msg_data->info->rgSignerInfo[i].EncryptedHash.pbData, 1144 1160 &msg_data->info->rgSignerInfo[i].EncryptedHash.cbData); 1145 1161 if (ret) ··· 1189 1205 for (i = 0; i < msg->msg_data.info->cSignerInfo; i++) 1190 1206 CSignerInfo_Free(&msg->msg_data.info->rgSignerInfo[i]); 1191 1207 CSignedMsgData_CloseHandles(&msg->msg_data); 1208 + CryptMemFree(msg->msg_data.info->signerKeySpec); 1192 1209 CryptMemFree(msg->msg_data.info->rgSignerInfo); 1193 1210 CryptMemFree(msg->msg_data.info); 1194 1211 } ··· 1411 1428 msg->msg_data.info->cSignerInfo * 1412 1429 sizeof(CMSG_CMS_SIGNER_INFO)); 1413 1430 ret = CSignedMsgData_AllocateHandles(&msg->msg_data); 1431 + msg->msg_data.info->signerKeySpec = CryptMemAlloc(info->cSigners * sizeof(DWORD)); 1432 + if (!msg->msg_data.info->signerKeySpec) 1433 + ret = FALSE; 1414 1434 for (i = 0; ret && i < msg->msg_data.info->cSignerInfo; i++) 1415 1435 { 1416 1436 if (info->rgSigners[i].SignerId.dwIdChoice == ··· 1422 1442 if (ret) 1423 1443 { 1424 1444 ret = CSignedMsgData_ConstructSignerHandles( 1425 - &msg->msg_data, i, info->rgSigners[i].hCryptProv); 1445 + &msg->msg_data, i, &info->rgSigners[i].hCryptProv, &dwFlags); 1426 1446 if (dwFlags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG) 1427 1447 CryptReleaseContext(info->rgSigners[i].hCryptProv, 1428 1448 0); 1429 1449 } 1450 + msg->msg_data.info->signerKeySpec[i] = 1451 + info->rgSigners[i].dwKeySpec; 1430 1452 } 1431 1453 } 1432 1454 else ··· 1956 1978 prov = info->hCryptProv; 1957 1979 else 1958 1980 { 1959 - prov = CRYPT_GetDefaultProvider(); 1981 + prov = I_CryptGetDefaultCryptProv(0); 1960 1982 dwFlags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG; 1961 1983 } 1962 1984 msg = CryptMemAlloc(sizeof(CEnvelopedEncodeMsg)); ··· 2078 2100 { 2079 2101 CDecodeMsg *msg = hCryptMsg; 2080 2102 2081 - if (msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG) 2103 + if (msg->crypt_prov && msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG) 2082 2104 CryptReleaseContext(msg->crypt_prov, 0); 2083 2105 switch (msg->type) 2084 2106 { ··· 2329 2351 &size); 2330 2352 if (ret) 2331 2353 algID = CertOIDToAlgId(hashAlgoID->pszObjId); 2354 + 2355 + if (!msg->crypt_prov) 2356 + { 2357 + msg->crypt_prov = I_CryptGetDefaultCryptProv(algID); 2358 + if (msg->crypt_prov) 2359 + msg->base.open_flags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG; 2360 + } 2361 + 2332 2362 ret = CryptCreateHash(msg->crypt_prov, algID, 0, 0, &msg->u.hash); 2333 2363 if (ret) 2334 2364 { ··· 2375 2405 ret = CSignedMsgData_AllocateHandles(&msg->u.signed_data); 2376 2406 for (i = 0; ret && i < msg->u.signed_data.info->cSignerInfo; i++) 2377 2407 ret = CSignedMsgData_ConstructSignerHandles(&msg->u.signed_data, i, 2378 - msg->crypt_prov); 2408 + &msg->crypt_prov, &msg->base.open_flags); 2379 2409 if (ret) 2380 2410 { 2381 2411 CRYPT_DATA_BLOB *content; ··· 3541 3571 CDecodeMsg_Close, CDecodeMsg_GetParam, CDecodeMsg_Update, 3542 3572 CDecodeMsg_Control); 3543 3573 msg->type = dwMsgType; 3544 - if (hCryptProv) 3545 - msg->crypt_prov = hCryptProv; 3546 - else 3547 - { 3548 - msg->crypt_prov = CRYPT_GetDefaultProvider(); 3549 - msg->base.open_flags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG; 3550 - } 3574 + msg->crypt_prov = hCryptProv; 3551 3575 memset(&msg->u, 0, sizeof(msg->u)); 3552 3576 msg->msg_data.cbData = 0; 3553 3577 msg->msg_data.pbData = NULL;
+290 -7
dll/win32/crypt32/oid.c
··· 1 1 /* 2 2 * Copyright 2002 Mike McCormack for CodeWeavers 3 3 * Copyright 2005-2006 Juan Lang 4 + * Copyright 2018 Dmitry Timoshkov 4 5 * 5 6 * This library is free software; you can redistribute it and/or 6 7 * modify it under the terms of the GNU Lesser General Public ··· 22 23 23 24 #include <stdio.h> 24 25 #include <stdarg.h> 26 + #ifdef __REACTOS__ 27 + #include <stdlib.h> 28 + #endif 25 29 #define NONAMELESSUNION 26 30 #include "windef.h" 27 31 #include "winbase.h" ··· 58 62 59 63 struct OIDFunction 60 64 { 65 + HMODULE hModule; 61 66 DWORD encoding; 62 67 CRYPT_OID_FUNC_ENTRY entry; 63 68 struct list next; ··· 72 77 static const LPCWSTR LocalizedKeys[] = {ROOT,MY,CA,ADDRESSBOOK,TRUSTEDPUBLISHER,DISALLOWED}; 73 78 static WCHAR LocalizedNames[ARRAY_SIZE(LocalizedKeys)][256]; 74 79 80 + static const WCHAR nameW[] = { 'N','a','m','e',0 }; 81 + static const WCHAR algidW[] = { 'A','l','g','i','d',0 }; 82 + static const WCHAR extraW[] = { 'E','x','t','r','a','I','n','f','o',0 }; 83 + static const WCHAR cngalgidW[] = { 'C','N','G','A','l','g','i','d',0 }; 84 + static const WCHAR cngextraalgidW[] = { 'C','N','G','E','x','t','r','a','A','l','g','i','d',0 }; 85 + static const WCHAR flagsW[] = { 'F','l','a','g','s',0 }; 86 + 75 87 static void free_function_sets(void) 76 88 { 77 89 struct OIDFunctionSet *setCursor, *setNext; ··· 242 254 { 243 255 struct OIDFunction *func; 244 256 257 + TRACE("OID %s, func %p\n", debugstr_a(rgFuncEntry[i].pszOID), rgFuncEntry[i].pvFuncAddr); 258 + 245 259 if (!IS_INTOID(rgFuncEntry[i].pszOID)) 246 260 func = CryptMemAlloc(sizeof(struct OIDFunction) 247 261 + strlen(rgFuncEntry[i].pszOID) + 1); ··· 261 275 else 262 276 func->entry.pszOID = rgFuncEntry[i].pszOID; 263 277 func->entry.pvFuncAddr = rgFuncEntry[i].pvFuncAddr; 278 + func->hModule = hModule; 264 279 list_add_tail(&set->functions, &func->next); 265 280 } 266 281 else ··· 418 433 return ret; 419 434 } 420 435 436 + static BOOL is_module_registered(HMODULE hModule) 437 + { 438 + struct OIDFunctionSet *set; 439 + BOOL ret = FALSE; 440 + 441 + EnterCriticalSection(&funcSetCS); 442 + 443 + LIST_FOR_EACH_ENTRY(set, &funcSets, struct OIDFunctionSet, next) 444 + { 445 + struct OIDFunction *function; 446 + 447 + EnterCriticalSection(&set->cs); 448 + 449 + LIST_FOR_EACH_ENTRY(function, &set->functions, struct OIDFunction, next) 450 + { 451 + if (function->hModule == hModule) 452 + { 453 + ret = TRUE; 454 + break; 455 + } 456 + } 457 + 458 + LeaveCriticalSection(&set->cs); 459 + 460 + if (ret) break; 461 + } 462 + 463 + LeaveCriticalSection(&funcSetCS); 464 + 465 + return ret; 466 + } 467 + 421 468 BOOL WINAPI CryptFreeOIDFunctionAddress(HCRYPTOIDFUNCADDR hFuncAddr, 422 469 DWORD dwFlags) 423 470 { ··· 431 478 { 432 479 struct FuncAddr *addr = hFuncAddr; 433 480 434 - CryptMemFree(addr->dllList); 435 - FreeLibrary(addr->lib); 436 - CryptMemFree(addr); 481 + if (!is_module_registered(addr->lib)) 482 + { 483 + CryptMemFree(addr->dllList); 484 + FreeLibrary(addr->lib); 485 + CryptMemFree(addr); 486 + } 437 487 } 438 488 return TRUE; 439 489 } ··· 653 703 } 654 704 655 705 /*********************************************************************** 706 + * CryptUnregisterOIDInfo (CRYPT32.@) 707 + */ 708 + BOOL WINAPI CryptUnregisterOIDInfo(PCCRYPT_OID_INFO info) 709 + { 710 + char *key_name; 711 + HKEY root; 712 + DWORD err; 713 + 714 + TRACE("(%p)\n", info); 715 + 716 + if (!info || info->cbSize != sizeof(*info) || !info->pszOID) 717 + { 718 + SetLastError(E_INVALIDARG); 719 + return FALSE; 720 + } 721 + 722 + err = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo", 0, KEY_ALL_ACCESS, &root); 723 + if (err != ERROR_SUCCESS) 724 + { 725 + SetLastError(err); 726 + return FALSE; 727 + } 728 + 729 + key_name = CryptMemAlloc(strlen(info->pszOID) + 16); 730 + if (key_name) 731 + { 732 + sprintf(key_name, "%s!%u", info->pszOID, info->dwGroupId); 733 + err = RegDeleteKeyA(root, key_name); 734 + } 735 + else 736 + err = ERROR_OUTOFMEMORY; 737 + 738 + CryptMemFree(key_name); 739 + RegCloseKey(root); 740 + 741 + if (err) 742 + SetLastError(err); 743 + 744 + return !err; 745 + } 746 + 747 + /*********************************************************************** 656 748 * CryptRegisterOIDInfo (CRYPT32.@) 657 749 */ 658 - BOOL WINAPI CryptRegisterOIDInfo(PCCRYPT_OID_INFO pInfo, DWORD dwFlags) 750 + BOOL WINAPI CryptRegisterOIDInfo(PCCRYPT_OID_INFO info, DWORD flags) 659 751 { 660 - FIXME("(%p, %x): stub\n", pInfo, dwFlags ); 661 - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 662 - return FALSE; 752 + char *key_name; 753 + HKEY root = 0, key = 0; 754 + DWORD err; 755 + 756 + TRACE("(%p, %x)\n", info, flags ); 757 + 758 + if (!info || info->cbSize != sizeof(*info) || !info->pszOID) 759 + { 760 + SetLastError(E_INVALIDARG); 761 + return FALSE; 762 + } 763 + 764 + if (!info->dwGroupId) return TRUE; 765 + 766 + key_name = CryptMemAlloc(strlen(info->pszOID) + 16); 767 + if (!key_name) 768 + { 769 + err = ERROR_OUTOFMEMORY; 770 + goto done; 771 + } 772 + 773 + err = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo", 774 + 0, NULL, 0, KEY_ALL_ACCESS, NULL, &root, NULL); 775 + if (err != ERROR_SUCCESS) goto done; 776 + 777 + sprintf(key_name, "%s!%u", info->pszOID, info->dwGroupId); 778 + err = RegCreateKeyA(root, key_name, &key); 779 + if (err != ERROR_SUCCESS) goto done; 780 + 781 + if (flags) 782 + { 783 + err = RegSetValueExW(key, flagsW, 0, REG_DWORD, (const BYTE *)&flags, sizeof(flags)); 784 + if (err != ERROR_SUCCESS) goto done; 785 + } 786 + 787 + if (info->pwszName) 788 + { 789 + err = RegSetValueExW(key, nameW, 0, REG_SZ, (const BYTE *)info->pwszName, (lstrlenW(info->pwszName) + 1) * sizeof(WCHAR)); 790 + if (err != ERROR_SUCCESS) goto done; 791 + } 792 + 793 + if (info->u.Algid) 794 + { 795 + err = RegSetValueExW(key, algidW, 0, REG_DWORD, (const BYTE *)&info->u.Algid, sizeof(info->u.Algid)); 796 + if (err != ERROR_SUCCESS) goto done; 797 + } 798 + 799 + if (info->ExtraInfo.cbData && info->ExtraInfo.pbData) 800 + { 801 + err = RegSetValueExW(key, extraW, 0, REG_BINARY, info->ExtraInfo.pbData, info->ExtraInfo.cbData); 802 + if (err != ERROR_SUCCESS) goto done; 803 + } 804 + 805 + if (info->pwszCNGAlgid) 806 + { 807 + err = RegSetValueExW(key, cngalgidW, 0, REG_SZ, (const BYTE *)info->pwszCNGAlgid, (lstrlenW(info->pwszCNGAlgid) + 1) * sizeof(WCHAR)); 808 + if (err != ERROR_SUCCESS) goto done; 809 + } 810 + 811 + if (info->pwszCNGExtraAlgid) 812 + { 813 + err = RegSetValueExW(key, cngextraalgidW, 0, REG_SZ, (const BYTE *)info->pwszCNGExtraAlgid, (lstrlenW(info->pwszCNGExtraAlgid) + 1) * sizeof(WCHAR)); 814 + if (err != ERROR_SUCCESS) goto done; 815 + } 816 + 817 + done: 818 + CryptMemFree(key_name); 819 + if (key) RegCloseKey(key); 820 + if (root) RegCloseKey(root); 821 + 822 + if (err) 823 + SetLastError(err); 824 + 825 + return !err; 663 826 } 664 827 665 828 /*********************************************************************** ··· 1405 1568 struct list entry; 1406 1569 }; 1407 1570 1571 + static struct OIDInfo *read_oid_info(HKEY root, char *key_name, DWORD *flags) 1572 + { 1573 + HKEY key; 1574 + DWORD len, oid_len, name_len = 0, extra_len = 0, cngalgid_len = 0, cngextra_len = 0, group_id = 0; 1575 + struct OIDInfo *info; 1576 + char *p; 1577 + 1578 + if (RegOpenKeyExA(root, key_name, 0, KEY_READ, &key)) 1579 + return NULL; 1580 + 1581 + p = strchr(key_name, '!'); 1582 + if (p) 1583 + { 1584 + group_id = strtol(p + 1, NULL, 10); 1585 + *p = 0; 1586 + } 1587 + 1588 + oid_len = strlen(key_name) + 1; 1589 + 1590 + RegQueryValueExW(key, nameW, NULL, NULL, NULL, &name_len); 1591 + RegQueryValueExW(key, extraW, NULL, NULL, NULL, &extra_len); 1592 + RegQueryValueExW(key, cngalgidW, NULL, NULL, NULL, &cngalgid_len); 1593 + RegQueryValueExW(key, cngextraalgidW, NULL, NULL, NULL, &cngextra_len); 1594 + 1595 + info = CryptMemAlloc(sizeof(*info) + oid_len + name_len + extra_len + cngalgid_len + cngextra_len); 1596 + if (info) 1597 + { 1598 + *flags = 0; 1599 + len = sizeof(*flags); 1600 + RegQueryValueExW(key, flagsW, NULL, NULL, (BYTE *)flags, &len); 1601 + 1602 + memset(info, 0, sizeof(*info)); 1603 + info->info.cbSize = sizeof(info->info); 1604 + 1605 + p = (char *)(info + 1); 1606 + 1607 + info->info.pszOID = p; 1608 + strcpy((char *)info->info.pszOID, key_name); 1609 + p += oid_len; 1610 + 1611 + if (name_len) 1612 + { 1613 + info->info.pwszName = (WCHAR *)p; 1614 + RegQueryValueExW(key, nameW, NULL, NULL, (BYTE *)info->info.pwszName, &name_len); 1615 + p += name_len; 1616 + } 1617 + 1618 + info->info.dwGroupId = group_id; 1619 + 1620 + len = sizeof(info->info.u.Algid); 1621 + RegQueryValueExW(key, algidW, NULL, NULL, (BYTE *)&info->info.u.Algid, &len); 1622 + 1623 + if (extra_len) 1624 + { 1625 + info->info.ExtraInfo.cbData = extra_len; 1626 + info->info.ExtraInfo.pbData = (BYTE *)p; 1627 + RegQueryValueExW(key, extraW, NULL, NULL, info->info.ExtraInfo.pbData, &extra_len); 1628 + p += extra_len; 1629 + } 1630 + 1631 + if (cngalgid_len) 1632 + { 1633 + info->info.pwszCNGAlgid = (WCHAR *)p; 1634 + RegQueryValueExW(key, cngalgidW, NULL, NULL, (BYTE *)info->info.pwszCNGAlgid, &cngalgid_len); 1635 + p += cngalgid_len; 1636 + } 1637 + 1638 + if (cngextra_len) 1639 + { 1640 + info->info.pwszCNGExtraAlgid = (WCHAR *)p; 1641 + RegQueryValueExW(key, cngextraalgidW, NULL, NULL, (BYTE *)info->info.pwszCNGExtraAlgid, &cngalgid_len); 1642 + } 1643 + } 1644 + 1645 + RegCloseKey(key); 1646 + 1647 + return info; 1648 + } 1649 + 1650 + static void init_registered_oid_info(void) 1651 + { 1652 + DWORD err, idx; 1653 + HKEY root; 1654 + 1655 + err = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllFindOIDInfo", 1656 + 0, KEY_ALL_ACCESS, &root); 1657 + if (err != ERROR_SUCCESS) return; 1658 + 1659 + idx = 0; 1660 + for (;;) 1661 + { 1662 + char key_name[MAX_PATH]; 1663 + struct OIDInfo *info; 1664 + DWORD flags; 1665 + 1666 + err = RegEnumKeyA(root, idx++, key_name, MAX_PATH); 1667 + if (err == ERROR_NO_MORE_ITEMS) 1668 + break; 1669 + 1670 + if (err == ERROR_SUCCESS) 1671 + { 1672 + if ((info = read_oid_info(root, key_name, &flags))) 1673 + { 1674 + TRACE("adding oid %s, name %s, groupid %u, algid %u, extra %u, CNG algid %s, CNG extra %s\n", 1675 + debugstr_a(info->info.pszOID), debugstr_w(info->info.pwszName), 1676 + info->info.dwGroupId, info->info.u.Algid, info->info.ExtraInfo.cbData, 1677 + debugstr_w(info->info.pwszCNGAlgid), debugstr_w(info->info.pwszCNGExtraAlgid)); 1678 + 1679 + if (flags & CRYPT_INSTALL_OID_INFO_BEFORE_FLAG) 1680 + list_add_head(&oidInfo, &info->entry); 1681 + else 1682 + list_add_tail(&oidInfo, &info->entry); 1683 + } 1684 + } 1685 + } 1686 + 1687 + RegCloseKey(root); 1688 + } 1689 + 1408 1690 static void init_oid_info(void) 1409 1691 { 1410 1692 DWORD i; ··· 1632 1914 void crypt_oid_init(void) 1633 1915 { 1634 1916 init_oid_info(); 1917 + init_registered_oid_info(); 1635 1918 } 1636 1919 1637 1920 void crypt_oid_free(void)
+1 -1
media/doc/README.WINE
··· 58 58 reactos/dll/win32/comdlg32 # Synced to WineStaging-4.0 59 59 reactos/dll/win32/compstui # Synced to WineStaging-3.3 60 60 reactos/dll/win32/credui # Synced to WineStaging-4.0 61 - reactos/dll/win32/crypt32 # Synced to WineStaging-3.17 61 + reactos/dll/win32/crypt32 # Synced to WineStaging-4.0 62 62 reactos/dll/win32/cryptdlg # Synced to WineStaging-3.3 63 63 reactos/dll/win32/cryptdll # Synced to WineStaging-3.3 64 64 reactos/dll/win32/cryptnet # Synced to WineStaging-3.3