- Timestamp:
- Jun 10, 2020 6:01:15 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/kWorker/kWorker.c ¶
r3371 r3374 70 70 #define WITH_TEMP_MEMORY_FILES 71 71 72 /** @def WITH_HASH_ MD5_CACHE73 * Enables caching of MD5 sums for cl.exe.72 /** @def WITH_HASH_CACHE 73 * Enables caching of MD5, SHA-1, SHA-256 and SHA-512 hashes for cl.exe. 74 74 * This prevents wasting time on rehashing common headers each time 75 75 * they are included. */ 76 #define WITH_HASH_ MD5_CACHE76 #define WITH_HASH_CACHE 77 77 78 78 /** @def WITH_CRYPT_CTX_REUSE … … 492 492 /** The file size. */ 493 493 KU32 cbCached; 494 #ifdef WITH_HASH_ MD5_CACHE494 #ifdef WITH_HASH_CACHE 495 495 /** Set if we've got a valid MD5 hash in abMd5Digest. */ 496 496 KBOOL fValidMd5; 497 /** Set if we've got a valid SHA-1 hash in abMd5Digest. */ 498 KBOOL fValidSha1; 499 /** Set if we've got a valid SHA-256 hash in abMd5Digest. */ 500 KBOOL fValidSha256; 501 /** Set if we've got a valid SHA-512 hash in abMd5Digest. */ 502 KBOOL fValidSha512; 497 503 /** The MD5 digest if fValidMd5 is set. */ 498 504 KU8 abMd5Digest[16]; 505 /** The SHA-1 digest if fValidSha1 is set. */ 506 KU8 abSha1Digest[20]; 507 /** The SHA-256 digest if fValidSha256 is set. */ 508 KU8 abSha256Digest[32]; 509 /** The SHA-512 digest if fValidSha256 is set. */ 510 KU8 abSha512Digest[64]; 499 511 #endif 500 512 … … 508 520 typedef KFSWCACHEDFILE *PKFSWCACHEDFILE; 509 521 510 #ifdef WITH_HASH_ MD5_CACHE522 #ifdef WITH_HASH_CACHE 511 523 512 524 /** Pointer to a MD5 hash instance. */ 513 typedef struct KW HASHMD5 *PKWHASHMD5;525 typedef struct KWCRYPTHASH *PKWCRYPTHASH; 514 526 /** 515 527 * A MD5 hash instance. 516 528 */ 517 typedef struct KW HASHMD5529 typedef struct KWCRYPTHASH 518 530 { 519 531 /** The magic value. */ 520 532 KUPTR uMagic; 521 533 /** Pointer to the next hash handle. */ 522 PKW HASHMD5pNext;534 PKWCRYPTHASH pNext; 523 535 /** The cached file we've associated this handle with. */ 524 536 PKFSWCACHEDFILE pCachedFile; … … 527 539 /** Set if this has gone wrong. */ 528 540 KBOOL fGoneBad; 529 /** Set if we're in fallback mode (file not cached). */530 KBOOL fFallbackMode;531 541 /** Set if we've already finalized the digest. */ 532 542 KBOOL fFinal; 533 /** The MD5 fallback context. */ 534 struct MD5Context Md5Ctx; 543 /** If in fallback mode. */ 544 HCRYPTHASH hFallback; 545 /** The algorithm. */ 546 ALG_ID idAlg; 547 /** The hash name. */ 548 const char *pszAlgName; 549 /** The digest size. */ 550 KU32 cbDigest; 535 551 /** The finalized digest. */ 536 KU8 abDigest[16]; 537 538 } KWHASHMD5; 539 /** Magic value for KWHASHMD5::uMagic (Les McCann). */ 540 # define KWHASHMD5_MAGIC KUPTR_C(0x19350923) 541 542 #endif /* WITH_HASH_MD5_CACHE */ 552 KU8 abDigest[64]; 553 } KWCRYPTHASH; 554 /** Magic value for KWCRYPTHASH::uMagic (Les McCann). */ 555 # define KWCRYPTHASH_MAGIC KUPTR_C(0x19350923) 556 557 #endif /* WITH_HASH_CACHE */ 543 558 #ifdef WITH_TEMP_MEMORY_FILES 544 559 … … 930 945 MY_UNICODE_STRING SavedCommandLine; 931 946 932 #ifdef WITH_HASH_MD5_CACHE 933 /** The special MD5 hash instance. */ 934 PKWHASHMD5 pHashHead; 947 #ifdef WITH_HASH_CACHE 948 /** The crypto provider instance we use for hashes. */ 949 HCRYPTPROV hCryptProvRsa; 950 /** The crypto provider instance we use for hashes. */ 951 HCRYPTPROV hCryptProvAes; 952 /** List of crypto hash instances. */ 953 PKWCRYPTHASH pHashHead; 935 954 /** ReadFile sets these while CryptHashData claims and clears them. 936 955 * 937 * This is part of the heuristics we use for MD5 caching for header files. The 938 * observed pattern is that c1.dll/c1xx.dll first reads a chunk of a source or 939 * header, then passes the same buffer and read byte count to CryptHashData. 956 * This is part of the heuristics we use for MD5/SHA1/SHA256 caching for header 957 * files. The observed pattern is that c1.dll/c1xx.dll first reads a chunk of a 958 * source or header, then passes the same buffer and read byte count to 959 * CryptHashData. 940 960 */ 941 961 struct … … 1321 1341 /** Total bytes written to in-memory temporary files. */ 1322 1342 static KSIZE g_cbWriteFileToInMemTemp; 1343 1344 #ifdef WITH_HASH_CACHE 1345 /** Total number of hashes. */ 1346 static KSIZE g_cHashes; 1347 /** Number of cached hash hits. */ 1348 static KSIZE g_cHashesCached; 1349 /** Number of fallbacks. */ 1350 static KSIZE g_cHashesFallbacks; 1351 /** Number of partial cached file hashes. */ 1352 static KSIZE g_cHashesPartial; 1353 /** Total number of MD5 hashes. */ 1354 static KSIZE g_cHashesMd5; 1355 /** Total number of SHA-1 hashes. */ 1356 static KSIZE g_cHashesSha1; 1357 /** Total number of SHA-256 hashes. */ 1358 static KSIZE g_cHashesSha256; 1359 /** Total number of SHA-512 hashes. */ 1360 static KSIZE g_cHashesSha512; 1361 #endif 1323 1362 1324 1363 … … 7558 7597 cbActually = cbToRead; 7559 7598 7560 #ifdef WITH_HASH_ MD5_CACHE7599 #ifdef WITH_HASH_CACHE 7561 7600 if (g_Sandbox.pHashHead) 7562 7601 { … … 9896 9935 */ 9897 9936 9898 #ifdef WITH_HASH_MD5_CACHE 9937 #ifdef WITH_HASH_CACHE 9938 9939 /** 9940 * Gets our crypto provider context/instance, creating it if needed. 9941 */ 9942 static HCRYPTPROV kwSandboxGetCryptoProvider(ALG_ID idAlg) 9943 { 9944 DWORD dwProvider; 9945 HCRYPTPROV *phCryptProv; 9946 HCRYPTPROV hCryptProv; 9947 if ( idAlg == CALG_SHA_256 9948 || idAlg == CALG_SHA_512) 9949 { 9950 phCryptProv = &g_Sandbox.hCryptProvAes; 9951 dwProvider = PROV_RSA_AES; 9952 } 9953 else 9954 { 9955 phCryptProv = &g_Sandbox.hCryptProvRsa; 9956 dwProvider = PROV_RSA_FULL; 9957 } 9958 hCryptProv = *phCryptProv; 9959 if (hCryptProv) 9960 return hCryptProv; 9961 9962 /* Create it. */ 9963 if (CryptAcquireContextW(&hCryptProv, NULL, NULL, dwProvider, CRYPT_VERIFYCONTEXT)) 9964 { 9965 kHlpAssert(hCryptProv != 0); 9966 kHlpAssert(hCryptProv != KUPTR_MAX); 9967 *phCryptProv = hCryptProv; 9968 return hCryptProv; 9969 } 9970 9971 kwErrPrintf("kwSandboxGetCryptoProvider: CryptAcquireContext(,,,%#x, CRYPT_VERIFYCONTEXT) failed! %u\n", 9972 dwProvider, GetLastError()); 9973 return (HCRYPTPROV)NULL; 9974 } 9899 9975 9900 9976 /** AdvApi32 - CryptCreateHash */ … … 9909 9985 if (g_Sandbox.pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_CL) 9910 9986 { 9911 /** @todo do generic caching of hash results. Need SHA-1 and SHA-256 for 9912 * more recent compilers. */ 9913 if (idAlg == CALG_MD5) 9987 KU32 cbDigest; 9988 const char *pszName; 9989 switch (idAlg) 9990 { 9991 case CALG_MD5: 9992 cbDigest = 128/8; 9993 pszName = "MD5"; 9994 g_cHashesMd5++; 9995 break; 9996 case CALG_SHA1: 9997 cbDigest = 160/8; 9998 pszName = "SHA1"; 9999 g_cHashesSha1++; 10000 break; 10001 case CALG_SHA_256: 10002 cbDigest = 256/8; 10003 pszName = "SHA-256"; 10004 g_cHashesSha256++; 10005 break; 10006 case CALG_SHA_512: 10007 cbDigest = 512/8; 10008 pszName = "SHA-512"; 10009 g_cHashesSha512++; 10010 break; 10011 default: 10012 cbDigest = 0; 10013 pszName = NULL; 10014 break; 10015 } 10016 10017 if (cbDigest) 9914 10018 { 9915 10019 if (hKey == 0) … … 9917 10021 if (dwFlags == 0) 9918 10022 { 9919 PKW HASHMD5 pHash = (PKWHASHMD5)kHlpAllocZ(sizeof(*pHash));10023 PKWCRYPTHASH pHash = (PKWCRYPTHASH)kHlpAllocZ(sizeof(*pHash)); 9920 10024 if (pHash) 9921 10025 { 9922 10026 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 9923 pHash->uMagic = KW HASHMD5_MAGIC;10027 pHash->uMagic = KWCRYPTHASH_MAGIC; 9924 10028 pHash->cbHashed = 0; 9925 10029 pHash->fGoneBad = K_FALSE; 9926 pHash->fFallbackMode = K_FALSE;9927 10030 pHash->fFinal = K_FALSE; 10031 pHash->hFallback = KUPTR_MAX; 10032 pHash->idAlg = idAlg; 10033 pHash->pszAlgName = pszName; 10034 pHash->cbDigest = cbDigest; 9928 10035 9929 10036 /* link it. */ … … 9932 10039 9933 10040 *phHash = (KUPTR)pHash; 9934 KWCRYPT_LOG(("CryptCreateHash(hProv=%p, idAlg= CALG_MD5, 0, 0, *phHash=%p) -> %d [cached]\n",9935 hProv, *phHash, TRUE));10041 KWCRYPT_LOG(("CryptCreateHash(hProv=%p, idAlg=%s, 0, 0, *phHash=%p) -> %d [cached]\n", 10042 hProv, pszName, *phHash, TRUE)); 9936 10043 return TRUE; 9937 10044 } … … 9940 10047 } 9941 10048 else 9942 kwErrPrintf("CryptCreateHash: dwFlags=%p is not supported with CALG_MD5\n", hKey);10049 kwErrPrintf("CryptCreateHash: dwFlags=%p is not supported with %s\n", hKey, pszName); 9943 10050 } 9944 10051 else 9945 kwErrPrintf("CryptCreateHash: hKey=%p is not supported with CALG_MD5\n", hKey);9946 } 9947 //else9948 //kwErrPrintf("CryptCreateHash: idAlg=%#x is not supported\n", idAlg);10052 kwErrPrintf("CryptCreateHash: hKey=%p is not supported with %s\n", hKey, pszName); 10053 } 10054 else 10055 kwErrPrintf("CryptCreateHash: idAlg=%#x is not supported\n", idAlg); 9949 10056 } 9950 10057 … … 9962 10069 static BOOL WINAPI kwSandbox_Advapi32_CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData, DWORD cbData, DWORD dwFlags) 9963 10070 { 9964 BOOL fRc;9965 PKW HASHMD5pHash = g_Sandbox.pHashHead;10071 BOOL fRc; 10072 PKWCRYPTHASH pHash = g_Sandbox.pHashHead; 9966 10073 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 9967 10074 while (pHash && (KUPTR)pHash != hHash) … … 9974 10081 * Validate the state. 9975 10082 */ 9976 if ( pHash->uMagic == KWHASHMD5_MAGIC 9977 && !pHash->fFinal) 9978 { 9979 if (!pHash->fFallbackMode) 10083 if ( pHash->uMagic == KWCRYPTHASH_MAGIC 10084 && !pHash->fFinal 10085 && !pHash->fGoneBad) 10086 { 10087 if (pHash->hFallback == KUPTR_MAX) 9980 10088 { 9981 10089 /* … … 10017 10125 } 10018 10126 else if (!pCachedFile) 10019 kwErrPrintf("CryptHashData: Last pCachedFile is NULL when buffer address and size matches!\n");10127 KWCRYPT_LOG(("CryptHashData: Last pCachedFile is NULL when buffer address and size matches!\n")); 10020 10128 else 10021 10129 kwErrPrintf("CryptHashData: First 64 bytes of the buffer doesn't match the cache.\n"); … … 10025 10133 g_Sandbox.LastHashRead.cbRead, g_Sandbox.LastHashRead.pvRead, cbData, pbData); 10026 10134 if (pHash->cbHashed == 0) 10027 pHash->fFallbackMode = K_TRUE;10028 if (pHash->fFallbackMode)10029 10135 { 10030 10136 /* Initiate fallback mode (file that we don't normally cache, like .c/.cpp). */ 10031 pHash->fFallbackMode = K_TRUE; 10032 MD5Init(&pHash->Md5Ctx); 10033 MD5Update(&pHash->Md5Ctx, pbData, cbData); 10034 pHash->cbHashed = cbData; 10035 KWCRYPT_LOG(("CryptHashData(hHash=%p/fallback, pbData=%p, cbData=%#x, dwFlags=%#x) -> 1 [fallback!]\n", 10036 hHash, pbData, cbData, dwFlags)); 10037 return TRUE; 10137 HCRYPTPROV hCryptProv = kwSandboxGetCryptoProvider(pHash->idAlg); 10138 if (hCryptProv) 10139 { 10140 HCRYPTHASH hCryptHash = KUPTR_MAX; 10141 if (CryptCreateHash(hCryptProv, pHash->idAlg, 0, 0, &hCryptHash)) 10142 { 10143 kHlpAssert(hCryptHash != KUPTR_MAX); 10144 pHash->hFallback = hCryptHash; 10145 fRc = CryptHashData(hCryptHash, pbData, cbData, dwFlags); 10146 if (fRc) 10147 pHash->cbHashed = cbData; 10148 g_cHashesFallbacks++; 10149 KWCRYPT_LOG(("CryptHashData(hHash=%p/fallback, pbData=%p, cbData=%#x, dwFlags=%#x) -> %d (%u) [fallback!]\n", 10150 hHash, pbData, cbData, dwFlags, fRc, GetLastError())); 10151 } 10152 else 10153 { 10154 kwErrPrintf("kwSandbox_Advapi32_CryptHashData: Fallback CryptCreateHash(%u) failed: %u\n", 10155 pHash->idAlg, GetLastError()); 10156 fRc = FALSE; 10157 } 10158 return fRc; 10159 } 10038 10160 } 10039 10161 pHash->fGoneBad = K_TRUE; … … 10044 10166 { 10045 10167 /* fallback. */ 10046 MD5Update(&pHash->Md5Ctx, pbData, cbData);10047 pHash->cbHashed += cbData;10048 fRc = TRUE;10049 KWCRYPT_LOG(("CryptHashData(hHash=%p/fallback, pbData=%p, cbData=%#x, dwFlags=%#x) -> 1[fallback]\n",10050 hHash, pbData, cbData, dwFlags ));10168 fRc = CryptHashData(pHash->hFallback, pbData, cbData, dwFlags); 10169 if (fRc) 10170 pHash->cbHashed += cbData; 10171 KWCRYPT_LOG(("CryptHashData(hHash=%p/fallback, pbData=%p, cbData=%#x, dwFlags=%#x) -> %d [fallback]\n", 10172 hHash, pbData, cbData, dwFlags, fRc)); 10051 10173 } 10052 10174 } … … 10056 10178 else 10057 10179 { 10058 if (pHash->uMagic != KW HASHMD5_MAGIC)10180 if (pHash->uMagic != KWCRYPTHASH_MAGIC) 10059 10181 kwErrPrintf("CryptHashData: Invalid cached hash handle!!\n"); 10060 10182 else … … 10074 10196 10075 10197 10198 /** Helper for simpe data hashing. */ 10199 static BOOL kwSandboxCalcHash(ALG_ID idAlg, void const *pvData, KSIZE cbData, KU8 *pbDigest, KSIZE cbDigest) 10200 { 10201 BOOL fRet = FALSE; 10202 if (idAlg == CALG_MD5) 10203 { 10204 struct MD5Context Ctx; 10205 MD5Init(&Ctx); 10206 MD5Update(&Ctx, (unsigned char const *)pvData, (unsigned)cbData); 10207 MD5Final(pbDigest, &Ctx); 10208 fRet = TRUE; 10209 } 10210 else 10211 { 10212 HCRYPTPROV hCryptProv = kwSandboxGetCryptoProvider(idAlg); 10213 if (hCryptProv) 10214 { 10215 HCRYPTHASH hCryptHash = KUPTR_MAX; 10216 if (CryptCreateHash(hCryptProv, idAlg, 0, 0, &hCryptHash)) 10217 { 10218 if (CryptHashData(hCryptHash, (const BYTE *)pvData, (DWORD)cbData, 0)) 10219 { 10220 DWORD cbActual = (DWORD)cbDigest; 10221 if (CryptGetHashParam(hCryptHash, HP_HASHVAL, pbDigest, &cbActual, 0)) 10222 { 10223 fRet = TRUE; 10224 kHlpAssert(cbActual == cbDigest); 10225 } 10226 else 10227 kwErrPrintf("CryptGetHashParam([%#x],HP_HASHVAL,%p,%#x,0) failed: %u\n", 10228 idAlg, pbDigest, cbDigest, GetLastError()); 10229 } 10230 else 10231 kwErrPrintf("CryptHashData([%#x],%p,%#x,0) failed: %u\n", idAlg, pvData, cbData, GetLastError()); 10232 CryptDestroyHash(hCryptHash); 10233 } 10234 else 10235 kwErrPrintf("CryptCreateHash(%#x) failed: %u\n", idAlg, GetLastError()); 10236 } 10237 } 10238 return fRet; 10239 } 10240 10241 10076 10242 /** AdvApi32 - CryptGetHashParam */ 10077 10243 static BOOL WINAPI kwSandbox_Advapi32_CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, 10078 10244 BYTE *pbData, DWORD *pcbData, DWORD dwFlags) 10079 10245 { 10080 BOOL fRc;10081 PKW HASHMD5pHash = g_Sandbox.pHashHead;10246 BOOL fRc; 10247 PKWCRYPTHASH pHash = g_Sandbox.pHashHead; 10082 10248 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 10083 10249 while (pHash && (KUPTR)pHash != hHash) … … 10085 10251 if (pHash) 10086 10252 { 10087 if (pHash->uMagic == KW HASHMD5_MAGIC)10253 if (pHash->uMagic == KWCRYPTHASH_MAGIC) 10088 10254 { 10089 10255 if (dwFlags == 0) … … 10102 10268 /* Check the hash progress. */ 10103 10269 PKFSWCACHEDFILE pCachedFile = pHash->pCachedFile; 10270 g_cHashes++; 10104 10271 if (pCachedFile) 10105 10272 { … … 10107 10274 && !pHash->fGoneBad) 10108 10275 { 10109 if (pCachedFile->fValidMd5) 10276 KBOOL *pfValid; 10277 switch (pHash->idAlg) 10278 { 10279 case CALG_MD5: 10280 pfValid = &pCachedFile->fValidMd5; 10281 pvRet = pCachedFile->abMd5Digest; 10282 break; 10283 case CALG_SHA1: 10284 pfValid = &pCachedFile->fValidSha1; 10285 pvRet = pCachedFile->abSha1Digest; 10286 break; 10287 case CALG_SHA_256: 10288 pfValid = &pCachedFile->fValidSha256; 10289 pvRet = pCachedFile->abSha256Digest; 10290 break; 10291 case CALG_SHA_512: 10292 pfValid = &pCachedFile->fValidSha512; 10293 pvRet = pCachedFile->abSha512Digest; 10294 break; 10295 default: 10296 kwErrPrintf("Invalid idAlg value: %#x\n", pHash->idAlg); 10297 SetLastError(ERROR_INVALID_SERVER_STATE); 10298 return FALSE; 10299 } 10300 10301 if (*pfValid) 10302 { 10110 10303 KWCRYPT_LOG(("Already calculated hash for %p/%s! [hit]\n", pCachedFile, pCachedFile->szPath)); 10304 g_cHashesCached++; 10305 } 10111 10306 else 10112 10307 { 10113 MD5Init(&pHash->Md5Ctx); 10114 MD5Update(&pHash->Md5Ctx, pCachedFile->pbCached, pCachedFile->cbCached); 10115 MD5Final(pCachedFile->abMd5Digest, &pHash->Md5Ctx); 10116 pCachedFile->fValidMd5 = K_TRUE; 10308 fRc = kwSandboxCalcHash(pHash->idAlg, pCachedFile->pbCached, pCachedFile->cbCached, 10309 pvRet, pHash->cbDigest); 10310 if (!fRc) 10311 return FALSE; 10312 *pfValid = K_TRUE; 10117 10313 KWCRYPT_LOG(("Calculated hash for %p/%s.\n", pCachedFile, pCachedFile->szPath)); 10118 10314 } 10119 pvRet = pCachedFile->abMd5Digest;10120 10315 } 10121 10316 else … … 10126 10321 pHash->pCachedFile->cbCached, pHash->cbHashed, pHash->fGoneBad, 10127 10322 pHash, pCachedFile, pCachedFile->szPath)); 10128 pHash->fFallbackMode = K_TRUE; 10129 pHash->pCachedFile = NULL; 10130 MD5Init(&pHash->Md5Ctx); 10131 MD5Update(&pHash->Md5Ctx, pCachedFile->pbCached, pHash->cbHashed); 10132 MD5Final(pHash->abDigest, &pHash->Md5Ctx); 10323 g_cHashesPartial++; 10324 pHash->pCachedFile = NULL; 10133 10325 pvRet = pHash->abDigest; 10326 fRc = kwSandboxCalcHash(pHash->idAlg, pCachedFile->pbCached, pHash->cbHashed, 10327 pvRet, pHash->cbDigest); 10328 if (!fRc) 10329 { 10330 pHash->fGoneBad = K_TRUE; 10331 return FALSE; 10332 } 10134 10333 } 10135 10334 pHash->fFinal = K_TRUE; 10136 cbRet = 16;10335 cbRet = pHash->cbDigest; 10137 10336 break; 10138 10337 } 10139 else if (pHash->fFallbackMode) 10338 10339 pvRet = pHash->abDigest; 10340 cbRet = pHash->cbDigest; 10341 if (pHash->fFinal) 10342 break; 10343 if (pHash->hFallback != KUPTR_MAX) 10140 10344 { 10141 if (!pHash->fFinal) 10345 DWORD cbActual = (DWORD)pHash->cbDigest; 10346 if (CryptGetHashParam(pHash->hFallback, HP_HASHVAL, pHash->abDigest, &cbActual, 0)) 10142 10347 { 10348 kHlpAssert(cbActual == pHash->cbDigest); 10143 10349 pHash->fFinal = K_TRUE; 10144 MD5Final(pHash->abDigest, &pHash->Md5Ctx);10350 break; 10145 10351 } 10146 pvRet = pHash->abDigest; 10147 cbRet = 16; 10148 break; 10352 kwErrPrintf("CryptGetHashParam/HP_HASHVAL: Fallback CryptGetHashParam failed: %u!!\n", GetLastError()); 10149 10353 } 10150 10354 else … … 10157 10361 10158 10362 case HP_HASHSIZE: 10159 uBuf.dw = 16;10363 uBuf.dw = pHash->cbDigest; 10160 10364 pvRet = &uBuf; 10161 10365 cbRet = sizeof(DWORD); … … 10163 10367 10164 10368 case HP_ALGID: 10165 uBuf.dw = CALG_MD5;10369 uBuf.dw = pHash->idAlg; 10166 10370 pvRet = &uBuf; 10167 10371 cbRet = sizeof(DWORD); … … 10193 10397 pbData[8], pbData[9], pbData[10], pbData[11], 10194 10398 pbData[12], pbData[13], pbData[14], pbData[15])); 10399 else if (cbRet == 20) 10400 KWCRYPT_LOG(("CryptGetHashParam/%#x/%p/%p: TRUE, cbRet=%#x data=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x [cached]\n", 10401 dwParam, pHash, pHash->pCachedFile, cbRet, 10402 pbData[0], pbData[1], pbData[2], pbData[3], 10403 pbData[4], pbData[5], pbData[6], pbData[7], 10404 pbData[8], pbData[9], pbData[10], pbData[11], 10405 pbData[12], pbData[13], pbData[14], pbData[15], 10406 pbData[16], pbData[17], pbData[18], pbData[19] )); 10407 else if (cbRet >= 32) 10408 KWCRYPT_LOG(("CryptGetHashParam/%#x/%p/%p: TRUE, cbRet=%#x data=%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%s [cached]\n", 10409 dwParam, pHash, pHash->pCachedFile, cbRet, 10410 pbData[0], pbData[1], pbData[2], pbData[3], 10411 pbData[4], pbData[5], pbData[6], pbData[7], 10412 pbData[8], pbData[9], pbData[10], pbData[11], 10413 pbData[12], pbData[13], pbData[14], pbData[15], 10414 pbData[16], pbData[17], pbData[18], pbData[19], 10415 pbData[20], pbData[21], pbData[22], pbData[23], 10416 pbData[24], pbData[25], pbData[26], pbData[27], 10417 pbData[28], pbData[29], pbData[30], pbData[31], cbRet > 32 ? "..." : "")); 10195 10418 else 10196 10419 KWCRYPT_LOG(("CryptGetHashParam/%#x%/p%/%p: TRUE, cbRet=%#x [cached]\n", … … 10235 10458 static BOOL WINAPI kwSandbox_Advapi32_CryptDestroyHash(HCRYPTHASH hHash) 10236 10459 { 10237 BOOL fRc;10238 PKW HASHMD5pPrev = NULL;10239 PKW HASHMD5pHash = g_Sandbox.pHashHead;10460 BOOL fRc; 10461 PKWCRYPTHASH pPrev = NULL; 10462 PKWCRYPTHASH pHash = g_Sandbox.pHashHead; 10240 10463 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 10241 10464 while (pHash && (KUPTR)pHash != hHash) … … 10246 10469 if (pHash) 10247 10470 { 10248 if (pHash->uMagic == KW HASHMD5_MAGIC)10471 if (pHash->uMagic == KWCRYPTHASH_MAGIC) 10249 10472 { 10250 10473 pHash->uMagic = 0; … … 10276 10499 } 10277 10500 10278 #endif /* WITH_HASH_ MD5_CACHE */10501 #endif /* WITH_HASH_CACHE */ 10279 10502 10280 10503 … … 10748 10971 #endif 10749 10972 10750 #ifdef WITH_HASH_ MD5_CACHE10973 #ifdef WITH_HASH_CACHE 10751 10974 { TUPLE("CryptCreateHash"), NULL, (KUPTR)kwSandbox_Advapi32_CryptCreateHash }, 10752 10975 { TUPLE("CryptHashData"), NULL, (KUPTR)kwSandbox_Advapi32_CryptHashData }, … … 10883 11106 #endif 10884 11107 10885 #ifdef WITH_HASH_ MD5_CACHE11108 #ifdef WITH_HASH_CACHE 10886 11109 { TUPLE("CryptCreateHash"), NULL, (KUPTR)kwSandbox_Advapi32_CryptCreateHash }, 10887 11110 { TUPLE("CryptHashData"), NULL, (KUPTR)kwSandbox_Advapi32_CryptHashData }, … … 11441 11664 PKWHEAP pHeap; 11442 11665 PKWLOCALSTORAGE pLocalStorage; 11443 #ifdef WITH_HASH_ MD5_CACHE11444 PKW HASHMD5pHash;11666 #ifdef WITH_HASH_CACHE 11667 PKWCRYPTHASH pHash; 11445 11668 #endif 11446 11669 #ifdef WITH_TEMP_MEMORY_FILES … … 11627 11850 } 11628 11851 11629 #ifdef WITH_HASH_ MD5_CACHE11852 #ifdef WITH_HASH_CACHE 11630 11853 /* 11631 11854 * Hash handles. … … 11635 11858 while (pHash) 11636 11859 { 11637 PKW HASHMD5pNext = pHash->pNext;11860 PKWCRYPTHASH pNext = pHash->pNext; 11638 11861 KWCRYPT_LOG(("Freeing leaked hash instance %#p\n", pHash)); 11862 if (pHash->hFallback != KUPTR_MAX) 11863 CryptDestroyHash(pHash->hFallback); 11639 11864 kHlpFree(pHash); 11640 11865 pHash = pNext; … … 12579 12804 (unsigned)(g_pFsCache->cNameGrowths * 100 / K_MAX(g_pFsCache->cNameChanges, 1)) ); 12580 12805 12806 #ifdef WITH_HASH_CACHE 12807 off += sprintf(&szBuf[off], "%s %14s hashes calculated, %s cache hits (%u%%), %s fallbacks, %s partial\n", szPrf, 12808 kwFmtU64(sz1, g_cHashes), 12809 kwFmtU64(sz2, g_cHashesCached), 12810 (unsigned)(g_cHashesCached * 100 / K_MAX(g_cHashes, 1)), 12811 kwFmtU64(sz3, g_cHashesFallbacks), 12812 kwFmtU64(sz4, g_cHashesPartial)); 12813 off += sprintf(&szBuf[off], "%s %14s MD5: %s SHA-1: %s SHA-256: %s SHA-512: %s\n", szPrf, "", kwFmtU64(sz1, g_cHashesMd5), 12814 kwFmtU64(sz2, g_cHashesSha1), kwFmtU64(sz3, g_cHashesSha256), kwFmtU64(sz4, g_cHashesSha512)); 12815 #endif 12581 12816 12582 12817 /*
Note:
See TracChangeset
for help on using the changeset viewer.