// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by the GPL v2 license that can
// be found in the LICENSE file.
//
// Defines FileHasher, a class that creates a Verity-specific file of
// per-block hashes from a given base::File.
#ifndef VERITY_FILE_HASHER_H_
#define VERITY_FILE_HASHER_H_

#include <memory>
#include <string>
#include <utility>
#include <vector>

#include <base/files/file.h>

#include "verity/dm-bht.h"
#include "verity/dm-bht-userspace.h"

namespace verity {
// FileHasher takes a |base::File| object and reads in |block_size|
// bytes creating SHA-256 hashes as it goes.
// TODO(wad) allow any hashing format supported by openssl (and the kernel).
// This class may not be used by multiple threads at once.
class FileHasher {
 public:
  FileHasher(std::unique_ptr<base::File> source,
             std::unique_ptr<base::File> destination,
             unsigned int blocks,
             const char* alg)
      : source_(std::move(source)),
        destination_(std::move(destination)),
        block_limit_(blocks),
        alg_(alg),
        initialized_(false) {}
  virtual ~FileHasher();

  // TODO(wad) add initialized_ variable to check.
  virtual bool Initialize();
  virtual bool Hash();
  virtual bool Store();
  // Print a table to stdout which contains a dmsetup compatible format
  virtual void PrintTable(bool colocated);
  virtual std::string GetTable(bool colocated);

  virtual const char* RandomSalt();
  virtual void set_salt(const char* salt) {
    if (!strcmp(salt, "random"))
      salt = RandomSalt();
    dm_bht_set_salt(&tree_, salt);
    salt_ = salt;
  }
  virtual const char* salt(void) { return salt_; }

 private:
  std::unique_ptr<base::File> source_;
  std::unique_ptr<base::File> destination_;
  unsigned int block_limit_;
  const char* alg_;
  const char* salt_;
  char random_salt_[DM_BHT_SALT_SIZE * 2 + 1];
  std::vector<char> hash_data_;
  struct dm_bht tree_;
  sector_t sectors_;
  bool initialized_;

  FileHasher(const FileHasher&) = delete;
  FileHasher& operator=(const FileHasher&) = delete;
};

}  // namespace verity

#endif  // VERITY_FILE_HASHER_H__
