#include "content/browser/web_package/signed_exchange_signature_verifier.h"
#include <array>
#include <string>
#include <string_view>
#include <vector>
#include "base/containers/span.h"
#include "base/format_macros.h"
#include "base/metrics/histogram_macros.h"
#include "base/numerics/byte_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "content/browser/web_package/signed_exchange_certificate_chain.h"
#include "content/browser/web_package/signed_exchange_consts.h"
#include "content/browser/web_package/signed_exchange_envelope.h"
#include "content/browser/web_package/signed_exchange_signature_header_field.h"
#include "content/browser/web_package/signed_exchange_utils.h"
#include "content/public/browser/content_browser_client.h"
#include "crypto/signature_verifier.h"
#include "net/cert/asn1_util.h"
#include "net/cert/x509_util.h"
#include "third_party/boringssl/src/include/openssl/bytestring.h"
#include "third_party/boringssl/src/include/openssl/ec.h"
#include "third_party/boringssl/src/include/openssl/ec_key.h"
#include "third_party/boringssl/src/include/openssl/evp.h"
namespace content {
namespace {
constexpr uint8_t kMessageHeader[] = …
"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
"HTTP Exchange 1 b3";
constexpr base::TimeDelta kOneWeek = …;
constexpr base::TimeDelta kFourWeeks = …;
std::optional<crypto::SignatureVerifier::SignatureAlgorithm>
GetSignatureAlgorithm(scoped_refptr<net::X509Certificate> cert,
SignedExchangeDevToolsProxy* devtools_proxy) { … }
bool VerifySignature(base::span<const uint8_t> sig,
base::span<const uint8_t> msg,
scoped_refptr<net::X509Certificate> cert,
crypto::SignatureVerifier::SignatureAlgorithm algorithm,
SignedExchangeDevToolsProxy* devtools_proxy) { … }
std::string HexDump(const std::vector<uint8_t>& msg) { … }
void AppendToBuf8BytesBigEndian(std::vector<uint8_t>* buf, uint64_t n) { … }
std::vector<uint8_t> GenerateSignedMessage(
SignedExchangeVersion version,
const SignedExchangeEnvelope& envelope) { … }
base::Time TimeFromSignedExchangeUnixTime(uint64_t t) { … }
SignedExchangeSignatureVerifier::Result VerifyValidityPeriod(
const SignedExchangeEnvelope& envelope) { … }
SignedExchangeSignatureVerifier::Result VerifyTimestamps(
const SignedExchangeEnvelope& envelope,
const base::Time& verification_time) { … }
}
SignedExchangeSignatureVerifier::Result SignedExchangeSignatureVerifier::Verify(
SignedExchangeVersion version,
const SignedExchangeEnvelope& envelope,
const SignedExchangeCertificateChain* cert_chain,
const base::Time& verification_time,
SignedExchangeDevToolsProxy* devtools_proxy) { … }
}