VirtualBox

Changeset 95612 in vbox for trunk


Ignore:
Timestamp:
Jul 13, 2022 12:51:28 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
152252
Message:

IPRT/ldr: Changed RTLdrHashImage to return the hash rather than the digest string. bugref:8691

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/ldr.h

    r93115 r95612  
    11051105     *          SignedData bit is found a few levels down into this as per RFC. */
    11061106    RTLDRPROP_PKCS7_SIGNED_DATA,
     1107    /** Query the number of pages that needs hashing.
     1108     * This is for RTLDRPROP_SHA1_PAGE_HASHES and RTLDRPROP_SHA256_PAGE_HASHES
     1109     * buffer size calculations. */
     1110    RTLDRPROP_HASHABLE_PAGES,
     1111    /** Query the SHA-1 page hashes.
     1112     * Returns an array with entries made of a 32-bit file offset and a SHA-1
     1113     * digest.  Use RTLDRPROP_HASHABLE_PAGES to calculate the buffer size. */
     1114    RTLDRPROP_SHA1_PAGE_HASHES,
     1115    /** Query the SHA-256 page hashes.
     1116     * Returns an array with entries made of a 32-bit file offset and a SHA-256
     1117     * digest. Use RTLDRPROP_HASHABLE_PAGES to calculate the buffer size. */
     1118    RTLDRPROP_SHA256_PAGE_HASHES,
    11071119
    11081120    /** Query whether code signature checks are enabled.  */
     
    12811293 * @param   hLdrMod         The module handle.
    12821294 * @param   enmDigest       Which kind of digest.
    1283  * @param   pszDigest       Where to store the image digest.
    1284  * @param   cbDigest        Size of the buffer @a pszDigest points at.
    1285  */
    1286 RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest);
     1295 * @param   pabHash         Where to store the image hash.
     1296 * @param   cbHash          Size of the buffer @a pabHash points at.  The
     1297 *                          required and returned size can be derived from the
     1298 *                          digest type (@a enmDigest).
     1299 */
     1300RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash);
    12871301
    12881302/**
  • trunk/src/VBox/Runtime/common/ldr/ldrEx.cpp

    r93115 r95612  
    629629            break;
    630630        case RTLDRPROP_PKCS7_SIGNED_DATA:
     631        case RTLDRPROP_SHA1_PAGE_HASHES:
     632        case RTLDRPROP_SHA256_PAGE_HASHES:
    631633            *pcbRet = 0;
     634            break;
     635        case RTLDRPROP_HASHABLE_PAGES:
     636            *pcbRet = sizeof(uint32_t);
     637            AssertReturn(cbBuf >= sizeof(uint32_t), VERR_INVALID_PARAMETER);
    632638            break;
    633639        case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED:
     
    693699
    694700
    695 RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
     701RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash)
    696702{
    697703    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
     
    704710    switch (enmDigest)
    705711    {
    706         case RTDIGESTTYPE_MD5:      AssertReturn(cbDigest >= RTMD5_DIGEST_LEN    + 1, VERR_BUFFER_OVERFLOW); break;
    707         case RTDIGESTTYPE_SHA1:     AssertReturn(cbDigest >= RTSHA1_DIGEST_LEN   + 1, VERR_BUFFER_OVERFLOW); break;
    708         case RTDIGESTTYPE_SHA256:   AssertReturn(cbDigest >= RTSHA256_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
    709         case RTDIGESTTYPE_SHA512:   AssertReturn(cbDigest >= RTSHA512_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;
     712        case RTDIGESTTYPE_MD5:      AssertReturn(cbHash >= RTMD5_HASH_SIZE,    VERR_BUFFER_OVERFLOW); break;
     713        case RTDIGESTTYPE_SHA1:     AssertReturn(cbHash >= RTSHA1_HASH_SIZE,  VERR_BUFFER_OVERFLOW); break;
     714        case RTDIGESTTYPE_SHA256:   AssertReturn(cbHash >= RTSHA256_HASH_SIZE, VERR_BUFFER_OVERFLOW); break;
     715        case RTDIGESTTYPE_SHA512:   AssertReturn(cbHash >= RTSHA512_HASH_SIZE, VERR_BUFFER_OVERFLOW); break;
    710716        default:
    711717            if (enmDigest > RTDIGESTTYPE_INVALID && enmDigest < RTDIGESTTYPE_END)
     
    713719            AssertFailedReturn(VERR_INVALID_PARAMETER);
    714720    }
    715     AssertPtrReturn(pszDigest, VERR_INVALID_POINTER);
     721    AssertPtrReturn(pabHash, VERR_INVALID_POINTER);
    716722
    717723    /*
     
    720726    if (!pMod->pOps->pfnHashImage)
    721727        return VERR_NOT_SUPPORTED;
    722     return pMod->pOps->pfnHashImage(pMod, enmDigest, pszDigest, cbDigest);
     728    return pMod->pOps->pfnHashImage(pMod, enmDigest, pabHash, cbHash);
    723729}
    724730RT_EXPORT_SYMBOL(RTLdrHashImage);
  • trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp

    r93295 r95612  
    31603160 * @interface_method_impl{RTLDROPS,pfnHashImage}
    31613161 */
    3162 static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)
     3162static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash)
    31633163{
    31643164    PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod;
     
    31863186    {
    31873187        /*
    3188          * Format the digest into as human readable hash string.
     3188         * Copy out the result.
    31893189         */
     3190        RT_NOREF(cbHash); /* verified by caller */
    31903191        switch (enmDigest)
    31913192        {
    3192             case RTDIGESTTYPE_SHA512:  rc = RTSha512ToString(HashRes.abSha512, pszDigest, cbDigest); break;
    3193             case RTDIGESTTYPE_SHA256:  rc = RTSha256ToString(HashRes.abSha256, pszDigest, cbDigest); break;
    3194             case RTDIGESTTYPE_SHA1:    rc = RTSha1ToString(HashRes.abSha1, pszDigest, cbDigest); break;
    3195             case RTDIGESTTYPE_MD5:     rc = RTMd5ToString(HashRes.abMd5, pszDigest, cbDigest); break;
     3193            case RTDIGESTTYPE_SHA512:  memcpy(pabHash, HashRes.abSha512, sizeof(HashRes.abSha512)); break;
     3194            case RTDIGESTTYPE_SHA256:  memcpy(pabHash, HashRes.abSha256, sizeof(HashRes.abSha256)); break;
     3195            case RTDIGESTTYPE_SHA1:    memcpy(pabHash, HashRes.abSha1,   sizeof(HashRes.abSha1)); break;
     3196            case RTDIGESTTYPE_MD5:     memcpy(pabHash, HashRes.abMd5,    sizeof(HashRes.abMd5)); break;
    31963197            default:                   AssertFailedReturn(VERR_INTERNAL_ERROR_3);
    31973198        }
  • trunk/src/VBox/Runtime/include/internal/ldr.h

    r94869 r95612  
    518518     * @param   pMod            The module handle.
    519519     * @param   enmDigest       Which kind of digest.
    520      * @param   pszDigest       Where to store the image digest.
    521      * @param   cbDigest        Size of the buffer @a pszDigest points at.
    522      */
    523     DECLCALLBACKMEMBER(int, pfnHashImage,(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest));
     520     * @param   pabHash         Where to store the image hash.
     521     * @param   cbHash          Size of the buffer @a pabHash points at.  This has
     522     *                          been validated to be at least the required size.
     523     */
     524    DECLCALLBACKMEMBER(int, pfnHashImage,(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash));
    524525
    525526        /**
  • trunk/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp

    r93115 r95612  
    3838#include <iprt/test.h>
    3939
     40#include <iprt/md5.h>
     41#include <iprt/sha.h>
     42
    4043
    4144/*********************************************************************************************************************************
     
    7376        if (RT_SUCCESS(rc))
    7477        {
    75             char szDigest[512];
     78            uint8_t abHash[128];
     79            char    szDigest[512];
    7680
    77             RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_MD5, szDigest, sizeof(szDigest)), VINF_SUCCESS);
     81            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_MD5, abHash, sizeof(abHash)), VINF_SUCCESS);
    7882            if (RT_SUCCESS(rc))
     83            {
     84                RTMd5ToString(abHash, szDigest, sizeof(szDigest));
    7985                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "md5=%s\n", szDigest);
    80             RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA1, szDigest, sizeof(szDigest)), VINF_SUCCESS);
     86            }
     87            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA1, abHash, sizeof(abHash)), VINF_SUCCESS);
    8188            if (RT_SUCCESS(rc))
     89            {
     90                RTSha1ToString(abHash, szDigest, sizeof(szDigest));
    8291                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha1=%s\n", szDigest);
    83             RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA256, szDigest, sizeof(szDigest)), VINF_SUCCESS);
     92            }
     93            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA256, abHash, sizeof(abHash)), VINF_SUCCESS);
    8494            if (RT_SUCCESS(rc))
     95            {
     96                RTSha256ToString(abHash, szDigest, sizeof(szDigest));
    8597                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha256=%s\n", szDigest);
    86             RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA512, szDigest, sizeof(szDigest)), VINF_SUCCESS);
     98            }
     99            RTTESTI_CHECK_RC(rc = RTLdrHashImage(hLdrMod, RTDIGESTTYPE_SHA512, abHash, sizeof(abHash)), VINF_SUCCESS);
    87100            if (RT_SUCCESS(rc))
     101            {
     102                RTSha512ToString(abHash, szDigest, sizeof(szDigest));
    88103                RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha512=%s\n", szDigest);
     104            }
    89105
    90106            if (rc != VERR_NOT_SUPPORTED)
Note: See TracChangeset for help on using the changeset viewer.

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