Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(994)

Side by Side Diff: nss/lib/libpkix/pkix/top/pkix_build.c

Issue 170823003: Update to NSS 3.15.5 and NSPR 4.10.3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « nss/lib/libpkix/pkix/top/pkix_build.h ('k') | nss/lib/nss/nss.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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, &paramsNeeded, plContext), 911 (candidatePubKey, &paramsNeeded, 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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « nss/lib/libpkix/pkix/top/pkix_build.h ('k') | nss/lib/nss/nss.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698