1/** 2 * Copyright(c) 2011 Trusted Logic. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name Trusted Logic nor the names of its 15 * contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#ifndef __SCHANNEL6_PROTOCOL_H__ 32#define __SCHANNEL6_PROTOCOL_H__ 33 34#include "s_type.h" 35 36/** 37 * This header file defines some structures needed for the secure channel 38 * protocol. See your Product Reference Manual for a specification of the 39 * SChannel protocol. 40 */ 41// jroux to do : remove 42#undef SMC_PROTOCOL_VERSION 43#define SMC_PROTOCOL_VERSION 0x06000000 44 45/** 46 * Time representation. 47 */ 48typedef uint64_t SCTIME; 49 50#define SCTIME_IMMEDIATE ((uint64_t) 0x0000000000000000ULL) 51#define SCTIME_INFINITE ((uint64_t) 0xFFFFFFFFFFFFFFFFULL) 52 53/* 54 * Message types 55 */ 56#define SCX_CREATE_DEVICE_CONTEXT 0x02 57#define SCX_DESTROY_DEVICE_CONTEXT 0xFD 58#define SCX_REGISTER_SHARED_MEMORY 0xF7 59#define SCX_RELEASE_SHARED_MEMORY 0xF9 60#define SCX_OPEN_CLIENT_SESSION 0xF0 61#define SCX_CLOSE_CLIENT_SESSION 0xF2 62#define SCX_INVOKE_CLIENT_COMMAND 0xF5 63#define SCX_CANCEL_CLIENT_OPERATION 0xF4 64#define SCX_MANAGEMENT 0xFE 65 66/* 67 * Shared mem flags 68 */ 69#define SCX_SHARED_MEM_FLAG_INPUT 1 70#define SCX_SHARED_MEM_FLAG_OUTPUT 2 71#define SCX_SHARED_MEM_FLAG_INOUT 3 72 73/* 74 * Parameter types 75 */ 76#define SCX_PARAM_TYPE_NONE 0x0 77#define SCX_PARAM_TYPE_VALUE_INPUT 0x1 78#define SCX_PARAM_TYPE_VALUE_OUTPUT 0x2 79#define SCX_PARAM_TYPE_VALUE_INOUT 0x3 80#define SCX_PARAM_TYPE_MEMREF_TEMP_INPUT 0x5 81#define SCX_PARAM_TYPE_MEMREF_TEMP_OUTPUT 0x6 82#define SCX_PARAM_TYPE_MEMREF_TEMP_INOUT 0x7 83#define SCX_PARAM_TYPE_MEMREF_INPUT 0xD 84#define SCX_PARAM_TYPE_MEMREF_OUTPUT 0xE 85#define SCX_PARAM_TYPE_MEMREF_INOUT 0xF 86 87#define SCX_PARAM_TYPE_INPUT_FLAG 0x1 88#define SCX_PARAM_TYPE_OUTPUT_FLAG 0x2 89#define SCX_PARAM_TYPE_MEMREF_FLAG 0x4 90#define SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG 0x8 91 92#define SCX_PARAM_TYPE_IS_TMPREF(nParamType) (((nParamType) & (SCX_PARAM_TYPE_MEMREF_FLAG | SCX_PARAM_TYPE_REGISTERED_MEMREF_FLAG)) == SCX_PARAM_TYPE_MEMREF_FLAG) 93 94#define SCX_MAKE_PARAM_TYPES(t0, t1, t2, t3) ((t0) | ((t1) << 4) | ((t2) << 8) | ((t3) << 12)) 95#define SCX_GET_PARAM_TYPE(t, i) (((t) >> (4*i)) & 0xF) 96 97/* 98 * return origins 99 */ 100#define SCX_ORIGIN_COMMS 2 101#define SCX_ORIGIN_TEE 3 102#define SCX_ORIGIN_TRUSTED_APP 4 103 104/* 105 * Login types 106 */ 107#include "schannel6_logins.h" 108 109/** 110 * Command parameters. 111 */ 112typedef struct 113{ 114 uint32_t a; 115 uint32_t b; 116}SCHANNEL6_COMMAND_PARAM_VALUE; 117 118typedef struct 119{ 120 uint32_t nDescriptor; 121 uint32_t nSize; 122 uint32_t nOffset; /* Socket: 4 weak bits of the address (for alignement checks) */ 123 124}SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF; 125 126typedef struct 127{ 128 S_HANDLE hBlock; 129 uint32_t nSize; 130 uint32_t nOffset; 131 132}SCHANNEL6_COMMAND_PARAM_MEMREF; 133 134typedef union 135{ 136 SCHANNEL6_COMMAND_PARAM_VALUE sValue; 137 SCHANNEL6_COMMAND_PARAM_TEMP_MEMREF sTempMemref; 138 SCHANNEL6_COMMAND_PARAM_MEMREF sMemref; 139 140} SCHANNEL6_COMMAND_PARAM; 141 142typedef struct 143{ 144 uint32_t a; 145 uint32_t b; 146} SCHANNEL6_ANSWER_PARAM_VALUE; 147 148typedef struct 149{ 150 uint32_t _ignored; 151 uint32_t nSize; 152} SCHANNEL6_ANSWER_PARAM_SIZE; 153 154typedef union 155{ 156 SCHANNEL6_ANSWER_PARAM_SIZE sSize; 157 SCHANNEL6_ANSWER_PARAM_VALUE sValue; 158} SCHANNEL6_ANSWER_PARAM; 159 160/** 161 * Command messages. 162 */ 163 typedef struct 164{ 165 uint8_t nMessageSize; 166 uint8_t nMessageType; 167 uint16_t nMessageInfo; 168 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 169}SCHANNEL6_COMMAND_HEADER; 170 171typedef struct 172{ 173 uint8_t nMessageSize; 174 uint8_t nMessageType; 175 uint16_t nMessageInfo_RFU; 176 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 177 uint32_t nDeviceContextID; /* an opaque Normal World identifier for the device context */ 178}SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND; 179 180typedef struct 181{ 182 uint8_t nMessageSize; 183 uint8_t nMessageType; 184 uint16_t nParamTypes; 185 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 186 S_HANDLE hDeviceContext; 187 S_HANDLE hClientSession; 188 uint64_t sTimeout; 189 uint32_t nCancellationID; 190 uint32_t nClientCommandIdentifier; 191 SCHANNEL6_COMMAND_PARAM sParams[4]; 192}SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND; 193 194typedef struct 195{ 196 uint8_t nMessageSize; 197 uint8_t nMessageType; 198 uint16_t nParamTypes; 199 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 200 S_HANDLE hDeviceContext; 201 uint32_t nCancellationID; 202 SCTIME sTimeout; 203 S_UUID sDestinationUUID; 204 SCHANNEL6_COMMAND_PARAM sParams[4]; 205 uint32_t nLoginType; 206 uint8_t sLoginData[20]; /* Size depends on the login type. */ 207 208}SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND; 209 210typedef struct 211{ 212 uint8_t nMessageSize; 213 uint8_t nMessageType; 214 uint16_t nMemoryFlags; 215 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 216 S_HANDLE hDeviceContext; 217 uint32_t nBlockID; 218 uint32_t nSharedMemSize; 219 uint32_t nSharedMemStartOffset; 220 uint32_t nSharedMemDescriptors[8]; 221 222}SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND; 223 224typedef struct 225{ 226 uint8_t nMessageSize; 227 uint8_t nMessageType; 228 uint16_t nMessageInfo_RFU; 229 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 230 S_HANDLE hDeviceContext; 231 S_HANDLE hBlock; 232 233}SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND; 234 235typedef struct 236{ 237 uint8_t nMessageSize; 238 uint8_t nMessageType; 239 uint16_t nMessageInfo_RFU; 240 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 241 S_HANDLE hDeviceContext; 242 S_HANDLE hClientSession; 243 uint32_t nCancellationID; 244 245}SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND; 246 247typedef struct 248{ 249 uint8_t nMessageSize; 250 uint8_t nMessageType; 251 uint16_t nMessageInfo_RFU; 252 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 253 S_HANDLE hDeviceContext; 254 S_HANDLE hClientSession; 255 256}SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND; 257 258typedef struct 259{ 260 uint8_t nMessageSize; 261 uint8_t nMessageType; 262 uint16_t nMessageInfo_RFU; 263 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 264 S_HANDLE hDeviceContext; 265 266}SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND; 267 268#define SCHANNEL6_MANAGEMENT_COMMAND_HIBERNATE 1 269#define SCHANNEL6_MANAGEMENT_COMMAND_SHUTDOWN 2 270#define SCHANNEL6_MANAGEMENT_COMMAND_PREPARE_FOR_CORE_OFF 3 271#define SCHANNEL6_MANAGEMENT_COMMAND_RESUME_FROM_CORE_OFF 4 272 273typedef struct 274{ 275 uint8_t nMessageSize; 276 uint8_t nMessageType; 277 uint16_t nCommand; 278 uint32_t nOperationID; /* an opaque Normal World identifier for the operation */ 279 uint32_t nW3BSize; 280 uint32_t nW3BStartOffset; 281#ifdef SCHANNEL_TRUSTZONE 282 uint32_t nSharedMemDescriptors[128]; 283#endif 284}SCHANNEL6_MANAGEMENT_COMMAND; 285 286typedef union 287{ 288 SCHANNEL6_COMMAND_HEADER sHeader; 289 SCHANNEL6_CREATE_DEVICE_CONTEXT_COMMAND sCreateDeviceContext; 290 SCHANNEL6_DESTROY_DEVICE_CONTEXT_COMMAND sDestroyDeviceContext; 291 SCHANNEL6_OPEN_CLIENT_SESSION_COMMAND sOpenClientSession; 292 SCHANNEL6_CLOSE_CLIENT_SESSION_COMMAND sCloseClientSession; 293 SCHANNEL6_REGISTER_SHARED_MEMORY_COMMAND sRegisterSharedMemory; 294 SCHANNEL6_RELEASE_SHARED_MEMORY_COMMAND sReleaseSharedMemory; 295 SCHANNEL6_INVOKE_CLIENT_COMMAND_COMMAND sInvokeClientCommand; 296 SCHANNEL6_CANCEL_CLIENT_OPERATION_COMMAND sCancelClientOperation; 297 SCHANNEL6_MANAGEMENT_COMMAND sManagement; 298 299}SCHANNEL6_COMMAND; 300 301/** 302 * Answer messages. 303 */ 304typedef struct 305{ 306 uint8_t nMessageSize; 307 uint8_t nMessageType; 308 uint16_t nMessageInfo; 309 uint32_t nOperationID; 310 uint32_t nErrorCode; 311}SCHANNEL6_ANSWER_HEADER; 312 313typedef struct 314{ 315 uint8_t nMessageSize; 316 uint8_t nMessageType; 317 uint16_t nMessageInfo_RFU; 318 uint32_t nOperationID; 319 uint32_t nErrorCode; 320 S_HANDLE hDeviceContext; 321}SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER; 322 323typedef struct 324{ 325 uint8_t nMessageSize; 326 uint8_t nMessageType; 327 uint8_t nReturnOrigin; 328 uint8_t __nReserved; 329 uint32_t nOperationID; 330 uint32_t nErrorCode; 331 SCHANNEL6_ANSWER_PARAM sAnswers[4]; 332 333}SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER; 334 335typedef struct 336{ 337 uint8_t nMessageSize; 338 uint8_t nMessageType; 339 uint8_t nReturnOrigin; 340 uint8_t __nReserved; 341 uint32_t nOperationID; 342 uint32_t nErrorCode; 343 S_HANDLE hClientSession; 344 SCHANNEL6_ANSWER_PARAM sAnswers[4]; 345}SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER; 346 347typedef struct 348{ 349 uint8_t nMessageSize; 350 uint8_t nMessageType; 351 uint16_t nMessageInfo_RFU; 352 uint32_t nOperationID; 353 uint32_t nErrorCode; 354}SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER; 355 356typedef struct 357{ 358 uint8_t nMessageSize; 359 uint8_t nMessageType; 360 uint16_t nMessageInfo_RFU; 361 uint32_t nOperationID; 362 uint32_t nErrorCode; 363 S_HANDLE hBlock; 364 365}SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER; 366 367typedef struct 368{ 369 uint8_t nMessageSize; 370 uint8_t nMessageType; 371 uint16_t nMessageInfo_RFU; 372 uint32_t nOperationID; 373 uint32_t nErrorCode; 374 uint32_t nBlockID; 375 376}SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER; 377 378typedef struct 379{ 380 uint8_t nMessageSize; 381 uint8_t nMessageType; 382 uint16_t nMessageInfo_RFU; 383 uint32_t nOperationID; 384 uint32_t nErrorCode; 385 uint32_t nDeviceContextID; 386 387}SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER; 388 389typedef struct 390{ 391 uint8_t nMessageSize; 392 uint8_t nMessageType; 393 uint16_t nMessageInfo_RFU; 394 uint32_t nOperationID; 395 uint32_t nErrorCode; 396 397}SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER; 398 399typedef struct 400{ 401 uint8_t nMessageSize; 402 uint8_t nMessageType; 403 uint16_t nMessageInfo_RFU; 404 uint32_t nOperationID; 405 uint32_t nErrorCode; 406 407}SCHANNEL6_MANAGEMENT_ANSWER; 408 409typedef union 410{ 411 SCHANNEL6_ANSWER_HEADER sHeader; 412 SCHANNEL6_CREATE_DEVICE_CONTEXT_ANSWER sCreateDeviceContext; 413 SCHANNEL6_OPEN_CLIENT_SESSION_ANSWER sOpenClientSession; 414 SCHANNEL6_REGISTER_SHARED_MEMORY_ANSWER sRegisterSharedMemory; 415 SCHANNEL6_RELEASE_SHARED_MEMORY_ANSWER sReleaseSharedMemory; 416 SCHANNEL6_INVOKE_CLIENT_COMMAND_ANSWER sInvokeClientCommand; 417 SCHANNEL6_DESTROY_DEVICE_CONTEXT_ANSWER sDestroyDeviceContext; 418 SCHANNEL6_CANCEL_CLIENT_OPERATION_ANSWER sCancelClientOperation; 419 SCHANNEL6_CLOSE_CLIENT_SESSION_ANSWER sCloseClientSession; 420 SCHANNEL6_MANAGEMENT_ANSWER sManagement; 421 422}SCHANNEL6_ANSWER; 423 424 425#endif /* __SCHANNEL6_PROTOCOL_H__ */ 426