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 |