- Timestamp:
- Jun 27, 2016 10:55:28 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/crypto/digest.h
r59689 r61891 61 61 62 62 /** 63 * Allocates the digest data. 64 */ 65 DECLCALLBACKMEMBER(void *, pfnNew)(void); 66 67 /** 68 * Frees the digest data. 69 * 70 * @param pvState The opaque message digest state. 71 */ 72 DECLCALLBACKMEMBER(void, pfnFree)(void *pvState); 73 74 /** 63 75 * Updates the digest with more data. 64 76 * -
trunk/src/VBox/Runtime/common/crypto/digest-builtin.cpp
r57358 r61891 87 87 sizeof(RTMD2CONTEXT), 88 88 0, 89 NULL, 90 NULL, 89 91 rtCrDigestMd2_Update, 90 92 rtCrDigestMd2_Final, … … 139 141 sizeof(RTMD5CONTEXT), 140 142 0, 143 NULL, 144 NULL, 141 145 rtCrDigestMd5_Update, 142 146 rtCrDigestMd5_Final, … … 191 195 sizeof(RTSHA1CONTEXT), 192 196 0, 197 NULL, 198 NULL, 193 199 rtCrDigestSha1_Update, 194 200 rtCrDigestSha1_Final, … … 242 248 sizeof(RTSHA256CONTEXT), 243 249 0, 250 NULL, 251 NULL, 244 252 rtCrDigestSha256_Update, 245 253 rtCrDigestSha256_Final, … … 293 301 sizeof(RTSHA512CONTEXT), 294 302 0, 303 NULL, 304 NULL, 295 305 rtCrDigestSha512_Update, 296 306 rtCrDigestSha512_Final, … … 344 354 sizeof(RTSHA224CONTEXT), 345 355 0, 356 NULL, 357 NULL, 346 358 rtCrDigestSha224_Update, 347 359 rtCrDigestSha224_Final, … … 395 407 sizeof(RTSHA384CONTEXT), 396 408 0, 409 NULL, 410 NULL, 397 411 rtCrDigestSha384_Update, 398 412 rtCrDigestSha384_Final, … … 446 460 sizeof(RTSHA512T224CONTEXT), 447 461 0, 462 NULL, 463 NULL, 448 464 rtCrDigestSha512t224_Update, 449 465 rtCrDigestSha512t224_Final, … … 498 514 sizeof(RTSHA512T256CONTEXT), 499 515 0, 516 NULL, 517 NULL, 500 518 rtCrDigestSha512t256_Update, 501 519 rtCrDigestSha512t256_Final, … … 534 552 * OpenSSL EVP. 535 553 */ 554 555 # if OPENSSL_VERSION_NUMBER >= 0x10100000 556 /** @impl_interface_method{RTCRDIGESTDESC::pfnNew} */ 557 static DECLCALLBACK(void*) rtCrDigestOsslEvp_New(void) 558 { 559 return EVP_MD_CTX_new(); 560 } 561 562 static DECLCALLBACK(void) rtCrDigestOsslEvp_Free(void *pvState) 563 { 564 EVP_MD_CTX_free((EVP_MD_CTX*)pvState); 565 } 566 567 # endif 536 568 537 569 /** @impl_interface_method{RTCRDIGESTDESC::pfnUpdate} */ … … 540 572 EVP_DigestUpdate((EVP_MD_CTX *)pvState, pvData, cbData); 541 573 } 542 543 574 544 575 /** @impl_interface_method{RTCRDIGESTDESC::pfnFinal} */ … … 558 589 { 559 590 pEvpType = EVP_MD_CTX_md(pThis); 591 # if OPENSSL_VERSION_NUMBER >= 0x10100000 592 EVP_MD_CTX_reset(pThis); 593 # else 560 594 EVP_MD_CTX_cleanup(pThis); 595 # endif 561 596 } 562 597 … … 573 608 { 574 609 EVP_MD_CTX *pThis = (EVP_MD_CTX *)pvState; 610 # if OPENSSL_VERSION_NUMBER >= 0x10100000 611 EVP_MD_CTX_reset(pThis); 612 # else 575 613 EVP_MD_CTX_cleanup(pThis); 614 # endif 576 615 } 577 616 … … 614 653 RTDIGESTTYPE_UNKNOWN, 615 654 EVP_MAX_MD_SIZE, 616 sizeof(EVP_MD_CTX), 617 0, 655 0, 656 0, 657 # if OPENSSL_VERSION_NUMBER >= 0x10100000 658 rtCrDigestOsslEvp_New, 659 rtCrDigestOsslEvp_Free, 660 # else 661 NULL, 662 NULL, 663 # endif 618 664 rtCrDigestOsslEvp_Update, 619 665 rtCrDigestOsslEvp_Final, -
trunk/src/VBox/Runtime/common/crypto/digest-core.cpp
r59689 r61891 60 60 /** The number of bytes consumed. */ 61 61 uint64_t cbConsumed; 62 /** Pointer to the data specific to the message digest algorithm. Points 63 * either to &abState[0] or to memory allocated with pDesc->pfnNew. */ 64 void *pvState; 62 65 /** Opaque data specific to the message digest algorithm, size given by 63 * RTCRDIGESTDESC::cbState. This is followed by space for the final hash at 64 * offHash with size RTCRDIGESTDESC::cbHash. */ 66 * RTCRDIGESTDESC::cbState. This is followed by space for the final hash 67 * at offHash with size RTCRDIGESTDESC::cbHash. The data specific to the 68 * message digest algorithm can also be 0. In this case, pDesc->pfnNew() 69 * and pDesc->pfnFree() must not be NULL. */ 65 70 uint8_t abState[1]; 66 71 } RTCRDIGESTINT; … … 89 94 90 95 int rc = VINF_SUCCESS; 91 uint32_t offHash = RT_ALIGN_32(pDesc->cbState, 8); 96 uint32_t const offHash = RT_ALIGN_32(pDesc->cbState, 8); 97 AssertReturn(pDesc->pfnNew || offHash, VERR_INVALID_PARAMETER); 98 AssertReturn(!pDesc->pfnNew || (pDesc->pfnFree && pDesc->pfnInit && pDesc->pfnClone), VERR_INVALID_PARAMETER); 92 99 PRTCRDIGESTINT pThis = (PRTCRDIGESTINT)RTMemAllocZ(RT_OFFSETOF(RTCRDIGESTINT, abState[offHash + pDesc->cbHash])); 93 100 if (pThis) 94 101 { 95 pThis->u32Magic = RTCRDIGESTINT_MAGIC; 96 pThis->cRefs = 1; 97 pThis->offHash = offHash; 98 pThis->pDesc = pDesc; 99 pThis->uState = RTCRDIGEST_STATE_READY; 100 if (pDesc->pfnInit) 101 rc = pDesc->pfnInit(pThis->abState, pvOpaque, false /*fReInit*/); 102 if (RT_SUCCESS(rc)) 102 if (pDesc->pfnNew) 103 pThis->pvState = pDesc->pfnNew(); 104 else 105 pThis->pvState = &pThis->abState[0]; 106 if (pThis->pvState) 103 107 { 104 *phDigest = pThis; 105 return VINF_SUCCESS; 108 pThis->u32Magic = RTCRDIGESTINT_MAGIC; 109 pThis->cRefs = 1; 110 pThis->offHash = offHash; 111 pThis->pDesc = pDesc; 112 pThis->uState = RTCRDIGEST_STATE_READY; 113 if (pDesc->pfnInit) 114 rc = pDesc->pfnInit(pThis->pvState, pvOpaque, false /*fReInit*/); 115 if (RT_SUCCESS(rc)) 116 { 117 *phDigest = pThis; 118 return VINF_SUCCESS; 119 } 120 if (pDesc->pfnFree) 121 pDesc->pfnFree(pThis->pvState); 106 122 } 123 else 124 rc = VERR_NO_MEMORY; 107 125 pThis->u32Magic = 0; 108 126 RTMemFree(pThis); … … 125 143 if (pThis) 126 144 { 127 pThis->u32Magic = RTCRDIGESTINT_MAGIC; 128 pThis->cRefs = 1; 129 pThis->offHash = offHash; 130 pThis->pDesc = hSrc->pDesc; 131 if (hSrc->pDesc->pfnClone) 132 rc = hSrc->pDesc->pfnClone(pThis->abState, hSrc->abState); 133 else 134 memcpy(pThis->abState, hSrc->abState, offHash); 135 memcpy(&pThis->abState[offHash], &hSrc->abState[offHash], hSrc->pDesc->cbHash); 136 pThis->uState = hSrc->uState; 137 138 if (RT_SUCCESS(rc)) 145 if (hSrc->pDesc->pfnNew) 146 pThis->pvState = hSrc->pDesc->pfnNew(); 147 else 148 pThis->pvState = &pThis->abState[0]; 149 if (pThis->pvState) 139 150 { 140 *phDigest = pThis; 141 return VINF_SUCCESS; 151 pThis->u32Magic = RTCRDIGESTINT_MAGIC; 152 pThis->cRefs = 1; 153 pThis->offHash = offHash; 154 pThis->pDesc = hSrc->pDesc; 155 if (hSrc->pDesc->pfnClone) 156 rc = hSrc->pDesc->pfnClone(pThis->pvState, hSrc->pvState); 157 else 158 { 159 Assert(!hSrc->pDesc->pfnNew); 160 memcpy(pThis->pvState, hSrc->pvState, offHash); 161 } 162 memcpy(&pThis->abState[offHash], &hSrc->abState[offHash], hSrc->pDesc->cbHash); 163 pThis->uState = hSrc->uState; 164 165 if (RT_SUCCESS(rc)) 166 { 167 *phDigest = pThis; 168 return VINF_SUCCESS; 169 } 170 if (hSrc->pDesc->pfnFree) 171 hSrc->pDesc->pfnFree(pThis->pvState); 142 172 } 173 else 174 rc = VERR_NO_MEMORY; 143 175 pThis->u32Magic = 0; 144 176 RTMemFree(pThis); … … 162 194 if (pThis->pDesc->pfnInit) 163 195 { 164 rc = pThis->pDesc->pfnInit(pThis-> abState, NULL, true /*fReInit*/);196 rc = pThis->pDesc->pfnInit(pThis->pvState, NULL, true /*fReInit*/); 165 197 if (RT_FAILURE(rc)) 166 198 pThis->uState = RTCRDIGEST_STATE_BUSTED; … … 168 200 } 169 201 else 170 RT_BZERO(pThis->abState, pThis->offHash + pThis->pDesc->cbHash); 202 { 203 Assert(!pThis->pDesc->pfnNew); 204 RT_BZERO(pThis->pvState, pThis->offHash + pThis->pDesc->cbHash); 205 } 171 206 return rc; 172 207 } … … 198 233 pThis->u32Magic = ~RTCRDIGESTINT_MAGIC; 199 234 if (pThis->pDesc->pfnDelete) 200 pThis->pDesc->pfnDelete(pThis->abState); 235 pThis->pDesc->pfnDelete(pThis->pvState); 236 if (pThis->pDesc->pfnFree) 237 pThis->pDesc->pfnFree(pThis->pvState); 201 238 RTMemFree(pThis); 202 239 } … … 213 250 AssertReturn(pThis->uState == RTCRDIGEST_STATE_READY, VERR_INVALID_STATE); 214 251 215 pThis->pDesc->pfnUpdate(pThis-> abState, pvData, cbData);252 pThis->pDesc->pfnUpdate(pThis->pvState, pvData, cbData); 216 253 pThis->cbConsumed += cbData; 217 254 return VINF_SUCCESS; … … 232 269 if (pThis->uState == RTCRDIGEST_STATE_READY) 233 270 { 234 pThis->pDesc->pfnFinal(pThis-> abState, &pThis->abState[pThis->offHash]);271 pThis->pDesc->pfnFinal(pThis->pvState, &pThis->abState[pThis->offHash]); 235 272 pThis->uState = RTCRDIGEST_STATE_FINAL; 236 273 } … … 245 282 uint32_t cbNeeded = pThis->pDesc->cbHash; 246 283 if (pThis->pDesc->pfnGetHashSize) 247 cbNeeded = pThis->pDesc->pfnGetHashSize(pThis-> abState);284 cbNeeded = pThis->pDesc->pfnGetHashSize(pThis->pvState); 248 285 Assert(cbNeeded > 0); 249 286 … … 300 337 if (pThis->pDesc->pfnGetHashSize) 301 338 { 302 uint32_t cbHash = pThis->pDesc->pfnGetHashSize(pThis-> abState);339 uint32_t cbHash = pThis->pDesc->pfnGetHashSize(pThis->pvState); 303 340 Assert(cbHash <= pThis->pDesc->cbHash); 304 341 return cbHash; … … 334 371 RTDIGESTTYPE enmType = pThis->pDesc->enmType; 335 372 if (pThis->pDesc->pfnGetDigestType) 336 enmType = pThis->pDesc->pfnGetDigestType(pThis-> abState);373 enmType = pThis->pDesc->pfnGetDigestType(pThis->pvState); 337 374 return enmType; 338 375 }
Note:
See TracChangeset
for help on using the changeset viewer.