blob: c0ee6315bc62b67912734b2178cad126ecc6f021 [file] [log] [blame]
// Copyright 2018 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.tee;
using zx;
// Trusted Execution Environment (TEE) Interface
/// UUID identifiers are used to identify the TEE Operating System and individual Trusted
/// Applications. This structure matches the UUID type as defined by RFC4122.
type Uuid = struct {
time_low uint32;
time_mid uint16;
time_hi_and_version uint16;
clock_seq_and_node array<uint8, 8>;
};
type OsRevision = table {
1: major uint32;
2: minor uint32;
};
type OsInfo = table {
1: uuid Uuid;
2: revision OsRevision;
3: is_global_platform_compliant bool;
};
/// Communication with the TEE OS and Trusted Applications is performed using opaque parameters.
/// These parameters can be a mix of small values (Value type) or a buffer reference (Buffer type).
/// A parameter will be tagged as either an input, output or both (inout).
type Direction = strict enum : uint32 {
INPUT = 0;
OUTPUT = 1;
INOUT = 2;
};
/// An empty parameter type is used as a placeholder for elements in the parameter set that are not
/// used.
// TODO(fxbug.dev/8031): Consider making this a table once empty tables do not cause binding issues.
type None = struct {};
/// Represents a buffer parameter.
type Buffer = resource table {
1: direction Direction;
/// The VMO is allowed to be not present for situations where the TEE allows for buffer size
/// checks.
///
/// For example, if the operation to be performed needs an output buffer, but the user cannot
/// calculate how large that output buffer should be, they can attempt the operation without
/// a vmo and the Trusted Application will populate the size field so that the operation can
/// be performed again with an appropriately sized buffer.
2: vmo zx.handle:VMO;
3: offset uint64;
4: size uint64;
};
/// Represents a direct value parameter.
type Value = table {
1: direction Direction;
/// This value is optional. If not set, a zero value is sent in its place if it is required by
/// the calling convention.
2: a uint64;
/// This value is optional. If not set, a zero value is sent in its place if it is required by
/// the calling convention.
3: b uint64;
/// This value is optional. If not set, a zero value is sent in its place if it is required by
/// the calling convention.
4: c uint64;
};
type Parameter = flexible resource union {
1: none None;
2: buffer Buffer;
3: value Value;
};
const MAX_PARAMETERSET_COUNT uint32 = 4;
alias ParameterSet = vector<Parameter>:MAX_PARAMETERSET_COUNT;
/// Each operation must flow through the device driver and the trusted operating system before
/// reaching the trusted application (and back). The ReturnOrigin indicates which layer provided the
/// return code.
type ReturnOrigin = strict enum : uint32 {
COMMUNICATION = 0;
TRUSTED_OS = 1;
TRUSTED_APPLICATION = 2;
};
/// The result of an operation will include a return code, the origin of the result, and the return
/// of the parameter set. The returned parameter set will be a copy of the input parameter set, but
/// with the INOUT and OUTPUT parameters updated. If the parameter is a Buffer, it will update the
/// Buffer.size to the number of bytes written.
type OpResult = resource table {
1: return_code uint64;
2: return_origin ReturnOrigin;
3: parameter_set ParameterSet;
};
/// Provides information about the TEE device.
@discoverable
protocol DeviceInfo {
/// Obtains information about the TEE OS.
GetOsInfo() -> (struct {
info OsInfo;
});
};
/// Represents a connection to an application running in the TEE.
@discoverable
protocol Application {
/// Initiates a communication session with the trusted application.
OpenSession2(resource struct {
parameter_set ParameterSet;
}) -> (resource struct {
session_id uint32;
op_result OpResult;
});
/// Requests the trusted application perform the provided command. The command is unique to the
/// trusted application.
InvokeCommand(resource struct {
session_id uint32;
command_id uint32;
parameter_set ParameterSet;
}) -> (resource struct {
op_result OpResult;
});
/// Closes an established session.
CloseSession(struct {
session_id uint32;
}) -> ();
};