| // 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 |
| protocol Rpmb { |
| GetDeviceInfo() -> (struct { |
| info DeviceInfo; |
| }); |
| Request(resource struct { |
| request Request; |
| }) -> (struct {}) error zx.status; |
| }; |