1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef mozilla_dom_SRICheck_h
8 #define mozilla_dom_SRICheck_h
10 #include "nsTString.h"
11 #include "nsStringFwd.h"
13 #include "nsICryptoHash.h"
16 class nsIConsoleReportCollector
;
18 namespace mozilla::dom
{
22 class SRICheck final
{
25 * Parse the multiple hashes specified in the integrity attribute and
26 * return the strongest supported hash.
28 static nsresult
IntegrityMetadata(const nsAString
& aMetadataList
,
29 const nsACString
& aSourceFileURI
,
30 nsIConsoleReportCollector
* aReporter
,
31 SRIMetadata
* outMetadata
);
34 // The SRICheckDataVerifier can be used in 2 different mode:
36 // 1. The streaming mode involves reading bytes from an input, and to use
37 // the |Update| function to stream new bytes, and to use the |Verify|
38 // function to check the hash of the content with the hash provided by
41 // Optionally, one can serialize the verified hash with |ExportDataSummary|,
42 // in a buffer in order to rely on the second mode the next time.
44 // 2. The pre-computed mode, involves reading a hash with |ImportDataSummary|,
45 // which got exported by the SRICheckDataVerifier and potentially cached, and
46 // then use the |Verify| function to check against the hash provided by the
48 class SRICheckDataVerifier final
{
50 SRICheckDataVerifier(const SRIMetadata
& aMetadata
,
51 const nsACString
& aSourceFileURI
,
52 nsIConsoleReportCollector
* aReporter
);
54 // Append the following bytes to the content used to compute the hash. Once
55 // all bytes are streamed, use the Verify function to check the integrity.
56 nsresult
Update(uint32_t aStringLen
, const uint8_t* aString
);
58 // Verify that the computed hash corresponds to the metadata.
59 nsresult
Verify(const SRIMetadata
& aMetadata
, nsIChannel
* aChannel
,
60 const nsACString
& aSourceFileURI
,
61 nsIConsoleReportCollector
* aReporter
);
63 bool IsComplete() const { return mComplete
; }
65 // Report the length of the computed hash and its type, such that we can
66 // reserve the space for encoding it in a vector.
67 uint32_t DataSummaryLength();
68 static uint32_t EmptyDataSummaryLength();
70 // Write the computed hash and its type in a pre-allocated buffer.
71 nsresult
ExportDataSummary(uint32_t aDataLen
, uint8_t* aData
);
72 static nsresult
ExportEmptyDataSummary(uint32_t aDataLen
, uint8_t* aData
);
74 // Report the length of the computed hash and its type, such that we can
75 // skip these data while reading a buffer.
76 static nsresult
DataSummaryLength(uint32_t aDataLen
, const uint8_t* aData
,
79 // Extract the computed hash and its type, such that we can |Verify| if it
80 // matches the metadata. The buffer should be at least the same size or
81 // larger than the value returned by |DataSummaryLength|.
82 nsresult
ImportDataSummary(uint32_t aDataLen
, const uint8_t* aData
);
85 nsCOMPtr
<nsICryptoHash
> mCryptoHash
;
86 nsAutoCString mComputedHash
;
90 bool mInvalidMetadata
;
93 nsresult
EnsureCryptoHash();
95 nsresult
VerifyHash(const SRIMetadata
& aMetadata
, uint32_t aHashIndex
,
96 const nsACString
& aSourceFileURI
,
97 nsIConsoleReportCollector
* aReporter
);
100 } // namespace mozilla::dom
102 #endif // mozilla_dom_SRICheck_h