// 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.

library fuchsia.hardware.block.encrypted;

using zx;

/// We require simple layout to use the simple C bindings, and simple layout
/// requires that we have non-maximal length bounds, so give some excessively
/// large key length here so we can use the simple layout.
const uint32 MAX_KEY_SIZE = 256;

/// An interface to the zxcrypt driver, as bound to a single block device with
/// a zxcrypt superblock.  zxcrypt devices are encrypted, and before their
/// plaintext contents can be accessed, they must be unsealed with a key.
/// This protocol allows the caller to make requests to unseal the device (by
/// providing the appropriate key) and to seal the device (rendering its
/// contents inaccessible).
[ForDeprecatedCBindings]
protocol DeviceManager {
    /// Attempts to unseal the device by using the provided master key to unwrap
    /// the data key wrapped in the specified key slot.  If the key provided was
    /// the correct key for this slot, then the device node responding to this
    /// protocol will create an unsealed zxcrypt device as a child of itself in
    /// the device tree before returning success.
    /// Returns `ZX_ERR_INVALID_ARGS` if `slot` is invalid.
    /// Returns `ZX_ERR_BAD_STATE` and keeps the device open if the device is already unsealed.
    /// Returns other errors if operations on the underlying block device return errors.
    /// Returns `ZX_OK` on success.
    Unseal(bytes:MAX_KEY_SIZE key, uint8 slot) -> (zx.status status);

    /// Seals the device, causing any previously-created child zxcrypt Device to
    /// be removed some time later.  (Someday we'd like this to only return once
    /// the unsealed child device is removed, but that's not straightforward today.)
    /// Returns `ZX_ERR_BAD_STATE` if the device is already sealed.
    /// Returns `ZX_OK` on success.
    Seal() -> (zx.status status);

    /// Shreds the device, permanently overwriting the keys that would allow
    /// `Unseal()`ing the device again in the future.  This call does *not*
    /// impact the current sealed/unsealed state of the device -- if currently
    /// unsealed, the device will remain in that state until `Seal()` is called
    /// or the device is unbound.
    /// Returns `ZX_OK` on success.
    /// Returns other errors if operations on the underlying block device return errors.
    Shred() -> (zx.status status);
};
