// Copyright 2018 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cryptohome/lockbox-cache.h"

#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>

namespace cryptohome {
namespace {

constexpr uint8_t kInvalid[] = {0xba, 0xad};
constexpr uint8_t kNvram[] = {
    0x00, 0x00, 0x00, 0xe0, 0x00, 0xb8, 0x1a, 0xa2, 0xd7, 0xd1, 0xc1, 0xfc,
    0x92, 0x13, 0x05, 0xed, 0xa7, 0x90, 0x3a, 0x68, 0xfa, 0x9c, 0xe3, 0xa7,
    0x15, 0x52, 0xdf, 0xf3, 0x96, 0x59, 0x3c, 0xa5, 0x9e, 0xf2, 0x87, 0x8b,
    0xec, 0x4a, 0x43, 0xf6, 0x48, 0x3f, 0xcb, 0x92, 0xd4, 0x26, 0x99, 0xdd,
    0x34, 0x2a, 0xb5, 0x38, 0xf0, 0x8a, 0x8c, 0x45, 0x05, 0x65, 0xc6, 0x1d,
    0x1f, 0x11, 0x14, 0x04, 0x4d, 0x3c, 0x81, 0xf2, 0x89,
};
constexpr uint8_t kLockbox[] = {
    0x08, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d,
    0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x69, 0x6f, 0x73, 0x6b,
    0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x01, 0x00, 0x12,
    0x19, 0x0a, 0x10, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73,
    0x65, 0x2e, 0x6f, 0x77, 0x6e, 0x65, 0x64, 0x12, 0x05, 0x74, 0x72, 0x75,
    0x65, 0x00, 0x12, 0x1e, 0x0a, 0x0f, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70,
    0x72, 0x69, 0x73, 0x65, 0x2e, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x65,
    0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x00, 0x12, 0x2a,
    0x0a, 0x11, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65,
    0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x15, 0x63, 0x68, 0x72,
    0x6f, 0x6d, 0x65, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x74, 0x65, 0x73,
    0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x12, 0x15, 0x0a, 0x10, 0x65, 0x6e,
    0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x61,
    0x6c, 0x6d, 0x12, 0x01, 0x00, 0x12, 0x3d, 0x0a, 0x14, 0x65, 0x6e, 0x74,
    0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e, 0x64, 0x65, 0x76, 0x69,
    0x63, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x25, 0x32, 0x63, 0x34, 0x37, 0x37,
    0x36, 0x35, 0x33, 0x2d, 0x32, 0x61, 0x66, 0x66, 0x2d, 0x34, 0x64, 0x63,
    0x35, 0x2d, 0x62, 0x32, 0x34, 0x30, 0x2d, 0x62, 0x38, 0x31, 0x34, 0x35,
    0x66, 0x31, 0x36, 0x33, 0x66, 0x66, 0x62, 0x00,
};

class LockboxCacheTest : public testing::Test {
 public:
  void SetUp() override {
    ASSERT_TRUE(tmpdir_.CreateUniqueTempDir());
    nvram_path_ = tmpdir_.GetPath().AppendASCII("nvram");
    lockbox_path_ = tmpdir_.GetPath().AppendASCII("lockbox");
    cache_path_ = tmpdir_.GetPath().AppendASCII("cache");
  }

  template <typename Array>
  void WriteBlob(const base::FilePath& path, const Array& array) {
    ASSERT_TRUE(platform_.WriteFile(
        path, brillo::Blob(std::begin(array), std::end(array))));
  }

  void ExpectFailure() {
    EXPECT_FALSE(
        CacheLockbox(&platform_, nvram_path_, lockbox_path_, cache_path_));
    EXPECT_FALSE(base::PathExists(cache_path_));
  }

  libstorage::Platform platform_;
  base::ScopedTempDir tmpdir_;
  base::FilePath nvram_path_;
  base::FilePath lockbox_path_;
  base::FilePath cache_path_;
};

TEST_F(LockboxCacheTest, NoNvram) {
  ExpectFailure();
}

TEST_F(LockboxCacheTest, InvalidNvram) {
  WriteBlob(nvram_path_, kInvalid);
  ExpectFailure();
}

TEST_F(LockboxCacheTest, NoLockbox) {
  WriteBlob(nvram_path_, kNvram);
  ExpectFailure();
}

TEST_F(LockboxCacheTest, LockboxVerificationBadSize) {
  WriteBlob(nvram_path_, kNvram);
  WriteBlob(lockbox_path_, kInvalid);
  ExpectFailure();
}

TEST_F(LockboxCacheTest, LockboxVerificationBadData) {
  WriteBlob(nvram_path_, kNvram);
  uint8_t invalid_lockbox[sizeof(kLockbox)];
  for (size_t i = 0; i < sizeof(invalid_lockbox); ++i) {
    invalid_lockbox[i] ^= 0xff;
  }
  WriteBlob(lockbox_path_, invalid_lockbox);
  ExpectFailure();
}

TEST_F(LockboxCacheTest, Success) {
  WriteBlob(nvram_path_, kNvram);
  WriteBlob(lockbox_path_, kLockbox);

  EXPECT_TRUE(
      CacheLockbox(&platform_, nvram_path_, lockbox_path_, cache_path_));
  brillo::Blob cache;
  ASSERT_TRUE(platform_.ReadFile(cache_path_, &cache));
  EXPECT_EQ(brillo::Blob(std::begin(kLockbox), std::end(kLockbox)), cache);
}

}  // namespace
}  // namespace cryptohome
