// Copyright (c) 2016 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.

#ifndef NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSET_H_
#define NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSET_H_

#include <string>
#include <vector>

#include "base/macros.h"

namespace net {

namespace transport_security_state {

// A Pinset represents the data a website would send in a HPKP header. A pinset
// is given a name so that multiple entries in the preload list can reference
// the same pinset.
class Pinset {
 public:
  Pinset(std::string name, std::string report_uri);
  ~Pinset();

  const std::string& name() const { return name_; }
  const std::string& report_uri() const { return report_uri_; }

  const std::vector<std::string>& static_spki_hashes() const {
    return static_spki_hashes_;
  }
  const std::vector<std::string>& bad_static_spki_hashes() const {
    return bad_static_spki_hashes_;
  }

  // Register a good hash for this pinset. Hashes are referenced by a name, not
  // by the actual hash.
  void AddStaticSPKIHash(const std::string& hash_name);

  // Register a bad hash for this pinset. Hashes are referenced by a name, not
  // by the actual hash.
  void AddBadStaticSPKIHash(const std::string& hash_name);

 private:
  std::string name_;
  std::string report_uri_;

  // These vectors contain names rather than actual hashes.
  std::vector<std::string> static_spki_hashes_;
  std::vector<std::string> bad_static_spki_hashes_;

  DISALLOW_COPY_AND_ASSIGN(Pinset);
};

}  // namespace transport_security_state

}  // namespace net

#endif  // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSET_H_
