1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright (c) 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef NET_HTTP_DISK_BASED_CERT_CACHE_H 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define NET_HTTP_DISK_BASED_CERT_CACHE_H 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/callback.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/containers/hash_tables.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/containers/mru_cache.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/weak_ptr.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/net_export.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/cert/x509_certificate.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace disk_cache { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Backend; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace disk_cache 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace net { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// DiskBasedCertCache is used to store and retrieve X.509 certificates from the 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// cache. Each individual certificate is stored separately from its certificate 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// chain. No more than one copy (per certificate) will be stored on disk. 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass NET_EXPORT_PRIVATE DiskBasedCertCache { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void(const X509Certificate::OSCertHandle cert_handle)> 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetCallback; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void(const std::string&)> SetCallback; 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Initializes a new DiskBasedCertCache that will access the disk cache via 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // |backend|. 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit DiskBasedCertCache(disk_cache::Backend* backend); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~DiskBasedCertCache(); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Fetches the certificate associated with |key|. If the certificate is 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // found within the cache, |cb| will be called with the certificate. 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Otherwise, |cb| will be called with NULL. Callers that wish to store 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // a reference to the certificate need to use X509Certificate::DupOSCertHandle 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // inside |cb|. 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void GetCertificate(const std::string& key, const GetCallback& cb); 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Stores |cert_handle| in the cache. If |cert_handle| is successfully stored, 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |cb| will be called with the key. If |cb| is called with an empty 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // string, then |cert_handle| was not stored. 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SetCertificate(const X509Certificate::OSCertHandle cert_handle, 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const SetCallback& cb); 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns the number of in-memory MRU cache hits that have occurred 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // on SetCertificate and GetCertificate operations. Intended for test purposes 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // only. 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t mem_cache_hits_for_testing() const { return mem_cache_hits_; } 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns the number of in-memory MRU cache misses that have occurred 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // on SetCertificate and GetCertificate operations. Intended for test purposes 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // only. 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t mem_cache_misses_for_testing() const { return mem_cache_misses_; } 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class ReadWorker; 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class WriteWorker; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A functor used to free an OSCertHandle. Used by the MRUCertCache. 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch struct CertFree { 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void operator()(X509Certificate::OSCertHandle cert_handle); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // An in-memory cache that is used to prevent redundantly reading 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // from disk. 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::MRUCacheBase<std::string, 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch X509Certificate::OSCertHandle, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CertFree> MRUCertCache; 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ReadWorkerMap and WriteWorkerMap map cache keys to their 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // corresponding Workers. 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::hash_map<std::string, ReadWorker*> ReadWorkerMap; 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::hash_map<std::string, WriteWorker*> WriteWorkerMap; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // FinishedReadOperation and FinishedWriteOperation are used to remove 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // workers from their respective worker maps, and perform other necessary 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // cleanup. They are called from the workers via callback. 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FinishedReadOperation(const std::string& key, 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch X509Certificate::OSCertHandle cert_handle); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void FinishedWriteOperation(const std::string& key, 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch X509Certificate::OSCertHandle cert_handle); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch disk_cache::Backend* backend_; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReadWorkerMap read_worker_map_; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WriteWorkerMap write_worker_map_; 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MRUCertCache mru_cert_cache_; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int mem_cache_hits_; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int mem_cache_misses_; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtrFactory<DiskBasedCertCache> weak_factory_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(DiskBasedCertCache); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace net 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // NET_HTTP_DISK_BASED_CERT_CACHE_H 104