1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/cert/mock_cert_verifier.h"
6
7#include "base/memory/ref_counted.h"
8#include "base/strings/string_util.h"
9#include "net/base/net_errors.h"
10#include "net/cert/cert_status_flags.h"
11#include "net/cert/cert_verify_result.h"
12#include "net/cert/x509_certificate.h"
13
14namespace net {
15
16struct MockCertVerifier::Rule {
17  Rule(X509Certificate* cert,
18       const std::string& hostname,
19       const CertVerifyResult& result,
20       int rv)
21      : cert(cert),
22        hostname(hostname),
23        result(result),
24        rv(rv) {
25    DCHECK(cert);
26    DCHECK(result.verified_cert.get());
27  }
28
29  scoped_refptr<X509Certificate> cert;
30  std::string hostname;
31  CertVerifyResult result;
32  int rv;
33};
34
35MockCertVerifier::MockCertVerifier() : default_result_(ERR_CERT_INVALID) {}
36
37MockCertVerifier::~MockCertVerifier() {}
38
39int MockCertVerifier::Verify(X509Certificate* cert,
40                             const std::string& hostname,
41                             int flags,
42                             CRLSet* crl_set,
43                             CertVerifyResult* verify_result,
44                             const CompletionCallback& callback,
45                             RequestHandle* out_req,
46                             const BoundNetLog& net_log) {
47  RuleList::const_iterator it;
48  for (it = rules_.begin(); it != rules_.end(); ++it) {
49    // Check just the server cert. Intermediates will be ignored.
50    if (!it->cert->Equals(cert))
51      continue;
52    if (!MatchPattern(hostname, it->hostname))
53      continue;
54    *verify_result = it->result;
55    return it->rv;
56  }
57
58  // Fall through to the default.
59  verify_result->verified_cert = cert;
60  verify_result->cert_status = MapNetErrorToCertStatus(default_result_);
61  return default_result_;
62}
63
64void MockCertVerifier::CancelRequest(RequestHandle req) {
65  NOTIMPLEMENTED();
66}
67
68void MockCertVerifier::AddResultForCert(X509Certificate* cert,
69                                        const CertVerifyResult& verify_result,
70                                        int rv) {
71  AddResultForCertAndHost(cert, "*", verify_result, rv);
72}
73
74void MockCertVerifier::AddResultForCertAndHost(
75    X509Certificate* cert,
76    const std::string& host_pattern,
77    const CertVerifyResult& verify_result,
78    int rv) {
79  Rule rule(cert, host_pattern, verify_result, rv);
80  rules_.push_back(rule);
81}
82
83}  // namespace net
84