15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/mock_cert_verifier.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
85e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_status_flags.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/cert_verify_result.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MockCertVerifier::Rule {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rule(X509Certificate* cert,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       const std::string& hostname,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       const CertVerifyResult& result,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       int rv)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : cert(cert),
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hostname(hostname),
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result(result),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rv(rv) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(cert);
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DCHECK(result.verified_cert.get());
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<X509Certificate> cert;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hostname;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertVerifyResult result;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockCertVerifier::MockCertVerifier() : default_result_(ERR_CERT_INVALID) {}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockCertVerifier::~MockCertVerifier() {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MockCertVerifier::Verify(X509Certificate* cert,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& hostname,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int flags,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             CRLSet* crl_set,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             CertVerifyResult* verify_result,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const CompletionCallback& callback,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             RequestHandle* out_req,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const BoundNetLog& net_log) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RuleList::const_iterator it;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it = rules_.begin(); it != rules_.end(); ++it) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check just the server cert. Intermediates will be ignored.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!it->cert->Equals(cert))
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!MatchPattern(hostname, it->hostname))
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *verify_result = it->result;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return it->rv;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fall through to the default.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verify_result->verified_cert = cert;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  verify_result->cert_status = MapNetErrorToCertStatus(default_result_);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return default_result_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockCertVerifier::CancelRequest(RequestHandle req) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockCertVerifier::AddResultForCert(X509Certificate* cert,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const CertVerifyResult& verify_result,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int rv) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddResultForCertAndHost(cert, "*", verify_result, rv);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MockCertVerifier::AddResultForCertAndHost(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    X509Certificate* cert,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& host_pattern,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CertVerifyResult& verify_result,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rule rule(cert, host_pattern, verify_result, rv);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rules_.push_back(rule);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
84