// Copyright 2019 The Chromium OS 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 "biod/cros_fp_firmware.h"

#include <string>

#include <base/logging.h>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/memory_mapped_file.h>

#include <chromeos/ec/ec_commands.h>
#include <fmap.h>

namespace {

constexpr char kFmapRoIdLabel[] = "RO_FRID";
constexpr char kFmapRwIdLabel[] = "RW_FWID";

bool DecodeVersionFromArea(const base::MemoryMappedFile& image,
                           const struct fmap* fmap,
                           const char* area_name,
                           std::string* ver) {
  DCHECK(fmap != nullptr);
  DCHECK(area_name != nullptr);
  DCHECK(ver != nullptr);

  const auto area = fmap_find_area(fmap, area_name);
  if (area == nullptr) {
    LOG(ERROR) << "Failed to find FMAP area " << area_name << ".";
    return false;
  }
  if ((area->offset + area->size) > fmap->size) {
    LOG(ERROR) << "FMAP area " << area_name << " has offset " << area->offset
               << " with size " << area->size
               << ", which spans outside the firmware image, of size "
               << fmap->size << ".";
    return false;
  }

  // area->size can be larger than the printable characters in the buffer
  // std::string(char*, size_t) constructor will not stop at first \0
  const char* str =
      reinterpret_cast<const char*>(&(image.data()[area->offset]));
  *ver = std::string(str, strnlen(str, area->size));
  return true;
}

}  // namespace

namespace biod {

CrosFpFirmware::CrosFpFirmware(const base::FilePath& image_path)
    : path_(image_path) {
  DecodeVersionFromFile();
}

base::FilePath CrosFpFirmware::GetPath() const {
  return path_;
}

bool CrosFpFirmware::IsValid() const {
  return status_ == Status::kOk;
}

CrosFpFirmware::Status CrosFpFirmware::GetStatus() const {
  return status_;
}

std::string CrosFpFirmware::GetStatusString() const {
  return StatusToString(GetStatus());
}

const CrosFpFirmware::ImageVersion& CrosFpFirmware::GetVersion() const {
  return version_;
}

std::string CrosFpFirmware::StatusToString(Status status) {
  switch (status) {
    case CrosFpFirmware::Status::kUninitialized:
      return "Not initialized";
    case CrosFpFirmware::Status::kNotFound:
      return "Firmware file does not exist.";
    case CrosFpFirmware::Status::kBadFmap:
      return "Firmware file has bad FMAP.";
    case CrosFpFirmware::Status::kOpenError:
      return "Failed to open firmware file version.";
    case CrosFpFirmware::Status::kOk:
      return "Firmware file is okay.";
  }

  NOTREACHED();
  return "";
}

void CrosFpFirmware::DecodeVersionFromFile() {
  if (!base::PathExists(path_) || base::DirectoryExists(path_)) {
    LOG(ERROR) << "Failed to find firmware file '" << path_.value() << "'.";
    status_ = Status::kNotFound;
    return;
  }

  base::MemoryMappedFile image;
  if (!image.Initialize(path_) || !image.IsValid()) {
    PLOG(ERROR) << "Failed to open firmware file '" << path_.value() << "'.";
    status_ = Status::kOpenError;
    return;
  }

  auto fmap_offset = fmap_find(image.data(), image.length());
  if (fmap_offset < 0 || fmap_offset >= image.length()) {
    LOG(ERROR) << "Failed to find FMAP inside firmware file '" << path_.value()
               << "'.";
    status_ = Status::kBadFmap;
    return;
  }
  DLOG(INFO) << "FMAP signature found at offset " << fmap_offset << ".";

  base::MemoryMappedFile image_fmap_aligned;
  const base::MemoryMappedFile::Region image_fmap_aligned_region = {
    .offset = fmap_offset,
    .size = image.length() - fmap_offset,
  };
  // MemoryMappedFile doesn't allow sharing the same open file with another
  // MemoryMappedFile nor does it allow mapping multiple file regions,
  // so we need to open the same file again.
  if (!image_fmap_aligned.Initialize(
          base::File(path_, base::File::FLAG_OPEN | base::File::FLAG_READ),
          image_fmap_aligned_region) ||
      !image_fmap_aligned.IsValid()) {
    PLOG(ERROR) << "Failed to open firmware file's fmap region '"
                << path_.value() << "'.";
    status_ = Status::kOpenError;
    return;
  }
  const auto fmap =
      reinterpret_cast<const struct fmap*>(image_fmap_aligned.data());

  // The firmware file's self reported size should not be larger
  // than the file size.
  if (fmap->size > image.length()) {
    LOG(ERROR) << "FMAP reported an image size of " << fmap->size
               << ", which is larger than the entire file size, "
               << image.length() << ", for '" << path_.value() << "'.";
    status_ = Status::kBadFmap;
    return;
  }

  if (!DecodeVersionFromArea(image, fmap, kFmapRoIdLabel,
                             &version_.ro_version)) {
    status_ = Status::kBadFmap;
    return;
  }
  if (!DecodeVersionFromArea(image, fmap, kFmapRwIdLabel,
                             &version_.rw_version)) {
    status_ = Status::kBadFmap;
    return;
  }
  status_ = Status::kOk;
}

}  // namespace biod
