VirtualBox

Changeset 3374 in kBuild for trunk


Ignore:
Timestamp:
Jun 10, 2020 6:01:15 PM (5 years ago)
Author:
bird
Message:

kWorker: Generalized the hash caching to support SHA-1, SHA-256 and SHA-512 in addition to MD5. We need SHA-256 for VC++ 14.x.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/kWorker/kWorker.c

    r3371 r3374  
    7070#define WITH_TEMP_MEMORY_FILES
    7171
    72 /** @def WITH_HASH_MD5_CACHE
    73  * 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.
    7474 * This prevents wasting time on rehashing common headers each time
    7575 * they are included. */
    76 #define WITH_HASH_MD5_CACHE
     76#define WITH_HASH_CACHE
    7777
    7878/** @def WITH_CRYPT_CTX_REUSE
     
    492492    /** The file size. */
    493493    KU32                cbCached;
    494 #ifdef WITH_HASH_MD5_CACHE
     494#ifdef WITH_HASH_CACHE
    495495    /** Set if we've got a valid MD5 hash in abMd5Digest. */
    496496    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;
    497503    /** The MD5 digest if fValidMd5 is set. */
    498504    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];
    499511#endif
    500512
     
    508520typedef KFSWCACHEDFILE *PKFSWCACHEDFILE;
    509521
    510 #ifdef WITH_HASH_MD5_CACHE
     522#ifdef WITH_HASH_CACHE
    511523
    512524/** Pointer to a MD5 hash instance. */
    513 typedef struct KWHASHMD5 *PKWHASHMD5;
     525typedef struct KWCRYPTHASH *PKWCRYPTHASH;
    514526/**
    515527 * A MD5 hash instance.
    516528 */
    517 typedef struct KWHASHMD5
     529typedef struct KWCRYPTHASH
    518530{
    519531    /** The magic value. */
    520532    KUPTR               uMagic;
    521533    /** Pointer to the next hash handle. */
    522     PKWHASHMD5          pNext;
     534    PKWCRYPTHASH        pNext;
    523535    /** The cached file we've associated this handle with. */
    524536    PKFSWCACHEDFILE     pCachedFile;
     
    527539    /** Set if this has gone wrong. */
    528540    KBOOL               fGoneBad;
    529     /** Set if we're in fallback mode (file not cached). */
    530     KBOOL               fFallbackMode;
    531541    /** Set if we've already finalized the digest. */
    532542    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;
    535551    /** 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 */
    543558#ifdef WITH_TEMP_MEMORY_FILES
    544559
     
    930945    MY_UNICODE_STRING SavedCommandLine;
    931946
    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;
    935954    /** ReadFile sets these while CryptHashData claims and clears them.
    936955     *
    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.
    940960     */
    941961    struct
     
    13211341/** Total bytes written to in-memory temporary files. */
    13221342static KSIZE    g_cbWriteFileToInMemTemp;
     1343
     1344#ifdef WITH_HASH_CACHE
     1345/** Total number of hashes. */
     1346static KSIZE    g_cHashes;
     1347/** Number of cached hash hits. */
     1348static KSIZE    g_cHashesCached;
     1349/** Number of fallbacks. */
     1350static KSIZE    g_cHashesFallbacks;
     1351/** Number of partial cached file hashes. */
     1352static KSIZE    g_cHashesPartial;
     1353/** Total number of MD5 hashes. */
     1354static KSIZE    g_cHashesMd5;
     1355/** Total number of SHA-1 hashes. */
     1356static KSIZE    g_cHashesSha1;
     1357/** Total number of SHA-256 hashes. */
     1358static KSIZE    g_cHashesSha256;
     1359/** Total number of SHA-512 hashes. */
     1360static KSIZE    g_cHashesSha512;
     1361#endif
    13231362
    13241363
     
    75587597                    cbActually = cbToRead;
    75597598
    7560 #ifdef WITH_HASH_MD5_CACHE
     7599#ifdef WITH_HASH_CACHE
    75617600                if (g_Sandbox.pHashHead)
    75627601                {
     
    98969935 */
    98979936
    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 */
     9942static 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}
    98999975
    99009976/** AdvApi32 - CryptCreateHash */
     
    99099985    if (g_Sandbox.pTool->u.Sandboxed.enmHint == KWTOOLHINT_VISUAL_CPP_CL)
    99109986    {
    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)
    991410018        {
    991510019            if (hKey == 0)
     
    991710021                if (dwFlags == 0)
    991810022                {
    9919                     PKWHASHMD5 pHash = (PKWHASHMD5)kHlpAllocZ(sizeof(*pHash));
     10023                    PKWCRYPTHASH pHash = (PKWCRYPTHASH)kHlpAllocZ(sizeof(*pHash));
    992010024                    if (pHash)
    992110025                    {
    992210026                        kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    9923                         pHash->uMagic        = KWHASHMD5_MAGIC;
     10027                        pHash->uMagic        = KWCRYPTHASH_MAGIC;
    992410028                        pHash->cbHashed      = 0;
    992510029                        pHash->fGoneBad      = K_FALSE;
    9926                         pHash->fFallbackMode = K_FALSE;
    992710030                        pHash->fFinal        = K_FALSE;
     10031                        pHash->hFallback     = KUPTR_MAX;
     10032                        pHash->idAlg         = idAlg;
     10033                        pHash->pszAlgName    = pszName;
     10034                        pHash->cbDigest      = cbDigest;
    992810035
    992910036                        /* link it. */
     
    993210039
    993310040                        *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));
    993610043                        return TRUE;
    993710044                    }
     
    994010047                }
    994110048                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);
    994310050            }
    994410051            else
    9945                 kwErrPrintf("CryptCreateHash: hKey=%p is not supported with CALG_MD5\n", hKey);
    9946         }
    9947         //else
    9948         //    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);
    994910056    }
    995010057
     
    996210069static BOOL WINAPI kwSandbox_Advapi32_CryptHashData(HCRYPTHASH hHash, CONST BYTE *pbData, DWORD cbData, DWORD dwFlags)
    996310070{
    9964     BOOL        fRc;
    9965     PKWHASHMD5 pHash = g_Sandbox.pHashHead;
     10071    BOOL         fRc;
     10072    PKWCRYPTHASH pHash = g_Sandbox.pHashHead;
    996610073    kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    996710074    while (pHash && (KUPTR)pHash != hHash)
     
    997410081         * Validate the state.
    997510082         */
    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)
    998010088            {
    998110089                /*
     
    1001710125                    }
    1001810126                    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"));
    1002010128                    else
    1002110129                        kwErrPrintf("CryptHashData: First 64 bytes of the buffer doesn't match the cache.\n");
     
    1002510133                                g_Sandbox.LastHashRead.cbRead, g_Sandbox.LastHashRead.pvRead, cbData, pbData);
    1002610134                if (pHash->cbHashed == 0)
    10027                     pHash->fFallbackMode = K_TRUE;
    10028                 if (pHash->fFallbackMode)
    1002910135                {
    1003010136                    /* 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                    }
    1003810160                }
    1003910161                pHash->fGoneBad = K_TRUE;
     
    1004410166            {
    1004510167                /* 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));
    1005110173            }
    1005210174        }
     
    1005610178        else
    1005710179        {
    10058             if (pHash->uMagic != KWHASHMD5_MAGIC)
     10180            if (pHash->uMagic != KWCRYPTHASH_MAGIC)
    1005910181                kwErrPrintf("CryptHashData: Invalid cached hash handle!!\n");
    1006010182            else
     
    1007410196
    1007510197
     10198/** Helper for simpe data hashing.   */
     10199static 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
    1007610242/** AdvApi32 - CryptGetHashParam */
    1007710243static BOOL WINAPI kwSandbox_Advapi32_CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam,
    1007810244                                                        BYTE *pbData, DWORD *pcbData, DWORD dwFlags)
    1007910245{
    10080     BOOL        fRc;
    10081     PKWHASHMD5  pHash = g_Sandbox.pHashHead;
     10246    BOOL            fRc;
     10247    PKWCRYPTHASH    pHash = g_Sandbox.pHashHead;
    1008210248    kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    1008310249    while (pHash && (KUPTR)pHash != hHash)
     
    1008510251    if (pHash)
    1008610252    {
    10087         if (pHash->uMagic == KWHASHMD5_MAGIC)
     10253        if (pHash->uMagic == KWCRYPTHASH_MAGIC)
    1008810254        {
    1008910255            if (dwFlags == 0)
     
    1010210268                        /* Check the hash progress. */
    1010310269                        PKFSWCACHEDFILE pCachedFile = pHash->pCachedFile;
     10270                        g_cHashes++;
    1010410271                        if (pCachedFile)
    1010510272                        {
     
    1010710274                                && !pHash->fGoneBad)
    1010810275                            {
    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                                {
    1011010303                                    KWCRYPT_LOG(("Already calculated hash for %p/%s! [hit]\n", pCachedFile, pCachedFile->szPath));
     10304                                    g_cHashesCached++;
     10305                                }
    1011110306                                else
    1011210307                                {
    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;
    1011710313                                    KWCRYPT_LOG(("Calculated hash for %p/%s.\n", pCachedFile, pCachedFile->szPath));
    1011810314                                }
    10119                                 pvRet = pCachedFile->abMd5Digest;
    1012010315                            }
    1012110316                            else
     
    1012610321                                             pHash->pCachedFile->cbCached, pHash->cbHashed, pHash->fGoneBad,
    1012710322                                             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;
    1013310325                                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                                }
    1013410333                            }
    1013510334                            pHash->fFinal = K_TRUE;
    10136                             cbRet = 16;
     10335                            cbRet = pHash->cbDigest;
    1013710336                            break;
    1013810337                        }
    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)
    1014010344                        {
    10141                             if (!pHash->fFinal)
     10345                            DWORD cbActual = (DWORD)pHash->cbDigest;
     10346                            if (CryptGetHashParam(pHash->hFallback, HP_HASHVAL, pHash->abDigest, &cbActual, 0))
    1014210347                            {
     10348                                kHlpAssert(cbActual == pHash->cbDigest);
    1014310349                                pHash->fFinal = K_TRUE;
    10144                                 MD5Final(pHash->abDigest, &pHash->Md5Ctx);
     10350                                break;
    1014510351                            }
    10146                             pvRet = pHash->abDigest;
    10147                             cbRet = 16;
    10148                             break;
     10352                            kwErrPrintf("CryptGetHashParam/HP_HASHVAL: Fallback CryptGetHashParam failed: %u!!\n", GetLastError());
    1014910353                        }
    1015010354                        else
     
    1015710361
    1015810362                    case HP_HASHSIZE:
    10159                         uBuf.dw = 16;
     10363                        uBuf.dw = pHash->cbDigest;
    1016010364                        pvRet = &uBuf;
    1016110365                        cbRet = sizeof(DWORD);
     
    1016310367
    1016410368                    case HP_ALGID:
    10165                         uBuf.dw = CALG_MD5;
     10369                        uBuf.dw = pHash->idAlg;
    1016610370                        pvRet = &uBuf;
    1016710371                        cbRet = sizeof(DWORD);
     
    1019310397                                         pbData[8],  pbData[9],  pbData[10], pbData[11],
    1019410398                                         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 ? "..." : ""));
    1019510418                        else
    1019610419                            KWCRYPT_LOG(("CryptGetHashParam/%#x%/p%/%p: TRUE, cbRet=%#x [cached]\n",
     
    1023510458static BOOL WINAPI kwSandbox_Advapi32_CryptDestroyHash(HCRYPTHASH hHash)
    1023610459{
    10237     BOOL        fRc;
    10238     PKWHASHMD5  pPrev = NULL;
    10239     PKWHASHMD5  pHash = g_Sandbox.pHashHead;
     10460    BOOL            fRc;
     10461    PKWCRYPTHASH    pPrev = NULL;
     10462    PKWCRYPTHASH    pHash = g_Sandbox.pHashHead;
    1024010463    kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread);
    1024110464    while (pHash && (KUPTR)pHash != hHash)
     
    1024610469    if (pHash)
    1024710470    {
    10248         if (pHash->uMagic == KWHASHMD5_MAGIC)
     10471        if (pHash->uMagic == KWCRYPTHASH_MAGIC)
    1024910472        {
    1025010473            pHash->uMagic = 0;
     
    1027610499}
    1027710500
    10278 #endif /* WITH_HASH_MD5_CACHE */
     10501#endif /* WITH_HASH_CACHE */
    1027910502
    1028010503
     
    1074810971#endif
    1074910972
    10750 #ifdef WITH_HASH_MD5_CACHE
     10973#ifdef WITH_HASH_CACHE
    1075110974    { TUPLE("CryptCreateHash"),             NULL,       (KUPTR)kwSandbox_Advapi32_CryptCreateHash },
    1075210975    { TUPLE("CryptHashData"),               NULL,       (KUPTR)kwSandbox_Advapi32_CryptHashData },
     
    1088311106#endif
    1088411107
    10885 #ifdef WITH_HASH_MD5_CACHE
     11108#ifdef WITH_HASH_CACHE
    1088611109    { TUPLE("CryptCreateHash"),             NULL,       (KUPTR)kwSandbox_Advapi32_CryptCreateHash },
    1088711110    { TUPLE("CryptHashData"),               NULL,       (KUPTR)kwSandbox_Advapi32_CryptHashData },
     
    1144111664    PKWHEAP                     pHeap;
    1144211665    PKWLOCALSTORAGE             pLocalStorage;
    11443 #ifdef WITH_HASH_MD5_CACHE
    11444     PKWHASHMD5                  pHash;
     11666#ifdef WITH_HASH_CACHE
     11667    PKWCRYPTHASH                pHash;
    1144511668#endif
    1144611669#ifdef WITH_TEMP_MEMORY_FILES
     
    1162711850    }
    1162811851
    11629 #ifdef WITH_HASH_MD5_CACHE
     11852#ifdef WITH_HASH_CACHE
    1163011853    /*
    1163111854     * Hash handles.
     
    1163511858    while (pHash)
    1163611859    {
    11637         PKWHASHMD5 pNext = pHash->pNext;
     11860        PKWCRYPTHASH pNext = pHash->pNext;
    1163811861        KWCRYPT_LOG(("Freeing leaked hash instance %#p\n", pHash));
     11862        if (pHash->hFallback != KUPTR_MAX)
     11863            CryptDestroyHash(pHash->hFallback);
    1163911864        kHlpFree(pHash);
    1164011865        pHash = pNext;
     
    1257912804                   (unsigned)(g_pFsCache->cNameGrowths * 100 / K_MAX(g_pFsCache->cNameChanges, 1)) );
    1258012805
     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
    1258112816
    1258212817    /*
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette