diff options
Diffstat (limited to 'security/tee_client_api/schannel6_protocol.h')
-rw-r--r-- | security/tee_client_api/schannel6_protocol.h | 425 |
1 files changed, 425 insertions, 0 deletions
diff --git a/security/tee_client_api/schannel6_protocol.h b/security/tee_client_api/schannel6_protocol.h new file mode 100644 index 0000000..66ed12c --- /dev/null +++ b/security/tee_client_api/schannel6_protocol.h @@ -0,0 +1,425 @@ +/** + * Copyright(c) 2011 Trusted Logic. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name Trusted Logic nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __SCHANNEL6_PROTOCOL_H__ +#define __SCHANNEL6_PROTOCOL_H__ + +#include "s_type.h" + +/** + * This header file defines some structures needed for the secure channel + * protocol. See your Product Reference Manual for a specification of the + * SChannel protocol. + */ +// jroux to do : remove +#undef SMC_PROTOCOL_VERSION +#define SMC_PROTOCOL_VERSION 0x06000000 + +/** + * Time representation. + */ +typedef uint64_t SCTIME; + +#define SCTIME_IMMEDIATE ((uint64_t) 0x0000000000000000ULL) +#define SCTIME_INFINITE ((uint64_t) 0xFFFFFFFFFFFFFFFFULL) + +/* + * Message types + */ +#define SCX_CREATE_DEVICE_CONTEXT 0x02 +#define SCX_DESTROY_DEVICE_CONTEXT 0xFD +#define SCX_REGISTER_SHARED_MEMORY 0xF7 +#define SCX_RELEASE_SHARED_MEMORY 0xF9 +#define SCX_OPEN_CLIENT_SESSION 0xF0 +#define SCX_CLOSE_CLIENT_SESSION 0xF2 +#define SCX_INVOKE_CLIENT_COMMAND 0xF5 +#define SCX_CANCEL_CLIENT_OPERATION 0xF4 +#define SCX_MANAGEMENT 0xFE + +/* + * Shared mem flags + */ +#define SCX_SHARED_MEM_FLAG_INPUT 1 +#define SCX_SHARED_MEM_FLAG_OUTPUT 2 +#define SCX_SHARED_MEM_FLAG_INOUT 3 + +/* + * Parameter types + */ +#define SCX_PARAM_TYPE_NONE 0x0 +#define SCX_PARAM_TYPE_VALUE_INPUT 0x1 +#define SCX_PARAM_TYPE_VALUE_OUTPUT 0x2 +#define SCX_PARAM_TYPE_VALUE_INOUT 0x3 +#define SCX_PARAM_TYPE_MEMREF_TEMP_INPUT 0x5 +#define SCX_PARAM_TYPE_MEMREF_TEMP_OUTPUT 0x6 +#define SCX_PARAM_TYPE_MEMREF_TEMP_INOUT 0x7 +#define SCX_PARAM_TYPE_MEMREF_INPUT 0xD +#define SCX_PARAM_TYPE_MEMREF_OUTPUT 0xE +#define SCX_PARAM_TYPE_MEMREF_INOUT 0xF + +#define SCX_PARAM_TYPE_INPUT_FLAG 0x1 +#define SCX_PARAM_TYPE_OUTPUT_FLAG 0x2 +#define SCX_PARAM_TYPE_MEMREF_FLAG 0x4 +#define SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG 0x8 + +#define SCX_PARAM_TYPE_IS_TMPREF(nParamType) (((nParamType) & (SCX_PARAM_TYPE_MEMREF_FLAG | SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG)) == SCX_PARAM_TYPE_MEMREF_FLAG) + +#define SCX_MAKE_PARAM_TYPES(t0, t1, t2, t3) ((t0) | ((t1) << 4) | ((t2) << 8) | ((t3) << 12)) +#define SCX_GET_PARAM_TYPE(t, i) (((t) >> (4*i)) & 0xF) + +/* + * return origins + */ +#define SCX_ORIGIN_COMMS 2 +#define SCX_ORIGIN_TEE 3 +#define SCX_ORIGIN_TRUSTED_APP 4 + +/* + * Login types + */ +#include "schannel6_logins.h" + +/** + * Command parameters. + */ +typedef struct +{ + uint32_t a; + uint32_t b; +}SCHANNEL6_COMMAND_PARAM_VALUE; + +typedef struct +{ + uint32_t nDescriptor; + uint32_t nSize; + uint32_t nOffset; /* Socket: 4 weak bits of the address (for alignement checks) */ + +}SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF; + +typedef struct +{ + S_HANDLE hBlock; + uint32_t nSize; + uint32_t nOffset; + +}SCHANNEL6_COMMAND_PARAM_MEMREF; + +typedef union +{ + SCHANNEL6_COMMAND_PARAM_VALUE sValue; + SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF sTempMemref; + SCHANNEL6_COMMAND_PARAM_MEMREF sMemref; + +} SCHANNEL6_COMMAND_PARAM; + +typedef struct +{ + uint32_t a; + uint32_t b; +} SCHANNEL6_ANSWER_PARAM_VALUE; + +typedef struct +{ + uint32_t _ignored; + uint32_t nSize; +} SCHANNEL6_ANSWER_PARAM_SIZE; + +typedef union +{ + SCHANNEL6_ANSWER_PARAM_SIZE sSize; + SCHANNEL6_ANSWER_PARAM_VALUE sValue; +} SCHANNEL6_ANSWER_PARAM; + +/** + * Command messages. + */ + typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ +}SCHANNEL6_COMMAND_HEADER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + uint32_t nDeviceContextID; /* an opaque Normal World identifier for the device context */ +}SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nParamTypes; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + S_HANDLE hClientSession; + uint64_t sTimeout; + uint32_t nCancellationID; + uint32_t nClientCommandIdentifier; + SCHANNEL6_COMMAND_PARAM sParams[4]; +}SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nParamTypes; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + uint32_t nCancellationID; + SCTIME sTimeout; + S_UUID sDestinationUUID; + SCHANNEL6_COMMAND_PARAM sParams[4]; + uint32_t nLoginType; + uint8_t sLoginData[20]; /* Size depends on the login type. */ + +}SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMemoryFlags; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + uint32_t nBlockID; + uint32_t nSharedMemSize; + uint32_t nSharedMemStartOffset; + uint32_t nSharedMemDescriptors[8]; + +}SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + S_HANDLE hBlock; + +}SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + S_HANDLE hClientSession; + uint32_t nCancellationID; + +}SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + S_HANDLE hClientSession; + +}SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + S_HANDLE hDeviceContext; + +}SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND; + +#define SCHANNEL6_MANAGEMENT_COMMAND_HIBERNATE 1 +#define SCHANNEL6_MANAGEMENT_COMMAND_SHUTDOWN 2 +#define SCHANNEL6_MANAGEMENT_COMMAND_PREPARE_FOR_CORE_OFF 3 +#define SCHANNEL6_MANAGEMENT_COMMAND_RESUME_FROM_CORE_OFF 4 + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nCommand; + uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ + uint32_t nW3BSize; + uint32_t nW3BStartOffset; +#ifdef SCHANNEL_TRUSTZONE + uint32_t nSharedMemDescriptors[128]; +#endif +}SCHANNEL6_MANAGEMENT_COMMAND; + +typedef union +{ + SCHANNEL6_COMMAND_HEADER sHeader; + SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND sCreateDeviceContext; + SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND sDestroyDeviceContext; + SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND sOpenClientSession; + SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND sCloseClientSession; + SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND sRegisterSharedMemory; + SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND sReleaseSharedMemory; + SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND sInvokeClientCommand; + SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND sCancelClientOperation; + SCHANNEL6_MANAGEMENT_COMMAND sManagement; + +}SCHANNEL6_COMMAND; + +/** + * Answer messages. + */ +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo; + uint32_t nOperationID; + uint32_t nErrorCode; +}SCHANNEL6_ANSWER_HEADER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; + S_HANDLE hDeviceContext; +}SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint8_t nReturnOrigin; + uint8_t __nReserved; + uint32_t nOperationID; + uint32_t nErrorCode; + SCHANNEL6_ANSWER_PARAM sAnswers[4]; + +}SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint8_t nReturnOrigin; + uint8_t __nReserved; + uint32_t nOperationID; + uint32_t nErrorCode; + S_HANDLE hClientSession; + SCHANNEL6_ANSWER_PARAM sAnswers[4]; +}SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; +}SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; + S_HANDLE hBlock; + +}SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; + uint32_t nBlockID; + +}SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; + uint32_t nDeviceContextID; + +}SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; + +}SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER; + +typedef struct +{ + uint8_t nMessageSize; + uint8_t nMessageType; + uint16_t nMessageInfo_RFU; + uint32_t nOperationID; + uint32_t nErrorCode; + +}SCHANNEL6_MANAGEMENT_ANSWER; + +typedef union +{ + SCHANNEL6_ANSWER_HEADER sHeader; + SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER sCreateDeviceContext; + SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER sOpenClientSession; + SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER sRegisterSharedMemory; + SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER sReleaseSharedMemory; + SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER sInvokeClientCommand; + SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER sDestroyDeviceContext; + SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER sCancelClientOperation; + SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER sCloseClientSession; + SCHANNEL6_MANAGEMENT_ANSWER sManagement; + +}SCHANNEL6_ANSWER; + + +#endif /* __SCHANNEL6_PROTOCOL_H__ */ |