forked from mirrors/gecko-dev
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
87 lines
2.9 KiB
C++
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);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|