// Copyright 2018 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 OOBE_CONFIG_USB_UTILS_H_
#define OOBE_CONFIG_USB_UTILS_H_

#include <string>
#include <vector>

#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <crypto/scoped_openssl_types.h>

namespace oobe_config {

extern const char kStatefulDir[];
extern const char kUnencryptedOobeConfigDir[];
extern const char kConfigFile[];
extern const char kDomainFile[];
extern const char kKeyFile[];
extern const char kDevDiskById[];
extern const char kUsbDevicePathSigFile[];
extern const char kStoreDir[];
extern const char kOobeConfigRestoreUser[];

// Use of this class removes a file after it goes out of scope. This means we do
// not have to worry about keeping tracking which files to delete when.
class ScopedPathUnlinker {
 public:
  explicit ScopedPathUnlinker(const base::FilePath& file) : file_(file) {}
  ~ScopedPathUnlinker() {
    if (!base::DeleteFile(file_, false)) {
      PLOG(ERROR) << "Unable to unlink path " << file_.value();
    }
  }

 private:
  const base::FilePath file_;
  DISALLOW_COPY_AND_ASSIGN(ScopedPathUnlinker);
};

// Using |priv_key|, signs |src| file, and writes the digest into |dst|.
bool Sign(const base::FilePath& priv_key,
          const base::FilePath& src,
          const base::FilePath& dst);

// Using |priv_key|, signs |src_content|, and writes the digest into |dst|.
bool Sign(const base::FilePath& priv_key,
          const std::string& src_content,
          const base::FilePath& dst);

// Reads the |pub_key_file| into |pub_key| (a data structure usable by
// libcrypto.)
bool ReadPublicKey(const base::FilePath& pub_key_file,
                   crypto::ScopedEVP_PKEY* pub_key);

// Verifies the |signature| of a |message| using the default and already
// verified public key |pub_key|.
bool VerifySignature(const std::string& message,
                     const std::string& signature,
                     const crypto::ScopedEVP_PKEY& pub_key);

}  // namespace oobe_config

#endif  // OOBE_CONFIG_USB_UTILS_H_
