You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.7 KiB
117 lines
3.7 KiB
// 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 LIBBRILLO_BRILLO_BLKDEV_UTILS_DEVICE_MAPPER_H_
|
|
#define LIBBRILLO_BRILLO_BLKDEV_UTILS_DEVICE_MAPPER_H_
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include <base/bind.h>
|
|
#include <base/callback.h>
|
|
#include <base/files/file_path.h>
|
|
#include <brillo/blkdev_utils/device_mapper_task.h>
|
|
|
|
namespace brillo {
|
|
|
|
// DevmapperTable manages device parameters. Contains helper
|
|
// functions to parse results from dmsetup. Since the table parameters
|
|
// may contain sensitive data eg. dm-crypt keys, we use SecureBlobs for
|
|
// the table parameters and as the table output format.
|
|
|
|
class BRILLO_EXPORT DevmapperTable {
|
|
public:
|
|
// Create table from table parameters.
|
|
// Useful for setting up devices.
|
|
DevmapperTable(uint64_t start,
|
|
uint64_t size,
|
|
const std::string& type,
|
|
const SecureBlob& parameters);
|
|
|
|
~DevmapperTable() = default;
|
|
|
|
// Returns the table as a SecureBlob.
|
|
SecureBlob ToSecureBlob();
|
|
|
|
// Getters for table components.
|
|
uint64_t GetStart() const { return start_; }
|
|
uint64_t GetSize() const { return size_; }
|
|
std::string GetType() const { return type_; }
|
|
SecureBlob GetParameters() const { return parameters_; }
|
|
|
|
// Create table from table blob.
|
|
// Useful for parsing output from dmsetup.
|
|
// Using a static function to surface errors in parsing the blob.
|
|
static DevmapperTable CreateTableFromSecureBlob(const SecureBlob& table);
|
|
|
|
// dm-crypt specific functions:
|
|
// ----------------------------
|
|
// Extract key from (crypt) table.
|
|
SecureBlob CryptGetKey();
|
|
|
|
// Create crypt parameters .
|
|
// Useful for parsing output from dmsetup.
|
|
// Using a static function to surface errors in parsing the blob.
|
|
static SecureBlob CryptCreateParameters(const std::string& cipher,
|
|
const SecureBlob& encryption_key,
|
|
const int iv_offset,
|
|
const base::FilePath& device,
|
|
int device_offset,
|
|
bool allow_discard);
|
|
|
|
private:
|
|
const uint64_t start_;
|
|
const uint64_t size_;
|
|
const std::string type_;
|
|
const SecureBlob parameters_;
|
|
};
|
|
|
|
// DevmapperTask is an abstract class so we wrap it in a unique_ptr.
|
|
using DevmapperTaskFactory =
|
|
base::Callback<std::unique_ptr<DevmapperTask>(int)>;
|
|
|
|
// DeviceMapper handles the creation and removal of dm devices.
|
|
class BRILLO_EXPORT DeviceMapper {
|
|
public:
|
|
// Default constructor: sets up real devmapper devices.
|
|
DeviceMapper();
|
|
|
|
// Set a non-default dm task factory.
|
|
explicit DeviceMapper(const DevmapperTaskFactory& factory);
|
|
|
|
// Default destructor.
|
|
~DeviceMapper() = default;
|
|
|
|
// Sets up device with table on /dev/mapper/<name>.
|
|
// Parameters
|
|
// name - Name of the devmapper device.
|
|
// table - Table for the devmapper device.
|
|
bool Setup(const std::string& name, const DevmapperTable& table);
|
|
|
|
// Removes device.
|
|
// Parameters
|
|
// name - Name of the devmapper device.
|
|
bool Remove(const std::string& device);
|
|
|
|
// Returns table for device.
|
|
// Parameters
|
|
// name - Name of the devmapper device.
|
|
DevmapperTable GetTable(const std::string& name);
|
|
|
|
// Clears table for device.
|
|
// Parameters
|
|
// name - Name of the devmapper device.
|
|
bool WipeTable(const std::string& name);
|
|
|
|
private:
|
|
// Devmapper task factory.
|
|
DevmapperTaskFactory dm_task_factory_;
|
|
DISALLOW_COPY_AND_ASSIGN(DeviceMapper);
|
|
};
|
|
|
|
} // namespace brillo
|
|
|
|
#endif // LIBBRILLO_BRILLO_BLKDEV_UTILS_DEVICE_MAPPER_H_
|