blob: 92915b5f1d39534a7aa3ce397a5bd4fe9c858155 [file] [log] [blame]
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Calculates the pervasive payload checksum"""
import hashlib
INCLUDE_HEADERS = frozenset([
"access-control-allow-credentials", "access-control-allow-headers",
"access-control-allow-methods", "access-control-allow-origin",
"access-control-expose-headers", "access-control-max-age",
"access-control-request-headers", "access-control-request-method",
"clear-site-data", "content-encoding", "content-security-policy",
"content-type", "cross-origin-embedder-policy",
"cross-origin-opener-policy", "cross-origin-resource-policy", "location",
"sec-websocket-accept", "sec-websocket-extensions", "sec-websocket-key",
"sec-websocket-protocol", "sec-websocket-version", "upgrade", "vary"
])
def calculate_checksum(headers, raw_body):
"""Calculates the pervasive payload checksum for a given resource
`headers` should be a list of name, value tuples.
`raw_body` should be the response body exactly as returned by the server,
without decompression or other filtering applied.
Returns the SHA-256 checksum of the resource, calculated per the cache
transparency serialization algorithm.
"""
checksum_input = ""
headers = [(name.lower(), value) for name, value in headers]
headers.sort()
for header in headers:
if header[0] in INCLUDE_HEADERS:
checksum_input += header[0] + ": " + header[1] + "\n"
checksum_input += "\n"
checksum_input = checksum_input.encode()
checksum_input += raw_body
return hashlib.sha256(checksum_input).hexdigest().upper()