// Copyright 2016 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.
#ifndef IMAGELOADER_IMAGELOADER_UTILITY_H_
#define IMAGELOADER_IMAGELOADER_UTILITY_H_

#include <string>
#include <vector>

#include <base/files/file_path.h>
#include <base/gtest_prod_util.h>
#include <base/macros.h>

#include "loop_mounter.h"

namespace imageloader {

struct ImageLoaderConfig {
  ImageLoaderConfig(const std::vector<uint8_t> key, const char* storage_path,
                    const char* mount_path, std::unique_ptr<LoopMounter> ops)
      : key(key),
        storage_dir(storage_path),
        mount_path(mount_path),
        loop_mounter(std::move(ops)) {}

  std::vector<uint8_t> key;
  base::FilePath storage_dir;
  base::FilePath mount_path;
  std::unique_ptr<LoopMounter> loop_mounter;
};



class ImageLoaderImpl {
 public:
  // Instantiate an object with a configuration object.
  explicit ImageLoaderImpl(ImageLoaderConfig config)
      : config_(std::move(config)) {}

  // Register a component.
  bool RegisterComponent(const std::string& name, const std::string& version,
                         const std::string& component_folder_abs_path);

  // Get component version given component name.
  std::string GetComponentVersion(const std::string& name);

  // Load the specified component.
  std::string LoadComponent(const std::string& name);

 private:
  // This is a parsed version of the imageloader.json manifest.
  struct Manifest {
    int manifest_version;
    std::vector<uint8_t> image_sha256;
    std::vector<uint8_t> params_sha256;
    std::string version;
  };

  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, ECVerify);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, ManifestFingerPrint);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, CopyValidComponent);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, CopyComponentWithBadManifest);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, CopyValidImage);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, CopyInvalidImage);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, CopyInvalidHash);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, ParseManifest);
  FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, MountValidImage);

  // Verify the data with the RSA (PKCS #1 v1.5) signature.
  bool ECVerify(const base::StringPiece data, const base::StringPiece sig);

  // Copy the component directory from a user controlled location to an
  // imageloader controlled location. Do not copy unless it verifies.
  bool CopyComponentDirectory(const base::FilePath& component_path,
                              const base::FilePath& destination_folder,
                              const std::string& version);

  // Check the string contents to see if it matches the format of a
  // manifest.fingerprint file.
  bool IsValidFingerprintFile(const std::string& contents);

  // Verify the imageloader.json manifest file and parse the file information
  // out of it.
  bool VerifyAndParseManifest(const std::string& manifest_str,
                              const std::string& signature, Manifest* manifest);

  // Copies files over and checks their hash in the process. The copy fails if
  // the hashes do not match.
  bool CopyAndHashFile(const base::FilePath& src_path,
                       const base::FilePath& dest_path,
                       const std::vector<uint8_t>& known_hash);

  // Check if the client created a manifest.fingerprint, and preserve it.
  bool CopyFingerprintFile(const base::FilePath& src,
                           const base::FilePath& dest);

  // if |manifest| or |sig| are not null, they are set to the manifest contents
  // and the signature contents.
  bool GetAndVerifyManifest(const std::string& component_name,
                            const base::FilePath& component_path,
                            Manifest* manifest, std::string* manifest_str,
                            std::string* manifest_sig);

  // The configuration traits.
  ImageLoaderConfig config_;

  DISALLOW_COPY_AND_ASSIGN(ImageLoaderImpl);
};

}  // namespace imageloader

#endif  // IMAGELOADER_IMAGELOADER_UTILITY_H_
