• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  *
15  * Description: crypto symc struct header. \n
16  *
17  * History: \n
18  * 2023-03-22, Create file. \n
19  */
20 #ifndef CRYPTO_SYMC_STRUCT_H
21 #define CRYPTO_SYMC_STRUCT_H
22 
23 #include "crypto_common_struct.h"
24 
25 /* Structure for SYMC Create. */
26 typedef enum {
27     CRYPTO_SYMC_TYPE_NORMAL = 0x0,
28     CRYPTO_SYMC_TYPE_REG,
29     CRYPTO_SYMC_TYPE_MAX,
30     CRYPTO_SYMC_TYPE_INVALID = 0xffffffff,
31 } crypto_symc_type;
32 
33 typedef enum {
34     CRYPTO_SYMC_ALG_TDES = 0x0,
35     CRYPTO_SYMC_ALG_AES = 0x1,
36     CRYPTO_SYMC_ALG_SM4 = 0x2,
37     CRYPTO_SYMC_ALG_LEA = 0x3,
38     CRYPTO_SYMC_ALG_DMA = 0x4,
39     CRYPTO_SYMC_ALG_MAX,
40     CRYPTO_SYMC_ALG_INVALID = 0xffffffff,
41 } crypto_symc_alg;
42 
43 typedef enum {
44     CRYPTO_SYMC_WORK_MODE_ECB = 0x0,
45     CRYPTO_SYMC_WORK_MODE_CBC,
46     CRYPTO_SYMC_WORK_MODE_CTR,
47     CRYPTO_SYMC_WORK_MODE_OFB,
48     CRYPTO_SYMC_WORK_MODE_CFB,
49     CRYPTO_SYMC_WORK_MODE_CCM,
50     CRYPTO_SYMC_WORK_MODE_GCM,
51     CRYPTO_SYMC_WORK_MODE_CBC_MAC,
52     CRYPTO_SYMC_WORK_MODE_CMAC,
53     CRYPTO_SYMC_WORK_MODE_MAX,
54     CRYPTO_SYMC_WORK_MODE_INVALID = 0xffffffff,
55 } crypto_symc_work_mode;
56 
57 typedef enum {
58     CRYPTO_SYMC_KEY_64BIT =  0x0,
59     CRYPTO_SYMC_KEY_128BIT = 0x1,
60     CRYPTO_SYMC_KEY_192BIT = 0x2,
61     CRYPTO_SYMC_KEY_256BIT = 0x3,
62     CRYPTO_SYMC_KEY_LENGTH_MAX,
63     CRYPTO_SYMC_KEY_LENGTH_INVALID = 0xffffffff,
64 } crypto_symc_key_length;
65 
66 typedef enum {
67     CRYPTO_SYMC_KEY_EVEN =  0x0,
68     CRYPTO_SYMC_KEY_ODD  =  0x1,
69     CRYPTO_SYMC_KEY_PARITY_MAX,
70     CRYPTO_SYMC_KEY_PARITY_INVALID = 0xffffffff,
71 } crypto_symc_key_parity;
72 
73 typedef enum {
74     CRYPTO_SYMC_BIT_WIDTH_1BIT = 0x0,
75     CRYPTO_SYMC_BIT_WIDTH_8BIT = 0x1,
76     CRYPTO_SYMC_BIT_WIDTH_64BIT = 0x2,
77     CRYPTO_SYMC_BIT_WIDTH_128BIT = 0x3,
78     CRYPTO_SYMC_BIT_WIDTH_MAX,
79     CRYPTO_SYMC_BIT_WIDTH_INVALID = 0xffffffff,
80 } crypto_symc_bit_width;
81 
82 typedef enum {
83     CRYPTO_SYMC_IV_DO_NOT_CHANGE = 0,
84     CRYPTO_SYMC_IV_CHANGE_ONE_PKG,
85     CRYPTO_SYMC_IV_CHANGE_ALL_PKG,
86     /* GCM. */
87     CRYPTO_SYMC_GCM_IV_DO_NOT_CHANGE,
88     CRYPTO_SYMC_GCM_IV_CHANGE_START,
89     CRYPTO_SYMC_GCM_IV_CHANGE_UPDATE,
90     CRYPTO_SYMC_GCM_IV_CHANGE_FINISH,
91     /* CCM. */
92     CRYPTO_SYMC_CCM_IV_DO_NOT_CHANGE,
93     CRYPTO_SYMC_CCM_IV_CHANGE_START,
94     CRYPTO_SYMC_CCM_IV_CHANGE_UPDATE,
95     CRYPTO_SYMC_CCM_IV_CHANGE_FINISH,
96     CRYPTO_SYMC_IV_CHANGE_MAX,
97     CRYPTO_SYMC_IV_CHANGE_INVALID = 0xffffffff,
98 } crypto_symc_iv_change_type;
99 
100 typedef struct {
101     crypto_symc_alg symc_alg;
102     crypto_symc_work_mode work_mode;
103     crypto_symc_type symc_type;
104     td_bool is_long_term;
105 } crypto_symc_attr;
106 
107 typedef struct {
108     crypto_buf_attr buf_attr;
109     td_u32 length;
110 } crypto_symc_pack;
111 
112 typedef struct {
113     td_u32 clear_header_len;
114     td_u32 payload_len;
115     td_u32 payload_pattern_encrypt_len;
116     td_u32 payload_pattern_clear_len;
117     td_u32 payload_pattern_offset_len;
118     td_bool iv_change;
119     td_u32 iv[CRYPTO_AES_IV_SIZE_IN_WORD];
120 } crypto_symc_cenc_subsample;
121 
122 typedef struct {
123     td_bool use_odd_key;
124     td_u32 first_encrypt_offset;
125     crypto_symc_cenc_subsample *subsample;
126     td_u32 subsample_num;
127     crypto_symc_alg alg;
128     crypto_symc_work_mode work_mode;
129     td_u32 iv[CRYPTO_AES_IV_SIZE_IN_WORD];
130 } crypto_symc_cenc_param;
131 
132 typedef struct {
133     crypto_buf_attr aad_buf;
134     td_u32 aad_len;         /* Addition Data Length In Bytes. */
135     td_u32 data_len;        /* Crypto Data Length In Bytes. */
136     td_u32 tag_len;         /* Tag Length In Bytes. */
137 } crypto_symc_config_aes_ccm_gcm;
138 
139 typedef struct {
140     crypto_symc_alg symc_alg;
141     crypto_symc_work_mode work_mode;
142     crypto_symc_key_length symc_key_length;
143     crypto_symc_key_parity key_parity;
144     crypto_symc_bit_width symc_bit_width;
145     crypto_symc_iv_change_type iv_change_flag;
146     td_u8 iv[CRYPTO_IV_LEN_IN_BYTES];
147     td_u32 iv_length;
148     td_void *param;
149 } crypto_symc_ctrl_t;
150 
151 typedef struct {
152     td_u32 chn_id;                                         /* Channel number */
153     td_u32 open;                                           /* Open or closed */
154     td_u32 is_decrypt;                                     /* Decrypt or encrypt */
155     td_u32 alg;                                            /* Algorithm */
156     td_u32 mode;                                           /* Work mode */
157     td_u32 key_len;                                        /* Key length */
158     td_u32 key_source;                                     /* Hard or soft key */
159     td_u32 int_raw;                                        /* Raw intertupt */
160     td_u32 int_en;                                         /* Enable interrupt */
161     td_u32 int_status;                                     /* Status interrupt */
162     td_u32 owner;                                          /* Process PID of owner */
163     td_u32 is_secure;                                      /* Secure channel or not */
164     td_u32 smmu_enable;                                    /* Smmu enable */
165     td_u32 in_node_head;                                   /* In node list head */
166     td_u32 in_node_rptr;                                   /* In node list read index */
167     td_u32 in_node_wptr;                                   /* In node list write index */
168     td_u32 in_node_depth;                                  /* In node depth */
169     td_u32 out_node_head;                                  /* Out node list head */
170     td_u32 out_node_rptr;                                  /* Out node list read index */
171     td_u32 out_node_wptr;                                  /* Out node list write index */
172     td_u32 out_node_depth;                                 /* Out node depth */
173     td_u8 iv[CRYPTO_AES_IV_SIZE + CRYPTO_AES_IV_SIZE + 1]; /* Out iv */
174 } crypto_symc_proc_info;
175 
176 typedef struct {
177     td_u32 allow_reset; /* allow reset CPU or not */
178     td_u32 sec_cpu;     /* secure CPU or not */
179     const char *name;   /* interrupt name */
180     td_u32 int_num;     /* interrupt number */
181     td_u32 int_en;      /* interrupt enable */
182     td_u32 smmu_base;   /* smmu base address */
183     td_u32 err_code;    /* error code */
184 } crypto_symc_module_info;
185 
186 typedef struct {
187     td_bool is_long_term;
188     crypto_symc_alg symc_alg;
189     crypto_symc_work_mode work_mode;
190     crypto_symc_key_length symc_key_length;
191     td_u32 keyslot_chn;
192 } crypto_symc_mac_attr;
193 
194 #endif
195