// 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_SPKI_HASH_H_
#define NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_SPKI_HASH_H_

#include <stdint.h>
#include <string>
#include <vector>

#include "base/strings/string_piece.h"

namespace net {

namespace transport_security_state {

class SPKIHash {
 public:
  enum : size_t { kLength = 32 };

  SPKIHash();
  ~SPKIHash();

  // Initalizes a hash from the form sha256/<base64-hash-value>. The preloaded
  // SPKI hashes are SHA256. Other algorithms are not supported. Returns true
  // on success and copies the decoded bytes to |data_|. Returns false on
  // failure.
  bool FromString(base::StringPiece hash_string);

  // Calculates the SHA256 digest over |*input| and copies the result to
  // |data_|.
  void CalculateFromBytes(const uint8_t* input, size_t input_length);

  // Returns the size of the hash in bytes. Harcoded to 32 which is the length
  // of a SHA256 hash.
  size_t size() const { return kLength; }

  uint8_t* data() { return data_; }
  const uint8_t* data() const { return data_; };

 private:
  // The bytes of the hash. Current hashes are SHA256 and thus 32 bytes long.
  uint8_t data_[kLength];
};

}  // namespace transport_security_state

}  // namespace net

#endif  // NET_TOOLS_TRANSPORT_SECURITY_STATE_GENERATOR_SPKI_HASH_H_
