blob: e2cb78ced1a7400c37f05c3db2dd5ea2c6616a75 [file] [log] [blame]
// Copyright 2020 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.rpmb;
using zx;
using fuchsia.mem;
// RPMB: Replay Protected Memory Block
// RPMB is a secure area included in certain types of storage devices. For more information, see:
// https://optee.readthedocs.io/en/latest/architecture/secure_storage.html#rpmb-secure-storage
/// The RPMB frame size in bytes.
const FRAME_SIZE uint32 = 512;
type EmmcDeviceInfo = struct {
/// The device's CID register.
cid array<uint8, 16>;
/// RPMB_SIZE_MULT from the device's EXT_CSD register.
rpmb_size uint8;
/// REL_WR_SEC_C from the device's EXT_CSD register.
reliable_write_sector_count uint8;
};
type DeviceInfo = flexible union {
1: emmc_info EmmcDeviceInfo;
};
/// Represents an RPMB operation, which consists of sending one or more frames then receiving zero
/// or more frames. The tx_frames and rx_frames VMOs will be transferred to the protocol
/// implementation, so clients should keep duplicates of them if access is needed after the call to
/// Request().
/// The request will be aborted as soon as an error is encountered, meaning the read operation will
/// not be performed if the write operation failed. Invalid parameters passed through tx_frames or
/// rx_frames will cause an error to be returned immediately, without either operation having been
/// performed.
type Request = resource struct {
/// May not be null as all operations involve sending at least one frame. tx_frames.size must be
/// a multiple of and at least FRAME_SIZE.
tx_frames fuchsia.mem.Range;
/// May be null if no frames need to be received. rx_frames.size must be a multiple of
/// FRAME_SIZE if rx_frames is not null.
rx_frames box<fuchsia.mem.Range>;
};
@discoverable
closed protocol Rpmb {
strict GetDeviceInfo() -> (struct {
info DeviceInfo;
});
strict Request(resource struct {
request Request;
}) -> () error zx.Status;
};
service Service {
device client_end:Rpmb;
};