| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 /* | 4 /* |
| 5 * pkix_build.c | 5 * pkix_build.c |
| 6 * | 6 * |
| 7 * Top level buildChain function | 7 * Top level buildChain function |
| 8 * | 8 * |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 state->numCerts = 0; | 58 state->numCerts = 0; |
| 59 state->numAias = 0; | 59 state->numAias = 0; |
| 60 state->certIndex = 0; | 60 state->certIndex = 0; |
| 61 state->aiaIndex = 0; | 61 state->aiaIndex = 0; |
| 62 state->certCheckedIndex = 0; | 62 state->certCheckedIndex = 0; |
| 63 state->checkerIndex = 0; | 63 state->checkerIndex = 0; |
| 64 state->hintCertIndex = 0; | 64 state->hintCertIndex = 0; |
| 65 state->numFanout = 0; | 65 state->numFanout = 0; |
| 66 state->numDepth = 0; | 66 state->numDepth = 0; |
| 67 state->reasonCode = 0; | 67 state->reasonCode = 0; |
| 68 state->revCheckDelayed = PKIX_FALSE; | |
| 69 state->canBeCached = PKIX_FALSE; | 68 state->canBeCached = PKIX_FALSE; |
| 70 state->useOnlyLocal = PKIX_FALSE; | 69 state->useOnlyLocal = PKIX_FALSE; |
| 71 state->revChecking = PKIX_FALSE; | 70 state->revChecking = PKIX_FALSE; |
| 72 state->usingHintCerts = PKIX_FALSE; | 71 state->usingHintCerts = PKIX_FALSE; |
| 73 state->certLoopingDetected = PKIX_FALSE; | 72 state->certLoopingDetected = PKIX_FALSE; |
| 74 PKIX_DECREF(state->validityDate); | 73 PKIX_DECREF(state->validityDate); |
| 75 PKIX_DECREF(state->prevCert); | 74 PKIX_DECREF(state->prevCert); |
| 76 PKIX_DECREF(state->candidateCert); | 75 PKIX_DECREF(state->candidateCert); |
| 77 PKIX_DECREF(state->traversedSubjNames); | 76 PKIX_DECREF(state->traversedSubjNames); |
| 78 PKIX_DECREF(state->trustChain); | 77 PKIX_DECREF(state->trustChain); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 * DESCRIPTION: | 118 * DESCRIPTION: |
| 120 * Allocate and initialize a ForwardBuilderState. | 119 * Allocate and initialize a ForwardBuilderState. |
| 121 * | 120 * |
| 122 * PARAMETERS | 121 * PARAMETERS |
| 123 * "traversedCACerts" | 122 * "traversedCACerts" |
| 124 * Number of CA certificates traversed. | 123 * Number of CA certificates traversed. |
| 125 * "numFanout" | 124 * "numFanout" |
| 126 * Number of Certs that can be considered at this level (0 = no limit) | 125 * Number of Certs that can be considered at this level (0 = no limit) |
| 127 * "numDepth" | 126 * "numDepth" |
| 128 * Number of additional levels that can be searched (0 = no limit) | 127 * Number of additional levels that can be searched (0 = no limit) |
| 129 * "revCheckDelayed" | |
| 130 * Boolean value indicating whether rev check is delayed until after | |
| 131 * entire chain is built. | |
| 132 * "canBeCached" | 128 * "canBeCached" |
| 133 * Boolean value indicating whether all certs on the chain can be cached. | 129 * Boolean value indicating whether all certs on the chain can be cached. |
| 134 * "validityDate" | 130 * "validityDate" |
| 135 * Address of Date at which build chain Certs' most restricted validity | 131 * Address of Date at which build chain Certs' most restricted validity |
| 136 * time is kept. May be NULL. | 132 * time is kept. May be NULL. |
| 137 * "prevCert" | 133 * "prevCert" |
| 138 * Address of Cert just traversed. Must be non-NULL. | 134 * Address of Cert just traversed. Must be non-NULL. |
| 139 * "traversedSubjNames" | 135 * "traversedSubjNames" |
| 140 * Address of List of GeneralNames that have been traversed. | 136 * Address of List of GeneralNames that have been traversed. |
| 141 * Must be non-NULL. | 137 * Must be non-NULL. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 152 * RETURNS: | 148 * RETURNS: |
| 153 * Returns NULL if the function succeeds. | 149 * Returns NULL if the function succeeds. |
| 154 * Returns a Build Error if the function fails in a non-fatal way. | 150 * Returns a Build Error if the function fails in a non-fatal way. |
| 155 * Returns a Fatal Error if the function fails in an unrecoverable way. | 151 * Returns a Fatal Error if the function fails in an unrecoverable way. |
| 156 */ | 152 */ |
| 157 static PKIX_Error * | 153 static PKIX_Error * |
| 158 pkix_ForwardBuilderState_Create( | 154 pkix_ForwardBuilderState_Create( |
| 159 PKIX_Int32 traversedCACerts, | 155 PKIX_Int32 traversedCACerts, |
| 160 PKIX_UInt32 numFanout, | 156 PKIX_UInt32 numFanout, |
| 161 PKIX_UInt32 numDepth, | 157 PKIX_UInt32 numDepth, |
| 162 PKIX_Boolean revCheckDelayed, | |
| 163 PKIX_Boolean canBeCached, | 158 PKIX_Boolean canBeCached, |
| 164 PKIX_PL_Date *validityDate, | 159 PKIX_PL_Date *validityDate, |
| 165 PKIX_PL_Cert *prevCert, | 160 PKIX_PL_Cert *prevCert, |
| 166 PKIX_List *traversedSubjNames, | 161 PKIX_List *traversedSubjNames, |
| 167 PKIX_List *trustChain, | 162 PKIX_List *trustChain, |
| 168 PKIX_ForwardBuilderState *parentState, | 163 PKIX_ForwardBuilderState *parentState, |
| 169 PKIX_ForwardBuilderState **pState, | 164 PKIX_ForwardBuilderState **pState, |
| 170 void *plContext) | 165 void *plContext) |
| 171 { | 166 { |
| 172 PKIX_ForwardBuilderState *state = NULL; | 167 PKIX_ForwardBuilderState *state = NULL; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 188 state->numAias = 0; | 183 state->numAias = 0; |
| 189 state->certIndex = 0; | 184 state->certIndex = 0; |
| 190 state->aiaIndex = 0; | 185 state->aiaIndex = 0; |
| 191 state->certCheckedIndex = 0; | 186 state->certCheckedIndex = 0; |
| 192 state->checkerIndex = 0; | 187 state->checkerIndex = 0; |
| 193 state->hintCertIndex = 0; | 188 state->hintCertIndex = 0; |
| 194 state->numFanout = numFanout; | 189 state->numFanout = numFanout; |
| 195 state->numDepth = numDepth; | 190 state->numDepth = numDepth; |
| 196 state->reasonCode = 0; | 191 state->reasonCode = 0; |
| 197 state->revChecking = numDepth; | 192 state->revChecking = numDepth; |
| 198 state->revCheckDelayed = revCheckDelayed; | |
| 199 state->canBeCached = canBeCached; | 193 state->canBeCached = canBeCached; |
| 200 state->useOnlyLocal = PKIX_TRUE; | 194 state->useOnlyLocal = PKIX_TRUE; |
| 201 state->revChecking = PKIX_FALSE; | 195 state->revChecking = PKIX_FALSE; |
| 202 state->usingHintCerts = PKIX_FALSE; | 196 state->usingHintCerts = PKIX_FALSE; |
| 203 state->certLoopingDetected = PKIX_FALSE; | 197 state->certLoopingDetected = PKIX_FALSE; |
| 204 | 198 |
| 205 PKIX_INCREF(validityDate); | 199 PKIX_INCREF(validityDate); |
| 206 state->validityDate = validityDate; | 200 state->validityDate = validityDate; |
| 207 | 201 |
| 208 PKIX_INCREF(prevCert); | 202 PKIX_INCREF(prevCert); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 "\t{buildStatus: \t%s\n" | 358 "\t{buildStatus: \t%s\n" |
| 365 "\ttraversedCACerts: \t%d\n" | 359 "\ttraversedCACerts: \t%d\n" |
| 366 "\tcertStoreIndex: \t%d\n" | 360 "\tcertStoreIndex: \t%d\n" |
| 367 "\tnumCerts: \t%d\n" | 361 "\tnumCerts: \t%d\n" |
| 368 "\tnumAias: \t%d\n" | 362 "\tnumAias: \t%d\n" |
| 369 "\tcertIndex: \t%d\n" | 363 "\tcertIndex: \t%d\n" |
| 370 "\taiaIndex: \t%d\n" | 364 "\taiaIndex: \t%d\n" |
| 371 "\tnumFanout: \t%d\n" | 365 "\tnumFanout: \t%d\n" |
| 372 "\tnumDepth: \t%d\n" | 366 "\tnumDepth: \t%d\n" |
| 373 "\treasonCode: \t%d\n" | 367 "\treasonCode: \t%d\n" |
| 374 "\trevCheckDelayed: \t%d\n" | |
| 375 "\tcanBeCached: \t%d\n" | 368 "\tcanBeCached: \t%d\n" |
| 376 "\tuseOnlyLocal: \t%d\n" | 369 "\tuseOnlyLocal: \t%d\n" |
| 377 "\trevChecking: \t%d\n" | 370 "\trevChecking: \t%d\n" |
| 378 "\tvalidityDate: \t%s\n" | 371 "\tvalidityDate: \t%s\n" |
| 379 "\tprevCert: \t%s\n" | 372 "\tprevCert: \t%s\n" |
| 380 "\tcandidateCert: \t%s\n" | 373 "\tcandidateCert: \t%s\n" |
| 381 "\ttraversedSubjNames: \t%s\n" | 374 "\ttraversedSubjNames: \t%s\n" |
| 382 "\ttrustChain: \t%s\n" | 375 "\ttrustChain: \t%s\n" |
| 383 "\tcandidateCerts: \t%s\n" | 376 "\tcandidateCerts: \t%s\n" |
| 384 "\tcertSel: \t%s\n" | 377 "\tcertSel: \t%s\n" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 409 case BUILD_AIAPENDING: asciiStatus = "BUILD_AIAPENDING"; | 402 case BUILD_AIAPENDING: asciiStatus = "BUILD_AIAPENDING"; |
| 410 break; | 403 break; |
| 411 case BUILD_COLLECTINGCERTS: asciiStatus = "BUILD_COLLECTINGCERTS"; | 404 case BUILD_COLLECTINGCERTS: asciiStatus = "BUILD_COLLECTINGCERTS"; |
| 412 break; | 405 break; |
| 413 case BUILD_GATHERPENDING: asciiStatus = "BUILD_GATHERPENDING"; | 406 case BUILD_GATHERPENDING: asciiStatus = "BUILD_GATHERPENDING"; |
| 414 break; | 407 break; |
| 415 case BUILD_CERTVALIDATING: asciiStatus = "BUILD_CERTVALIDATING"; | 408 case BUILD_CERTVALIDATING: asciiStatus = "BUILD_CERTVALIDATING"; |
| 416 break; | 409 break; |
| 417 case BUILD_ABANDONNODE: asciiStatus = "BUILD_ABANDONNODE"; | 410 case BUILD_ABANDONNODE: asciiStatus = "BUILD_ABANDONNODE"; |
| 418 break; | 411 break; |
| 419 case BUILD_CRLPREP: asciiStatus = "BUILD_CRLPREP"; | |
| 420 break; | |
| 421 case BUILD_CRL1: asciiStatus = "BUILD_CRL1"; | |
| 422 break; | |
| 423 case BUILD_DATEPREP: asciiStatus = "BUILD_DATEPREP"; | 412 case BUILD_DATEPREP: asciiStatus = "BUILD_DATEPREP"; |
| 424 break; | 413 break; |
| 425 case BUILD_CHECKTRUSTED: asciiStatus = "BUILD_CHECKTRUSTED"; | 414 case BUILD_CHECKTRUSTED: asciiStatus = "BUILD_CHECKTRUSTED"; |
| 426 break; | 415 break; |
| 427 case BUILD_CHECKTRUSTED2: asciiStatus = "BUILD_CHECKTRUSTED2"; | 416 case BUILD_CHECKTRUSTED2: asciiStatus = "BUILD_CHECKTRUSTED2"; |
| 428 break; | 417 break; |
| 429 case BUILD_ADDTOCHAIN: asciiStatus = "BUILD_ADDTOCHAIN"; | 418 case BUILD_ADDTOCHAIN: asciiStatus = "BUILD_ADDTOCHAIN"; |
| 430 break; | 419 break; |
| 431 case BUILD_CRL2: asciiStatus = "BUILD_CRL2"; | |
| 432 break; | |
| 433 case BUILD_VALCHAIN: asciiStatus = "BUILD_VALCHAIN"; | 420 case BUILD_VALCHAIN: asciiStatus = "BUILD_VALCHAIN"; |
| 434 break; | 421 break; |
| 435 case BUILD_VALCHAIN2: asciiStatus = "BUILD_VALCHAIN2"; | 422 case BUILD_VALCHAIN2: asciiStatus = "BUILD_VALCHAIN2"; |
| 436 break; | 423 break; |
| 437 case BUILD_EXTENDCHAIN: asciiStatus = "BUILD_EXTENDCHAIN"; | 424 case BUILD_EXTENDCHAIN: asciiStatus = "BUILD_EXTENDCHAIN"; |
| 438 break; | 425 break; |
| 439 case BUILD_GETNEXTCERT: asciiStatus = "BUILD_GETNEXTCERT"; | 426 case BUILD_GETNEXTCERT: asciiStatus = "BUILD_GETNEXTCERT"; |
| 440 break; | 427 break; |
| 441 default: asciiStatus = "INVALID STATUS"; | 428 default: asciiStatus = "INVALID STATUS"; |
| 442 break; | 429 break; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 buildStatusString, | 478 buildStatusString, |
| 492 (PKIX_Int32)state->traversedCACerts, | 479 (PKIX_Int32)state->traversedCACerts, |
| 493 (PKIX_UInt32)state->certStoreIndex, | 480 (PKIX_UInt32)state->certStoreIndex, |
| 494 (PKIX_UInt32)state->numCerts, | 481 (PKIX_UInt32)state->numCerts, |
| 495 (PKIX_UInt32)state->numAias, | 482 (PKIX_UInt32)state->numAias, |
| 496 (PKIX_UInt32)state->certIndex, | 483 (PKIX_UInt32)state->certIndex, |
| 497 (PKIX_UInt32)state->aiaIndex, | 484 (PKIX_UInt32)state->aiaIndex, |
| 498 (PKIX_UInt32)state->numFanout, | 485 (PKIX_UInt32)state->numFanout, |
| 499 (PKIX_UInt32)state->numDepth, | 486 (PKIX_UInt32)state->numDepth, |
| 500 (PKIX_UInt32)state->reasonCode, | 487 (PKIX_UInt32)state->reasonCode, |
| 501 state->revCheckDelayed, | |
| 502 state->canBeCached, | 488 state->canBeCached, |
| 503 state->useOnlyLocal, | 489 state->useOnlyLocal, |
| 504 state->revChecking, | 490 state->revChecking, |
| 505 validityDateString, | 491 validityDateString, |
| 506 prevCertString, | 492 prevCertString, |
| 507 candidateCertString, | 493 candidateCertString, |
| 508 traversedSubjNamesString, | 494 traversedSubjNamesString, |
| 509 trustChainString, | 495 trustChainString, |
| 510 candidateCertsString, | 496 candidateCertsString, |
| 511 certSelString, | 497 certSelString, |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 static PKIX_Error* | 635 static PKIX_Error* |
| 650 pkix_ForwardBuilderState_IsIOPending( | 636 pkix_ForwardBuilderState_IsIOPending( |
| 651 PKIX_ForwardBuilderState *state, | 637 PKIX_ForwardBuilderState *state, |
| 652 PKIX_Boolean *pPending, | 638 PKIX_Boolean *pPending, |
| 653 void *plContext) | 639 void *plContext) |
| 654 { | 640 { |
| 655 PKIX_ENTER(FORWARDBUILDERSTATE, "pkix_ForwardBuilderState_IsIOPending"); | 641 PKIX_ENTER(FORWARDBUILDERSTATE, "pkix_ForwardBuilderState_IsIOPending"); |
| 656 PKIX_NULLCHECK_TWO(state, pPending); | 642 PKIX_NULLCHECK_TWO(state, pPending); |
| 657 | 643 |
| 658 if ((state->status == BUILD_GATHERPENDING) || | 644 if ((state->status == BUILD_GATHERPENDING) || |
| 659 (state->status == BUILD_CRL1) || | |
| 660 (state->status == BUILD_CRL2) || | |
| 661 (state->status == BUILD_CHECKTRUSTED2) || | 645 (state->status == BUILD_CHECKTRUSTED2) || |
| 662 (state->status == BUILD_VALCHAIN2) || | 646 (state->status == BUILD_VALCHAIN2) || |
| 663 (state->status == BUILD_AIAPENDING)) { | 647 (state->status == BUILD_AIAPENDING)) { |
| 664 *pPending = PKIX_TRUE; | 648 *pPending = PKIX_TRUE; |
| 665 } else { | 649 } else { |
| 666 *pPending = PKIX_FALSE; | 650 *pPending = PKIX_FALSE; |
| 667 } | 651 } |
| 668 | 652 |
| 669 PKIX_RETURN(FORWARDBUILDERSTATE); | 653 PKIX_RETURN(FORWARDBUILDERSTATE); |
| 670 } | 654 } |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 goto cleanup; \ | 757 goto cleanup; \ |
| 774 } | 758 } |
| 775 | 759 |
| 776 /* | 760 /* |
| 777 * FUNCTION: pkix_Build_VerifyCertificate | 761 * FUNCTION: pkix_Build_VerifyCertificate |
| 778 * DESCRIPTION: | 762 * DESCRIPTION: |
| 779 * | 763 * |
| 780 * Checks whether the previous Cert stored in the ForwardBuilderState pointed | 764 * Checks whether the previous Cert stored in the ForwardBuilderState pointed |
| 781 * to by "state" successfully chains, including signature verification, to the | 765 * to by "state" successfully chains, including signature verification, to the |
| 782 * candidate Cert also stored in "state", using the Boolean value in "trusted" | 766 * candidate Cert also stored in "state", using the Boolean value in "trusted" |
| 783 * to determine whether "candidateCert" is trusted. Using the Boolean value in | 767 * to determine whether "candidateCert" is trusted. |
| 784 * "revocationChecking" for the existence of revocation checking, it sets | |
| 785 * "pNeedsCRLChecking" to PKIX_TRUE if the candidate Cert needs to be checked | |
| 786 * against Certificate Revocation Lists. | |
| 787 * | 768 * |
| 788 * First it checks whether "candidateCert" has already been traversed by | 769 * First it checks whether "candidateCert" has already been traversed by |
| 789 * determining whether it is contained in the List of traversed Certs. It | 770 * determining whether it is contained in the List of traversed Certs. It then |
| 790 * checks the candidate Cert with user checkers, if any, in the List pointed to | 771 * checks the candidate Cert with user checkers, if any, in the List pointed to |
| 791 * by "userCheckers". It then runs the signature validation. Finally, it | 772 * by "userCheckers". Finally, it runs the signature validation. |
| 792 * determines the appropriate value for "pNeedsCRLChecking". | |
| 793 * | 773 * |
| 794 * If this Certificate fails verification, and state->verifyNode is non-NULL, | 774 * If this Certificate fails verification, and state->verifyNode is non-NULL, |
| 795 * this function sets the Error code into the verifyNode. | 775 * this function sets the Error code into the verifyNode. |
| 796 * | 776 * |
| 797 * PARAMETERS: | 777 * PARAMETERS: |
| 798 * "state" | 778 * "state" |
| 799 * Address of ForwardBuilderState to be used. Must be non-NULL. | 779 * Address of ForwardBuilderState to be used. Must be non-NULL. |
| 800 * "userCheckers" | 780 * "userCheckers" |
| 801 * Address of a List of CertChainCheckers to be used, if present, to | 781 * Address of a List of CertChainCheckers to be used, if present, to |
| 802 * validate the candidateCert. | 782 * validate the candidateCert. |
| 803 * "revocationChecking" | |
| 804 * Boolean indication of whether revocation checking is available, either | |
| 805 * as a CertChainChecker or a List of RevocationCheckers. | |
| 806 * "trusted" | 783 * "trusted" |
| 807 * Boolean value of trust for the candidate Cert | 784 * Boolean value of trust for the candidate Cert |
| 808 * "pNeedsCRLChecking" | |
| 809 * Address where Boolean CRL-checking-needed value is stored. | |
| 810 * Must be non-NULL. | |
| 811 * "plContext" | 785 * "plContext" |
| 812 * Platform-specific context pointer. | 786 * Platform-specific context pointer. |
| 813 * THREAD SAFETY: | 787 * THREAD SAFETY: |
| 814 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) | 788 * Thread Safe (see Thread Safety Definitions in Programmer's Guide) |
| 815 * RETURNS: | 789 * RETURNS: |
| 816 * Returns NULL if the function succeeds. | 790 * Returns NULL if the function succeeds. |
| 817 * Returns a Build Error if the function fails in a non-fatal way | 791 * Returns a Build Error if the function fails in a non-fatal way |
| 818 * Returns a Fatal Error if the function fails in an unrecoverable way. | 792 * Returns a Fatal Error if the function fails in an unrecoverable way. |
| 819 */ | 793 */ |
| 820 static PKIX_Error * | 794 static PKIX_Error * |
| 821 pkix_Build_VerifyCertificate( | 795 pkix_Build_VerifyCertificate( |
| 822 PKIX_ForwardBuilderState *state, | 796 PKIX_ForwardBuilderState *state, |
| 823 PKIX_List *userCheckers, | 797 PKIX_List *userCheckers, |
| 824 PKIX_Boolean revocationChecking, | |
| 825 PKIX_Boolean *pTrusted, | 798 PKIX_Boolean *pTrusted, |
| 826 PKIX_Boolean *pNeedsCRLChecking, | |
| 827 PKIX_VerifyNode *verifyNode, | 799 PKIX_VerifyNode *verifyNode, |
| 828 void *plContext) | 800 void *plContext) |
| 829 { | 801 { |
| 830 PKIX_UInt32 numUserCheckers = 0; | 802 PKIX_UInt32 numUserCheckers = 0; |
| 831 PKIX_UInt32 i = 0; | 803 PKIX_UInt32 i = 0; |
| 832 PKIX_Boolean loopFound = PKIX_FALSE; | 804 PKIX_Boolean loopFound = PKIX_FALSE; |
| 833 PKIX_Boolean supportForwardChecking = PKIX_FALSE; | 805 PKIX_Boolean supportForwardChecking = PKIX_FALSE; |
| 834 PKIX_Boolean trusted = PKIX_FALSE; | 806 PKIX_Boolean trusted = PKIX_FALSE; |
| 835 PKIX_PL_Cert *candidateCert = NULL; | 807 PKIX_PL_Cert *candidateCert = NULL; |
| 836 PKIX_PL_PublicKey *candidatePubKey = NULL; | 808 PKIX_PL_PublicKey *candidatePubKey = NULL; |
| 837 PKIX_CertChainChecker *userChecker = NULL; | 809 PKIX_CertChainChecker *userChecker = NULL; |
| 838 PKIX_CertChainChecker_CheckCallback checkerCheck = NULL; | 810 PKIX_CertChainChecker_CheckCallback checkerCheck = NULL; |
| 839 PKIX_PL_TrustAnchorMode trustAnchorMode = | 811 PKIX_PL_TrustAnchorMode trustAnchorMode = |
| 840 PKIX_PL_TrustAnchorMode_Ignore; | 812 PKIX_PL_TrustAnchorMode_Ignore; |
| 841 void *nbioContext = NULL; | 813 void *nbioContext = NULL; |
| 842 | 814 |
| 843 PKIX_ENTER(BUILD, "pkix_Build_VerifyCertificate"); | 815 PKIX_ENTER(BUILD, "pkix_Build_VerifyCertificate"); |
| 844 PKIX_NULLCHECK_THREE(state, pTrusted, pNeedsCRLChecking); | 816 PKIX_NULLCHECK_TWO(state, pTrusted); |
| 845 PKIX_NULLCHECK_THREE | 817 PKIX_NULLCHECK_THREE |
| 846 (state->candidateCerts, state->prevCert, state->trustChain); | 818 (state->candidateCerts, state->prevCert, state->trustChain); |
| 847 | 819 |
| 848 *pNeedsCRLChecking = PKIX_FALSE; | |
| 849 | |
| 850 PKIX_INCREF(state->candidateCert); | 820 PKIX_INCREF(state->candidateCert); |
| 851 candidateCert = state->candidateCert; | 821 candidateCert = state->candidateCert; |
| 852 | 822 |
| 853 if (state->buildConstants.numAnchors) { | 823 if (state->buildConstants.numAnchors) { |
| 854 if (state->buildConstants.trustOnlyUserAnchors) { | 824 if (state->buildConstants.trustOnlyUserAnchors) { |
| 855 trustAnchorMode = PKIX_PL_TrustAnchorMode_Exclusive; | 825 trustAnchorMode = PKIX_PL_TrustAnchorMode_Exclusive; |
| 856 } else { | 826 } else { |
| 857 trustAnchorMode = PKIX_PL_TrustAnchorMode_Additive; | 827 trustAnchorMode = PKIX_PL_TrustAnchorMode_Additive; |
| 858 } | 828 } |
| 859 } else { | 829 } else { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey | 907 PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey |
| 938 (candidateCert, &candidatePubKey, plContext), | 908 (candidateCert, &candidatePubKey, plContext), |
| 939 PKIX_CERTGETSUBJECTPUBLICKEYFAILED); | 909 PKIX_CERTGETSUBJECTPUBLICKEYFAILED); |
| 940 PKIX_CHECK(PKIX_PL_PublicKey_NeedsDSAParameters | 910 PKIX_CHECK(PKIX_PL_PublicKey_NeedsDSAParameters |
| 941 (candidatePubKey, ¶msNeeded, plContext), | 911 (candidatePubKey, ¶msNeeded, plContext), |
| 942 PKIX_PUBLICKEYNEEDSDSAPARAMETERSFAILED); | 912 PKIX_PUBLICKEYNEEDSDSAPARAMETERSFAILED); |
| 943 if (paramsNeeded) { | 913 if (paramsNeeded) { |
| 944 PKIX_ERROR(PKIX_MISSINGDSAPARAMETERS); | 914 PKIX_ERROR(PKIX_MISSINGDSAPARAMETERS); |
| 945 } | 915 } |
| 946 } | 916 } |
| 947 | |
| 948 | |
| 949 if (revocationChecking) { | |
| 950 if (!trusted) { | |
| 951 if (state->revCheckDelayed) { | |
| 952 goto cleanup; | |
| 953 } else { | |
| 954 PKIX_Boolean isSelfIssued = PKIX_FALSE; | |
| 955 PKIX_CHECK( | |
| 956 pkix_IsCertSelfIssued(candidateCert, &isSelfIssued, | |
| 957 plContext), | |
| 958 PKIX_ISCERTSELFISSUEDFAILED); | |
| 959 if (isSelfIssued) { | |
| 960 state->revCheckDelayed = PKIX_TRUE; | |
| 961 goto cleanup; | |
| 962 } | |
| 963 } | |
| 964 } | |
| 965 *pNeedsCRLChecking = PKIX_TRUE; | |
| 966 } | |
| 967 | 917 |
| 968 cleanup: | 918 cleanup: |
| 969 PKIX_DECREF(candidateCert); | 919 PKIX_DECREF(candidateCert); |
| 970 PKIX_DECREF(candidatePubKey); | 920 PKIX_DECREF(candidatePubKey); |
| 971 PKIX_DECREF(userChecker); | 921 PKIX_DECREF(userChecker); |
| 972 | 922 |
| 973 PKIX_RETURN(BUILD); | 923 PKIX_RETURN(BUILD); |
| 974 } | 924 } |
| 975 | 925 |
| 976 /* | 926 /* |
| (...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2072 pkix_BuildForwardDepthFirstSearch( | 2022 pkix_BuildForwardDepthFirstSearch( |
| 2073 void **pNBIOContext, | 2023 void **pNBIOContext, |
| 2074 PKIX_ForwardBuilderState *state, | 2024 PKIX_ForwardBuilderState *state, |
| 2075 PKIX_ValidateResult **pValResult, | 2025 PKIX_ValidateResult **pValResult, |
| 2076 void *plContext) | 2026 void *plContext) |
| 2077 { | 2027 { |
| 2078 PKIX_Boolean outOfOptions = PKIX_FALSE; | 2028 PKIX_Boolean outOfOptions = PKIX_FALSE; |
| 2079 PKIX_Boolean trusted = PKIX_FALSE; | 2029 PKIX_Boolean trusted = PKIX_FALSE; |
| 2080 PKIX_Boolean isSelfIssued = PKIX_FALSE; | 2030 PKIX_Boolean isSelfIssued = PKIX_FALSE; |
| 2081 PKIX_Boolean canBeCached = PKIX_FALSE; | 2031 PKIX_Boolean canBeCached = PKIX_FALSE; |
| 2082 PKIX_Boolean revocationCheckingExists = PKIX_FALSE; | |
| 2083 PKIX_Boolean needsCRLChecking = PKIX_FALSE; | |
| 2084 PKIX_Boolean ioPending = PKIX_FALSE; | 2032 PKIX_Boolean ioPending = PKIX_FALSE; |
| 2085 PKIX_PL_Date *validityDate = NULL; | 2033 PKIX_PL_Date *validityDate = NULL; |
| 2086 PKIX_PL_Date *currTime = NULL; | 2034 PKIX_PL_Date *currTime = NULL; |
| 2087 PKIX_Int32 childTraversedCACerts = 0; | 2035 PKIX_Int32 childTraversedCACerts = 0; |
| 2088 PKIX_UInt32 numSubjectNames = 0; | 2036 PKIX_UInt32 numSubjectNames = 0; |
| 2089 PKIX_UInt32 numChained = 0; | 2037 PKIX_UInt32 numChained = 0; |
| 2090 PKIX_Int32 cmpTimeResult = 0; | 2038 PKIX_Int32 cmpTimeResult = 0; |
| 2091 PKIX_UInt32 i = 0; | 2039 PKIX_UInt32 i = 0; |
| 2092 PKIX_UInt32 certsSoFar = 0; | 2040 PKIX_UInt32 certsSoFar = 0; |
| 2093 PKIX_List *childTraversedSubjNames = NULL; | 2041 PKIX_List *childTraversedSubjNames = NULL; |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2384 } | 2332 } |
| 2385 | 2333 |
| 2386 /* ****Phase 2 - Chain building***** */ | 2334 /* ****Phase 2 - Chain building***** */ |
| 2387 | 2335 |
| 2388 #if PKIX_FORWARDBUILDERSTATEDEBUG | 2336 #if PKIX_FORWARDBUILDERSTATEDEBUG |
| 2389 PKIX_CHECK(pkix_ForwardBuilderState_DumpState(state, plContext), | 2337 PKIX_CHECK(pkix_ForwardBuilderState_DumpState(state, plContext), |
| 2390 PKIX_FORWARDBUILDERSTATEDUMPSTATEFAILED); | 2338 PKIX_FORWARDBUILDERSTATEDUMPSTATEFAILED); |
| 2391 #endif | 2339 #endif |
| 2392 | 2340 |
| 2393 if (state->status == BUILD_CERTVALIDATING) { | 2341 if (state->status == BUILD_CERTVALIDATING) { |
| 2394 revocationCheckingExists = | |
| 2395 (state->buildConstants.revChecker != NULL); | |
| 2396 | |
| 2397 PKIX_DECREF(state->candidateCert); | 2342 PKIX_DECREF(state->candidateCert); |
| 2398 PKIX_CHECK(PKIX_List_GetItem | 2343 PKIX_CHECK(PKIX_List_GetItem |
| 2399 (state->candidateCerts, | 2344 (state->candidateCerts, |
| 2400 state->certIndex, | 2345 state->certIndex, |
| 2401 (PKIX_PL_Object **)&(state->candidateCert), | 2346 (PKIX_PL_Object **)&(state->candidateCert), |
| 2402 plContext), | 2347 plContext), |
| 2403 PKIX_LISTGETITEMFAILED); | 2348 PKIX_LISTGETITEMFAILED); |
| 2404 | 2349 |
| 2405 if ((state->verifyNode) != NULL) { | 2350 if ((state->verifyNode) != NULL) { |
| 2406 PKIX_CHECK_FATAL(pkix_VerifyNode_Create | 2351 PKIX_CHECK_FATAL(pkix_VerifyNode_Create |
| 2407 (state->candidateCert, | 2352 (state->candidateCert, |
| 2408 0, | 2353 0, |
| 2409 NULL, | 2354 NULL, |
| 2410 &verifyNode, | 2355 &verifyNode, |
| 2411 plContext), | 2356 plContext), |
| 2412 PKIX_VERIFYNODECREATEFAILED); | 2357 PKIX_VERIFYNODECREATEFAILED); |
| 2413 } | 2358 } |
| 2414 | 2359 |
| 2415 /* If failure, this function sets Error in verifyNode */ | 2360 /* If failure, this function sets Error in verifyNode */ |
| 2416 verifyError = pkix_Build_VerifyCertificate | 2361 verifyError = pkix_Build_VerifyCertificate |
| 2417 (state, | 2362 (state, |
| 2418 state->buildConstants.userCheckers, | 2363 state->buildConstants.userCheckers, |
| 2419 revocationCheckingExists, | |
| 2420 &trusted, | 2364 &trusted, |
| 2421 &needsCRLChecking, | |
| 2422 verifyNode, | 2365 verifyNode, |
| 2423 plContext); | 2366 plContext); |
| 2424 | 2367 |
| 2425 if (verifyError) { | 2368 if (verifyError) { |
| 2426 pkixTempErrorReceived = PKIX_TRUE; | 2369 pkixTempErrorReceived = PKIX_TRUE; |
| 2427 pkixErrorClass = verifyError->errClass; | 2370 pkixErrorClass = verifyError->errClass; |
| 2428 if (pkixErrorClass == PKIX_FATAL_ERROR) { | 2371 if (pkixErrorClass == PKIX_FATAL_ERROR) { |
| 2429 pkixErrorResult = verifyError; | 2372 pkixErrorResult = verifyError; |
| 2430 verifyError = NULL; | 2373 verifyError = NULL; |
| 2431 goto fatal; | 2374 goto fatal; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2446 } | 2389 } |
| 2447 pkixTempErrorReceived = PKIX_FALSE; | 2390 pkixTempErrorReceived = PKIX_FALSE; |
| 2448 PKIX_DECREF(finalError); | 2391 PKIX_DECREF(finalError); |
| 2449 finalError = verifyError; | 2392 finalError = verifyError; |
| 2450 verifyError = NULL; | 2393 verifyError = NULL; |
| 2451 if (state->certLoopingDetected) { | 2394 if (state->certLoopingDetected) { |
| 2452 PKIX_ERROR | 2395 PKIX_ERROR |
| 2453 (PKIX_LOOPDISCOVEREDDUPCERTSNOTALLOWED); | 2396 (PKIX_LOOPDISCOVEREDDUPCERTSNOTALLOWED); |
| 2454 } | 2397 } |
| 2455 state->status = BUILD_GETNEXTCERT; | 2398 state->status = BUILD_GETNEXTCERT; |
| 2456 } else if (needsCRLChecking) { | |
| 2457 state->status = BUILD_CRLPREP; | |
| 2458 } else { | 2399 } else { |
| 2459 state->status = BUILD_DATEPREP; | 2400 state->status = BUILD_DATEPREP; |
| 2460 } | 2401 } |
| 2461 } | 2402 } |
| 2462 | 2403 |
| 2463 if (state->status == BUILD_CRLPREP) { | |
| 2464 PKIX_RevocationStatus revStatus; | |
| 2465 PKIX_UInt32 reasonCode; | |
| 2466 | |
| 2467 verifyError = | |
| 2468 PKIX_RevocationChecker_Check( | |
| 2469 state->prevCert, state->candidateCert, | |
| 2470 state->buildConstants.revChecker, | |
| 2471 state->buildConstants.procParams, | |
| 2472 PKIX_FALSE, | |
| 2473 (state->parentState == NULL) ? | |
| 2474 PKIX_TRUE : PKIX_FALSE, | |
| 2475 &revStatus, &reasonCode, | |
| 2476 &nbio, plContext); | |
| 2477 if (nbio != NULL) { | |
| 2478 *pNBIOContext = nbio; | |
| 2479 goto cleanup; | |
| 2480 } | |
| 2481 if (revStatus == PKIX_RevStatus_Revoked || verifyError) { | |
| 2482 if (!verifyError) { | |
| 2483 /* if verifyError is returned then use it as | |
| 2484 * it has a detailed revocation error code. | |
| 2485 * Otherwise create a new error */ | |
| 2486 PKIX_ERROR_CREATE(VALIDATE, PKIX_CERTIFICATEREVOKED, | |
| 2487 verifyError); | |
| 2488 } | |
| 2489 if (state->verifyNode != NULL) { | |
| 2490 PKIX_CHECK_FATAL(pkix_VerifyNode_SetError | |
| 2491 (verifyNode, verifyError, plContext), | |
| 2492 PKIX_VERIFYNODESETERRORFAILED); | |
| 2493 PKIX_CHECK_FATAL(pkix_VerifyNode_AddToTree | |
| 2494 (state->verifyNode, | |
| 2495 verifyNode, | |
| 2496 plContext), | |
| 2497 PKIX_VERIFYNODEADDTOTREEFAILED); | |
| 2498 PKIX_DECREF(verifyNode); | |
| 2499 } | |
| 2500 PKIX_DECREF(finalError); | |
| 2501 finalError = verifyError; | |
| 2502 verifyError = NULL; | |
| 2503 if (state->certLoopingDetected) { | |
| 2504 PKIX_ERROR | |
| 2505 (PKIX_LOOPDISCOVEREDDUPCERTSNOTALLOWED); | |
| 2506 } | |
| 2507 state->status = BUILD_GETNEXTCERT; | |
| 2508 } else { | |
| 2509 state->status = BUILD_DATEPREP; | |
| 2510 } | |
| 2511 } | |
| 2512 | |
| 2513 if (state->status == BUILD_DATEPREP) { | 2404 if (state->status == BUILD_DATEPREP) { |
| 2514 /* Keep track of whether this chain can be cached */ | 2405 /* Keep track of whether this chain can be cached */ |
| 2515 PKIX_CHECK(pkix_Build_UpdateDate(state, plContext), | 2406 PKIX_CHECK(pkix_Build_UpdateDate(state, plContext), |
| 2516 PKIX_BUILDUPDATEDATEFAILED); | 2407 PKIX_BUILDUPDATEDATEFAILED); |
| 2517 | 2408 |
| 2518 canBeCached = state->canBeCached; | 2409 canBeCached = state->canBeCached; |
| 2519 PKIX_DECREF(validityDate); | 2410 PKIX_DECREF(validityDate); |
| 2520 PKIX_INCREF(state->validityDate); | 2411 PKIX_INCREF(state->validityDate); |
| 2521 validityDate = state->validityDate; | 2412 validityDate = state->validityDate; |
| 2522 if (trusted == PKIX_TRUE) { | 2413 if (trusted == PKIX_TRUE) { |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2704 PKIX_LISTAPPENDITEMFAILED); | 2595 PKIX_LISTAPPENDITEMFAILED); |
| 2705 PKIX_DECREF(subjectName); | 2596 PKIX_DECREF(subjectName); |
| 2706 } | 2597 } |
| 2707 PKIX_DECREF(subjectNames); | 2598 PKIX_DECREF(subjectNames); |
| 2708 } | 2599 } |
| 2709 | 2600 |
| 2710 PKIX_CHECK(pkix_ForwardBuilderState_Create | 2601 PKIX_CHECK(pkix_ForwardBuilderState_Create |
| 2711 (childTraversedCACerts, | 2602 (childTraversedCACerts, |
| 2712 state->buildConstants.maxFanout, | 2603 state->buildConstants.maxFanout, |
| 2713 state->numDepth - 1, | 2604 state->numDepth - 1, |
| 2714 state->revCheckDelayed, | |
| 2715 canBeCached, | 2605 canBeCached, |
| 2716 validityDate, | 2606 validityDate, |
| 2717 state->candidateCert, | 2607 state->candidateCert, |
| 2718 childTraversedSubjNames, | 2608 childTraversedSubjNames, |
| 2719 state->trustChain, | 2609 state->trustChain, |
| 2720 state, | 2610 state, |
| 2721 &childState, | 2611 &childState, |
| 2722 plContext), | 2612 plContext), |
| 2723 PKIX_FORWARDBUILDSTATECREATEFAILED); | 2613 PKIX_FORWARDBUILDSTATECREATEFAILED); |
| 2724 | 2614 |
| (...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3514 buildConstants.trustOnlyUserAnchors = | 3404 buildConstants.trustOnlyUserAnchors = |
| 3515 procParams->useOnlyTrustAnchors; | 3405 procParams->useOnlyTrustAnchors; |
| 3516 | 3406 |
| 3517 PKIX_CHECK(pkix_Build_GetResourceLimits(&buildConstants, plContext), | 3407 PKIX_CHECK(pkix_Build_GetResourceLimits(&buildConstants, plContext), |
| 3518 PKIX_BUILDGETRESOURCELIMITSFAILED); | 3408 PKIX_BUILDGETRESOURCELIMITSFAILED); |
| 3519 | 3409 |
| 3520 PKIX_CHECK(pkix_ForwardBuilderState_Create | 3410 PKIX_CHECK(pkix_ForwardBuilderState_Create |
| 3521 (0, /* PKIX_UInt32 traversedCACerts */ | 3411 (0, /* PKIX_UInt32 traversedCACerts */ |
| 3522 buildConstants.maxFanout, | 3412 buildConstants.maxFanout, |
| 3523 buildConstants.maxDepth, | 3413 buildConstants.maxDepth, |
| 3524 PKIX_FALSE, /* PKIX_Boolean revCheckDelayed */ | |
| 3525 PKIX_TRUE, /* PKIX_Boolean canBeCached */ | 3414 PKIX_TRUE, /* PKIX_Boolean canBeCached */ |
| 3526 NULL, /* PKIX_Date *validityDate */ | 3415 NULL, /* PKIX_Date *validityDate */ |
| 3527 targetCert, /* PKIX_PL_Cert *prevCert */ | 3416 targetCert, /* PKIX_PL_Cert *prevCert */ |
| 3528 targetSubjNames, /* PKIX_List *traversedSubjNames */ | 3417 targetSubjNames, /* PKIX_List *traversedSubjNames */ |
| 3529 tentativeChain, /* PKIX_List *trustChain */ | 3418 tentativeChain, /* PKIX_List *trustChain */ |
| 3530 NULL, /* PKIX_ForwardBuilderState *parent */ | 3419 NULL, /* PKIX_ForwardBuilderState *parent */ |
| 3531 &state, /* PKIX_ForwardBuilderState **pState */ | 3420 &state, /* PKIX_ForwardBuilderState **pState */ |
| 3532 plContext), | 3421 plContext), |
| 3533 PKIX_BUILDSTATECREATEFAILED); | 3422 PKIX_BUILDSTATECREATEFAILED); |
| 3534 | 3423 |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3846 *pBuildResult = buildResult; | 3735 *pBuildResult = buildResult; |
| 3847 buildResult = NULL; | 3736 buildResult = NULL; |
| 3848 } | 3737 } |
| 3849 | 3738 |
| 3850 cleanup: | 3739 cleanup: |
| 3851 PKIX_DECREF(buildResult); | 3740 PKIX_DECREF(buildResult); |
| 3852 PKIX_DECREF(state); | 3741 PKIX_DECREF(state); |
| 3853 | 3742 |
| 3854 PKIX_RETURN(BUILD); | 3743 PKIX_RETURN(BUILD); |
| 3855 } | 3744 } |
| OLD | NEW |