// 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 simple_file::File.
#ifndef VERITY_FILE_HASHER_H__
#define VERITY_FILE_HASHER_H__ 1

#include "verity/dm-bht.h"
#include "verity/dm-bht-userspace.h"
#include "verity/simple_file/file.h"
#include "verity/include/asm/page.h"

namespace verity {
// FileHasher takes a simple_file::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()
      : source_(NULL), destination_(NULL), block_limit_(0), alg_(NULL) {}
  // TODO(wad) add initialized_ variable to check.
  virtual bool Initialize(simple_file::File* source,
                          simple_file::File* destination,
                          unsigned int blocks,
                          const char* alg);
  virtual bool Hash();
  virtual bool Store();
  // Print a table to stdout which contains a dmsetup compatible format
  virtual void PrintTable(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_; }

  virtual ~FileHasher(){};
  static int WriteCallback(void* file,
                           sector_t start,
                           u8* dst,
                           sector_t count,
                           struct dm_bht_entry* entry);

 private:
  simple_file::File* source_;
  simple_file::File* destination_;
  unsigned int block_limit_;
  const char* alg_;
  const char* salt_;
  char random_salt_[DM_BHT_SALT_SIZE * 2 + 1];
  u8* hash_data_;
  struct dm_bht tree_;
  sector_t sectors_;
};

}  // namespace verity

#endif  // VERITY_FILE_HASHER_H__
