| Index: net/cert/internal/path_builder.cc
|
| diff --git a/net/cert/internal/path_builder.cc b/net/cert/internal/path_builder.cc
|
| index 49814ade89b6107984f72868f6e0b8590978e995..419b7062f14bbfd24d0004e9fd6e7b49fc664dff 100644
|
| --- a/net/cert/internal/path_builder.cc
|
| +++ b/net/cert/internal/path_builder.cc
|
| @@ -621,6 +621,25 @@ CertPathBuilder::ResultPath::~ResultPath() = default;
|
| CertPathBuilder::Result::Result() = default;
|
| CertPathBuilder::Result::~Result() = default;
|
|
|
| +const CertPathBuilder::ResultPath* CertPathBuilder::Result::GetBestValidPath()
|
| + const {
|
| + DCHECK((paths.empty() && best_result_index == 0) ||
|
| + best_result_index < paths.size());
|
| +
|
| + if (best_result_index >= paths.size())
|
| + return nullptr;
|
| +
|
| + const ResultPath* result_path = paths[best_result_index].get();
|
| + if (result_path->valid)
|
| + return result_path;
|
| +
|
| + return nullptr;
|
| +}
|
| +
|
| +bool CertPathBuilder::Result::HasValidPath() const {
|
| + return GetBestValidPath() != nullptr;
|
| +}
|
| +
|
| CertPathBuilder::CertPathBuilder(scoped_refptr<ParsedCertificate> cert,
|
| const TrustStore* trust_store,
|
| const SignaturePolicy* signature_policy,
|
| @@ -695,15 +714,16 @@ CompletionStatus CertPathBuilder::DoGetNextPathComplete() {
|
| return CompletionStatus::SYNC;
|
| }
|
|
|
| - // TODO(crbug.com/634443): Expose CertErrors on ResultPath.
|
| - CertErrors errors;
|
| + // Verify the entire certificate chain.
|
| + auto result_path = base::MakeUnique<ResultPath>();
|
| bool verify_result =
|
| - next_path_.trust_anchor.get() &&
|
| VerifyCertificateChain(next_path_.certs, next_path_.trust_anchor.get(),
|
| - signature_policy_, time_, &errors);
|
| + signature_policy_, time_, &result_path->errors);
|
| DVLOG(1) << "CertPathBuilder VerifyCertificateChain result = "
|
| - << verify_result;
|
| - AddResultPath(next_path_, verify_result);
|
| + << result_path->valid;
|
| + result_path->path = next_path_;
|
| + result_path->valid = verify_result;
|
| + AddResultPath(std::move(result_path));
|
|
|
| if (verify_result) {
|
| // Found a valid path, return immediately.
|
| @@ -719,15 +739,11 @@ CompletionStatus CertPathBuilder::DoGetNextPathComplete() {
|
| return CompletionStatus::SYNC;
|
| }
|
|
|
| -void CertPathBuilder::AddResultPath(const CertPath& path, bool is_success) {
|
| - std::unique_ptr<ResultPath> result_path(new ResultPath());
|
| - // TODO(mattm): better error reporting.
|
| - result_path->error = is_success ? OK : ERR_CERT_AUTHORITY_INVALID;
|
| +void CertPathBuilder::AddResultPath(std::unique_ptr<ResultPath> result_path) {
|
| // TODO(mattm): set best_result_index based on number or severity of errors.
|
| - if (result_path->error == OK)
|
| + if (result_path->valid)
|
| out_result_->best_result_index = out_result_->paths.size();
|
| // TODO(mattm): add flag to only return a single path or all attempted paths?
|
| - result_path->path = path;
|
| out_result_->paths.push_back(std::move(result_path));
|
| }
|
|
|
|
|