// 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_PINSETS_H_
#define NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSETS_H_

#include <map>
#include <memory>
#include <string>

#include "base/macros.h"
#include "base/strings/string_piece.h"
#include "net/tools/transport_security_state_generator/cert_util.h"
#include "net/tools/transport_security_state_generator/pinset.h"
#include "net/tools/transport_security_state_generator/spki_hash.h"

namespace net {

namespace transport_security_state {

// Contains SPKIHashes and their names. The names are used to reference
// the hashes from Pinset's.
using SPKIHashMap = std::map<std::string, SPKIHash>;
using PinsetMap = std::map<std::string, std::unique_ptr<Pinset>>;

class Pinsets {
 public:
  Pinsets();
  ~Pinsets();

  void RegisterSPKIHash(base::StringPiece name, const SPKIHash& hash);
  void RegisterPinset(std::unique_ptr<Pinset> set);

  size_t size() const { return pinsets_.size(); }
  size_t spki_size() const { return spki_hashes_.size(); }

  const SPKIHashMap& spki_hashes() const { return spki_hashes_; }
  const PinsetMap& pinsets() const { return pinsets_; }

 private:
  // Contains all SPKI hashes found in the input pins file.
  SPKIHashMap spki_hashes_;

  // Contains all pinsets in the input JSON file.
  PinsetMap pinsets_;

  DISALLOW_COPY_AND_ASSIGN(Pinsets);
};

}  // namespace transport_security_state

}  // namespace net

#endif  // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_PINSETS_H_
