~ubuntu-branches/ubuntu/intrepid/xulrunner-1.9/intrepid-security

« back to all changes in this revision

Viewing changes to mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c

  • Committer: Bazaar Package Importer
  • Author(s): Alexander Sack
  • Date: 2009-08-03 13:16:32 UTC
  • mfrom: (1.2.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20090803131632-1pfcgs323tjx7bp1
Tags: 1.9.0.13+nobinonly-0ubuntu0.8.10.1
* New upstream release v1.9.0.13 (FIREFOX_3_0_13_RELEASE)
  - see USN-811-1

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
 
49
49
extern PRLogModuleInfo *pkixLog;
50
50
 
51
 
#ifdef DEBUG_kaie
52
 
void
53
 
pkix_trace_dump_cert(const char *info, PKIX_PL_Cert *cert, void *plContext)
54
 
{
55
 
        if (pkixLog && PR_LOG_TEST(pkixLog, PR_LOG_DEBUG)) {
56
 
            PKIX_PL_String *unString;
57
 
            char *unAscii;
58
 
            PKIX_UInt32 length;
59
 
    
60
 
            PKIX_TOSTRING
61
 
                    ((PKIX_PL_Object*)cert,
62
 
                    &unString,
63
 
                    plContext,
64
 
                    PKIX_OBJECTTOSTRINGFAILED);
65
 
    
66
 
            PKIX_PL_String_GetEncoded
67
 
                        (unString,
68
 
                        PKIX_ESCASCII,
69
 
                        (void **)&unAscii,
70
 
                        &length,
71
 
                        plContext);
72
 
    
73
 
            PR_LOG(pkixLog, PR_LOG_DEBUG, ("====> %s\n", info));
74
 
            PR_LOG(pkixLog, PR_LOG_DEBUG, ("====> cert: %s\n", unAscii));
75
 
    
76
 
            PKIX_DECREF(unString);
77
 
            PKIX_FREE(unAscii);
78
 
        }
79
 
 
80
 
cleanup:
81
 
return;
82
 
}
83
 
#endif
84
 
 
85
51
/*
86
52
 * List of critical extension OIDs associate with what build chain has
87
53
 * checked. Those OIDs need to be removed from the unresolved critical
126
92
        state->numAias = 0;
127
93
        state->certIndex = 0;
128
94
        state->aiaIndex = 0;
129
 
        state->anchorIndex = 0;
130
95
        state->certCheckedIndex = 0;
131
96
        state->checkerIndex = 0;
132
97
        state->hintCertIndex = 0;
133
98
        state->numFanout = 0;
134
99
        state->numDepth = 0;
135
100
        state->reasonCode = 0;
136
 
        state->dsaParamsNeeded = PKIX_FALSE;
137
101
        state->revCheckDelayed = PKIX_FALSE;
138
102
        state->canBeCached = PKIX_FALSE;
139
103
        state->useOnlyLocal = PKIX_FALSE;
150
114
        PKIX_DECREF(state->reversedCertChain);
151
115
        PKIX_DECREF(state->checkedCritExtOIDs);
152
116
        PKIX_DECREF(state->checkerChain);
153
 
        PKIX_DECREF(state->revCheckers);
154
117
        PKIX_DECREF(state->certSel);
155
118
        PKIX_DECREF(state->verifyNode);
156
119
        PKIX_DECREF(state->client);
172
135
                PKIX_DECREF(state->buildConstants.anchors);
173
136
                PKIX_DECREF(state->buildConstants.userCheckers);
174
137
                PKIX_DECREF(state->buildConstants.hintCerts);
175
 
                PKIX_DECREF(state->buildConstants.crlChecker);
 
138
                PKIX_DECREF(state->buildConstants.revChecker);
176
139
                PKIX_DECREF(state->buildConstants.aiaMgr);
177
140
        } else {
178
141
                PKIX_DECREF(state->parentState);
196
159
 *      Number of Certs that can be considered at this level (0 = no limit)
197
160
 *  "numDepth"
198
161
 *      Number of additional levels that can be searched (0 = no limit)
199
 
 *  "dsaParamsNeeded"
200
 
 *      Boolean value indicating whether DSA parameters are needed.
201
162
 *  "revCheckDelayed"
202
163
 *      Boolean value indicating whether rev check is delayed until after
203
164
 *      entire chain is built.
231
192
        PKIX_Int32 traversedCACerts,
232
193
        PKIX_UInt32 numFanout,
233
194
        PKIX_UInt32 numDepth,
234
 
        PKIX_Boolean dsaParamsNeeded,
235
195
        PKIX_Boolean revCheckDelayed,
236
196
        PKIX_Boolean canBeCached,
237
197
        PKIX_PL_Date *validityDate,
261
221
        state->numAias = 0;
262
222
        state->certIndex = 0;
263
223
        state->aiaIndex = 0;
264
 
        state->anchorIndex = 0;
265
224
        state->certCheckedIndex = 0;
266
225
        state->checkerIndex = 0;
267
226
        state->hintCertIndex = 0;
269
228
        state->numDepth = numDepth;
270
229
        state->reasonCode = 0;
271
230
        state->revChecking = numDepth;
272
 
        state->dsaParamsNeeded = dsaParamsNeeded;
273
231
        state->revCheckDelayed = revCheckDelayed;
274
232
        state->canBeCached = canBeCached;
275
233
        state->useOnlyLocal = PKIX_TRUE;
296
254
        state->reversedCertChain = NULL;
297
255
        state->checkedCritExtOIDs = NULL;
298
256
        state->checkerChain = NULL;
299
 
        state->revCheckers = NULL;
300
257
        state->certSel = NULL;
301
258
        state->verifyNode = NULL;
302
259
        state->client = NULL;
335
292
                        parentState->buildConstants.userCheckers;
336
293
                state->buildConstants.hintCerts =
337
294
                        parentState->buildConstants.hintCerts;
338
 
                state->buildConstants.crlChecker =
339
 
                        parentState->buildConstants.crlChecker;
 
295
                state->buildConstants.revChecker =
 
296
                        parentState->buildConstants.revChecker;
340
297
                state->buildConstants.aiaMgr =
341
298
                        parentState->buildConstants.aiaMgr;
342
299
        }
445
402
                "\tnumFanout: \t%d\n"
446
403
                "\tnumDepth:  \t%d\n"
447
404
                "\treasonCode:  \t%d\n"
448
 
                "\tdsaParamsNeeded: \t%d\n"
449
405
                "\trevCheckDelayed: \t%d\n"
450
406
                "\tcanBeCached: \t%d\n"
451
407
                "\tuseOnlyLocal: \t%d\n"
503
459
                                        break;
504
460
            case BUILD_ADDTOCHAIN:      asciiStatus = "BUILD_ADDTOCHAIN";
505
461
                                        break;
506
 
            case BUILD_CHECKWITHANCHORS:asciiStatus = "BUILD_CHECKWITHANCHORS";
507
 
                                        break;
508
 
            case BUILD_CRL2PREP:        asciiStatus = "BUILD_CRL2PREP";
509
 
                                        break;
510
462
            case BUILD_CRL2:            asciiStatus = "BUILD_CRL2";
511
463
                                        break;
512
464
            case BUILD_VALCHAIN:        asciiStatus = "BUILD_VALCHAIN";
577
529
                (PKIX_UInt32)state->numFanout,
578
530
                (PKIX_UInt32)state->numDepth,
579
531
                (PKIX_UInt32)state->reasonCode,
580
 
                state->dsaParamsNeeded,
581
532
                state->revCheckDelayed,
582
533
                state->canBeCached,
583
534
                state->useOnlyLocal,
752
703
/* --Private-BuildChain-Functions------------------------------------------- */
753
704
 
754
705
/*
755
 
 * FUNCTION: pkix_Build_CheckCertAgainstAnchor
756
 
 * DESCRIPTION:
757
 
 *
758
 
 *  Checks whether the Cert pointed to by "candidateCert" successfully chains to
759
 
 *  the TrustAnchor pointed to by "anchor". Successful chaining includes
760
 
 *  successful subject/issuer name chaining, using the List of traversed subject
761
 
 *  names pointed to by "traversedSubjNames" to check for name constraints
762
 
 *  violation, and successful signature verification. If the "candidateCert"
763
 
 *  successfully chains, PKIX_TRUE is stored at the address pointed to by
764
 
 *  "pPassed". Otherwise PKIX_FALSE is stored.
765
 
 *
766
 
 *  If a non-NULL VerifyNode is supplied, then this function will, in the event
767
 
 *  of a failure, set the Error associated with the failure in the VerifyNode.
768
 
 *  .
769
 
 *
770
 
 * PARAMETERS:
771
 
 *  "candidateCert"
772
 
 *      Address of Cert that is being checked. Must be non-NULL.
773
 
 *  "anchor"
774
 
 *      Address of TrustAnchor with which the Cert must successfully chain.
775
 
 *      Must be non-NULL.
776
 
 *  "traversedSubjNames"
777
 
 *      Address of List of subject names in certificates previously traversed.
778
 
 *      Must be non-NULL.
779
 
 *  "pPassed"
780
 
 *      Address at which Boolean result is stored. Must be non-NULL.
781
 
 *  "verifyNode"
782
 
 *      Address of the VerifyNode to receive the Error. May be NULL.
783
 
 *  "plContext"
784
 
 *      Platform-specific context pointer.
785
 
 * THREAD SAFETY:
786
 
 *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
787
 
 * RETURNS:
788
 
 *  Returns NULL if the function succeeds.
789
 
 *  Returns a Build Error if the function fails in a non-fatal way
790
 
 *  Returns a Fatal Error if the function fails in an unrecoverable way.
791
 
 */
792
 
static PKIX_Error *
793
 
pkix_Build_CheckCertAgainstAnchor(
794
 
        PKIX_PL_Cert *candidateCert,
795
 
        PKIX_TrustAnchor *anchor,
796
 
        PKIX_List *traversedSubjNames,
797
 
        PKIX_Boolean *pPassed,
798
 
        PKIX_VerifyNode *verifyNode,
799
 
        void *plContext)
800
 
{
801
 
        PKIX_PL_Cert *trustedCert = NULL;
802
 
        PKIX_PL_CertNameConstraints *anchorNC = NULL;
803
 
        PKIX_CertSelector *certSel = NULL;
804
 
        PKIX_ComCertSelParams *certSelParams = NULL;
805
 
        PKIX_PL_X500Name *trustedSubject = NULL;
806
 
        PKIX_PL_X500Name *candidateIssuer = NULL;
807
 
        PKIX_CertSelector_MatchCallback selectorMatch = NULL;
808
 
        PKIX_Boolean certMatch = PKIX_TRUE;
809
 
        PKIX_Boolean anchorMatch = PKIX_FALSE;
810
 
        PKIX_PL_PublicKey *trustedPubKey = NULL;
811
 
        PKIX_VerifyNode *anchorVerifyNode = NULL;
812
 
        PKIX_Error *verifyError = NULL;
813
 
 
814
 
        PKIX_ENTER(BUILD, "pkix_Build_CheckCertAgainstAnchor");
815
 
        PKIX_NULLCHECK_THREE(anchor, candidateCert, pPassed);
816
 
 
817
 
        *pPassed = PKIX_FALSE;
818
 
 
819
 
        PKIX_CHECK(PKIX_TrustAnchor_GetTrustedCert
820
 
                    (anchor, &trustedCert, plContext),
821
 
                    PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
822
 
 
823
 
        PKIX_CHECK(PKIX_PL_Cert_GetSubject
824
 
                    (trustedCert, &trustedSubject, plContext),
825
 
                    PKIX_CERTGETSUBJECTFAILED);
826
 
 
827
 
        PKIX_NULLCHECK_ONE(trustedSubject);
828
 
 
829
 
        PKIX_CHECK(PKIX_PL_Cert_GetIssuer
830
 
                    (candidateCert, &candidateIssuer, plContext),
831
 
                    PKIX_CERTGETISSUERFAILED);
832
 
 
833
 
        PKIX_CHECK(PKIX_PL_X500Name_Match
834
 
                    (trustedSubject, candidateIssuer, &anchorMatch, plContext),
835
 
                    PKIX_X500NAMEMATCHFAILED);
836
 
 
837
 
        if (!anchorMatch) {
838
 
                goto cleanup;
839
 
        }
840
 
 
841
 
        PKIX_CHECK(PKIX_TrustAnchor_GetNameConstraints
842
 
                    (anchor, &anchorNC, plContext),
843
 
                    PKIX_TRUSTANCHORGETNAMECONSTRAINTSFAILED);
844
 
 
845
 
        if (anchorNC == NULL) {
846
 
                PKIX_CHECK(PKIX_CertSelector_Create
847
 
                            (NULL, NULL, &certSel, plContext),
848
 
                            PKIX_CERTSELECTORCREATEFAILED);
849
 
 
850
 
                PKIX_CHECK(PKIX_ComCertSelParams_Create
851
 
                            (&certSelParams, plContext),
852
 
                            PKIX_COMCERTSELPARAMSCREATEFAILED);
853
 
 
854
 
                PKIX_NULLCHECK_ONE(traversedSubjNames);
855
 
 
856
 
                PKIX_CHECK(PKIX_ComCertSelParams_SetPathToNames
857
 
                        (certSelParams, traversedSubjNames, plContext),
858
 
                        PKIX_COMCERTSELPARAMSSETPATHTONAMESFAILED);
859
 
 
860
 
                PKIX_CHECK(PKIX_CertSelector_SetCommonCertSelectorParams
861
 
                        (certSel, certSelParams, plContext),
862
 
                        PKIX_CERTSELECTORSETCOMMONCERTSELECTORPARAMSFAILED);
863
 
 
864
 
                PKIX_CHECK(PKIX_CertSelector_GetMatchCallback
865
 
                        (certSel, &selectorMatch, plContext),
866
 
                        PKIX_CERTSELECTORGETMATCHCALLBACKFAILED);
867
 
 
868
 
                PKIX_CHECK(selectorMatch
869
 
                        (certSel, candidateCert, &certMatch, plContext),
870
 
                        PKIX_SELECTORMATCHFAILED);
871
 
 
872
 
                if (!certMatch) {
873
 
                        goto cleanup;
874
 
                }
875
 
 
876
 
        }
877
 
 
878
 
        PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
879
 
                (trustedCert, &trustedPubKey, plContext),
880
 
                PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
881
 
 
882
 
        PKIX_CHECK(PKIX_PL_Cert_VerifySignature
883
 
                   (candidateCert, trustedPubKey, plContext),
884
 
                   PKIX_CERTVERIFYSIGNATUREFAILED);
885
 
 
886
 
cleanup:
887
 
 
888
 
        if (PKIX_ERROR_RECEIVED || !anchorMatch || !certMatch) {
889
 
                if (pkixErrorClass == PKIX_FATAL_ERROR) {
890
 
                        goto fatal;
891
 
                }
892
 
                if (verifyNode != NULL) {
893
 
                        if (!anchorMatch) {
894
 
                            PKIX_ERROR_CREATE
895
 
                                (BUILD,
896
 
                                PKIX_ANCHORDIDNOTCHAINTOCERT,
897
 
                                verifyError);
898
 
                        } else if (!certMatch) {
899
 
                            PKIX_ERROR_CREATE
900
 
                                (BUILD,
901
 
                                PKIX_ANCHORDIDNOTPASSCERTSELECTORCRITERIA,
902
 
                                verifyError);
903
 
                        } else {
904
 
                            verifyError = pkixErrorResult;
905
 
                            pkixErrorResult = NULL;
906
 
                        }
907
 
                        PKIX_DECREF(pkixErrorResult);
908
 
                }
909
 
        } else {
910
 
                *pPassed = PKIX_TRUE;
911
 
        }
912
 
 
913
 
        if (verifyNode != NULL) {
914
 
                PKIX_CHECK_FATAL(pkix_VerifyNode_Create
915
 
                        (trustedCert,
916
 
                        1,
917
 
                        verifyError,
918
 
                        &anchorVerifyNode,
919
 
                        plContext),
920
 
                        PKIX_VERIFYNODECREATEFAILED);
921
 
                PKIX_CHECK_FATAL(pkix_VerifyNode_AddToTree
922
 
                        (verifyNode, anchorVerifyNode, plContext),
923
 
                        PKIX_VERIFYNODEADDTOTREEFAILED);
924
 
                PKIX_DECREF(verifyError);
925
 
        }
926
 
 
927
 
fatal:
928
 
        PKIX_DECREF(verifyError);
929
 
        PKIX_DECREF(anchorVerifyNode);
930
 
        PKIX_DECREF(trustedCert);
931
 
        PKIX_DECREF(anchorNC);
932
 
        PKIX_DECREF(certSel);
933
 
        PKIX_DECREF(certSelParams);
934
 
        PKIX_DECREF(trustedSubject);
935
 
        PKIX_DECREF(trustedPubKey);
936
 
        PKIX_DECREF(candidateIssuer);
937
 
 
938
 
        PKIX_RETURN(BUILD);
939
 
}
940
 
 
941
 
/*
942
706
 * FUNCTION: pkix_Build_SortCertComparator
943
707
 * DESCRIPTION:
944
708
 *
1037
801
            verifyNode->error = pkixErrorResult; \
1038
802
        } \
1039
803
        pkixErrorCode = errCode; \
1040
 
        pkixErrorMsg = PKIX_ErrorText[errCode]; \
1041
804
        goto cleanup; \
1042
805
    }
1043
806
 
1098
861
        PKIX_UInt32 numUserCheckers = 0;
1099
862
        PKIX_UInt32 i = 0;
1100
863
        PKIX_Boolean loopFound = PKIX_FALSE;
1101
 
        PKIX_Boolean dsaParamsNeeded = PKIX_FALSE;
1102
 
        PKIX_Boolean isSelfIssued = PKIX_FALSE;
1103
864
        PKIX_Boolean supportForwardChecking = PKIX_FALSE;
1104
865
        PKIX_Boolean trusted = PKIX_FALSE;
1105
866
        PKIX_PL_Cert *candidateCert = NULL;
1106
867
        PKIX_PL_PublicKey *candidatePubKey = NULL;
1107
868
        PKIX_CertChainChecker *userChecker = NULL;
1108
869
        PKIX_CertChainChecker_CheckCallback checkerCheck = NULL;
 
870
        PKIX_Boolean trustOnlyUserAnchors = PKIX_FALSE;
1109
871
        void *nbioContext = NULL;
1110
 
 
 
872
        
1111
873
        PKIX_ENTER(BUILD, "pkix_Build_VerifyCertificate");
1112
874
        PKIX_NULLCHECK_THREE(state, pTrusted, pNeedsCRLChecking);
1113
875
        PKIX_NULLCHECK_THREE
1120
882
 
1121
883
        /* If user defined trust anchor list is not empty, do not
1122
884
         * trust any certs except to the ones that are in the list */
1123
 
        if (!state->buildConstants.numAnchors) {
1124
 
            PKIX_CHECK(PKIX_PL_Cert_IsCertTrusted
1125
 
                       (candidateCert, &trusted, plContext),
1126
 
                       PKIX_CERTISCERTTRUSTEDFAILED);
 
885
        if (state->buildConstants.numAnchors) {
 
886
            trustOnlyUserAnchors = PKIX_TRUE;
1127
887
        }
1128
888
 
 
889
        PKIX_CHECK(
 
890
            PKIX_PL_Cert_IsCertTrusted(candidateCert,
 
891
                                       trustOnlyUserAnchors,
 
892
                                       &trusted, plContext),
 
893
            PKIX_CERTISCERTTRUSTEDFAILED);
 
894
 
1129
895
        *pTrusted = trusted;
1130
896
 
1131
897
        /* check for loops */
1191
957
                }
1192
958
        }
1193
959
 
1194
 
        /* signature check */
1195
 
 
1196
 
        if ((!(state->dsaParamsNeeded)) || trusted) {
1197
 
                PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
1198
 
                            (candidateCert, &candidatePubKey, plContext),
1199
 
                            PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
1200
 
 
1201
 
                PKIX_CHECK(PKIX_PL_PublicKey_NeedsDSAParameters
1202
 
                            (candidatePubKey, &dsaParamsNeeded, plContext),
1203
 
                            PKIX_PUBLICKEYNEEDSDSAPARAMETERSFAILED);
1204
 
 
1205
 
                if (dsaParamsNeeded) {
1206
 
                        if (trusted) {
1207
 
                                PKIX_ERROR(PKIX_MISSINGDSAPARAMETERS);
1208
 
                        } else {
1209
 
                                state->dsaParamsNeeded = PKIX_TRUE;
1210
 
                                goto cleanup;
1211
 
                        }
1212
 
                }
1213
 
 
1214
 
                pkixErrorResult = PKIX_PL_Cert_VerifyKeyUsage
1215
 
                        (candidateCert, PKIX_KEY_CERT_SIGN, plContext);
1216
 
 
1217
 
                ERROR_CHECK(PKIX_CERTVERIFYKEYUSAGEFAILED);
1218
 
 
1219
 
                pkixErrorResult = PKIX_PL_Cert_VerifySignature
1220
 
                        (state->prevCert, candidatePubKey, plContext);
1221
 
 
1222
 
                ERROR_CHECK(PKIX_CERTVERIFYSIGNATUREFAILED);
1223
 
 
1224
 
                if (revocationChecking) {
1225
 
                        if (!trusted) {
1226
 
                            if (state->revCheckDelayed) {
1227
 
                                goto cleanup;
1228
 
                            } else {
1229
 
                                PKIX_CHECK(pkix_IsCertSelfIssued
1230
 
                                        (candidateCert,
1231
 
                                        &isSelfIssued,
1232
 
                                        plContext),
1233
 
                                        PKIX_ISCERTSELFISSUEDFAILED);
1234
 
 
1235
 
                                if (isSelfIssued) {
1236
 
                                        state->revCheckDelayed = PKIX_TRUE;
1237
 
                                        goto cleanup;
1238
 
                                }
1239
 
                            }
1240
 
                        }
1241
 
 
1242
 
                        *pNeedsCRLChecking = PKIX_TRUE;
1243
 
                }
 
960
        /* Check that public key of the trusted dsa cert has
 
961
         * dsa parameters */
 
962
        if (trusted) {
 
963
            PKIX_Boolean paramsNeeded = PKIX_FALSE;
 
964
            PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
 
965
                       (candidateCert, &candidatePubKey, plContext),
 
966
                       PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
 
967
            PKIX_CHECK(PKIX_PL_PublicKey_NeedsDSAParameters
 
968
                       (candidatePubKey, &paramsNeeded, plContext),
 
969
                       PKIX_PUBLICKEYNEEDSDSAPARAMETERSFAILED);
 
970
            if (paramsNeeded) {
 
971
                PKIX_ERROR(PKIX_MISSINGDSAPARAMETERS);
 
972
            }
 
973
        }
 
974
        
 
975
        
 
976
        if (revocationChecking) {
 
977
            if (!trusted) {
 
978
                if (state->revCheckDelayed) {
 
979
                    goto cleanup;
 
980
                } else {
 
981
                    PKIX_Boolean isSelfIssued = PKIX_FALSE;
 
982
                    PKIX_CHECK(
 
983
                        pkix_IsCertSelfIssued(candidateCert, &isSelfIssued,
 
984
                                              plContext),
 
985
                        PKIX_ISCERTSELFISSUEDFAILED);
 
986
                    if (isSelfIssued) {
 
987
                        state->revCheckDelayed = PKIX_TRUE;
 
988
                        goto cleanup;
 
989
                    }
 
990
                }
 
991
            }
 
992
            *pNeedsCRLChecking = PKIX_TRUE;
1244
993
        }
1245
994
 
1246
995
cleanup:
1247
 
 
1248
996
        PKIX_DECREF(candidateCert);
1249
997
        PKIX_DECREF(candidatePubKey);
1250
998
        PKIX_DECREF(userChecker);
1273
1021
 *      Address of List of Certs to be validated. Must be non-NULL.
1274
1022
 *  "anchor"
1275
1023
 *      Address of TrustAnchor to be used. Must be non-NULL.
 
1024
 *  "addEkuChecker"
 
1025
 *      Boolean flags that tells to add eku checker to the list
 
1026
 *      of checkers. Only needs to be done for existing chain revalidation.
1276
1027
 *  "plContext"
1277
1028
 *      Platform-specific context pointer.
1278
1029
 * THREAD SAFETY:
1287
1038
        PKIX_ForwardBuilderState *state,
1288
1039
        PKIX_List *certChain,
1289
1040
        PKIX_TrustAnchor *anchor,
 
1041
        PKIX_Boolean addEkuChecker,
1290
1042
        void *plContext)
1291
1043
{
1292
1044
        PKIX_List *checkers = NULL;
1297
1049
        PKIX_PL_Cert *trustedCert = NULL;
1298
1050
        PKIX_PL_PublicKey *trustedPubKey = NULL;
1299
1051
        PKIX_CertChainChecker *sigChecker = NULL;
1300
 
        PKIX_CertChainChecker *crlChecker = NULL;
1301
1052
        PKIX_CertChainChecker *policyChecker = NULL;
1302
1053
        PKIX_CertChainChecker *userChecker = NULL;
1303
 
        PKIX_RevocationChecker *revChecker = NULL;
 
1054
        PKIX_CertChainChecker *ekuChecker = NULL;
1304
1055
        PKIX_List *userCheckersList = NULL;
1305
1056
        PKIX_List *userCheckerExtOIDs = NULL;
1306
 
        PKIX_List *revCheckers = NULL;
1307
1057
        PKIX_PL_OID *oid = NULL;
1308
1058
        PKIX_Boolean supportForwardChecking = PKIX_FALSE;
1309
1059
        PKIX_Boolean policyQualifiersRejected = PKIX_FALSE;
1330
1080
 
1331
1081
        procParams = state->buildConstants.procParams;
1332
1082
 
 
1083
        /* Do need to add eku checker for chains, that we just
 
1084
         * built. KU and EKU get checked by certificate selector
 
1085
         * during chain construction. For other cases when trying
 
1086
         * short cut or for cached chain we need to verify key
 
1087
         * usage again. For those cases the function shoud be
 
1088
         * called with addEkuChecker set to true. */
 
1089
        if (addEkuChecker) {
 
1090
            PKIX_CHECK(
 
1091
                PKIX_EkuChecker_Create(procParams, &ekuChecker,
 
1092
                                       plContext),
 
1093
                PKIX_EKUCHECKERINITIALIZEFAILED);
 
1094
            
 
1095
            PKIX_CHECK(PKIX_List_AppendItem
 
1096
                       (checkers, (PKIX_PL_Object *)ekuChecker, plContext),
 
1097
                       PKIX_LISTAPPENDITEMFAILED);
 
1098
        }
 
1099
 
1333
1100
        PKIX_CHECK(PKIX_ProcessingParams_GetInitialPolicies
1334
1101
                (procParams, &initialPolicies, plContext),
1335
1102
                PKIX_PROCESSINGPARAMSGETINITIALPOLICIESFAILED);
1442
1209
                }
1443
1210
        }
1444
1211
 
1445
 
        if (procParams->revCheckers) {
1446
 
            PKIX_CHECK(
1447
 
                PKIX_PL_Object_Duplicate(
1448
 
                    (PKIX_PL_Object*)procParams->revCheckers,
1449
 
                    (PKIX_PL_Object **)&revCheckers,
1450
 
                    plContext),
1451
 
                PKIX_LISTDUPLICATEFAILED);
1452
 
        } else {
1453
 
            PKIX_CHECK(PKIX_List_Create(&revCheckers, plContext),
1454
 
                       PKIX_LISTCREATEFAILED);
1455
 
        }
1456
 
 
1457
 
        if ((state->dsaParamsNeeded) || (state->revCheckDelayed)) {
1458
 
 
1459
 
                if ((state->dsaParamsNeeded) ||
1460
 
                    (state->buildConstants.crlChecker)) {
1461
 
 
1462
 
                        PKIX_CHECK(PKIX_TrustAnchor_GetTrustedCert
1463
 
                                (anchor, &trustedCert, plContext),
1464
 
                                PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
1465
 
 
1466
 
                        PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
1467
 
                                (trustedCert, &trustedPubKey, plContext),
1468
 
                                PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
1469
 
 
1470
 
                        PKIX_NULLCHECK_ONE(state->buildConstants.certStores);
1471
 
 
1472
 
#if 0
1473
 
                        PKIX_CHECK(pkix_DefaultCRLChecker_Initialize
1474
 
                                (state->buildConstants.certStores,
1475
 
                                state->buildConstants.testDate,
1476
 
                                trustedPubKey,
1477
 
                                numChainCerts,
1478
 
                                &crlChecker,
1479
 
                                plContext),
1480
 
                                PKIX_DEFAULTCRLCHECKERINITIALIZEFAILED);
1481
 
 
1482
 
                        PKIX_CHECK(PKIX_List_AppendItem
1483
 
                                (checkers,
1484
 
                                (PKIX_PL_Object *)crlChecker,
1485
 
                                plContext),
1486
 
                                PKIX_LISTAPPENDITEMFAILED);
1487
 
#else
1488
 
                        PKIX_CHECK(pkix_DefaultRevChecker_Initialize
1489
 
                                (state->buildConstants.certStores,
1490
 
                                state->buildConstants.testDate,
1491
 
                                trustedPubKey,
1492
 
                                numChainCerts,
1493
 
                                &revChecker,
1494
 
                                plContext),
1495
 
                                PKIX_DEFAULTREVCHECKERINITIALIZEFAILED);
1496
 
 
1497
 
                        PKIX_CHECK(PKIX_List_AppendItem
1498
 
                                (revCheckers,
1499
 
                                (PKIX_PL_Object *)revChecker,
1500
 
                                plContext),
1501
 
                                PKIX_LISTAPPENDITEMFAILED);
1502
 
 
1503
 
#endif
1504
 
 
1505
 
                        if (state->dsaParamsNeeded) {
1506
 
 
1507
 
                                PKIX_CHECK(pkix_SignatureChecker_Initialize
1508
 
                                        (trustedPubKey,
1509
 
                                        numChainCerts,
1510
 
                                        &sigChecker,
1511
 
                                        plContext),
1512
 
                                        PKIX_SIGNATURECHECKERINITIALIZEFAILED);
1513
 
 
1514
 
                                PKIX_CHECK(PKIX_List_AppendItem
1515
 
                                        (checkers,
1516
 
                                        (PKIX_PL_Object *)sigChecker,
1517
 
                                        plContext),
1518
 
                                        PKIX_LISTAPPENDITEMFAILED);
1519
 
                        }
1520
 
                }
1521
 
        }
 
1212
        /* Inabling post chain building signature check on the certs. */
 
1213
        PKIX_CHECK(PKIX_TrustAnchor_GetTrustedCert
 
1214
                   (anchor, &trustedCert, plContext),
 
1215
                   PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
 
1216
        
 
1217
        PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
 
1218
                   (trustedCert, &trustedPubKey, plContext),
 
1219
                   PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
 
1220
        
 
1221
        PKIX_CHECK(pkix_SignatureChecker_Initialize
 
1222
                   (trustedPubKey,
 
1223
                    numChainCerts,
 
1224
                    &sigChecker,
 
1225
                    plContext),
 
1226
                   PKIX_SIGNATURECHECKERINITIALIZEFAILED);
 
1227
        
 
1228
        PKIX_CHECK(PKIX_List_AppendItem
 
1229
                   (checkers,
 
1230
                    (PKIX_PL_Object *)sigChecker,
 
1231
                    plContext),
 
1232
                   PKIX_LISTAPPENDITEMFAILED);
1522
1233
 
1523
1234
        PKIX_INCREF(reversedCertChain);
1524
1235
        state->reversedCertChain = reversedCertChain;
1525
1236
        PKIX_INCREF(buildCheckedCritExtOIDsList);
1526
1237
        state->checkedCritExtOIDs = buildCheckedCritExtOIDsList;
1527
 
        PKIX_INCREF(checkers);
1528
1238
        state->checkerChain = checkers;
1529
 
        PKIX_INCREF(revCheckers);
1530
 
        state->revCheckers = revCheckers;
 
1239
        checkers = NULL;
1531
1240
        state->certCheckedIndex = 0;
1532
1241
        state->checkerIndex = 0;
1533
1242
        state->revChecking = PKIX_FALSE;
1539
1248
        PKIX_DECREF(reversedCertChain);
1540
1249
        PKIX_DECREF(buildCheckedCritExtOIDsList);
1541
1250
        PKIX_DECREF(checkers);
1542
 
        PKIX_DECREF(revCheckers);
1543
 
        PKIX_DECREF(revChecker);
1544
1251
        PKIX_DECREF(initialPolicies);
1545
1252
        PKIX_DECREF(trustedCert);
1546
1253
        PKIX_DECREF(trustedPubKey);
1547
1254
        PKIX_DECREF(sigChecker);
1548
 
        PKIX_DECREF(crlChecker);
1549
1255
        PKIX_DECREF(policyChecker);
1550
1256
        PKIX_DECREF(userChecker);
1551
1257
        PKIX_DECREF(userCheckersList);
1552
1258
        PKIX_DECREF(userCheckerExtOIDs);
 
1259
        PKIX_DECREF(ekuChecker);
1553
1260
 
1554
1261
        PKIX_RETURN(BUILD);
1555
1262
}
1617
1324
                PKIX_LISTGETLENGTHFAILED);
1618
1325
 
1619
1326
        pkixErrorResult =
1620
 
            pkix_CheckChain(state->reversedCertChain, numChainCerts,
1621
 
                            state->checkerChain, state->revCheckers,
 
1327
            pkix_CheckChain(state->reversedCertChain, numChainCerts, anchor,
 
1328
                            state->checkerChain,
 
1329
                            state->buildConstants.revChecker,
1622
1330
                            state->checkedCritExtOIDs,
1623
1331
                            state->buildConstants.procParams,
1624
1332
                            &state->certCheckedIndex, &state->checkerIndex,
1637
1345
                PKIX_ERROR(PKIX_CHAINREJECTEDBYREVOCATIONCHECKER);
1638
1346
        }
1639
1347
 
1640
 
        if (state->dsaParamsNeeded == PKIX_FALSE) {
1641
 
                PKIX_INCREF(state->buildConstants.targetPubKey);
1642
 
                subjPubKey = state->buildConstants.targetPubKey;
1643
 
        }
1644
 
 
1645
1348
        PKIX_CHECK(pkix_ValidateResult_Create
1646
1349
                (subjPubKey, anchor, policyTree, &valResult, plContext),
1647
1350
                PKIX_VALIDATERESULTCREATEFAILED);
1747
1450
        PKIX_CertSelector *certSel = NULL;
1748
1451
        PKIX_PL_X500Name *currentIssuer = NULL;
1749
1452
        PKIX_PL_Date *testDate = NULL;
 
1453
        PKIX_CertSelector *callerCertSelector = NULL;
 
1454
        PKIX_ComCertSelParams *callerComCertSelParams = NULL;
 
1455
        PKIX_UInt32 reqKu = 0;
 
1456
        PKIX_List   *reqEkuOids = NULL;
1750
1457
 
1751
1458
        PKIX_ENTER(BUILD, "pkix_Build_BuildSelectorAndParams");
1752
1459
        PKIX_NULLCHECK_THREE(state, state->prevCert, state->traversedSubjNames);
1777
1484
                (certSelParams, state->traversedSubjNames, plContext),
1778
1485
                PKIX_COMCERTSELPARAMSSETPATHTONAMESFAILED);
1779
1486
 
 
1487
        PKIX_CHECK(PKIX_ProcessingParams_GetTargetCertConstraints
 
1488
                    (state->buildConstants.procParams,
 
1489
                     &callerCertSelector, plContext),
 
1490
                    PKIX_PROCESSINGPARAMSGETTARGETCERTCONSTRAINTSFAILED);
 
1491
 
 
1492
        if (callerCertSelector != NULL) {
 
1493
 
 
1494
            /* Get initial EKU OIDs from ComCertSelParams, if set */
 
1495
            PKIX_CHECK(PKIX_CertSelector_GetCommonCertSelectorParams
 
1496
                       (callerCertSelector, &callerComCertSelParams, plContext),
 
1497
                       PKIX_CERTSELECTORGETCOMMONCERTSELECTORPARAMSFAILED);
 
1498
 
 
1499
            if (callerComCertSelParams != NULL) {
 
1500
                PKIX_CHECK(PKIX_ComCertSelParams_GetExtendedKeyUsage
 
1501
                           (callerComCertSelParams, &reqEkuOids, plContext),
 
1502
                           PKIX_COMCERTSELPARAMSGETEXTENDEDKEYUSAGEFAILED);
 
1503
 
 
1504
                PKIX_CHECK(PKIX_ComCertSelParams_GetKeyUsage
 
1505
                           (callerComCertSelParams, &reqKu, plContext),
 
1506
                           PKIX_COMCERTSELPARAMSGETEXTENDEDKEYUSAGEFAILED);
 
1507
            }
 
1508
        }
 
1509
 
 
1510
        PKIX_CHECK(
 
1511
            PKIX_ComCertSelParams_SetKeyUsage(certSelParams, reqKu,
 
1512
                                              plContext),
 
1513
            PKIX_COMCERTSELPARAMSSETKEYUSAGEFAILED);
 
1514
        
 
1515
        PKIX_CHECK(
 
1516
            PKIX_ComCertSelParams_SetExtendedKeyUsage(certSelParams,
 
1517
                                                      reqEkuOids,
 
1518
                                                      plContext),
 
1519
            PKIX_COMCERTSELPARAMSSETEXTKEYUSAGEFAILED);
 
1520
 
1780
1521
        PKIX_CHECK(PKIX_CertSelector_Create
1781
1522
                (NULL, NULL, &state->certSel, plContext),
1782
1523
                PKIX_CERTSELECTORCREATEFAILED);
1795
1536
        PKIX_DECREF(certSel);
1796
1537
        PKIX_DECREF(currentIssuer);
1797
1538
        PKIX_DECREF(testDate);
 
1539
        PKIX_DECREF(reqEkuOids);
 
1540
        PKIX_DECREF(callerComCertSelParams);
 
1541
        PKIX_DECREF(callerCertSelector);
1798
1542
 
1799
1543
        PKIX_RETURN(BUILD);
1800
1544
}
1801
1545
 
1802
 
/*
1803
 
 * FUNCTION: pkix_Build_CombineWithTrust
1804
 
 * DESCRIPTION:
1805
 
 *
1806
 
 *  Adds each Cert in the List pointed to by "fromList" to the List pointed
1807
 
 *  to by "toList", if it is not already a member of that List. If it is a
1808
 
 *  member of both Lists, then the two instances are checked to see if either
1809
 
 *  is trusted, in which case the trusted one is retained. In other words,
1810
 
 *  "toList" becomes the union of the two sets, with trust preserved.
1811
 
 *
1812
 
 *  It is assumed that fromList does not contain duplicates. Therefore as
1813
 
 *  elements of "fromlist" are added to "tolist", subsequent additions do
1814
 
 *  not need to be checked for equality against these new members.
1815
 
 *
1816
 
 * PARAMETERS:
1817
 
 *  "fromList"
1818
 
 *      Address of a List of Certs to be added, if not already present, to
1819
 
 *      "toList". Must be non-NULL, but may be empty.
1820
 
 *  "toList"
1821
 
 *      Address of a List of Certs to be augmented by "fromList". Must be
1822
 
 *      non-NULL, but may be empty.
1823
 
 *  "plContext"
1824
 
 *      Platform-specific context pointer.
1825
 
 * THREAD SAFETY:
1826
 
 *  Not Thread Safe - assumes exclusive access to "toList"
1827
 
 *  (see Thread Safety Definitions in Programmer's Guide)
1828
 
 * RETURNS:
1829
 
 *  Returns NULL if the function succeeds
1830
 
 *  Returns a Build Error if the function fails in a non-fatal way.
1831
 
 *  Returns a Fatal Error if the function fails in an unrecoverable way
1832
 
 */
1833
 
static PKIX_Error *
1834
 
pkix_Build_CombineWithTrust(
1835
 
        PKIX_List *toList,
1836
 
        PKIX_List *fromList,
1837
 
        void *plContext)
1838
 
{
1839
 
        PKIX_Boolean match = PKIX_FALSE;
1840
 
        PKIX_Boolean trusted = PKIX_FALSE;
1841
 
        PKIX_UInt32 fromlistLen = 0;
1842
 
        PKIX_UInt32 originalTolistLen = 0;
1843
 
        PKIX_UInt32 fromlistIx = 0;
1844
 
        PKIX_UInt32 tolistIx = 0;
1845
 
        PKIX_PL_Object *fObject = NULL;
1846
 
        PKIX_PL_Object *tObject = NULL;
1847
 
 
1848
 
        PKIX_ENTER(BUILD, "pkix_Build_CombineWithTrust");
1849
 
        PKIX_NULLCHECK_TWO(fromList, toList);
1850
 
 
1851
 
        PKIX_CHECK(PKIX_List_GetLength(fromList, &fromlistLen, plContext),
1852
 
                PKIX_LISTGETLENGTHFAILED);
1853
 
 
1854
 
        PKIX_CHECK(PKIX_List_GetLength(toList, &originalTolistLen, plContext),
1855
 
                PKIX_LISTGETLENGTHFAILED);
1856
 
 
1857
 
        for (fromlistIx = 0; fromlistIx < fromlistLen; fromlistIx++) {
1858
 
 
1859
 
                PKIX_CHECK(PKIX_List_GetItem
1860
 
                        (fromList, fromlistIx, &fObject, plContext),
1861
 
                        PKIX_LISTGETITEMFAILED);
1862
 
 
1863
 
                PKIX_NULLCHECK_ONE(fObject);
1864
 
 
1865
 
                match = PKIX_FALSE;
1866
 
                for (tolistIx = 0; tolistIx < originalTolistLen; tolistIx++) {
1867
 
                        PKIX_CHECK(PKIX_List_GetItem
1868
 
                                (toList, tolistIx, &tObject, plContext),
1869
 
                                PKIX_LISTGETITEMFAILED);
1870
 
 
1871
 
                        PKIX_NULLCHECK_ONE(tObject);
1872
 
 
1873
 
                        PKIX_CHECK(PKIX_PL_Object_Equals
1874
 
                                (fObject, tObject, &match, plContext),
1875
 
                                PKIX_OBJECTEQUALSFAILED);
1876
 
 
1877
 
                        if (match) {
1878
 
                                PKIX_CHECK(pkix_CheckType
1879
 
                                        (tObject, PKIX_CERT_TYPE, plContext),
1880
 
                                        PKIX_OBJECTNOTCERT);
1881
 
 
1882
 
                                PKIX_CHECK(PKIX_PL_Cert_IsCertTrusted
1883
 
                                        ((PKIX_PL_Cert *)tObject, &trusted,
1884
 
                                         plContext),
1885
 
                                        PKIX_CERTISCERTTRUSTEDFAILED);
 
1546
/* Match trust anchor to select params in order to find next cert. */
 
1547
static PKIX_Error*
 
1548
pkix_Build_SelectCertsFromTrustAnchors(
 
1549
    PKIX_List *trustAnchorsList,
 
1550
    PKIX_ComCertSelParams *certSelParams,
 
1551
    PKIX_List **pMatchList,
 
1552
    void *plContext) 
 
1553
{
 
1554
    int anchorIndex = 0;
 
1555
    PKIX_TrustAnchor *anchor = NULL;
 
1556
    PKIX_PL_Cert *trustedCert = NULL;
 
1557
    PKIX_List *matchList = NULL;
 
1558
    PKIX_CertSelector *certSel = NULL;
 
1559
    PKIX_CertSelector_MatchCallback selectorMatchCB = NULL;
 
1560
    PKIX_Boolean certMatch = PKIX_TRUE;
 
1561
 
 
1562
    PKIX_ENTER(BUILD, "pkix_Build_SelectCertsFromTrustAnchors");
 
1563
    
 
1564
    PKIX_CHECK(PKIX_CertSelector_Create
 
1565
               (NULL, NULL, &certSel, plContext),
 
1566
               PKIX_CERTSELECTORCREATEFAILED);
 
1567
    PKIX_CHECK(PKIX_CertSelector_SetCommonCertSelectorParams
 
1568
               (certSel, certSelParams, plContext),
 
1569
               PKIX_CERTSELECTORSETCOMMONCERTSELECTORPARAMSFAILED);
 
1570
    PKIX_CHECK(PKIX_CertSelector_GetMatchCallback
 
1571
               (certSel, &selectorMatchCB, plContext),
 
1572
               PKIX_CERTSELECTORGETMATCHCALLBACKFAILED);
 
1573
 
 
1574
    for (anchorIndex = 0;anchorIndex < trustAnchorsList->length; anchorIndex++) {
 
1575
        PKIX_CHECK(
 
1576
            PKIX_List_GetItem(trustAnchorsList,
 
1577
                              anchorIndex,
 
1578
                              (PKIX_PL_Object **)&anchor,
 
1579
                              plContext),
 
1580
            PKIX_LISTGETITEMFAILED);
 
1581
        PKIX_CHECK(PKIX_TrustAnchor_GetTrustedCert
 
1582
                   (anchor, &trustedCert, plContext),
 
1583
                   PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
 
1584
        pkixErrorResult =
 
1585
            (*selectorMatchCB)(certSel, trustedCert,
 
1586
                               &certMatch, plContext);
 
1587
        if (!pkixErrorResult && certMatch) {
 
1588
            if (!matchList) {
 
1589
                PKIX_CHECK(PKIX_List_Create(&matchList,
 
1590
                                            plContext),
 
1591
                           PKIX_LISTCREATEFAILED);
 
1592
            }
 
1593
            PKIX_CHECK(
 
1594
                PKIX_List_AppendItem(matchList,
 
1595
                    (PKIX_PL_Object*)trustedCert,
 
1596
                                     plContext),
 
1597
                PKIX_LISTAPPENDITEMFAILED);
 
1598
        } else {
 
1599
            PKIX_DECREF(pkixErrorResult);
 
1600
        }
 
1601
        PKIX_DECREF(trustedCert);
 
1602
        PKIX_DECREF(anchor);
 
1603
     }
 
1604
    
 
1605
    *pMatchList = matchList;
 
1606
    matchList = NULL;
 
1607
 
 
1608
cleanup:
 
1609
    PKIX_DECREF(matchList);
 
1610
    PKIX_DECREF(trustedCert);
 
1611
    PKIX_DECREF(anchor);
 
1612
    PKIX_DECREF(certSel);
 
1613
    
 
1614
    PKIX_RETURN(BUILD);
 
1615
}
 
1616
 
 
1617
 
 
1618
static PKIX_Error*
 
1619
pkix_Build_RemoveDupUntrustedCerts(
 
1620
    PKIX_List *trustedCertList,
 
1621
    PKIX_List *certsFound,
 
1622
    void *plContext)
 
1623
{
 
1624
    PKIX_UInt32 trustIndex;
 
1625
    PKIX_PL_Cert *trustCert = NULL, *cert = NULL;
 
1626
 
 
1627
    PKIX_ENTER(BUILD, "pkix_Build_RemoveDupUntrustedCerts");
 
1628
    if (trustedCertList == NULL || certsFound == NULL) {
 
1629
        goto cleanup;
 
1630
    }
 
1631
    for (trustIndex = 0;trustIndex < trustedCertList->length;
 
1632
        trustIndex++) {
 
1633
        PKIX_UInt32 certIndex = 0;
 
1634
        PKIX_CHECK(
 
1635
            PKIX_List_GetItem(trustedCertList,
 
1636
                              trustIndex,
 
1637
                              (PKIX_PL_Object **)&trustCert,
 
1638
                              plContext),
 
1639
            PKIX_LISTGETITEMFAILED);
1886
1640
        
1887
 
                                /* If tObject is a trusted cert, keep it. */
1888
 
                                if (trusted == PKIX_TRUE) {
1889
 
                                        PKIX_DECREF(tObject);
1890
 
                                        break;
1891
 
                                }
1892
 
 
1893
 
                                PKIX_CHECK(pkix_CheckType
1894
 
                                        (fObject, PKIX_CERT_TYPE, plContext),
1895
 
                                        PKIX_OBJECTNOTCERT);
1896
 
 
1897
 
                                PKIX_CHECK(PKIX_PL_Cert_IsCertTrusted
1898
 
                                        ((PKIX_PL_Cert *)fObject, &trusted,
1899
 
                                         plContext),
1900
 
                                        PKIX_CERTISCERTTRUSTEDFAILED);
1901
 
 
1902
 
                                /* If fObject is a trusted cert, replace it. */
1903
 
                                if (trusted == PKIX_TRUE) {
1904
 
                                        PKIX_CHECK(PKIX_List_SetItem
1905
 
                                                (toList,
1906
 
                                                tolistIx,
1907
 
                                                fObject,
1908
 
                                                plContext),
1909
 
                                                PKIX_LISTSETITEMFAILED);
1910
 
                                        PKIX_DECREF(tObject);
1911
 
                                        break;
1912
 
                                }
1913
 
                        }
1914
 
                        PKIX_DECREF(tObject);
1915
 
                }
1916
 
 
1917
 
                if (match == PKIX_FALSE) {
1918
 
                        PKIX_CHECK(PKIX_List_AppendItem
1919
 
                                (toList, fObject, plContext),
1920
 
                                PKIX_LISTAPPENDITEMFAILED);
1921
 
                }
1922
 
 
1923
 
                PKIX_DECREF(fObject);
 
1641
        while (certIndex < certsFound->length) {
 
1642
            PKIX_Boolean result = PKIX_FALSE;
 
1643
            PKIX_DECREF(cert);
 
1644
            PKIX_CHECK(
 
1645
                PKIX_List_GetItem(certsFound, certIndex,
 
1646
                                  (PKIX_PL_Object **)&cert,
 
1647
                                  plContext),
 
1648
                PKIX_LISTGETITEMFAILED);
 
1649
            PKIX_CHECK(
 
1650
                PKIX_PL_Object_Equals((PKIX_PL_Object *)trustCert,
 
1651
                                      (PKIX_PL_Object *)cert,
 
1652
                                      &result,
 
1653
                                      plContext),
 
1654
                PKIX_OBJECTEQUALSFAILED);
 
1655
            if (!result) {
 
1656
                certIndex += 1;
 
1657
                continue;
 
1658
            }
 
1659
            PKIX_CHECK(
 
1660
                PKIX_List_DeleteItem(certsFound, certIndex,
 
1661
                                     plContext),
 
1662
                PKIX_LISTDELETEITEMFAILED);
1924
1663
        }
1925
 
 
 
1664
        PKIX_DECREF(trustCert);
 
1665
    }
1926
1666
cleanup:
1927
 
 
1928
 
        PKIX_DECREF(fObject);
1929
 
        PKIX_DECREF(tObject);
1930
 
 
1931
 
        PKIX_RETURN(BUILD);
 
1667
    PKIX_DECREF(cert);
 
1668
    PKIX_DECREF(trustCert);
 
1669
 
 
1670
    PKIX_RETURN(BUILD);
1932
1671
}
1933
1672
 
 
1673
 
1934
1674
/*
1935
1675
 * FUNCTION: pkix_Build_GatherCerts
1936
1676
 * DESCRIPTION:
1978
1718
        PKIX_Boolean certStoreIsCached = PKIX_FALSE;
1979
1719
        PKIX_Boolean certStoreIsLocal = PKIX_FALSE;
1980
1720
        PKIX_Boolean foundInCache = PKIX_FALSE;
1981
 
        PKIX_Boolean listIsEmpty = PKIX_FALSE;
1982
1721
        PKIX_CertStore *certStore = NULL;
1983
1722
        PKIX_CertStore_CertCallback getCerts = NULL;
1984
1723
        PKIX_List *certsFound = NULL;
1985
 
        PKIX_List *sorted = NULL;
 
1724
        PKIX_List *trustedCertList = NULL;
1986
1725
        void *nbioContext = NULL;
1987
1726
 
1988
1727
        PKIX_ENTER(BUILD, "pkix_Build_GatherCerts");
1991
1730
        nbioContext = *pNBIOContext;
1992
1731
        *pNBIOContext = NULL;
1993
1732
 
1994
 
        PKIX_CHECK(
1995
 
            PKIX_List_IsEmpty(state->candidateCerts, &listIsEmpty, plContext),
1996
 
            PKIX_LISTISEMPTYFAILED);
1997
 
 
1998
 
        /* The caller is responsible to make sure that the list is empty */
1999
 
#ifdef UNDEF
2000
 
        /* I suspect that the list will not be empty. Commenting the assertion
2001
 
         * out for now. More work needs to be done for bug 418544 to clean up
2002
 
         * code related to candidateCerts list */
2003
 
        PORT_Assert(listIsEmpty);
2004
 
#endif
2005
 
        if (!listIsEmpty) {
2006
 
            PKIX_DECREF(state->candidateCerts);
2007
 
            PKIX_CHECK(PKIX_List_Create(&state->candidateCerts, plContext),
2008
 
                       PKIX_LISTCREATEFAILED);
2009
 
        }
 
1733
        PKIX_DECREF(state->candidateCerts);
2010
1734
 
2011
1735
        while (state->certStoreIndex < state->buildConstants.numCertStores) {
2012
1736
 
2105
1829
                        state->status = BUILD_GATHERPENDING;
2106
1830
                        *pNBIOContext = nbioContext;
2107
1831
                        goto cleanup;
2108
 
                    } else {
2109
 
                        PKIX_CHECK(pkix_Build_CombineWithTrust
2110
 
                                (state->candidateCerts, certsFound, plContext),
2111
 
                                PKIX_BUILDCOMBINEWITHTRUSTFAILED);
2112
 
                        PKIX_DECREF(certsFound);
2113
1832
                    }
2114
1833
                }
2115
1834
 
2118
1837
                ++(state->certStoreIndex);
2119
1838
        }
2120
1839
 
 
1840
        if (certsFound && certsFound->length > 1) {
 
1841
            PKIX_List *sorted = NULL;
 
1842
            
 
1843
            /* sort Certs to try to optimize search */
 
1844
            PKIX_CHECK(pkix_Build_SortCandidateCerts
 
1845
                       (certsFound, &sorted, plContext),
 
1846
                       PKIX_BUILDSORTCANDIDATECERTSFAILED);
 
1847
            PKIX_DECREF(certsFound);
 
1848
            certsFound = sorted;
 
1849
        }
 
1850
 
 
1851
        PKIX_CHECK(
 
1852
            pkix_Build_SelectCertsFromTrustAnchors(
 
1853
                state->buildConstants.anchors,
 
1854
                certSelParams, &trustedCertList,
 
1855
                plContext),
 
1856
            PKIX_FAILTOSELECTCERTSFROMANCHORS);
 
1857
        PKIX_CHECK(
 
1858
            pkix_Build_RemoveDupUntrustedCerts(trustedCertList,
 
1859
                                               certsFound,
 
1860
                                               plContext),
 
1861
            PKIX_REMOVEDUPUNTRUSTEDCERTSFAILED);
 
1862
 
 
1863
        PKIX_CHECK(
 
1864
            pkix_List_MergeLists(trustedCertList,
 
1865
                                 certsFound,
 
1866
                                 &state->candidateCerts,
 
1867
                                 plContext),
 
1868
            PKIX_LISTMERGEFAILED);
 
1869
 
2121
1870
        /* No, return the list we have gathered */
2122
1871
        PKIX_CHECK(PKIX_List_GetLength
2123
1872
                (state->candidateCerts, &state->numCerts, plContext),
2124
1873
                PKIX_LISTGETLENGTHFAILED);
2125
1874
 
2126
 
        if (state->numCerts > 1) {
2127
 
                /* sort Certs to try to optimize search */
2128
 
                PKIX_CHECK(pkix_Build_SortCandidateCerts
2129
 
                        (state->candidateCerts, &sorted, plContext),
2130
 
                        PKIX_BUILDSORTCANDIDATECERTSFAILED);
2131
 
 
2132
 
                PKIX_DECREF(state->candidateCerts);
2133
 
                state->candidateCerts = sorted;
2134
 
                sorted = NULL;
2135
 
        }
2136
 
 
2137
1875
        state->certIndex = 0;
2138
1876
 
2139
1877
cleanup:
2140
 
 
 
1878
        PKIX_DECREF(trustedCertList);
2141
1879
        PKIX_DECREF(certStore);
2142
1880
        PKIX_DECREF(certsFound);
2143
1881
 
2219
1957
}
2220
1958
 
2221
1959
/*
2222
 
 * FUNCTION: pkix_Build_RevCheckPrep
2223
 
 * DESCRIPTION:
2224
 
 *
2225
 
 *  This function prepares the CertChainCheckerState of the crlChecker contained
2226
 
 *  in "state" for checking the Certificate pointed to by "certToCheck".
2227
 
 *
2228
 
 * PARAMETERS:
2229
 
 *  "state"
2230
 
 *      Address of ForwardBuilderState to be used. Must be non-NULL.
2231
 
 *  "certToCheck"
2232
 
 *      Address of Certificate to be checked. Must be non-NULL.
2233
 
 *  "plContext"
2234
 
 *      Platform-specific context pointer.
2235
 
 * THREAD SAFETY:
2236
 
 *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
2237
 
 * RETURNS:
2238
 
 *  Returns NULL if the function succeeds.
2239
 
 *  Returns a Build Error if the function fails in a non-fatal way
2240
 
 *  Returns a Fatal Error if the function fails in an unrecoverable way.
2241
 
 */
2242
 
static PKIX_Error *
2243
 
pkix_Build_RevCheckPrep(
2244
 
        PKIX_ForwardBuilderState *state,
2245
 
        PKIX_PL_Cert *certToCheck,
2246
 
        void *plContext)
2247
 
{
2248
 
        PKIX_PL_Object *crlCheckerState = NULL;
2249
 
 
2250
 
        PKIX_ENTER(BUILD, "pkix_Build_RevCheckPrep");
2251
 
        PKIX_NULLCHECK_ONE(state);
2252
 
 
2253
 
        PKIX_CHECK(PKIX_CertChainChecker_GetCertChainCheckerState
2254
 
                (state->buildConstants.crlChecker, &crlCheckerState, plContext),
2255
 
                PKIX_CERTCHAINCHECKERGETCERTCHAINCHECKERSTATEFAILED);
2256
 
 
2257
 
        PKIX_CHECK(pkix_CheckType
2258
 
                (crlCheckerState, PKIX_DEFAULTCRLCHECKERSTATE_TYPE, plContext),
2259
 
                PKIX_OBJECTNOTDEFAULTCRLCHECKERSTATE);
2260
 
 
2261
 
        /* Set up CRLSelector */
2262
 
        PKIX_CHECK(pkix_DefaultCRLChecker_Check_SetSelector
2263
 
                (certToCheck,
2264
 
                (pkix_DefaultCRLCheckerState *) crlCheckerState,
2265
 
                plContext),
2266
 
                PKIX_DEFAULTCRLCHECKERCHECKSETSELECTORFAILED);
2267
 
 
2268
 
        PKIX_CHECK
2269
 
                (PKIX_CertChainChecker_SetCertChainCheckerState
2270
 
                (state->buildConstants.crlChecker, crlCheckerState, plContext),
2271
 
                PKIX_CERTCHAINCHECKERSETCERTCHAINCHECKERSTATEFAILED);
2272
 
 
2273
 
cleanup:
2274
 
 
2275
 
        PKIX_DECREF(crlCheckerState);
2276
 
 
2277
 
        PKIX_RETURN(BUILD);
2278
 
}
2279
 
 
2280
 
/*
2281
1960
 * FUNCTION: pkix_BuildForwardDepthFirstSearch
2282
1961
 * DESCRIPTION:
2283
1962
 *
2370
2049
        PKIX_Boolean trusted = PKIX_FALSE;
2371
2050
        PKIX_Boolean isSelfIssued = PKIX_FALSE;
2372
2051
        PKIX_Boolean canBeCached = PKIX_FALSE;
2373
 
        PKIX_Boolean passed = PKIX_FALSE;
2374
2052
        PKIX_Boolean revocationCheckingExists = PKIX_FALSE;
2375
2053
        PKIX_Boolean needsCRLChecking = PKIX_FALSE;
2376
2054
        PKIX_Boolean ioPending = PKIX_FALSE;
2390
2068
        PKIX_ValidateResult *valResult = NULL;
2391
2069
        PKIX_ForwardBuilderState *childState = NULL;
2392
2070
        PKIX_ForwardBuilderState *parentState = NULL;
2393
 
        PKIX_PL_Object *crlCheckerState = NULL;
2394
 
        PKIX_PL_PublicKey *candidatePubKey = NULL;
2395
 
        PKIX_PL_PublicKey *trustedPubKey = NULL;
 
2071
        PKIX_PL_Object *revCheckerState = NULL;
2396
2072
        PKIX_ComCertSelParams *certSelParams = NULL;
2397
2073
        PKIX_TrustAnchor *trustAnchor = NULL;
2398
2074
        PKIX_PL_Cert *trustedCert = NULL;
2510
2186
 
2511
2187
            if (state->status == BUILD_AIAPENDING &&
2512
2188
                state->buildConstants.aiaMgr) {
2513
 
                PKIX_CHECK(PKIX_PL_AIAMgr_GetAIACerts
 
2189
                pkixErrorResult = PKIX_PL_AIAMgr_GetAIACerts
2514
2190
                        (state->buildConstants.aiaMgr,
2515
2191
                        state->prevCert,
2516
2192
                        &nbio,
2517
2193
                        &unfilteredCerts,
2518
 
                        plContext),
2519
 
                        PKIX_AIAMGRGETAIACERTSFAILED);
 
2194
                         plContext);
2520
2195
 
2521
2196
                if (nbio != NULL) {
2522
2197
                        /* IO still pending, resume later */
2523
2198
                        *pNBIOContext = nbio;
2524
2199
                        goto cleanup;
2525
2200
                }
2526
 
 
2527
2201
                state->numCerts = 0;
2528
 
 
 
2202
                if (pkixErrorResult) {
 
2203
                    pkixErrorClass = pkixErrorResult->errClass;
 
2204
                    if (pkixErrorClass == PKIX_FATAL_ERROR) {
 
2205
                        goto fatal;
 
2206
                    }
 
2207
                    PKIX_DECREF(finalError);
 
2208
                    finalError = pkixErrorResult;
 
2209
                    pkixErrorResult = NULL;
 
2210
                    if (state->verifyNode != NULL) {
 
2211
                        /* state->verifyNode is the object that contains a list
 
2212
                         * of verifyNodes. verifyNodes contains cert chain build
 
2213
                         * failures that occured on this level of chian building.
 
2214
                         * Here, creating new verify node
 
2215
                         * to log the failure and adding it to the list. */
 
2216
                        PKIX_CHECK_FATAL(pkix_VerifyNode_Create
 
2217
                                         (state->prevCert,
 
2218
                                          0, NULL,
 
2219
                                          &verifyNode,
 
2220
                                          plContext),
 
2221
                                         PKIX_VERIFYNODECREATEFAILED);
 
2222
                        PKIX_CHECK_FATAL(pkix_VerifyNode_SetError
 
2223
                                         (verifyNode, finalError, plContext),
 
2224
                                         PKIX_VERIFYNODESETERRORFAILED);
 
2225
                        PKIX_CHECK_FATAL(pkix_VerifyNode_AddToTree
 
2226
                                         (state->verifyNode,
 
2227
                                          verifyNode,
 
2228
                                          plContext),
 
2229
                                         PKIX_VERIFYNODEADDTOTREEFAILED);
 
2230
                        PKIX_DECREF(verifyNode);
 
2231
                    }
 
2232
                }
2529
2233
#ifdef PKIX_BUILDDEBUG
2530
2234
                /* Turn this on to trace the List of Certs, before CertSelect */
2531
2235
                {
2650
2354
 
2651
2355
            if (state->status == BUILD_CERTVALIDATING) {
2652
2356
                    revocationCheckingExists =
2653
 
                        (state->buildConstants.crlChecker != NULL);
2654
 
 
2655
 
                    if ((revocationCheckingExists == PKIX_FALSE) &&
2656
 
                        (state->revCheckers != NULL)) {
2657
 
                            PKIX_CHECK(PKIX_List_GetLength
2658
 
                                    (state->revCheckers, &i, plContext),
2659
 
                                    PKIX_LISTGETLENGTHFAILED);
2660
 
                            if (i > 0) {
2661
 
                                    revocationCheckingExists = PKIX_TRUE;
2662
 
                            }
2663
 
                    }
 
2357
                        (state->buildConstants.revChecker != NULL);
2664
2358
 
2665
2359
                    PKIX_DECREF(state->candidateCert);
2666
2360
                    PKIX_CHECK(PKIX_List_GetItem
2680
2374
                                    PKIX_VERIFYNODECREATEFAILED);
2681
2375
                    }
2682
2376
 
2683
 
#ifdef DEBUG_kaie
2684
 
                    pkix_trace_dump_cert(
2685
 
                      "pkix_BuildForwardDepthFirstSearch calling pkix_Build_VerifyCertificate",
2686
 
                      state->candidateCert, plContext);
2687
 
#endif
2688
 
 
2689
2377
                    /* If failure, this function sets Error in verifyNode */
2690
2378
                    verifyError = pkix_Build_VerifyCertificate
2691
2379
                            (state,
2735
2423
            }
2736
2424
 
2737
2425
            if (state->status == BUILD_CRLPREP) {
2738
 
 
2739
 
                    PKIX_CHECK(pkix_Build_RevCheckPrep
2740
 
                            (state, state->prevCert, plContext),
2741
 
                            PKIX_BUILDREVCHECKPREPFAILED);
2742
 
 
2743
 
                    state->status = BUILD_CRL1;
2744
 
            }
2745
 
 
2746
 
            if (state->status == BUILD_CRL1) {
2747
 
 
2748
 
                PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
2749
 
                        (state->candidateCert,
2750
 
                        &candidatePubKey,
2751
 
                        plContext),
2752
 
                        PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
2753
 
 
2754
 
                PKIX_CHECK(PKIX_CertChainChecker_GetCertChainCheckerState
2755
 
                        (state->buildConstants.crlChecker,
2756
 
                        &crlCheckerState,
2757
 
                        plContext),
2758
 
                        PKIX_CERTCHAINCHECKERGETCERTCHAINCHECKERSTATEFAILED);
2759
 
 
2760
 
                PKIX_CHECK(pkix_CheckType
2761
 
                        (crlCheckerState,
2762
 
                        PKIX_DEFAULTCRLCHECKERSTATE_TYPE,
2763
 
                        plContext),
2764
 
                        PKIX_OBJECTNOTDEFAULTCRLCHECKERSTATE);
2765
 
 
2766
 
                verifyError = pkix_DefaultCRLChecker_Check_Helper
2767
 
                        (state->buildConstants.crlChecker,
2768
 
                        state->prevCert,
2769
 
                        candidatePubKey,
2770
 
                        (pkix_DefaultCRLCheckerState *) crlCheckerState,
2771
 
                        NULL, /* unresolved crit extensions */
2772
 
                        state->useOnlyLocal,
2773
 
                        &nbio,
2774
 
                        plContext);
2775
 
                if (verifyError) {
2776
 
                    pkixTempErrorReceived = PKIX_TRUE;
2777
 
                    pkixErrorClass = verifyError->errClass;
2778
 
                    if (pkixErrorClass == PKIX_FATAL_ERROR) {
2779
 
                        pkixErrorResult = verifyError;
2780
 
                        verifyError = NULL;
2781
 
                        goto fatal;
2782
 
                    }
2783
 
                }
2784
 
 
2785
 
                PKIX_DECREF(candidatePubKey);
2786
 
                PKIX_DECREF(crlCheckerState);
2787
 
 
 
2426
                PKIX_RevocationStatus revStatus;
 
2427
                PKIX_UInt32 reasonCode;
 
2428
 
 
2429
                verifyError =
 
2430
                    PKIX_RevocationChecker_Check(
 
2431
                             state->prevCert, state->candidateCert,
 
2432
                             state->buildConstants.revChecker,
 
2433
                             state->buildConstants.procParams,
 
2434
                             PKIX_FALSE,
 
2435
                             (state->parentState == NULL) ?
 
2436
                                              PKIX_TRUE : PKIX_FALSE,
 
2437
                             &revStatus, &reasonCode,
 
2438
                             &nbio, plContext);
2788
2439
                if (nbio != NULL) {
2789
 
                    /* IO still pending, resume later */
 
2440
                    *pNBIOContext = nbio;
2790
2441
                    goto cleanup;
2791
 
                } else if (PKIX_ERROR_RECEIVED) {
 
2442
                }
 
2443
                if (revStatus == PKIX_RevStatus_Revoked || verifyError) {
 
2444
                    if (!verifyError) {
 
2445
                        /* if verifyError is returned then use it as
 
2446
                         * it has a detailed revocation error code.
 
2447
                         * Otherwise create a new error */
 
2448
                        PKIX_ERROR_CREATE(VALIDATE, PKIX_CERTIFICATEREVOKED,
 
2449
                                          verifyError);
 
2450
                    }
2792
2451
                    if (state->verifyNode != NULL) {
2793
2452
                            PKIX_CHECK_FATAL(pkix_VerifyNode_SetError
2794
2453
                                    (verifyNode, verifyError, plContext),
2800
2459
                                    PKIX_VERIFYNODEADDTOTREEFAILED);
2801
2460
                            PKIX_DECREF(verifyNode);
2802
2461
                    }
2803
 
                    pkixTempErrorReceived = PKIX_FALSE;
2804
2462
                    PKIX_DECREF(finalError);
2805
2463
                    finalError = verifyError;
2806
2464
                    verifyError = NULL;
2846
2504
                      (state,
2847
2505
                      state->trustChain,
2848
2506
                      trustAnchor,
 
2507
                      PKIX_FALSE, /* do not add eku checker
 
2508
                                   * since eku was already
 
2509
                                   * checked */
2849
2510
                      plContext),
2850
2511
                      PKIX_BUILDVALIDATIONCHECKERSFAILED);
2851
2512
 
2853
2514
            }
2854
2515
 
2855
2516
            if (state->status == BUILD_CHECKTRUSTED2) {
2856
 
                    PKIX_CHECK_ONLY_FATAL(pkix_Build_ValidateEntireChain
2857
 
                        (state,
2858
 
                        trustAnchor,
2859
 
                        &nbio, &valResult,
2860
 
                        verifyNode,
2861
 
                        plContext),
2862
 
                        PKIX_BUILDVALIDATEENTIRECHAINFAILED);
2863
 
 
 
2517
                    verifyError = 
 
2518
                        pkix_Build_ValidateEntireChain(state,
 
2519
                                                       trustAnchor,
 
2520
                                                       &nbio, &valResult,
 
2521
                                                       verifyNode,
 
2522
                                                       plContext);
2864
2523
                    if (nbio != NULL) {
2865
2524
                            /* IO still pending, resume later */
2866
2525
                            goto cleanup;
2868
2527
                            PKIX_DECREF(state->reversedCertChain);
2869
2528
                            PKIX_DECREF(state->checkedCritExtOIDs);
2870
2529
                            PKIX_DECREF(state->checkerChain);
2871
 
                            PKIX_DECREF(state->revCheckers);
 
2530
                            /* checking the error for fatal status */
 
2531
                            if (verifyError) {
 
2532
                                pkixTempErrorReceived = PKIX_TRUE;
 
2533
                                pkixErrorClass = verifyError->errClass;
 
2534
                                if (pkixErrorClass == PKIX_FATAL_ERROR) {
 
2535
                                    pkixErrorResult = verifyError;
 
2536
                                    verifyError = NULL;
 
2537
                                    goto fatal;
 
2538
                                }
 
2539
                            }
2872
2540
                            if (state->verifyNode != NULL) {
2873
2541
                                PKIX_CHECK_FATAL(pkix_VerifyNode_AddToTree
2874
2542
                                        (state->verifyNode,
2877
2545
                                        PKIX_VERIFYNODEADDTOTREEFAILED);
2878
2546
                                PKIX_DECREF(verifyNode);
2879
2547
                            }
2880
 
 
2881
2548
                            if (!PKIX_ERROR_RECEIVED) {
2882
2549
                                *pValResult = valResult;
2883
2550
                                valResult = NULL;
2885
2552
                                state->status = BUILD_CHECKTRUSTED;
2886
2553
                                goto cleanup;
2887
2554
                            }
 
2555
                            PKIX_DECREF(finalError);
 
2556
                            finalError = verifyError;
 
2557
                            verifyError = NULL;
2888
2558
                            /* Reset temp error that was set by 
2889
2559
                             * PKIX_CHECK_ONLY_FATAL and continue */
2890
2560
                            pkixTempErrorReceived = PKIX_FALSE;
2896
2566
                     * adding more Certs to it can't help.
2897
2567
                     */
2898
2568
                    if (state->certLoopingDetected) {
2899
 
                            PKIX_ERROR
2900
 
                                (PKIX_LOOPDISCOVEREDDUPCERTSNOTALLOWED);
 
2569
                            PKIX_DECREF(verifyError);
 
2570
                            PKIX_ERROR_CREATE(BUILD, 
 
2571
                                         PKIX_LOOPDISCOVEREDDUPCERTSNOTALLOWED,
 
2572
                                         verifyError);
 
2573
                            PKIX_CHECK_FATAL(
 
2574
                                pkix_VerifyNode_SetError(state->verifyNode,
 
2575
                                                         verifyError,
 
2576
                                                         plContext),
 
2577
                                PKIX_VERIFYNODESETERRORFAILED);
 
2578
                            PKIX_DECREF(verifyError);
2901
2579
                    }
2902
2580
                    state->status = BUILD_GETNEXTCERT;
2903
2581
            }
2914
2592
                            plContext),
2915
2593
                            PKIX_LISTAPPENDITEMFAILED);
2916
2594
 
2917
 
                    state->status = BUILD_CHECKWITHANCHORS;
2918
 
                    state->anchorIndex = 0;
 
2595
                    state->status = BUILD_EXTENDCHAIN;
2919
2596
            }
2920
2597
 
2921
 
            while ((state->status == BUILD_CHECKWITHANCHORS) ||
2922
 
                (state->status == BUILD_CRL2) ||
2923
 
                (state->status == BUILD_VALCHAIN2)) {
2924
 
                    if (state->anchorIndex >=
2925
 
                            state->buildConstants.numAnchors) {
2926
 
                                   state->status = BUILD_EXTENDCHAIN;
2927
 
                            break;
2928
 
                    } else {
2929
 
 
2930
 
                            PKIX_CHECK(PKIX_List_GetItem
2931
 
                                    (state->buildConstants.anchors,
2932
 
                                    state->anchorIndex,
2933
 
                                    (PKIX_PL_Object **)&trustAnchor,
2934
 
                                    plContext),
2935
 
                                    PKIX_LISTGETITEMFAILED);
2936
 
 
2937
 
                    }
2938
 
 
2939
 
                    if (state->status == BUILD_CHECKWITHANCHORS) {
2940
 
 
2941
 
                            /*
2942
 
                             * Does this Trust Anchor chain to this cert?
2943
 
                             * (If state->verifyNode is non-NULL, this function
2944
 
                             * chains a verifyNode for each anchor checked.)
2945
 
                             */
2946
 
                            PKIX_CHECK(pkix_Build_CheckCertAgainstAnchor
2947
 
                                    (state->candidateCert,
2948
 
                                    trustAnchor,
2949
 
                                    state->traversedSubjNames,
2950
 
                                    &passed,
2951
 
                                    verifyNode,
2952
 
                                    plContext),
2953
 
                                    PKIX_CHECKCERTAGAINSTANCHORFAILED);
2954
 
 
2955
 
                            if (passed == PKIX_TRUE) {
2956
 
                                    if (state->buildConstants.crlChecker) {
2957
 
                                            state->status = BUILD_CRL2PREP;
2958
 
                                    } else {
2959
 
                                            state->status = BUILD_VALCHAIN;
2960
 
                                    }
2961
 
                            } /* else increment anchorIndex and try next */
2962
 
                    }
2963
 
 
2964
 
                    if (state->status == BUILD_CRL2PREP) {
2965
 
                            PKIX_CHECK(pkix_Build_RevCheckPrep
2966
 
                                    (state, state->candidateCert, plContext),
2967
 
                                    PKIX_BUILDREVCHECKPREPFAILED);
2968
 
                            state->status = BUILD_CRL2;
2969
 
                    }
2970
 
 
2971
 
                    if (state->status == BUILD_CRL2) {
2972
 
                      PKIX_CHECK(PKIX_TrustAnchor_GetTrustedCert
2973
 
                          (trustAnchor, &trustedCert, plContext),
2974
 
                          PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
2975
 
 
2976
 
                      PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
2977
 
                          (trustedCert, &trustedPubKey, plContext),
2978
 
                          PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
2979
 
 
2980
 
                      PKIX_CHECK
2981
 
                          (PKIX_CertChainChecker_GetCertChainCheckerState
2982
 
                          (state->buildConstants.crlChecker,
2983
 
                          &crlCheckerState,
2984
 
                          plContext),
2985
 
                          PKIX_CERTCHAINCHECKERGETCERTCHAINCHECKERSTATEFAILED);
2986
 
 
2987
 
                      PKIX_CHECK(pkix_CheckType
2988
 
                          (crlCheckerState,
2989
 
                          PKIX_DEFAULTCRLCHECKERSTATE_TYPE,
2990
 
                          plContext),
2991
 
                          PKIX_OBJECTNOTDEFAULTCRLCHECKERSTATE);
2992
 
 
2993
 
                      verifyError = pkix_DefaultCRLChecker_Check_Helper
2994
 
                          (state->buildConstants.crlChecker,
2995
 
                          state->candidateCert,
2996
 
                          trustedPubKey,
2997
 
                          (pkix_DefaultCRLCheckerState *) crlCheckerState,
2998
 
                          NULL, /* unresolved crit extensions */
2999
 
                          state->useOnlyLocal,
3000
 
                          &nbio,
3001
 
                          plContext);
3002
 
                      if (verifyError) {
3003
 
                          pkixTempErrorReceived = PKIX_TRUE;
3004
 
                          pkixErrorClass = verifyError->errClass;
3005
 
                          if (pkixErrorClass == PKIX_FATAL_ERROR) {
3006
 
                              pkixErrorResult = verifyError;
3007
 
                              verifyError = NULL;
3008
 
                              goto fatal;
3009
 
                          }
3010
 
                      }
3011
 
 
3012
 
                      PKIX_DECREF(trustedCert);
3013
 
                      PKIX_DECREF(trustedPubKey);
3014
 
                      PKIX_DECREF(crlCheckerState);
3015
 
 
3016
 
                      if (nbio != NULL) {
3017
 
                              /* IO still pending, resume later */
3018
 
                              goto cleanup;
3019
 
                      } else if (PKIX_ERROR_RECEIVED) {
3020
 
                              if (state->verifyNode != NULL) {
3021
 
                                  PKIX_CHECK_FATAL
3022
 
                                      (pkix_VerifyNode_SetError
3023
 
                                      (verifyNode,
3024
 
                                      verifyError,
3025
 
                                      plContext),
3026
 
                                      PKIX_VERIFYNODESETERRORFAILED);
3027
 
                              }
3028
 
                              pkixTempErrorReceived = PKIX_FALSE;
3029
 
                              PKIX_DECREF(finalError);
3030
 
                              finalError = verifyError;
3031
 
                              verifyError = NULL;
3032
 
                              /* try again with the next trust anchor */
3033
 
                              state->status = BUILD_CHECKWITHANCHORS;
3034
 
                      } else {
3035
 
                              state->status = BUILD_VALCHAIN;
3036
 
                      }
3037
 
                    }
3038
 
 
3039
 
                    if (state->status == BUILD_VALCHAIN) {
3040
 
                            /* Does the chain pass all validation tests? */
3041
 
                            PKIX_CHECK(pkix_Build_ValidationCheckers
3042
 
                                    (state,
3043
 
                                    state->trustChain,
3044
 
                                    trustAnchor,
3045
 
                                    plContext),
3046
 
                                    PKIX_BUILDVALIDATIONCHECKERSFAILED);
3047
 
 
3048
 
                            state->status = BUILD_VALCHAIN2;
3049
 
                    }
3050
 
 
3051
 
                    if (state->status == BUILD_VALCHAIN2) {
3052
 
                            PKIX_CHECK_ONLY_FATAL
3053
 
                                    (pkix_Build_ValidateEntireChain
3054
 
                                    (state,
3055
 
                                    trustAnchor,
3056
 
                                    &nbio,
3057
 
                                    &valResult,
3058
 
                                    verifyNode,
3059
 
                                    plContext),
3060
 
                                    PKIX_BUILDVALIDATEENTIRECHAINFAILED);
3061
 
 
3062
 
                            if (nbio != NULL) {
3063
 
                                    /* IO still pending, resume later */
3064
 
                                    goto cleanup;
3065
 
                            } else {
3066
 
                                    PKIX_DECREF(state->reversedCertChain);
3067
 
                                    PKIX_DECREF(state->checkedCritExtOIDs);
3068
 
                                    PKIX_DECREF(state->checkerChain);
3069
 
                                    PKIX_DECREF(state->revCheckers);
3070
 
                                    if (!PKIX_ERROR_RECEIVED) {
3071
 
                                        *pValResult = valResult;
3072
 
                                        valResult = NULL;
3073
 
                                        if (state->verifyNode != NULL) {
3074
 
                                            PKIX_CHECK_FATAL
3075
 
                                                (pkix_VerifyNode_AddToTree
3076
 
                                                        (state->verifyNode,
3077
 
                                                        verifyNode,
3078
 
                                                        plContext),
3079
 
                                                PKIX_VERIFYNODEADDTOTREEFAILED);
3080
 
                                            PKIX_DECREF(verifyNode);
3081
 
                                        }
3082
 
                                        /* Make IsIOPending FALSE */
3083
 
                                        state->status = BUILD_VALCHAIN;
3084
 
                                        goto cleanup;
3085
 
                                    }
3086
 
                                    /* Reset temp error that was set by 
3087
 
                                     * PKIX_CHECK_ONLY_FATAL and continue */
3088
 
                                    pkixTempErrorReceived = PKIX_FALSE;
3089
 
                            }
3090
 
 
3091
 
                            state->status = BUILD_CHECKWITHANCHORS;
3092
 
                    }
3093
 
 
3094
 
                    PKIX_DECREF(trustAnchor);
3095
 
                    state->anchorIndex++;
3096
 
            } /* while (anchorIndex < numAnchors) */
3097
 
 
3098
2598
            if (state->status == BUILD_EXTENDCHAIN) {
3099
2599
 
3100
2600
                    /* Check whether we are allowed to extend the chain */
3176
2676
                            (childTraversedCACerts,
3177
2677
                            state->buildConstants.maxFanout,
3178
2678
                            state->numDepth - 1,
3179
 
                            state->dsaParamsNeeded,
3180
2679
                            state->revCheckDelayed,
3181
2680
                            canBeCached,
3182
2681
                            validityDate,
3275
2774
                        PKIX_CHECK(PKIX_List_DeleteItem
3276
2775
                                (state->trustChain, numChained - 1, plContext),
3277
2776
                                PKIX_LISTDELETEITEMFAILED);
 
2777
                        
 
2778
                        /* local and aia fetching returned no good certs.
 
2779
                         * Creating a verify node in the parent that tells
 
2780
                         * us this. */
 
2781
                        if (!state->verifyNode) {
 
2782
                            PKIX_CHECK_FATAL(
 
2783
                                pkix_VerifyNode_Create(state->prevCert,
 
2784
                                                       0, NULL, 
 
2785
                                                       &state->verifyNode,
 
2786
                                                       plContext),
 
2787
                                PKIX_VERIFYNODECREATEFAILED);
 
2788
                        }
 
2789
                        /* Updating the log with the error. */
 
2790
                        PKIX_DECREF(verifyError);
 
2791
                        PKIX_ERROR_CREATE(BUILD, PKIX_SECERRORUNKNOWNISSUER,
 
2792
                                          verifyError);
 
2793
                        PKIX_CHECK_FATAL(
 
2794
                            pkix_VerifyNode_SetError(state->verifyNode,
 
2795
                                                     verifyError,
 
2796
                                                     plContext),
 
2797
                            PKIX_VERIFYNODESETERRORFAILED);
 
2798
                        PKIX_DECREF(verifyError);
 
2799
 
3278
2800
                        PKIX_INCREF(state->parentState);
3279
2801
                        parentState = state->parentState;
3280
2802
                        PKIX_DECREF(verifyNode);
3283
2805
                        PKIX_DECREF(state);
3284
2806
                        state = parentState;
3285
2807
                        parentState = NULL;
3286
 
                        if (state->verifyNode != NULL) {
 
2808
                        if (state->verifyNode != NULL && verifyNode) {
3287
2809
                                PKIX_CHECK_FATAL(pkix_VerifyNode_AddToTree
3288
2810
                                        (state->verifyNode,
3289
2811
                                        verifyNode,
3349
2871
                        PKIX_DECREF(state);
3350
2872
                        state = parentState;
3351
2873
                        parentState = NULL;
3352
 
                        if (state->verifyNode != NULL) {
 
2874
                        if (state->verifyNode != NULL && verifyNode) {
3353
2875
                                PKIX_CHECK_FATAL(pkix_VerifyNode_AddToTree
3354
2876
                                        (state->verifyNode,
3355
2877
                                        verifyNode,
3379
2901
            }
3380
2902
            pkixErrorCode = PKIX_SECERRORUNKNOWNISSUER;
3381
2903
            pkixErrorReceived = PKIX_TRUE;
 
2904
            PKIX_ERROR_CREATE(BUILD, PKIX_SECERRORUNKNOWNISSUER,
 
2905
                              verifyError);
 
2906
            PKIX_CHECK_FATAL(
 
2907
                pkix_VerifyNode_SetError(state->verifyNode, verifyError,
 
2908
                                         plContext),
 
2909
                PKIX_VERIFYNODESETERRORFAILED);
3382
2910
        } else {
3383
2911
            pkixErrorResult = verifyError;
3384
2912
            verifyError = NULL;
3385
2913
        }
3386
2914
 
3387
2915
fatal:
 
2916
        if (state->parentState) {
 
2917
            /* parentState in "state" object should be NULL at this point.
 
2918
             * If itn't, that means that we got fatal error(we have jumped to
 
2919
             * "fatal" label) and we should destroy all state except the top one. */
 
2920
            while (state->parentState) {
 
2921
                PKIX_Error *error = NULL;
 
2922
                PKIX_ForwardBuilderState *prntState = state->parentState;
 
2923
                /* Dumb: need to increment parentState to avoid destruction
 
2924
                 * of "build constants"(they get destroyed when parentState is
 
2925
                 * set to NULL. */
 
2926
                PKIX_INCREF(prntState);
 
2927
                error = PKIX_PL_Object_DecRef((PKIX_PL_Object*)state, plContext);
 
2928
                if (error) {
 
2929
                    PKIX_PL_Object_DecRef((PKIX_PL_Object*)error, plContext);
 
2930
                }
 
2931
                /* No need to decref the parent state. It was already done by
 
2932
                 * pkix_ForwardBuilderState_Destroy function. */
 
2933
                state = prntState;
 
2934
            }
 
2935
        }
3388
2936
        PKIX_DECREF(parentState);
3389
2937
        PKIX_DECREF(childState);
3390
2938
        PKIX_DECREF(valResult);
3391
2939
        PKIX_DECREF(verifyError);
3392
2940
        PKIX_DECREF(finalError);
3393
2941
        PKIX_DECREF(verifyNode);
3394
 
        PKIX_DECREF(candidatePubKey);
3395
 
        PKIX_DECREF(trustedPubKey);
3396
2942
        PKIX_DECREF(childTraversedSubjNames);
3397
2943
        PKIX_DECREF(certSelParams);
3398
2944
        PKIX_DECREF(subjectNames);
3399
2945
        PKIX_DECREF(subjectName);
3400
2946
        PKIX_DECREF(trustAnchor);
3401
2947
        PKIX_DECREF(validityDate);
3402
 
        PKIX_DECREF(crlCheckerState);
 
2948
        PKIX_DECREF(revCheckerState);
3403
2949
        PKIX_DECREF(currTime);
3404
2950
        PKIX_DECREF(filteredCerts);
3405
2951
        PKIX_DECREF(unfilteredCerts);
3409
2955
}
3410
2956
 
3411
2957
/*
3412
 
 * FUNCTION: pkix_Build_TryShortcut
3413
 
 * DESCRIPTION:
3414
 
 *
3415
 
 *  This function checks whether the target cert in "state", subject to the name
3416
 
 *  constraints specified by "targetSubjNames", forms a complete trust chain
3417
 
 *  with any of the trust anchors.
3418
 
 * 
3419
 
 *  If a crlChecker using non-blocking I/O returns with an indication that I/O
3420
 
 *  is in progress, this function stores the NBIOContext (returned by the
3421
 
 *  checker) at "pNBIOContext". Otherwise, it stores NULL at "pNBIOContext" and
3422
 
 *  indicates in "pAnchor" whether a complete trust chain was found. If no
3423
 
 *  successful trust chain is found, NULL is stored at "pAnchor". If a
3424
 
 *  successful trust chain is found, the anchor that completed the chain is
3425
 
 *  stored at "pAnchor".
3426
 
 *
3427
 
 * PARAMETERS:
3428
 
 *  "state"
3429
 
 *      Address of ForwardBuilderState to be used. Must be non-NULL.
3430
 
 *  "targetSubjNames"
3431
 
 *      Address of List of subject names in targetCertificate. Must be non-NULL.
3432
 
 *  "pNBIOContext"
3433
 
 *      Address at which the NBIOContext is stored indicating whether the
3434
 
 *      checking is complete. Must be non-NULL.
3435
 
 *  "pAnchor"
3436
 
 *      Address at which successful trustAnchor is stored, if trustAnchor and
3437
 
 *      Certificate form a complete trust chain. Must be non-NULL.
3438
 
 *  "plContext"
3439
 
 *      Platform-specific context pointer.
3440
 
 * THREAD SAFETY:
3441
 
 *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
3442
 
 * RETURNS:
3443
 
 *  Returns NULL if the function succeeds.
3444
 
 *  Returns a Build Error if the function fails in a non-fatal way
3445
 
 *  Returns a Fatal Error if the function fails in an unrecoverable way.
3446
 
 */
3447
 
static PKIX_Error *
3448
 
pkix_Build_TryShortcut(
3449
 
        PKIX_ForwardBuilderState *state,
3450
 
        PKIX_List *targetSubjNames,
3451
 
        void **pNBIOContext,
3452
 
        PKIX_TrustAnchor **pAnchor,
3453
 
        PKIX_ValidateResult **pValResult,
3454
 
        void *plContext)
3455
 
{
3456
 
        PKIX_Boolean passed = PKIX_FALSE;
3457
 
        void *nbioContext = NULL;
3458
 
        PKIX_TrustAnchor *anchor = NULL;
3459
 
        PKIX_PL_Cert *trustedCert = NULL;
3460
 
        PKIX_PL_PublicKey *trustedPubKey = NULL;
3461
 
        PKIX_PL_Object *crlCheckerState = NULL;
3462
 
        PKIX_Error *validationError = NULL;
3463
 
        PKIX_VerifyNode *verifyNode = NULL;
3464
 
        PKIX_ValidateResult *valResult = NULL;
3465
 
 
3466
 
        PKIX_ENTER(BUILD, "pkix_Build_TryShortcut");
3467
 
        PKIX_NULLCHECK_THREE(state, pNBIOContext, pAnchor);
3468
 
 
3469
 
        *pNBIOContext = NULL; /* prepare in case of error exit */
3470
 
 
3471
 
        /*
3472
 
         * Does the target cert, with any of our trust
3473
 
         * anchors, form a complete trust chain?
3474
 
         */
3475
 
        while (state->anchorIndex < state->buildConstants.numAnchors) {
3476
 
                PKIX_CHECK(PKIX_List_GetItem
3477
 
                        (state->buildConstants.anchors,
3478
 
                        state->anchorIndex,
3479
 
                        (PKIX_PL_Object **)&anchor,
3480
 
                        plContext),
3481
 
                        PKIX_LISTGETITEMFAILED);
3482
 
                PKIX_CHECK(pkix_Build_CheckCertAgainstAnchor
3483
 
                        (state->prevCert,
3484
 
                        anchor,
3485
 
                        targetSubjNames,
3486
 
                        &passed,
3487
 
                        state->verifyNode,
3488
 
                        plContext),
3489
 
                        PKIX_CHECKCERTAGAINSTANCHORFAILED);
3490
 
 
3491
 
                if (passed != PKIX_TRUE) {
3492
 
                    PKIX_DECREF(anchor);
3493
 
                    state->anchorIndex++;
3494
 
                    continue;
3495
 
                }
3496
 
 
3497
 
                if (state->buildConstants.crlChecker != NULL) {
3498
 
 
3499
 
                    PKIX_DECREF(trustedCert);
3500
 
                    PKIX_CHECK(PKIX_TrustAnchor_GetTrustedCert
3501
 
                               (anchor, &trustedCert, plContext),
3502
 
                               PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
3503
 
                    
3504
 
                    PKIX_DECREF(trustedPubKey);
3505
 
                    PKIX_CHECK(PKIX_PL_Cert_GetSubjectPublicKey
3506
 
                               (trustedCert, &trustedPubKey, plContext),
3507
 
                               PKIX_CERTGETSUBJECTPUBLICKEYFAILED);
3508
 
                    
3509
 
                    PKIX_DECREF(crlCheckerState);
3510
 
                    PKIX_CHECK
3511
 
                        (PKIX_CertChainChecker_GetCertChainCheckerState
3512
 
                         (state->buildConstants.crlChecker,
3513
 
                          &crlCheckerState,
3514
 
                          plContext),
3515
 
                         PKIX_CERTCHAINCHECKERGETCERTCHAINCHECKERSTATEFAILED);
3516
 
                    
3517
 
                    PKIX_CHECK(pkix_CheckType
3518
 
                               (crlCheckerState,
3519
 
                                PKIX_DEFAULTCRLCHECKERSTATE_TYPE,
3520
 
                                plContext),
3521
 
                               PKIX_OBJECTNOTDEFAULTCRLCHECKERSTATE);
3522
 
 
3523
 
                    /* Set up CRLSelector */
3524
 
                    PKIX_CHECK(pkix_DefaultCRLChecker_Check_SetSelector
3525
 
                               (state->prevCert,
3526
 
                                (pkix_DefaultCRLCheckerState *) crlCheckerState,
3527
 
                                plContext),
3528
 
                               PKIX_DEFAULTCRLCHECKERCHECKSETSELECTORFAILED);
3529
 
                    
3530
 
                    validationError =
3531
 
                        pkix_DefaultCRLChecker_Check_Helper
3532
 
                        (state->buildConstants.crlChecker,
3533
 
                         state->prevCert,
3534
 
                         trustedPubKey,
3535
 
                         (pkix_DefaultCRLCheckerState *) crlCheckerState,
3536
 
                         NULL, /* unresolved crit extensions */
3537
 
                         PKIX_FALSE,
3538
 
                         &nbioContext,
3539
 
                         plContext);
3540
 
 
3541
 
                    if (validationError) {
3542
 
                        pkixErrorClass = validationError->errClass;
3543
 
                        if (pkixErrorClass == PKIX_FATAL_ERROR) {
3544
 
                            pkixErrorResult = validationError;
3545
 
                            validationError = NULL;
3546
 
                            goto cleanup;
3547
 
                        }
3548
 
                        if (state->verifyNode) {
3549
 
                            PKIX_CHECK_FATAL(
3550
 
                                pkix_VerifyNode_Create(state->prevCert,
3551
 
                                                       0, validationError,
3552
 
                                                       &verifyNode,
3553
 
                                                       plContext),
3554
 
                                PKIX_VERIFYNODECREATEFAILED);
3555
 
                            PKIX_CHECK_FATAL(
3556
 
                                pkix_VerifyNode_AddToTree(state->verifyNode,
3557
 
                                                          verifyNode,
3558
 
                                                          plContext),
3559
 
                                PKIX_VERIFYNODEADDTOTREEFAILED);
3560
 
                            PKIX_DECREF(verifyNode);
3561
 
                        }
3562
 
                        PKIX_DECREF(validationError);
3563
 
                        /* contunue to the next anchor */
3564
 
                        PKIX_DECREF(anchor);
3565
 
                        state->anchorIndex++;
3566
 
                        continue;
3567
 
                    }
3568
 
                    if (nbioContext != NULL) {
3569
 
                        state->status = BUILD_SHORTCUTPENDING;
3570
 
                        *pNBIOContext = nbioContext;
3571
 
                        goto cleanup;
3572
 
                    }
3573
 
                }
3574
 
 
3575
 
                PKIX_CHECK_FATAL(
3576
 
                    pkix_VerifyNode_Create(state->prevCert, 0, NULL,
3577
 
                                           &verifyNode,
3578
 
                                           plContext),
3579
 
                    PKIX_VERIFYNODECREATEFAILED);
3580
 
                
3581
 
                PKIX_CHECK(
3582
 
                    pkix_Build_ValidationCheckers(state, state->trustChain,
3583
 
                                                  anchor, plContext),
3584
 
                    PKIX_BUILDVALIDATIONCHECKERSFAILED);
3585
 
                
3586
 
                PKIX_CHECK_ONLY_FATAL(
3587
 
                    pkix_Build_ValidateEntireChain(state, anchor, &nbioContext,
3588
 
                                                   &valResult, verifyNode,
3589
 
                                                   plContext),
3590
 
                    PKIX_BUILDVALIDATEENTIRECHAINFAILED);
3591
 
                
3592
 
                if (nbioContext != NULL) {
3593
 
                    /* IO still pending, resume later */
3594
 
                    *pNBIOContext = nbioContext;
3595
 
                    goto cleanup;
3596
 
                }
3597
 
                /* Cleanup after pkix_Build_ValidateEntireChain. */
3598
 
                PKIX_DECREF(state->reversedCertChain);
3599
 
                PKIX_DECREF(state->checkedCritExtOIDs);
3600
 
                PKIX_DECREF(state->checkerChain);
3601
 
                PKIX_DECREF(state->revCheckers);
3602
 
                if (state->verifyNode != NULL) {
3603
 
                    PKIX_CHECK_FATAL(
3604
 
                        pkix_VerifyNode_AddToTree(state->verifyNode,
3605
 
                                                  verifyNode, plContext),
3606
 
                        PKIX_VERIFYNODEADDTOTREEFAILED);
3607
 
                    PKIX_DECREF(verifyNode);
3608
 
                }
3609
 
                
3610
 
                if (!PKIX_ERROR_RECEIVED) {
3611
 
                    *pValResult = valResult;
3612
 
                    valResult = NULL;
3613
 
                    break;
3614
 
                }
3615
 
                /* Reset temp error that was set by 
3616
 
                 * PKIX_CHECK_ONLY_FATAL and continue */
3617
 
                pkixTempErrorReceived = PKIX_FALSE;
3618
 
                PKIX_DECREF(anchor);
3619
 
                state->anchorIndex++;
3620
 
        } /* while (state->anchorIndex < state->buildConstants.numAnchors) */
3621
 
 
3622
 
        *pAnchor = anchor;
3623
 
        anchor = NULL;
3624
 
 
3625
 
cleanup:
3626
 
fatal:
3627
 
 
3628
 
        PKIX_DECREF(validationError);
3629
 
        PKIX_DECREF(valResult);
3630
 
        PKIX_DECREF(verifyNode);
3631
 
        PKIX_DECREF(trustedCert);
3632
 
        PKIX_DECREF(trustedPubKey);
3633
 
        PKIX_DECREF(crlCheckerState);
3634
 
        PKIX_DECREF(anchor);
3635
 
 
3636
 
        PKIX_RETURN(BUILD);
3637
 
}
3638
 
 
3639
 
/*
3640
2958
 * FUNCTION: pkix_Build_CheckInCache
3641
2959
 * DESCRIPTION:
3642
2960
 *
3723
3041
                   (matchingAnchor, &trustedCert, plContext),
3724
3042
                   PKIX_TRUSTANCHORGETTRUSTEDCERTFAILED);
3725
3043
        
3726
 
        PKIX_CHECK(PKIX_PL_Cert_IsCertTrusted
3727
 
                   (trustedCert, &trusted, plContext),
3728
 
                   PKIX_CERTISCERTTRUSTEDFAILED);
3729
 
        
 
3044
        if (!state->buildConstants.anchors) {
 
3045
            PKIX_CHECK(PKIX_PL_Cert_IsCertTrusted
 
3046
                       (trustedCert, PKIX_FALSE, &trusted, plContext),
 
3047
                       PKIX_CERTISCERTTRUSTEDFAILED);
 
3048
        } else {
 
3049
            /* Check if it is one of the trust anchors */
 
3050
            PKIX_CHECK(
 
3051
                pkix_List_Contains(state->buildConstants.anchors,
 
3052
                                   (PKIX_PL_Object *)matchingAnchor,
 
3053
                                   &trusted,
 
3054
                                   plContext),
 
3055
                PKIX_LISTCONTAINSFAILED);
 
3056
        }
 
3057
 
3730
3058
        if (!trusted) {
3731
3059
            goto cleanup;
3732
3060
        }
3747
3075
                   (state,
3748
3076
                    certList,
3749
3077
                    matchingAnchor,
 
3078
                    PKIX_TRUE,  /* Adding eku checker. */
3750
3079
                    plContext),
3751
3080
                   PKIX_BUILDVALIDATIONCHECKERSFAILED);
3752
3081
        
3766
3095
        PKIX_DECREF(state->reversedCertChain);
3767
3096
        PKIX_DECREF(state->checkedCritExtOIDs);
3768
3097
        PKIX_DECREF(state->checkerChain);
3769
 
        PKIX_DECREF(state->revCheckers);
3770
3098
        
3771
3099
        if (!PKIX_ERROR_RECEIVED) {
3772
3100
            /* The result from cache is still valid. But we replace an old*/
3858
3186
        PKIX_UInt32 numCertStores = 0;
3859
3187
        PKIX_UInt32 numHintCerts = 0;
3860
3188
        PKIX_UInt32 i = 0;
3861
 
        PKIX_Boolean dsaParamsNeeded = PKIX_FALSE;
3862
 
        PKIX_Boolean isCrlEnabled = PKIX_FALSE;
3863
 
        PKIX_Boolean nistCRLPolicyEnabled = PKIX_TRUE;
3864
3189
        PKIX_Boolean isDuplicate = PKIX_FALSE;
3865
3190
        PKIX_PL_Cert *trustedCert = NULL;
3866
3191
        PKIX_CertSelector *targetConstraints = NULL;
3869
3194
        PKIX_List *targetSubjNames = NULL;
3870
3195
        PKIX_PL_Cert *targetCert = NULL;
3871
3196
        PKIX_PL_Object *firstHintCert = NULL;
3872
 
        PKIX_CertChainChecker *crlChecker = NULL;
 
3197
        PKIX_RevocationChecker *revChecker = NULL;
3873
3198
        PKIX_List *certStores = NULL;
3874
3199
        PKIX_CertStore *certStore = NULL;
3875
3200
        PKIX_List *userCheckers = NULL;
3902
3227
                    (procParams, &testDate, plContext),
3903
3228
                    PKIX_PROCESSINGPARAMSGETDATEFAILED);
3904
3229
    
3905
 
            if (!testDate) {
3906
 
                    PKIX_CHECK(PKIX_PL_Date_Create_UTCTime
3907
 
                            (NULL, &testDate, plContext),
3908
 
                            PKIX_DATECREATEUTCTIMEFAILED);
3909
 
            }
3910
 
    
3911
3230
            PKIX_CHECK(PKIX_ProcessingParams_GetTrustAnchors
3912
3231
                    (procParams, &anchors, plContext),
3913
3232
                    PKIX_PROCESSINGPARAMSGETTRUSTANCHORSFAILED);
4010
3329
                    (tentativeChain, (PKIX_PL_Object *)targetCert, plContext),
4011
3330
                    PKIX_LISTAPPENDITEMFAILED);
4012
3331
    
4013
 
            PKIX_CHECK(PKIX_PL_PublicKey_NeedsDSAParameters
4014
 
                    (targetPubKey, &dsaParamsNeeded, plContext),
4015
 
                    PKIX_PUBLICKEYNEEDSDSAPARAMETERSFAILED);
4016
 
    
4017
3332
            /* Failure here is reportable */
4018
3333
            pkixErrorResult = PKIX_PL_Cert_CheckValidity
4019
3334
                    (targetCert, testDate, plContext);
4040
3355
                    goto cleanup;
4041
3356
            }
4042
3357
    
4043
 
            PKIX_CHECK(pkix_ProcessingParams_GetRevocationEnabled
4044
 
                    (procParams, &isCrlEnabled, plContext),
4045
 
                    PKIX_PROCESSINGPARAMSGETREVOCATIONENABLEDFAILED);
4046
 
    
4047
 
            PKIX_CHECK(
4048
 
                pkix_ProcessingParams_GetNISTRevocationPolicyEnabled
4049
 
                (procParams, &nistCRLPolicyEnabled, plContext),
4050
 
                PKIX_PROCESSINGPARAMSGETNISTREVPOLICYENABLEDFAILED);
4051
 
 
4052
 
 
4053
3358
            PKIX_CHECK(PKIX_ProcessingParams_GetCertStores
4054
3359
                    (procParams, &certStores, plContext),
4055
3360
                    PKIX_PROCESSINGPARAMSGETCERTSTORESFAILED);
4093
3398
                        (procParams, &userCheckers, plContext),
4094
3399
                        PKIX_PROCESSINGPARAMSGETCERTCHAINCHECKERSFAILED);
4095
3400
    
4096
 
            if (isCrlEnabled) {
4097
 
                    if (numCertStores > 0) {
4098
 
                            PKIX_CHECK(pkix_DefaultCRLChecker_Initialize
4099
 
                                    (certStores,
4100
 
                                    testDate,
4101
 
                                    NULL,
4102
 
                                    0,
4103
 
                                    nistCRLPolicyEnabled,
4104
 
                                    &crlChecker,
4105
 
                                    plContext),
4106
 
                                    PKIX_DEFAULTCRLCHECKERINITIALIZEFAILED);
4107
 
                    } else {
4108
 
                        PKIX_ERROR(PKIX_CANTENABLEREVOCATIONWITHOUTCERTSTORE);
4109
 
                    }
4110
 
            }
4111
 
    
 
3401
            PKIX_CHECK(PKIX_ProcessingParams_GetRevocationChecker
 
3402
                        (procParams, &revChecker, plContext),
 
3403
                       PKIX_PROCESSINGPARAMSGETREVOCATIONCHECKERFAILED);
4112
3404
            /* Do not initialize AIA manager if we are not going to fetch
4113
3405
             * cert using aia url. */
4114
3406
            if (procParams->useAIAForCertFetching) {
4133
3425
            buildConstants.anchors = anchors;
4134
3426
            buildConstants.userCheckers = userCheckers;
4135
3427
            buildConstants.hintCerts = hintCerts;
4136
 
            buildConstants.crlChecker = crlChecker;
 
3428
            buildConstants.revChecker = revChecker;
4137
3429
            buildConstants.aiaMgr = aiaMgr;
4138
3430
                
4139
3431
            PKIX_CHECK(pkix_Build_GetResourceLimits(&buildConstants, plContext),
4143
3435
                    (0,              /* PKIX_UInt32 traversedCACerts */
4144
3436
                    buildConstants.maxFanout,
4145
3437
                    buildConstants.maxDepth,
4146
 
                    dsaParamsNeeded, /* PKIX_Boolean dsaParamsNeeded */
4147
3438
                    PKIX_FALSE,      /* PKIX_Boolean revCheckDelayed */
4148
3439
                    PKIX_TRUE,       /* PKIX_Boolean canBeCached */
4149
3440
                    NULL,            /* PKIX_Date *validityDate */
4179
3470
                    buildConstants.userCheckers;
4180
3471
            PKIX_INCREF(buildConstants.hintCerts);
4181
3472
            state->buildConstants.hintCerts = buildConstants.hintCerts;
4182
 
            PKIX_INCREF(buildConstants.crlChecker);
4183
 
            state->buildConstants.crlChecker = buildConstants.crlChecker;
 
3473
            PKIX_INCREF(buildConstants.revChecker);
 
3474
            state->buildConstants.revChecker = buildConstants.revChecker;
4184
3475
            state->buildConstants.aiaMgr = buildConstants.aiaMgr;
4185
3476
            aiaMgr = NULL;
4186
3477
 
4205
3496
                }
4206
3497
            }
4207
3498
 
4208
 
            PKIX_CHECK(
 
3499
            PKIX_CHECK_ONLY_FATAL(
4209
3500
                pkix_Build_CheckInCache(state, &buildResult,
4210
3501
                                        &nbioContext, plContext),
4211
3502
                PKIX_UNABLETOBUILDCHAIN);
4234
3525
                    PKIX_CERTGETALLSUBJECTNAMESFAILED);
4235
3526
        }
4236
3527
 
4237
 
        /*
4238
 
         * We can avoid the search if this cert, with any of our trust
4239
 
         * anchors, forms a complete trust chain.
4240
 
         */
4241
 
        PKIX_CHECK_ONLY_FATAL(pkix_Build_TryShortcut
4242
 
                (state,
4243
 
                targetSubjNames,
4244
 
                &nbioContext,
4245
 
                &matchingAnchor,
4246
 
                &valResult,
4247
 
                plContext),
4248
 
                PKIX_BUILDTRYSHORTCUTFAILED);
4249
 
 
4250
 
        if (nbioContext != NULL) {
4251
 
                *pNBIOContext = nbioContext;
4252
 
                PKIX_INCREF(state);
4253
 
                *pState = state;
4254
 
                goto cleanup;
4255
 
        }
4256
 
 
4257
3528
        state->status = BUILD_INITIAL;
4258
3529
 
4259
3530
        if (!matchingAnchor) {
4294
3565
        PKIX_DECREF(anchors);
4295
3566
        PKIX_DECREF(targetSubjNames);
4296
3567
        PKIX_DECREF(targetCert);
4297
 
        PKIX_DECREF(crlChecker);
 
3568
        PKIX_DECREF(revChecker);
4298
3569
        PKIX_DECREF(certStores);
4299
3570
        PKIX_DECREF(certStore);
4300
3571
        PKIX_DECREF(userCheckers);