blob: a6265c0a7242afd14d9702be9717a2bb523e70b3 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 ZXCRYPT_DDK_VOLUME_H_
#define ZXCRYPT_DDK_VOLUME_H_
#include <memory>
#include <ddk/device.h>
#include <ddk/driver.h>
#include "src/security/zxcrypt/volume.h"
namespace zxcrypt {
class DdkVolume final : public Volume {
public:
explicit DdkVolume(zx_device_t* dev);
// Unlocks a zxcrypt volume on the block device described by |dev| using the |key| corresponding
// to given key |slot|.
static zx_status_t Unlock(zx_device_t* dev, const crypto::Secret& key, key_slot_t slot,
std::unique_ptr<DdkVolume>* out);
// Opens a zxcrypt volume on the block device described by |dev|, but does not
// do any operations involving a key. This is to make it possible to call Shred()
// without necessarily holding the key.
static zx_status_t OpenOpaque(zx_device_t* dev, std::unique_ptr<DdkVolume>* out);
// Uses the data key material to initialize |cipher| for the given |direction|.
zx_status_t Bind(crypto::Cipher::Direction direction, crypto::Cipher* cipher) const;
private:
// Retrieve the block/FVM information and adjust it
zx_status_t Init();
// Opens a zxcrypt volume on the underlying block device using the |key|
// corresponding to given key |slot|.
zx_status_t Unlock(const crypto::Secret& key, key_slot_t slot);
zx_status_t GetBlockInfo(BlockInfo* out);
zx_status_t GetFvmSliceSize(uint64_t* out);
zx_status_t DoBlockFvmVsliceQuery(uint64_t vslice_start, SliceRegion ranges[MAX_SLICE_REGIONS],
uint64_t* slice_count);
zx_status_t DoBlockFvmExtend(uint64_t start_slice, uint64_t slice_count);
// Reads a block from the current offset on the underlying device.
zx_status_t Read();
// Writes a block to the current offset on the underlying device.
zx_status_t Write();
// The underlying block device, accessed via DDK
zx_device_t* dev_;
};
} // namespace zxcrypt
#endif // ZXCRYPT_DDK_VOLUME_H_