fune/toolkit/components/url-classifier/nsCheckSummedOutputStream.cpp
dlee 28063a4595 Bug 1353956 - P4. Add header and CRC32 checksum to SafeBrowsing V4 prefix files. r=gcp
After this patch, we may have the following files in SafeBrowsing
directory:
- (v2) .sbstore  : Store V2 chunkdata, for update, MD5 integrity check
                   while load
- (v2) .pset     : Store V2 prefixset, for lookup, load upon startup, no
                  integrity check
- (v4) .metadata : Store V4 state, for update, no integrity check
- (v4) .vlpset   : Store V4 prefixset, for lookup, load upon startup,
                   CRC32 integrity check
- (v4) .pset     : V4 prefix set before this patch, should be removed

The magic string is also added to ".vlpset" header so we can add
a telemetry to see if sanity check is good enough for prefix set
integrity check (The telemetry is not yet added). If yes, we can remove
the CRC32 in the future for even better performance.

Differential Revision: https://phabricator.services.mozilla.com/D21463

--HG--
extra : moz-landing-system : lando
2019-03-07 14:41:25 +00:00

87 lines
2.9 KiB
C++

//* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsCRT.h"
#include "nsIFile.h"
#include "nsISupportsImpl.h"
#include "nsCheckSummedOutputStream.h"
#include "crc32c.h"
////////////////////////////////////////////////////////////////////////////////
// nsCheckSummedOutputStream
NS_IMPL_ISUPPORTS_INHERITED(nsCheckSummedOutputStream, nsBufferedOutputStream,
nsISafeOutputStream)
NS_IMETHODIMP
nsCheckSummedOutputStream::Init(nsIOutputStream *stream, uint32_t bufferSize) {
nsresult rv;
mHash = do_CreateInstance(NS_CRYPTO_HASH_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = mHash->Init(nsICryptoHash::MD5);
NS_ENSURE_SUCCESS(rv, rv);
return nsBufferedOutputStream::Init(stream, bufferSize);
}
NS_IMETHODIMP
nsCheckSummedOutputStream::Finish() {
nsresult rv = mHash->Finish(false, mCheckSum);
NS_ENSURE_SUCCESS(rv, rv);
uint32_t written;
rv = nsBufferedOutputStream::Write(
reinterpret_cast<const char *>(mCheckSum.BeginReading()),
mCheckSum.Length(), &written);
NS_ASSERTION(written == mCheckSum.Length(), "Error writing stream checksum");
NS_ENSURE_SUCCESS(rv, rv);
return nsBufferedOutputStream::Finish();
}
NS_IMETHODIMP
nsCheckSummedOutputStream::Write(const char *buf, uint32_t count,
uint32_t *result) {
nsresult rv = mHash->Update(reinterpret_cast<const uint8_t *>(buf), count);
NS_ENSURE_SUCCESS(rv, rv);
return nsBufferedOutputStream::Write(buf, count, result);
}
////////////////////////////////////////////////////////////////////////////////
// nsCrc32CheckSumedOutputStream
NS_IMPL_ISUPPORTS_INHERITED(nsCrc32CheckSumedOutputStream,
nsBufferedOutputStream, nsISafeOutputStream)
NS_IMETHODIMP
nsCrc32CheckSumedOutputStream::Init(nsIOutputStream *stream,
uint32_t bufferSize) {
mCheckSum = ~0;
return nsBufferedOutputStream::Init(stream, bufferSize);
}
NS_IMETHODIMP
nsCrc32CheckSumedOutputStream::Finish() {
uint32_t written;
nsresult rv = nsBufferedOutputStream::Write(
reinterpret_cast<const char *>(&mCheckSum), sizeof(mCheckSum), &written);
NS_ASSERTION(written == sizeof(mCheckSum), "Error writing stream checksum");
NS_ENSURE_SUCCESS(rv, rv);
return nsBufferedOutputStream::Finish();
}
NS_IMETHODIMP
nsCrc32CheckSumedOutputStream::Write(const char *buf, uint32_t count,
uint32_t *result) {
mCheckSum =
ComputeCrc32c(mCheckSum, reinterpret_cast<const uint8_t *>(buf), count);
return nsBufferedOutputStream::Write(buf, count, result);
}
////////////////////////////////////////////////////////////////////////////////