// Copyright 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.

#include "net/cert/signed_tree_head.h"

#include <string.h>

#include <ostream>

#include "base/strings/string_number_conversions.h"

namespace net {
namespace ct {

SignedTreeHead::SignedTreeHead() {}

SignedTreeHead::SignedTreeHead(Version version,
                               const base::Time& timestamp,
                               uint64_t tree_size,
                               const char sha256_root_hash[kSthRootHashLength],
                               const DigitallySigned& signature,
                               const std::string& log_id)
    : version(version),
      timestamp(timestamp),
      tree_size(tree_size),
      signature(signature),
      log_id(log_id) {
  memcpy(this->sha256_root_hash, sha256_root_hash, kSthRootHashLength);
}

SignedTreeHead::SignedTreeHead(const SignedTreeHead& other) = default;

SignedTreeHead::~SignedTreeHead() {}

void PrintTo(const SignedTreeHead& sth, std::ostream* os) {
  (*os) << "{\n"
        << "\t\"version\": " << sth.version << ",\n"
        << "\t\"timestamp\": " << sth.timestamp << ",\n"
        << "\t\"tree_size\": " << sth.tree_size << ",\n"
        << "\t\"sha256_root_hash\": \""
        << base::HexEncode(sth.sha256_root_hash, kSthRootHashLength)
        << "\",\n\t\"log_id\": \""
        << base::HexEncode(sth.log_id.data(), sth.log_id.size()) << "\"\n"
        << "}";
}

bool operator==(const SignedTreeHead& lhs, const SignedTreeHead& rhs) {
  return std::tie(lhs.version, lhs.timestamp, lhs.tree_size, lhs.log_id) ==
             std::tie(rhs.version, rhs.timestamp, rhs.tree_size, rhs.log_id) &&
         memcmp(lhs.sha256_root_hash, rhs.sha256_root_hash,
                kSthRootHashLength) == 0 &&
         lhs.signature.SignatureParametersMatch(
             rhs.signature.hash_algorithm, rhs.signature.signature_algorithm) &&
         lhs.signature.signature_data == rhs.signature.signature_data;
}

bool operator!=(const SignedTreeHead& lhs, const SignedTreeHead& rhs) {
  return !(lhs == rhs);
}

}  // namespace ct
}  // namespace net
