// Copyright 2018 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 "device/fido/opaque_attestation_statement.h"

#include <utility>

#include "components/cbor/values.h"

using cbor::Value;

namespace device {

OpaqueAttestationStatement::OpaqueAttestationStatement(
    std::string attestation_format,
    Value attestation_statement_map)
    : AttestationStatement(std::move(attestation_format)),
      attestation_statement_map_(std::move(attestation_statement_map)) {}

OpaqueAttestationStatement::~OpaqueAttestationStatement() = default;

// Returns the deep copied cbor map value of |attestation_statement_map_|.
Value::MapValue OpaqueAttestationStatement::GetAsCBORMap() const {
  DCHECK(attestation_statement_map_.is_map());
  Value::MapValue new_map;
  new_map.reserve(attestation_statement_map_.GetMap().size());
  for (const auto& map_it : attestation_statement_map_.GetMap()) {
    new_map.try_emplace(new_map.end(), map_it.first.Clone(),
                        map_it.second.Clone());
  }
  return new_map;
}

bool OpaqueAttestationStatement::IsSelfAttestation() {
  DCHECK(attestation_statement_map_.is_map());
  const Value::MapValue& m(attestation_statement_map_.GetMap());
  const Value alg("alg");
  const Value sig("sig");

  return format_ == "packed" && m.size() == 2 && m.count(std::move(alg)) == 1 &&
         m.count(std::move(sig)) == 1;
}

bool OpaqueAttestationStatement::
    IsAttestationCertificateInappropriatelyIdentifying() {
  return false;
}

base::Optional<base::span<const uint8_t>>
OpaqueAttestationStatement::GetLeafCertificate() const {
  DCHECK(attestation_statement_map_.is_map());
  const Value::MapValue& m(attestation_statement_map_.GetMap());
  const Value x5c("x5c");
  const auto it = m.find(x5c);
  if (it == m.end() || !it->second.is_array()) {
    return base::nullopt;
  }

  const Value::ArrayValue& certs = it->second.GetArray();
  if (certs.empty() || !certs[0].is_bytestring()) {
    return base::nullopt;
  }

  return certs[0].GetBytestring();
}

}  // namespace device
