Files
tubestation/toolkit/components/url-classifier/nsCheckSummedOutputStream.h
dlee c975e636dd 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
2019-03-07 14:41:25 +00:00

89 lines
2.7 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/. */
#ifndef nsCheckSummedOutputStream_h__
#define nsCheckSummedOutputStream_h__
#include "nsIFile.h"
#include "nsIOutputStream.h"
#include "nsICryptoHash.h"
#include "nsNetCID.h"
#include "nsNetUtil.h"
#include "nsString.h"
#include "../../../netwerk/base/nsBufferedStreams.h"
#include "prio.h"
class nsCheckSummedOutputStream : public nsBufferedOutputStream {
public:
NS_DECL_ISUPPORTS_INHERITED
// Size of MD5 hash in bytes
static const uint32_t CHECKSUM_SIZE = 16;
static const uint32_t MAX_BUFFER_SIZE = 64 * 1024;
nsCheckSummedOutputStream() {}
NS_IMETHOD Finish() override;
NS_IMETHOD Write(const char *buf, uint32_t count, uint32_t *result) override;
NS_IMETHOD Init(nsIOutputStream *stream, uint32_t bufferSize) override;
protected:
virtual ~nsCheckSummedOutputStream() { nsBufferedOutputStream::Close(); }
nsCOMPtr<nsICryptoHash> mHash;
nsCString mCheckSum;
};
// returns a file output stream which can be QI'ed to nsIFileOutputStream.
inline nsresult NS_NewCheckSummedOutputStream(nsIOutputStream **result,
nsIFile *file) {
nsCOMPtr<nsIOutputStream> localOutFile;
nsresult rv =
NS_NewSafeLocalFileOutputStream(getter_AddRefs(localOutFile), file,
PR_WRONLY | PR_TRUNCATE | PR_CREATE_FILE);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIBufferedOutputStream> out = new nsCheckSummedOutputStream();
rv = out->Init(localOutFile, nsCheckSummedOutputStream::CHECKSUM_SIZE);
if (NS_SUCCEEDED(rv)) {
out.forget(result);
}
return rv;
}
class nsCrc32CheckSumedOutputStream : public nsBufferedOutputStream {
public:
NS_DECL_ISUPPORTS_INHERITED
static const uint32_t CHECKSUM_SIZE = 4;
nsCrc32CheckSumedOutputStream() = default;
NS_IMETHOD Finish() override;
NS_IMETHOD Write(const char *buf, uint32_t count, uint32_t *result) override;
NS_IMETHOD Init(nsIOutputStream *stream, uint32_t bufferSize) override;
protected:
virtual ~nsCrc32CheckSumedOutputStream() { nsBufferedOutputStream::Close(); }
uint32_t mCheckSum;
};
inline nsresult NS_NewCrc32OutputStream(
nsIOutputStream **aResult, already_AddRefed<nsIOutputStream> aOutput,
uint32_t aBufferSize) {
nsCOMPtr<nsIOutputStream> out = std::move(aOutput);
nsCOMPtr<nsIBufferedOutputStream> bufferOutput =
new nsCrc32CheckSumedOutputStream();
nsresult rv = bufferOutput->Init(out, aBufferSize);
if (NS_SUCCEEDED(rv)) {
bufferOutput.forget(aResult);
}
return rv;
}
#endif