// Copyright 2021 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 "u2fd/fuzzers/fuzzed_user_state.h"

#include <base/sys_byteorder.h>

#include "u2fd/util.h"

namespace u2f {

namespace {
constexpr char kUser[] = "user";
constexpr char kSanitizedUser[] =
    "12dea96fec20593566ab75692c9949596833adc9";  // SHA1("user")
}  // namespace

FuzzedUserState::FuzzedUserState(FuzzedDataProvider* data_provider)
    : data_provider_(data_provider) {
  NextState();
}

void FuzzedUserState::NextState() {
  // This function consumes the same amount of data regardless of whether or not
  // the state is nullopt.

  std::string user_secret =
      data_provider_->ConsumeBytesAsString(kUserSecretSizeBytes);
  if (data_provider_->ConsumeBool()) {
    user_secret_ = brillo::SecureBlob(user_secret);
  } else {
    user_secret_ = base::nullopt;
  }

  uint32_t counter = data_provider_->ConsumeIntegral<uint32_t>();
  if (data_provider_->ConsumeBool()) {
    counter_ = counter;
  } else {
    counter_ = base::nullopt;
  }
}

base::Optional<brillo::SecureBlob> FuzzedUserState::GetUserSecret() {
  return user_secret_;
}

base::Optional<std::vector<uint8_t>> FuzzedUserState::GetCounter() {
  if (!counter_.has_value()) {
    return base::nullopt;
  }

  std::vector<uint8_t> counter_bytes;
  util::AppendToVector(base::HostToNet32(*counter_), &counter_bytes);
  return counter_bytes;
}

bool FuzzedUserState::IncrementCounter() {
  (*counter_)++;

  return data_provider_->ConsumeBool();
}

void FuzzedUserState::SetSessionStartedCallback(
    base::RepeatingCallback<void(const std::string&)>) {
  // Do nothing since FuzzedUserState does not call this callback function for
  // now
}
void FuzzedUserState::SetSessionStoppedCallback(
    base::RepeatingCallback<void()>) {
  // Do nothing since FuzzedUserState does not call this callback function for
  // now
}

bool FuzzedUserState::HasUser() {
  // TODO(domen): Support the state that there is no user.
  // We will need to call the callback functions in order to support changing
  // the user.
  return true;
}
base::Optional<std::string> FuzzedUserState::GetUser() {
  return kUser;
}
base::Optional<std::string> FuzzedUserState::GetSanitizedUser() {
  return kSanitizedUser;
}

}  // namespace u2f
