- Timestamp:
- Jul 13, 2022 12:51:28 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 152252
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/ldr.h
r93115 r95612 1105 1105 * SignedData bit is found a few levels down into this as per RFC. */ 1106 1106 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, 1107 1119 1108 1120 /** Query whether code signature checks are enabled. */ … … 1281 1293 * @param hLdrMod The module handle. 1282 1294 * @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 */ 1300 RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash); 1287 1301 1288 1302 /** -
trunk/src/VBox/Runtime/common/ldr/ldrEx.cpp
r93115 r95612 629 629 break; 630 630 case RTLDRPROP_PKCS7_SIGNED_DATA: 631 case RTLDRPROP_SHA1_PAGE_HASHES: 632 case RTLDRPROP_SHA256_PAGE_HASHES: 631 633 *pcbRet = 0; 634 break; 635 case RTLDRPROP_HASHABLE_PAGES: 636 *pcbRet = sizeof(uint32_t); 637 AssertReturn(cbBuf >= sizeof(uint32_t), VERR_INVALID_PARAMETER); 632 638 break; 633 639 case RTLDRPROP_SIGNATURE_CHECKS_ENFORCED: … … 693 699 694 700 695 RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)701 RTDECL(int) RTLdrHashImage(RTLDRMOD hLdrMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash) 696 702 { 697 703 AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE); … … 704 710 switch (enmDigest) 705 711 { 706 case RTDIGESTTYPE_MD5: AssertReturn(cb Digest >= RTMD5_DIGEST_LEN + 1,VERR_BUFFER_OVERFLOW); break;707 case RTDIGESTTYPE_SHA1: AssertReturn(cb Digest >= RTSHA1_DIGEST_LEN + 1,VERR_BUFFER_OVERFLOW); break;708 case RTDIGESTTYPE_SHA256: AssertReturn(cb Digest >= RTSHA256_DIGEST_LEN + 1, VERR_BUFFER_OVERFLOW); break;709 case RTDIGESTTYPE_SHA512: AssertReturn(cb Digest >= 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; 710 716 default: 711 717 if (enmDigest > RTDIGESTTYPE_INVALID && enmDigest < RTDIGESTTYPE_END) … … 713 719 AssertFailedReturn(VERR_INVALID_PARAMETER); 714 720 } 715 AssertPtrReturn(p szDigest, VERR_INVALID_POINTER);721 AssertPtrReturn(pabHash, VERR_INVALID_POINTER); 716 722 717 723 /* … … 720 726 if (!pMod->pOps->pfnHashImage) 721 727 return VERR_NOT_SUPPORTED; 722 return pMod->pOps->pfnHashImage(pMod, enmDigest, p szDigest, cbDigest);728 return pMod->pOps->pfnHashImage(pMod, enmDigest, pabHash, cbHash); 723 729 } 724 730 RT_EXPORT_SYMBOL(RTLdrHashImage); -
trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
r93295 r95612 3160 3160 * @interface_method_impl{RTLDROPS,pfnHashImage} 3161 3161 */ 3162 static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, char *pszDigest, size_t cbDigest)3162 static DECLCALLBACK(int) rtldrPE_HashImage(PRTLDRMODINTERNAL pMod, RTDIGESTTYPE enmDigest, uint8_t *pabHash, size_t cbHash) 3163 3163 { 3164 3164 PRTLDRMODPE pModPe = (PRTLDRMODPE)pMod; … … 3186 3186 { 3187 3187 /* 3188 * Format the digest into as human readable hash string.3188 * Copy out the result. 3189 3189 */ 3190 RT_NOREF(cbHash); /* verified by caller */ 3190 3191 switch (enmDigest) 3191 3192 { 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; 3196 3197 default: AssertFailedReturn(VERR_INTERNAL_ERROR_3); 3197 3198 } -
trunk/src/VBox/Runtime/include/internal/ldr.h
r94869 r95612 518 518 * @param pMod The module handle. 519 519 * @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)); 524 525 525 526 /** -
trunk/src/VBox/Runtime/testcase/tstRTLdrVerifyPeImage.cpp
r93115 r95612 38 38 #include <iprt/test.h> 39 39 40 #include <iprt/md5.h> 41 #include <iprt/sha.h> 42 40 43 41 44 /********************************************************************************************************************************* … … 73 76 if (RT_SUCCESS(rc)) 74 77 { 75 char szDigest[512]; 78 uint8_t abHash[128]; 79 char szDigest[512]; 76 80 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); 78 82 if (RT_SUCCESS(rc)) 83 { 84 RTMd5ToString(abHash, szDigest, sizeof(szDigest)); 79 85 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); 81 88 if (RT_SUCCESS(rc)) 89 { 90 RTSha1ToString(abHash, szDigest, sizeof(szDigest)); 82 91 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); 84 94 if (RT_SUCCESS(rc)) 95 { 96 RTSha256ToString(abHash, szDigest, sizeof(szDigest)); 85 97 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); 87 100 if (RT_SUCCESS(rc)) 101 { 102 RTSha512ToString(abHash, szDigest, sizeof(szDigest)); 88 103 RTTestPrintf(hTest, RTTESTLVL_ALWAYS, "sha512=%s\n", szDigest); 104 } 89 105 90 106 if (rc != VERR_NOT_SUPPORTED)
Note:
See TracChangeset
for help on using the changeset viewer.