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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/net/crl_set_fetcher.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/debug/trace_event.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/rand_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/component_updater/component_updater_service.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/crl_set.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/ssl/ssl_config_service.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using component_updater::ComponentUpdateService;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CRLSetFetcher::CRLSetFetcher() : cus_(NULL) {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool CRLSetFetcher::GetCRLSetFilePath(base::FilePath* path) const {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ok = PathService::Get(chrome::DIR_USER_DATA, path);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ok) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *path = path->Append(chrome::kCRLSetFilename);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CRLSetFetcher::StartInitialLoad(ComponentUpdateService* cus) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cus_ = cus;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::PostTask(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::FILE, FROM_HERE,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&CRLSetFetcher::DoInitialLoadFromDisk, this))) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CRLSetFetcher::DeleteFromDisk() {
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!BrowserThread::PostTask(
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          BrowserThread::FILE, FROM_HERE,
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          base::Bind(&CRLSetFetcher::DoDeleteFromDisk, this))) {
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    NOTREACHED();
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CRLSetFetcher::DoInitialLoadFromDisk() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crl_set_file_path;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetCRLSetFilePath(&crl_set_file_path))
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadFromDisk(crl_set_file_path, &crl_set_);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 sequence_of_loaded_crl = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (crl_set_.get())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sequence_of_loaded_crl = crl_set_->sequence();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get updates, advertising the sequence number of the CRL set that we just
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loaded, if any.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::PostTask(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::UI, FROM_HERE,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &CRLSetFetcher::RegisterComponent,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              this,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sequence_of_loaded_crl))) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CRLSetFetcher::LoadFromDisk(base::FilePath path,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 scoped_refptr<net::CRLSet>* out_crl_set) {
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  TRACE_EVENT0("CRLSetFetcher", "LoadFromDisk");
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string crl_set_bytes;
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  {
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    TRACE_EVENT0("CRLSetFetcher", "ReadFileToString");
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!base::ReadFileToString(path, &crl_set_bytes))
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net::CRLSet::Parse(crl_set_bytes, out_crl_set)) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Failed to parse CRL set from " << path.MaybeAsASCII();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Loaded " << crl_set_bytes.size() << " bytes of CRL set from disk";
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::PostTask(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &CRLSetFetcher::SetCRLSetIfNewer, this, *out_crl_set))) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CRLSetFetcher::SetCRLSetIfNewer(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::CRLSet> crl_set) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::CRLSet> old_crl_set(net::SSLConfigService::GetCRLSet());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (old_crl_set.get() && old_crl_set->sequence() > crl_set->sequence()) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Refusing to downgrade CRL set from #"
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << old_crl_set->sequence()
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "to #"
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << crl_set->sequence();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::SSLConfigService::SetCRLSet(crl_set);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Installed CRL set #" << crl_set->sequence();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kPublicKeySHA256 is the SHA256 hash of the SubjectPublicKeyInfo of the key
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that's used to sign generated CRL sets.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kPublicKeySHA256[32] = {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x75, 0xda, 0xf8, 0xcb, 0x77, 0x68, 0x40, 0x33,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x65, 0x4c, 0x97, 0xe5, 0xc5, 0x1b, 0xcd, 0x81,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x7b, 0x1e, 0xeb, 0x11, 0x2c, 0xe1, 0xa4, 0x33,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x8c, 0xf5, 0x72, 0x5e, 0xed, 0xb8, 0x43, 0x97,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CRLSetFetcher::RegisterComponent(uint32 sequence_of_loaded_crl) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component_updater::CrxComponent component;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component.pk_hash.assign(kPublicKeySHA256,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           kPublicKeySHA256 + sizeof(kPublicKeySHA256));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component.installer = this;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component.name = "CRLSet";
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  component.version = Version(base::UintToString(sequence_of_loaded_crl));
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  component.allow_background_download = false;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!component.version.IsValid()) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    component.version = Version("0");
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cus_->RegisterComponent(component) !=
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ComponentUpdateService::kOk) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "RegisterComponent returned error";
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CRLSetFetcher::DoDeleteFromDisk() {
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath crl_set_file_path;
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!GetCRLSetFilePath(&crl_set_file_path))
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DeleteFile(crl_set_file_path, false /* not recursive */);
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CRLSetFetcher::OnUpdateError(int error) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(WARNING) << "CRLSetFetcher got error " << error
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << " from component installer";
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool CRLSetFetcher::Install(const base::DictionaryValue& manifest,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const base::FilePath& unpack_path) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crl_set_file_path =
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unpack_path.Append(FILE_PATH_LITERAL("crl-set"));
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath save_to;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetCRLSetFilePath(&save_to))
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string crl_set_bytes;
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(crl_set_file_path, &crl_set_bytes)) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Failed to find crl-set file inside CRX";
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_delta;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net::CRLSet::GetIsDeltaUpdate(crl_set_bytes, &is_delta)) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "GetIsDeltaUpdate failed on CRL set from update CRX";
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_delta) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!net::CRLSet::Parse(crl_set_bytes, &crl_set_)) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Failed to parse CRL set from update CRX";
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int size = base::checked_cast<int>(crl_set_bytes.size());
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (base::WriteFile(save_to, crl_set_bytes.data(), size) != size) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Failed to save new CRL set to disk";
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We don't return false here because we can still use this CRL set. When
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // we restart we might revert to an older version, then we'll
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // advertise the older version to Omaha and everything will still work.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<net::CRLSet> new_crl_set;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!crl_set_->ApplyDelta(crl_set_bytes, &new_crl_set)) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Failed to parse delta CRL set";
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Applied CRL set delta #" << crl_set_->sequence()
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            << "->#" << new_crl_set->sequence();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string new_crl_set_bytes = new_crl_set->Serialize();
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int size = base::checked_cast<int>(new_crl_set_bytes.size());
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (base::WriteFile(save_to, new_crl_set_bytes.data(), size) != size) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LOG(WARNING) << "Failed to save new CRL set to disk";
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We don't return false here because we can still use this CRL set. When
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // we restart we might revert to an older version, then we'll
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // advertise the older version to Omaha and everything will still work.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crl_set_ = new_crl_set;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::PostTask(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::IO, FROM_HERE,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &CRLSetFetcher::SetCRLSetIfNewer, this, crl_set_))) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool CRLSetFetcher::GetInstalledFile(
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& file, base::FilePath* installed_file) {
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return false;
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CRLSetFetcher::~CRLSetFetcher() {}
241