blob: aa777f5d100c1b0639007ae8a12603f1fe33969a [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001#ifndef IPSEC_COMMON_INTERFACE_H
2#define IPSEC_COMMON_INTERFACE_H
3
4#include "kal_public_api.h"
5
6#define MAX_IPV4_ADDR_SIZE (4)
7#define MAX_IP_ADDR_SIZE (16)
8#define MAX_IP_FRAGMENT_SIZE (10)
9#define IPSEC_SAID_INVALID (0XFFFFFFFF)
10#define IPSEC_SPI_INVALID (0)
11
12#define IPSEC_ALGO_MAX_KEY_LEN (128) //need confirm
13
14/* Define the max selector number support in a SA/SP entry*/
15#define IPSEC_MAX_SELECTOR_NUM (2)
16
17/* Define maximum SA/SP entries to be deleted in
18MSG_ID_IPSEC_MULTI_SA_SP_DELETE_REQ*/
19#define IPSEC_MAX_SASP_DEL_NUM (50)
20
21/* SA_DEL CAUSE */
22#define IPSEC_HARD_LIFETIME_OUT (0)
23
24/*for async data flow*/
25typedef enum
26{
27 IPSEC_PKT_STATUS_INVALID,
28 IPSEC_ENCRYPTION_IN,
29 IPSEC_ENCRYPTION_SUCCESS,
30 IPSEC_DECRYPTION_IN,
31 IPSEC_DECRYPTION_SUCCESS,
32 IPSEC_INTEGRITY_IN,
33 IPSEC_INTEGRITY_SUCCESS
34
35}ipsec_pkt_status_enum;
36
37
38typedef enum
39{
40 IPSEC_ENTRY_UNUSED = 0,
41 IPSEC_ENTRY_USED = 1
42
43}ipsec_entry_status_enum;
44
45
46typedef enum
47{
48 IPSEC_SUCCESS,
49 IPSEC_FAILURE, /* for general fail */
50
51 /**** other particular failure ****/
52 /* - sa/sp add/del fail */
53 /* - encap/decap fail */
54 IPSEC_ENCAP_NO_RULE,
55 IPSEC_DECAP_NO_RULE = IPSEC_ENCAP_NO_RULE,
56 IPSEC_DECAP_PACKET_SA_UNMATCH,
57
58 /* - spi alloc/free fail */
59 IPSEC_SPI_FREE_FAIL_SA_EXISTANT,
60
61 /*-sa suspend*/
62 IPSEC_ENCAP_SA_SUSPEND
63
64}ipsec_status_enum;
65
66
67typedef enum
68{
69 IPSEC_TRANSPORT_MODE,
70 IPSEC_TUNNEL_MODE,
71 IPSEC_TUNNEL_MODE_UDP_ENCAP
72}ipsec_mode_enum;
73
74
75typedef enum
76{
77 IPSEC_IPV6_EXT_HOPOPT = 0,
78 IPSEC_ICMP = 1,
79 IPSEC_IPV4 = 4,
80 IPSEC_TCP = 6,
81 IPSEC_UDP = 17,
82 IPSEC_IPV6 = 41,
83 IPSEC_IPV6_EXT_ROUTING = 43,
84 IPSEC_IPV6_EXT_FRAGMENT = 44,
85
86 IPSEC_ESP = 50,
87 IPSEC_AH = 51,
88 IPSEC_ICMPV6 = 58,
89 IPSEC_IPV6_EXT_NONXT = 59,
90 IPSEC_IPV6_EXT_DESTOPT = 60,
91
92 /* NOT support proto_range and protocol_opaque */
93 IPSEC_PROTO_ANY = 255,
94
95 /* not used in selector */
96 IPSEC_PROTO_OPAQUE = IPSEC_PROTO_ANY
97
98}ipsec_proto_enum;
99
100
101typedef enum
102{
103 IPSEC_DIRECTION_INVALID,
104 IPSEC_DIRECTION_IN,
105 IPSEC_DIRECTION_OUT
106}ipsec_direction_enum;
107
108
109typedef enum
110{
111 IPSEC_FAMILY_IPV4,
112 IPSEC_FAMILY_IPV6
113
114}ipsec_addr_family_enum;
115
116
117typedef enum
118{
119 IPSEC_BYPASS,
120 IPSEC_PROTECTED,
121 IPSEC_DISCARD
122
123}ipsec_action_enum;
124
125
126typedef enum
127{
128 IPSEC_ENCR_DES_IV64 = 1,
129 IPSEC_ENCR_DES = 2,
130 IPSEC_ENCR_3DES = 3,
131 IPSEC_ENCR_RC5 = 4,
132 IPSEC_ENCR_IDEA = 5,
133 IPSEC_ENCR_CAST = 6,
134 IPSEC_ENCR_BLOWFISH = 7,
135 IPSEC_ENCR_3IDEA = 8,
136 IPSEC_ENCR_DES_IV32 = 9,
137 // 10-reserved
138 IPSEC_ENCR_NULL = 11,
139 IPSEC_ENCR_AES_CBC = 12,
140 IPSEC_ENCR_AES_CTR = 13,
141 //IPSEC_ENCR_AES_CCM_8 = 14, /*Combined-mode algo*/
142 //IPSEC_ENCR_AES_CCM_12 = 15, /*Combined-mode algo*/
143 //IPSEC_ENCR_AES_CCM_16 = 16, /*Combined-mode algo*/
144 //17-unassigned
145 //IPSEC_ENCR_AES_GCM_8 = 18, /*Combined-mode algo*/
146 //IPSEC_ENCR_AES_GCM_12 = 19, /*Combined-mode algo*/
147 //IPSEC_ENCR_AES_GCM_16 = 20, /*Combined-mode algo*/
148 //IPSEC_ENCR_NULL_AUTH_AES_GMAC = 21, /*Combined-mode algo*/
149 //22-reserved for IEEE P1619 XTS-AES
150 IPSEC_ENCR_CAMELLA_CBC = 23,
151 IPSEC_ENCR_CAMELLA_CTR = 24,
152 //IPSEC_ENCR_CAMELLA_CCM_8 = 25, /*Combined-mode algo*/
153 //IPSEC_ENCR_CAMELLA_CCM_12 = 26, /*Combined-mode algo*/
154 //IPSEC_ENCR_CAMELLA_CCM_16 = 27, /*Combined-mode algo*/
155 //IPSEC_ENCR_CHACHA20_POLY1305 = 28, /*Combined-mode algo*/
156 IPSEC_ENCR_AES_CCM_8_IIV = 29,
157 IPSEC_ENCR_AES_GCM_16_IIV = 30,
158 IPSEC_ENCR_CHACHA20_POLY1305_IIV = 31
159
160 // 21-1023: unassigned
161 // 1024-65535: Private use
162}ipsec_encry_algo_enum;
163
164
165typedef enum
166{
167 //0-NONE
168 IPSEC_AUTH_HMAC_MD5_96 = 1,
169 IPSEC_AUTH_HMAC_SHA1_96 = 2,
170 IPSEC_AUTH_DES_MAC = 3,
171 IPSEC_AUTH_KPDK_MD5 = 4,
172 IPSEC_AUTH_AES_XCBC_96 = 5,
173 IPSEC_AUTH_HMAC_MD5_128 = 6,
174 IPSEC_AUTH_HMAC_SHA1_160 = 7,
175 IPSEC_AUTH_AES_CMAC_96 = 8,
176 IPSEC_AUTH_AES_128_GMAC = 9,
177 IPSEC_AUTH_AES_192_GMAC = 10,
178 IPSEC_AUTH_AES_256_GMAC = 11,
179 IPSEC_AUTH_HMAC_SHA2_256_128 = 12,
180 IPSEC_AUTH_HMAC_SHA2_384_192 = 13,
181 IPSEC_AUTH_HMAC_SHA2_512_256 = 14,
182 IPSEC_AUTH_NULL = 15 //???
183
184 //15~1023: Unassigned
185 //1024~65535: Private use
186}ipsec_integ_algo_enum;
187
188
189typedef enum
190{
191 IPSEC_COM_NULL,
192 IPSEC_COM_AES_CCM_8 = 14, /*Combined-mode algo*/
193 IPSEC_COM_AES_CCM_12 = 15, /*Combined-mode algo*/
194 IPSEC_COM_AES_CCM_16 = 16, /*Combined-mode algo*/
195 //17-unassigned
196 IPSEC_COM_AES_GCM_8 = 18, /*Combined-mode algo*/
197 IPSEC_COM_AES_GCM_12 = 19, /*Combined-mode algo*/
198 IPSEC_COM_AES_GCM_16 = 20, /*Combined-mode algo*/
199 IPSEC_COM_ENCR_NULL_AUTH_AES_GMAC = 21, /*Combined-mode algo*/
200
201 IPSEC_COM_CAMELLA_CCM_8 = 25, /*Combined-mode algo*/
202 IPSEC_COM_CAMELLA_CCM_12 = 26, /*Combined-mode algo*/
203 IPSEC_COM_CAMELLA_CCM_16 = 27, /*Combined-mode algo*/
204 IPSEC_COM_CHACHA20_POLY1305 = 28 /*Combined-mode algo*/
205
206}ipsec_com_algo_enum;
207
208#define IPSEC_PORT_OPAQUE 0XFFFF
209typedef struct
210{
211 kal_uint8 src_addr[MAX_IP_ADDR_SIZE];
212 kal_uint8 dst_addr[MAX_IP_ADDR_SIZE];
213 ipsec_addr_family_enum addr_family;
214 kal_uint8 src_prefix; /* <= 32/128 */
215 kal_uint8 dst_prefix; /* <= 32/128 */
216 ipsec_proto_enum next_layer_protocol;
217 kal_uint16 src_port[2];//0-begin,1-end
218 kal_uint16 dst_port[2];//0-begin,1-end
219 /*
220 address and port can either be a single value or a range.
221 SINGLE_PORT: port[0] = port[1] = value
222 ANY_PORT: port[0]=0, port[1]=0XFFFF;
223 OPAQUE_PORT: port[0]=0xFFFF, port[1]=0;
224
225 SINGLE_ADDR: addr=value, prefix=32/128
226 ANY_ADDR: addr=any, prefix=0;
227 */
228
229}ipsec_selector_t;
230
231
232typedef struct
233{
234 kal_uint8 tunnel_src[MAX_IP_ADDR_SIZE];
235 kal_uint8 tunnel_dst[MAX_IP_ADDR_SIZE];
236 ipsec_addr_family_enum tunnel_addr_family;
237 kal_uint8 tunnel_dscp;//the lower 6 bits is valid; 000000 indicate copy from inner, else use this value.
238 kal_uint16 udp_sport;//only for Tunnel_UDP-Encap
239 kal_uint16 udp_dport;//only for Tunnel_UDP-Encap
240
241}ipsec_tunnel_info_t;
242
243
244typedef struct
245{
246 kal_uint8 flags;//for esn, stateful_fragment_checking, Bypass_DF, Bypass_DSCP?
247 ipsec_addr_family_enum tunnel_addr_family;
248 kal_uint8 tunnel_src[MAX_IP_ADDR_SIZE];//only for tunnel mode
249 kal_uint8 tunnel_dst[MAX_IP_ADDR_SIZE];//only for tunnel mode
250
251 //Used as paras when invoke SA creation?
252 kal_uint32 e_algos;// encryption
253 kal_uint32 i_algos;
254 kal_uint32 c_algos;
255}ipsec_process_info_t;
256
257
258typedef struct
259{
260 kal_uint64 byte_limit; /* = 0 if no use*/
261 kal_uint64 packet_limit;/* = 0 if no use*/
262 kal_uint32 add_expire_seconds; /* = 0 if no use*/
263 kal_uint32 use_expire_seconds; /* = 0 if no use*/
264}ipsec_lft_t;
265
266
267typedef struct
268{
269 /* = ESP_OUTER_HEADER(0/20/40 byte) + UDP_HEADER(0/8 bytes)
270 + ESP_SPI_LEN + ESP_SN_LEN + encry_algo.iv_len + integrity_algo.trunc_icv_len
271 + ESP_PAD_LENGTH_LEN + ESP_NEXT_HEADER_LEN */
272 kal_uint32 fixed_length;//in BYTE;
273
274 // = encry_algo.block_size or 4
275 // in BYTE; for users to calculate padding size
276 // (text + 2 + pad) % blk-size = 0
277 kal_uint32 encry_block_size;
278
279}esp_overhead_info_t;
280
281
282//Fragmentation buffer structure for encapsulated packet
283typedef struct
284{
285 kal_uint8 *p_ip_frag;
286 kal_uint32 frag_size;
287}ipsec_fragment_info_t;
288
289
290kal_int32 ipsec_get_esp_overhead_info(kal_uint32 said, esp_overhead_info_t *p_ovhd_info);
291kal_int32 ipsec_get_encap_buffer_size(kal_uint32 said, kal_uint32 text_size,
292 kal_uint32 *p_inbuf_size, kal_uint32 *p_outbuf_size);
293kal_int32 ipsec_get_decap_buffer_size(kal_uint32 said, kal_uint32 text_size,
294 kal_uint32 *p_inbuf_size, kal_uint32 *p_outbuf_size);
295
296#endif