// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file is generated by net/tools/transport_security_state_generator/.

#ifndef NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
#define NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_

#include <stdint.h>

#include "net/http/transport_security_state_source.h"

// These are SubjectPublicKeyInfo hashes for public key pinning. The
// hashes are SHA256 digests.
[[SPKI_HASHES]]

static const char* const kExpectCTReportURIs[] = [[EXPECT_CT_REPORT_URIS]];

// kNoRejectedPublicKeys is a placeholder for when no public keys are rejected.
static const char* const kNoRejectedPublicKeys[] = {
    nullptr,
};

[[ACCEPTABLE_CERTS]]

static const net::TransportSecurityStateSource::Pinset kPinsets[] = [[PINSETS]];

// kHSTSHuffmanTree describes a Huffman tree. The nodes of the tree are pairs
// of uint8s. The last node in the array is the root of the tree. Each pair is
// two uint8_t values, the first is "left" and the second is "right". If a
// uint8_t value has the MSB set then it represents a literal leaf value.
// Otherwise it's a pointer to the n'th element of the array.
static const uint8_t kHSTSHuffmanTree[] = [[HUFFMAN_TREE]];

static const uint8_t kPreloadedHSTSData[] = [[HSTS_TRIE]];

static const unsigned kPreloadedHSTSBits = [[HSTS_TRIE_BITS]];
static const unsigned kHSTSRootPosition = [[HSTS_TRIE_ROOT]];

static const net::TransportSecurityStateSource kHSTSSource = {
  kHSTSHuffmanTree,
  sizeof(kHSTSHuffmanTree),
  kPreloadedHSTSData,
  kPreloadedHSTSBits,
  kHSTSRootPosition,
  kExpectCTReportURIs,
  kPinsets,
  arraysize(kPinsets)
};

#endif  // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
