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

// A tool that can be used to read from or write to bootlockbox. For example:
// bootlockboxtool --action=read --key="xxx"
// This command prints the value stored in bootlockbox indexed by xxx.

#include <iostream>
#include <memory>

#include <stdlib.h>

#include <brillo/flag_helper.h>
#include <brillo/syslog_logging.h>

#include "cryptohome/bootlockbox/boot_lockbox_client.h"

namespace {

constexpr char kActionStore[] = "store";
constexpr char kActionRead[] = "read";
constexpr char kActionFinalize[] = "finalize";

}  // namespace

int main(int argc, char** argv) {
  DEFINE_string(action, "",
                "Choose one action [store|read|finalize] to perform.");
  DEFINE_string(key, "", "key for the data");
  DEFINE_string(data, "", "The data to be stored");
  brillo::FlagHelper::Init(argc, argv, "bootlockbox");

  brillo::OpenLog("bootlockbox", true);
  brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderr);

  if (FLAGS_action.empty()) {
    LOG(ERROR) << "must specify one action: [store|read|finalize]";
    return EXIT_FAILURE;
  }

  if (FLAGS_action != kActionStore && FLAGS_action != kActionRead &&
      FLAGS_action != kActionFinalize) {
    LOG(ERROR) << "Invalid action: [store|read|finalize]";
    return EXIT_FAILURE;
  }

  std::unique_ptr<cryptohome::BootLockboxClient> boot_lockbox_client =
      cryptohome::BootLockboxClient::CreateBootLockboxClient();

  if (FLAGS_action == kActionFinalize) {
    if (!boot_lockbox_client->Finalize()) {
      LOG(ERROR) << "Failed to finalize bootlockbox";
      return EXIT_FAILURE;
    }
    LOG(INFO) << "Success";
    return EXIT_SUCCESS;
  }

  if (FLAGS_key.empty()) {
    LOG(ERROR) << "must specify key to " << FLAGS_action;
    return EXIT_FAILURE;
  }
  std::string key(FLAGS_key);
  if (FLAGS_action == kActionStore) {
    if (FLAGS_data.empty()) {
      LOG(ERROR) << "must specify data to store";
      return EXIT_FAILURE;
    }
    std::string data(FLAGS_data);
    if (!boot_lockbox_client->Store(key, data)) {
      LOG(ERROR) << "Failed to store";
      return EXIT_FAILURE;
    }
    LOG(INFO) << "Success";
  } else if (FLAGS_action == kActionRead) {
    std::string data;
    if (!boot_lockbox_client->Read(key, &data)) {
      LOG(ERROR) << "Failed to read";
      return EXIT_FAILURE;
    }
    std::cout << data;
  }

  return EXIT_SUCCESS;
}
