xref: /optee_os/lib/libutee/include/pta_system.h (revision e4ad5ccd3994b1abe0fd638c786b8d719732e2a5)
14bca302aSIgor Opaniuk /* SPDX-License-Identifier: BSD-2-Clause */
24bca302aSIgor Opaniuk /*
3b5b6225fSJens Wiklander  * Copyright (c) 2018-2019, Linaro Limited
4*e4ad5ccdSAleksandr Anisimov  * Copyright (c) 2020, Open Mobile Platform LLC
54bca302aSIgor Opaniuk  */
64bca302aSIgor Opaniuk #ifndef __PTA_SYSTEM_H
74bca302aSIgor Opaniuk #define __PTA_SYSTEM_H
84bca302aSIgor Opaniuk 
9b5b6225fSJens Wiklander #include <util.h>
10b5b6225fSJens Wiklander 
114bca302aSIgor Opaniuk /*
124bca302aSIgor Opaniuk  * Interface to the pseudo TA, which is provides misc. auxiliary services,
134bca302aSIgor Opaniuk  * extending existing GlobalPlatform Core API
144bca302aSIgor Opaniuk  */
154bca302aSIgor Opaniuk 
164bca302aSIgor Opaniuk #define PTA_SYSTEM_UUID { 0x3a2f8978, 0x5dc0, 0x11e8, { \
174bca302aSIgor Opaniuk 			 0x9c, 0x2d, 0xfa, 0x7a, 0xe0, 0x1b, 0xbe, 0xbc } }
184bca302aSIgor Opaniuk 
194bca302aSIgor Opaniuk /*
20a30ddda9SJoakim Bech  * Having keys with too few bits impose a potential security risk, hence set a
21a30ddda9SJoakim Bech  * lower bound of 128 bits.
22a30ddda9SJoakim Bech  */
23a30ddda9SJoakim Bech #define TA_DERIVED_KEY_MIN_SIZE		16
24a30ddda9SJoakim Bech 
25a30ddda9SJoakim Bech /* Same value as max in huk_subkey_derive */
26a30ddda9SJoakim Bech #define TA_DERIVED_KEY_MAX_SIZE		32
27a30ddda9SJoakim Bech 
28a30ddda9SJoakim Bech #define TA_DERIVED_EXTRA_DATA_MAX_SIZE	1024
29a30ddda9SJoakim Bech 
30a30ddda9SJoakim Bech /*
314bca302aSIgor Opaniuk  * Add (re-seed) caller-provided entropy to the RNG pool. Keymaster
324bca302aSIgor Opaniuk  * implementations need to securely mix the provided entropy into their pool,
334bca302aSIgor Opaniuk  * which also must contain internally-generated entropy from a hardware random
344bca302aSIgor Opaniuk  * number generator.
354bca302aSIgor Opaniuk  *
364bca302aSIgor Opaniuk  * [in]     memref[0]: entropy input data
374bca302aSIgor Opaniuk  */
384bca302aSIgor Opaniuk #define PTA_SYSTEM_ADD_RNG_ENTROPY	0
394bca302aSIgor Opaniuk 
40a30ddda9SJoakim Bech /*
41a30ddda9SJoakim Bech  * Derives a device and TA unique key. The caller can also provide extra data
42a30ddda9SJoakim Bech  * that will be mixed together with existing device unique properties. If no
43a30ddda9SJoakim Bech  * extra data is provided, then the derived key will only use device unique
44a30ddda9SJoakim Bech  * properties and caller TA UUID.
45a30ddda9SJoakim Bech  *
46a30ddda9SJoakim Bech  * [in]  params[0].memref.buffer     Buffer for extra data
47a30ddda9SJoakim Bech  * [in]  params[0].memref.size       Size of extra data (max 1024 bytes)
48a30ddda9SJoakim Bech  * [out] params[1].memref.buffer     Buffer for the derived key
49a30ddda9SJoakim Bech  * [out] params[1].memref.size       Size of the derived key (16 to 32 bytes)
50a30ddda9SJoakim Bech  */
51a30ddda9SJoakim Bech #define PTA_SYSTEM_DERIVE_TA_UNIQUE_KEY 1
52a30ddda9SJoakim Bech 
53b5b6225fSJens Wiklander /* Memory can be shared with other TAs */
54b5b6225fSJens Wiklander #define PTA_SYSTEM_MAP_FLAG_SHAREABLE	BIT32(0)
550b414d3fSJens Wiklander /* Read/write memory */
560b414d3fSJens Wiklander #define PTA_SYSTEM_MAP_FLAG_WRITEABLE	BIT32(1)
570b414d3fSJens Wiklander /* Executable memory */
580b414d3fSJens Wiklander #define PTA_SYSTEM_MAP_FLAG_EXECUTABLE	BIT32(2)
59b5b6225fSJens Wiklander 
60b5b6225fSJens Wiklander /*
61b5b6225fSJens Wiklander  * Map zero initialized memory
62b5b6225fSJens Wiklander  *
63b5b6225fSJens Wiklander  * [in]	    value[0].a: Number of bytes
64b5b6225fSJens Wiklander  * [in]	    value[0].b: Flags, 0 or PTA_SYSTEM_MAP_FLAG_SHAREABLE
65b5b6225fSJens Wiklander  * [out]    value[1].a: Address upper 32-bits
66b5b6225fSJens Wiklander  * [out]    value[1].b: Address lower 32-bits
67b5b6225fSJens Wiklander  * [in]     value[2].a: Extra pad before memory range
68b5b6225fSJens Wiklander  * [in]     value[2].b: Extra pad after memory range
69b5b6225fSJens Wiklander  */
70b5b6225fSJens Wiklander #define PTA_SYSTEM_MAP_ZI		2
71b5b6225fSJens Wiklander 
72b5b6225fSJens Wiklander /*
73b5b6225fSJens Wiklander  * Unmap memory
74b5b6225fSJens Wiklander  *
75b5b6225fSJens Wiklander  * [in]	    value[0].a: Number of bytes
76b5b6225fSJens Wiklander  * [in]	    value[0].b: Must be 0
77b5b6225fSJens Wiklander  * [in]	    value[1].a: Address upper 32-bits
78b5b6225fSJens Wiklander  * [in]	    value[1].b: Address lower 32-bits
79b5b6225fSJens Wiklander  */
80b5b6225fSJens Wiklander #define PTA_SYSTEM_UNMAP		3
81b5b6225fSJens Wiklander 
820b414d3fSJens Wiklander /*
830b414d3fSJens Wiklander  * Find and opens an TA binary and return a handle
840b414d3fSJens Wiklander  *
850b414d3fSJens Wiklander  * [in]	    memref[0]:	UUID of TA binary
860b414d3fSJens Wiklander  * [out]    value[1].a:	Handle to TA binary
870b414d3fSJens Wiklander  * [out]    value[1].b:	0
880b414d3fSJens Wiklander  */
890b414d3fSJens Wiklander #define PTA_SYSTEM_OPEN_TA_BINARY	4
900b414d3fSJens Wiklander 
910b414d3fSJens Wiklander /*
920b414d3fSJens Wiklander  * Close an TA binary handle
930b414d3fSJens Wiklander  *
940b414d3fSJens Wiklander  * When a TA is done mapping new parts of an TA binary it closes the handle
950b414d3fSJens Wiklander  * to free resources, established mappings remains.
960b414d3fSJens Wiklander  *
970b414d3fSJens Wiklander  * [in]     value[1].a:	Handle to TA binary
980b414d3fSJens Wiklander  * [in]     value[1].b:	Must be 0
990b414d3fSJens Wiklander  *
1000b414d3fSJens Wiklander  * Returns TEE_SUCCESS if the TA binary was verified successfully.
1010b414d3fSJens Wiklander  */
1020b414d3fSJens Wiklander #define PTA_SYSTEM_CLOSE_TA_BINARY	5
1030b414d3fSJens Wiklander 
1040b414d3fSJens Wiklander /*
1050b414d3fSJens Wiklander  * Map segment of TA binary
1060b414d3fSJens Wiklander  *
1070b414d3fSJens Wiklander  * Different parts of an TA binary file needs different permissions.
1080b414d3fSJens Wiklander  * Read-write mapped parts are private to the TA, while read-only (which
1090b414d3fSJens Wiklander  * includes execute) mapped parts are shared with other TAs. This is
1100b414d3fSJens Wiklander  * transparent to the TA. If the supplied address in value[3] is 0 a
1110b414d3fSJens Wiklander  * suitable address is selected, else it will either be mapped at that
1120b414d3fSJens Wiklander  * address of an error is returned.
1130b414d3fSJens Wiklander  *
1140b414d3fSJens Wiklander  * [in]     value[0].a:	Handle to TA binary
1150b414d3fSJens Wiklander  * [in]     value[0].b:	Flags, PTA_SYSTEM_MAP_FLAG_*
1160b414d3fSJens Wiklander  * [in]     value[1].a:	Offset into TA binary, must be page aligned
1170b414d3fSJens Wiklander  * [in]     value[1].b:	Number of bytes, the last page will be zero
1180b414d3fSJens Wiklander  *			extended if not page aligned
1190b414d3fSJens Wiklander  * [in/out] value[2].a:	Address upper 32-bits
1200b414d3fSJens Wiklander  * [in/out] value[2].b:	Address lower 32-bits
1210b414d3fSJens Wiklander  * [in]     value[3].a: Extra pad before memory range
1220b414d3fSJens Wiklander  * [in]     value[3].b: Extra pad after memory range
1230b414d3fSJens Wiklander  */
1240b414d3fSJens Wiklander #define PTA_SYSTEM_MAP_TA_BINARY	6
1250b414d3fSJens Wiklander 
1260b414d3fSJens Wiklander /*
1270b414d3fSJens Wiklander  * Copy a memory range from TA binary
1280b414d3fSJens Wiklander  *
1290b414d3fSJens Wiklander  * [in]     value[0].a:	Handle to TA binary
1300b414d3fSJens Wiklander  * [in]     value[0].b:	Offset into TA binary
1310b414d3fSJens Wiklander  * [out]    memref[1]:	Destination
1320b414d3fSJens Wiklander  */
1330b414d3fSJens Wiklander #define PTA_SYSTEM_COPY_FROM_TA_BINARY	7
1340b414d3fSJens Wiklander 
1350a563c6fSJens Wiklander /*
1360a563c6fSJens Wiklander  * Set memory protection
1370a563c6fSJens Wiklander  *
1380a563c6fSJens Wiklander  * [in]	    value[0].a: Number of bytes
1390a563c6fSJens Wiklander  * [in]     value[0].b:	Flags, PTA_SYSTEM_MAP_FLAG_*
1400a563c6fSJens Wiklander  * [in]	    value[1].a: Address upper 32-bits
1410a563c6fSJens Wiklander  * [in]	    value[1].b: Address lower 32-bits
1420a563c6fSJens Wiklander  */
1430a563c6fSJens Wiklander #define PTA_SYSTEM_SET_PROT		8
1440a563c6fSJens Wiklander 
14534db7172SJens Wiklander /*
14634db7172SJens Wiklander  * Remap a segment of a TA mapping
14734db7172SJens Wiklander  *
14834db7172SJens Wiklander  * Moves an already mapped segment of a TA to a new address. If the
14934db7172SJens Wiklander  * supplied new address is 0 a suitable address is selected, else it will
15034db7172SJens Wiklander  * either be mapped at that address or an error is returned.
15134db7172SJens Wiklander  *
15234db7172SJens Wiklander  * [in]	    value[0].a: Number of bytes, must match length rounded up to
15334db7172SJens Wiklander  *			closest page of original mapping
15434db7172SJens Wiklander  * [in]     value[0].b:	Must be 0
15534db7172SJens Wiklander  * [in]	    value[1].a:	Old address upper 32-bits
15634db7172SJens Wiklander  * [in]     value[1].b:	Old address lower 32-bits
15734db7172SJens Wiklander  * [in/out] value[2].a:	New address upper 32-bits
15834db7172SJens Wiklander  * [in/out] value[2].b:	New address lower 32-bits
15934db7172SJens Wiklander  * [in]     value[3].a: Extra pad before memory range
16034db7172SJens Wiklander  * [in]     value[3].b: Extra pad after memory range
16134db7172SJens Wiklander  */
16234db7172SJens Wiklander #define PTA_SYSTEM_REMAP		9
16334db7172SJens Wiklander 
164ebef121cSJerome Forissier /*
165ebef121cSJerome Forissier  * Load a shared library
166ebef121cSJerome Forissier  *
167ebef121cSJerome Forissier  * [in]     memref[0]: the UUID of the shared library (@filename)
168ebef121cSJerome Forissier  * [in]     value[1].a: @flags, must be (RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE)
169ebef121cSJerome Forissier  *
170ebef121cSJerome Forissier  * Used by: (libdl) dlopen(const char *filename, int flags)
171ebef121cSJerome Forissier  */
172ebef121cSJerome Forissier #define PTA_SYSTEM_DLOPEN               10
173ebef121cSJerome Forissier 
174ebef121cSJerome Forissier /*
175ebef121cSJerome Forissier  * Resolve a symbol in a previously loaded shared library or in the whole TA
176ebef121cSJerome Forissier  *
177ebef121cSJerome Forissier  * [in]     memref[0]: the UUID of the shared library, or the nil UUID to
178ebef121cSJerome Forissier  *                     search the whole TA
179ebef121cSJerome Forissier  * [in]     memref[1]: symbol name (@symbol)
180ebef121cSJerome Forissier  * [out]    value[2]: address of the symbol or NULL
181ebef121cSJerome Forissier  *
182ebef121cSJerome Forissier  * Used by: (libdl) dlsym(void *handle, const char *symbol)
183ebef121cSJerome Forissier  */
184ebef121cSJerome Forissier #define PTA_SYSTEM_DLSYM                11
185ebef121cSJerome Forissier 
186dd333f03SJavier Almansa Sobrino /*
187dd333f03SJavier Almansa Sobrino  * Retrieves a copy of the TPM Event log held in secure memory.
188dd333f03SJavier Almansa Sobrino  *
189dd333f03SJavier Almansa Sobrino  * [out]    memref[0]: Pointer to the buffer where to store the event log.
190dd333f03SJavier Almansa Sobrino  */
191dd333f03SJavier Almansa Sobrino #define PTA_SYSTEM_GET_TPM_EVENT_LOG	12
192dd333f03SJavier Almansa Sobrino 
193*e4ad5ccdSAleksandr Anisimov /*
194*e4ad5ccdSAleksandr Anisimov  * Invoke a tee-supplicant's plugin
195*e4ad5ccdSAleksandr Anisimov  *
196*e4ad5ccdSAleksandr Anisimov  * [in]     memref[0]        uuid of the plugin (TEE_UUID)
197*e4ad5ccdSAleksandr Anisimov  * [in]     value[1].a       command for the plugin
198*e4ad5ccdSAleksandr Anisimov  * [in]     value[1].b       sub_command for the plugin
199*e4ad5ccdSAleksandr Anisimov  * [in/out] memref[2]        additional data for the plugin
200*e4ad5ccdSAleksandr Anisimov  * [out]    value[3].a       output length of data
201*e4ad5ccdSAleksandr Anisimov  */
202*e4ad5ccdSAleksandr Anisimov #define PTA_SYSTEM_SUPP_PLUGIN_INVOKE	13
203*e4ad5ccdSAleksandr Anisimov 
2044bca302aSIgor Opaniuk #endif /* __PTA_SYSTEM_H */
205