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  */
48 typedef 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  */
112 typedef struct
113 {
114    uint32_t    a;
115    uint32_t    b;
116 }SCHANNEL6_COMMAND_PARAM_VALUE;
117 
118 typedef 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 
126 typedef struct
127 {
128    S_HANDLE    hBlock;
129    uint32_t    nSize;
130    uint32_t    nOffset;
131 
132 }SCHANNEL6_COMMAND_PARAM_MEMREF;
133 
134 typedef 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 
142 typedef struct
143 {
144    uint32_t a;
145    uint32_t b;
146 } SCHANNEL6_ANSWER_PARAM_VALUE;
147 
148 typedef struct
149 {
150    uint32_t _ignored;
151    uint32_t nSize;
152 } SCHANNEL6_ANSWER_PARAM_SIZE;
153 
154 typedef 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 
171 typedef 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 
180 typedef 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 
194 typedef 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 
210 typedef 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 
224 typedef 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 
235 typedef 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 
247 typedef 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 
258 typedef 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 
273 typedef 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 
286 typedef 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  */
304 typedef 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 
313 typedef 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 
323 typedef 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 
335 typedef 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 
347 typedef 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 
356 typedef 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 
367 typedef 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 
378 typedef 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 
389 typedef 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 
399 typedef 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 
409 typedef 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