Index: nss/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c |
=================================================================== |
--- nss/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c (revision 142244) |
+++ nss/mozilla/security/nss/lib/libpkix/pkix/top/pkix_build.c (working copy) |
@@ -175,7 +175,7 @@ |
* "trustChain" |
* Address of List of certificates traversed. Must be non-NULL. |
* "parentState" |
- * Address of previous ForwardBuilder state |
+ * Address of previous ForwardBuilderState |
* "pState" |
* Address where ForwardBuilderState will be stored. Must be non-NULL. |
* "plContext" |
@@ -3156,7 +3156,7 @@ |
* |
* This function initiates the search for a BuildChain, using the parameters |
* provided in "procParams" and, if continuing a search that was suspended |
- * for I/O, using the ForwardBuilderState pointed to by "state". |
+ * for I/O, using the ForwardBuilderState pointed to by "pState". |
* |
* If a successful chain is built, this function stores the BuildResult at |
* "pBuildResult". Alternatively, if an operation using non-blocking I/O |
@@ -3231,7 +3231,6 @@ |
PKIX_ValidateResult *valResult = NULL; |
PKIX_BuildResult *buildResult = NULL; |
PKIX_List *certList = NULL; |
- PKIX_TrustAnchor *matchingAnchor = NULL; |
PKIX_ForwardBuilderState *state = NULL; |
PKIX_CertStore_CheckTrustCallback trustCallback = NULL; |
PKIX_CertSelector_MatchCallback selectorCallback = NULL; |
@@ -3346,9 +3345,6 @@ |
&trusted, |
plContext), |
PKIX_CERTISCERTTRUSTEDFAILED); |
- /* future: look at the |trusted| flag and force success. We only |
- * want to do this if we aren't validating against a policy (like |
- * EV). */ |
PKIX_CHECK(PKIX_PL_Cert_GetAllSubjectNames |
(targetCert, |
@@ -3406,6 +3402,36 @@ |
goto cleanup; |
} |
} |
+ |
+ /* If the EE cert is trusted, force success. We only want to do |
+ * this if we aren't validating against a policy (like EV). */ |
+ if (trusted && procParams->initialPolicies == NULL) { |
+ if (pVerifyNode != NULL) { |
+ PKIX_Error *tempResult = |
+ pkix_VerifyNode_Create(targetCert, 0, NULL, |
+ pVerifyNode, |
+ plContext); |
+ if (tempResult) { |
+ pkixErrorResult = tempResult; |
+ pkixErrorCode = PKIX_VERIFYNODECREATEFAILED; |
+ pkixErrorClass = PKIX_FATAL_ERROR; |
+ goto cleanup; |
+ } |
+ } |
+ PKIX_CHECK(pkix_ValidateResult_Create |
+ (targetPubKey, NULL /* anchor */, |
+ NULL /* policyTree */, &valResult, plContext), |
+ PKIX_VALIDATERESULTCREATEFAILED); |
+ PKIX_CHECK( |
+ pkix_BuildResult_Create(valResult, tentativeChain, |
+ &buildResult, plContext), |
+ PKIX_BUILDRESULTCREATEFAILED); |
+ *pBuildResult = buildResult; |
+ /* Note that *pState is NULL. The only side effect is that |
+ * the cert chain won't be cached in PKIX_BuildChain, which |
+ * is fine. */ |
+ goto cleanup; |
+ } |
PKIX_CHECK(PKIX_ProcessingParams_GetCertStores |
(procParams, &certStores, plContext), |
@@ -3579,11 +3605,9 @@ |
state->status = BUILD_INITIAL; |
- if (!matchingAnchor) { |
- pkixErrorResult = |
- pkix_BuildForwardDepthFirstSearch(&nbioContext, state, |
- &valResult, plContext); |
- } |
+ pkixErrorResult = |
+ pkix_BuildForwardDepthFirstSearch(&nbioContext, state, |
+ &valResult, plContext); |
/* non-null nbioContext means the build would block */ |
if (pkixErrorResult == NULL && nbioContext != NULL) { |
@@ -3628,7 +3652,6 @@ |
PKIX_DECREF(tentativeChain); |
PKIX_DECREF(valResult); |
PKIX_DECREF(certList); |
- PKIX_DECREF(matchingAnchor); |
PKIX_DECREF(trustedCert); |
PKIX_DECREF(state); |
PKIX_DECREF(aiaMgr); |