SEFile
Userspace drivers to manage a secure filesystem
 All Data Structures Files Functions Variables Typedefs Enumerator Macros Groups
se3c0def.h
1 #pragma once
2 
3 #include <stdlib.h>
4 #include <stdint.h>
5 #include <stddef.h>
6 #include <stdbool.h>
7 
8 #if defined(CUBESIM)
9 #include "stubs.h"
10 #include <time.h>
11 #endif
12 #if defined(CUBESIM) && defined(_DEBUG)
13 #include <stdio.h>
14 #define SE3_TRACE(msg) printf msg
15 #else
16 #define SE3_TRACE(msg)
17 #endif
18 
19 #define SE3_CONF_CRC 0
20 
21 #define SE3_SET64(x, pos, val) do{ memcpy(((uint8_t*)(x))+pos, (void*)&(val), 8); }while(0)
22 #define SE3_SET32(x, pos, val) do{ memcpy(((uint8_t*)(x))+pos, (void*)&(val), 4); }while(0)
23 #define SE3_SET16(x, pos, val) do{ memcpy(((uint8_t*)(x))+pos, (void*)&(val), 2); }while(0)
24 #define SE3_GET64(x, pos, val) do{ memcpy((void*)&(val), ((uint8_t*)(x))+pos, 8); }while(0)
25 #define SE3_GET32(x, pos, val) do{ memcpy((void*)&(val), ((uint8_t*)(x))+pos, 4); }while(0)
26 #define SE3_GET16(x, pos, val) do{ memcpy((void*)&(val), ((uint8_t*)(x))+pos, 2); }while(0)
27 
28 #define SE3_BIT_SET(val, n) do{ val |= (1 << (n)); }while(0)
29 #define SE3_BIT_CLEAR(val, n) do{ val &= ~(1 << (n)); }while(0)
30 #define SE3_BIT_TEST(val, n) (val & (1<< (n)))
31 
32 enum {
33  SE3_COMM_BLOCK = 512,
34  SE3_COMM_N = 16
35 };
36 
37 enum {
38  SE3_MAGIC_SIZE = 32,
39  SE3_HELLO_SIZE = 32,
40  SE3_SERIAL_SIZE = 32
41 };
42 
44 enum {
45  SE3_OK = 0,
46  SE3_ERR_HW = 0xF001,
47  SE3_ERR_COMM = 0xF002,
48  SE3_ERR_BUSY = 0xF003,
49  SE3_ERR_STATE = 0xF004,
50  SE3_ERR_CMD = 0xF005,
51  SE3_ERR_PARAMS = 0xF006,
52 };
53 
55 enum {
56  SE3_CMD0_FACTORY_INIT = 1,
57  SE3_CMD0_ECHO = 2,
58  SE3_CMD0_L1 = 3
59 };
60 
62 enum {
63  SE3_CMDFLAG_ENCRYPT = (1 << 15),
64  SE3_CMDFLAG_SIGN = (1 << 14)
65 };
66 
68 enum {
69  SE3_REQ_SIZE_HEADER = 16,
70  SE3_REQDATA_SIZE_HEADER = 4,
71  SE3_REQ_SIZE_DATA = SE3_COMM_BLOCK - SE3_REQ_SIZE_HEADER,
72  SE3_REQDATA_SIZE_DATA = SE3_COMM_BLOCK - SE3_REQDATA_SIZE_HEADER,
73 
74  SE3_REQ_OFFSET_CMD = 0,
75  SE3_REQ_OFFSET_CMDFLAGS = 2,
76  SE3_REQ_OFFSET_LEN = 4,
77  SE3_REQ_OFFSET_CMDTOKEN = 6,
78  SE3_REQ_OFFSET_PADDING = 10,
79  SE3_REQ_OFFSET_CRC = 14,
80  SE3_REQ_OFFSET_DATA = 16,
81 
82  SE3_REQDATA_OFFSET_CMDTOKEN = 0,
83  SE3_REQDATA_OFFSET_DATA = 4,
84 
85  SE3_REQ_MAX_DATA = ((SE3_COMM_BLOCK-SE3_REQ_SIZE_HEADER) + (SE3_COMM_N-2)*(SE3_COMM_BLOCK-SE3_REQDATA_SIZE_HEADER) - 8)
86 };
87 
89 enum {
90  SE3_RESP_SIZE_HEADER = 16,
91  SE3_RESPDATA_SIZE_HEADER = 4,
92  SE3_RESP_SIZE_DATA = SE3_COMM_BLOCK - SE3_REQ_SIZE_HEADER,
93  SE3_RESPDATA_SIZE_DATA = SE3_COMM_BLOCK - SE3_REQDATA_SIZE_HEADER,
94 
95  SE3_RESP_OFFSET_READY = 0,
96  SE3_RESP_OFFSET_STATUS = 2,
97  SE3_RESP_OFFSET_LEN = 4,
98  SE3_RESP_OFFSET_CMDTOKEN = 6,
99  SE3_RESP_OFFSET_CRC = 14,
100 
101  SE3_RESPDATA_OFFSET_CMDTOKEN = 0,
102  SE3_RESPDATA_OFFSET_DATA = 4,
103 
104  SE3_RESP_MAX_DATA = ((SE3_COMM_BLOCK-SE3_REQ_SIZE_HEADER) + (SE3_COMM_N-2)*(SE3_COMM_BLOCK-SE3_REQDATA_SIZE_HEADER) - 8)
105 };
106 
108 enum {
109  SE3_DISCO_OFFSET_MAGIC = 0,
110  SE3_DISCO_OFFSET_SERIAL = 32,
111  SE3_DISCO_OFFSET_HELLO = 2*32,
112  SE3_DISCO_OFFSET_STATUS = 3*32
113 };
114 
115 
116 // required for in-place encryption with AES
117 #if (SE3_REQ_MAX_DATA % 16 != 0)
118 #error "SE3_REQ_MAX_DATA is not a multiple of 16"
119 #endif
120 #if (SE3_RESP_MAX_DATA % 16 != 0)
121 #error "SE3_RESP_MAX_DATA is not a multiple of 16"
122 #endif