• 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  * Description: TLS 客户端常用操作,包括会话的创建、销毁等(此文件为DEMO,需集成方适配修改)
15  */
16 
17 #ifndef HILINK_TLS_CLIENT_H
18 #define HILINK_TLS_CLIENT_H
19 
20 #include <stddef.h>
21 #include <stdbool.h>
22 #include "hilink_sal_defines.h"
23 
24 #ifdef __cplusplus
25 #if __cplusplus
26 extern "C" {
27 #endif
28 #endif
29 
30 /* hilink tls需要的算法套件重定义,与mbedtls中的头文件保持一致 */
31 #define HILINK_MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA8
32 #define HILINK_MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030
33 #define HILINK_MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F
34 #define HILINK_MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 0xA8
35 #define HILINK_MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 0xA9
36 
37 /* hilink tls最大分片大小重定义,与mbedtls中的头文件保持一致 */
38 #define HILINK_MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /* !< don't use this extension */
39 #define HILINK_MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /* !< MaxFragmentLength 2^9 */
40 #define HILINK_MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /* !< MaxFragmentLength 2^10 */
41 #define HILINK_MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /* !< MaxFragmentLength 2^11 */
42 #define HILINK_MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /* !< MaxFragmentLength 2^12 */
43 #define HILINK_MBEDTLS_SSL_MAX_FRAG_LEN_DEFAULT 255 /* 使用默认值,不配置 */
44 
45 /** @brief TLS客户端句柄 */
46 typedef struct HiLinkTlsClient HiLinkTlsClient;
47 
48 /**
49  * @brief 获取当前实时时间
50  *
51  * @param timeMs [OUT] 输出时间
52  * @return 0 成功; -1 失败
53  */
54 typedef int (*HiLinkMbedtlsGetTimeCb)(unsigned long long *timeMs);
55 
56 /** @brief TLS客户端host信息 */
57 typedef struct HiLinkTlsHost {
58     /** 对端hostname */
59     const char *hostname;
60     /** 对端端口号,由TLS客户端创建fd时需传入 */
61     unsigned short port;
62 } HiLinkTlsHost;
63 
64 /** @brief TLS客户端使用的加密套件 */
65 typedef struct HiLinkTlsCiphersuites {
66     /** 加密套件标识符数组 */
67     const int *ciphersuites;
68     /** 加密套件数量 */
69     unsigned int num;
70 } HiLinkTlsCiphersuites;
71 
72 /** @brief TLS客户端使用的证书 */
73 typedef struct HiLlinkTlsCerts {
74     /** 证书数组,在客户端有效期内数组指针应有效 */
75     const char **certs;
76     /** 证书数量 */
77     unsigned int num;
78     /** 延迟校验证书标志位 */
79     bool isDelayVerifyCert;
80 } HiLlinkTlsCerts;
81 
82 /** @brief TLS客户端psk参数 */
83 typedef struct HiLlinkTlsPsk {
84     /** psk */
85     const unsigned char *psk;
86     /** psk长度 */
87     unsigned int pskLen;
88     /** psk标识符 */
89     const unsigned char *pskIdentity;
90     /** psk标识符长度 */
91     unsigned int pskIdentityLen;
92 } HiLlinkTlsPsk;
93 
94 typedef enum {
95     /* 为TLS客户端设置套接字,参数类型为int* */
96     HILINK_TLS_OPTION_FD = 0,
97     /* 为TLS客户端设置获取时间回调函数,参数类型为HiLinkMbedtlsGetTimeCb,对所有客户端生效 */
98     HILINK_TLS_OPTION_REG_TIME_CB,
99     /* 为TLS客户端设置对端地址,参数类型为HiLinkTlsHost* */
100     HILINK_TLS_OPTION_HOST,
101     /* 为TLS客户端设置套件白名单,参数类型为HiLinkTlsCiphersuites* */
102     HILINK_TLS_OPTION_CIPHERSUITE,
103     /* 为TLS客户端设置证书,参数类型为HiLlinkTlsCerts* */
104     HILINK_TLS_OPTION_CERT,
105     /* 为TLS客户端设置psk,参数类型为HiLlinkTlsPsk* */
106     HILINK_TLS_OPTION_PSK,
107     /* 为TLS客户端设置最大分片大小,参数类型为unsiged char *,值参考HILINK_MBEDTLS_SSL_MAX_FRAG_LEN */
108     HILINK_TLS_OPTION_MAX_FRAG_LEN,
109     HILINK_TLS_OPTION_RESERVED = 0x7FFFFFFF,
110 } HiLinkTlsOption;
111 
112 /**
113  * @brief 创建 Tls 客户端
114  *
115  * @param custom [IN] tls客户端标识名称
116  * @return 非NULL客户端句柄,NULL失败
117  */
118 HiLinkTlsClient *HILINK_TlsClientCreate(const char *custom);
119 
120 /**
121  * @brief 配置TLS客户端
122  *
123  * @param ctx [IN] tls客户端句柄
124  * @param option [IN] 设定的选项
125  * @param value [IN] 选项参数
126  * @param len [IN] 选项参数长度
127  * @return 0成功,非0失败
128  */
129 int HILINK_SetTlsClientOption(HiLinkTlsClient *ctx, HiLinkTlsOption option, const void *value, unsigned int len);
130 
131 /**
132  * @brief TLS客户端连接对端
133  *
134  * @param ctx [IN] tls客户端句柄
135  * @return 0成功,非0失败
136  */
137 int HILINK_TlsClientConnect(HiLinkTlsClient *ctx);
138 
139 /**
140  * @brief 获取ContextFd
141  *
142  * @param ctx [IN] tls客户端句柄
143  * @return  ContextFd
144  */
145 int HILINK_TlsClientGetContextFd(HiLinkTlsClient *ctx);
146 
147 /**
148  * @brief Tls 读取数据 非阻塞
149  *
150  * @param ctx [IN] tls客户端句柄
151  * @param buf [OUT] 数据输出buf
152  * @param len [IN] buf可写长度
153  * @return 0 正常在读取中暂未接到包; 小于0 失败; 其他为接收成功数据长度
154  */
155 int HILINK_TlsClientRead(HiLinkTlsClient *ctx, unsigned char *buf, size_t len);
156 
157 /**
158  * @brief Tls 发送数据 非阻塞
159  *
160  * @param ctx [IN] tls客户端句柄
161  * @param buf [IN] 发送数据
162  * @param len [IN] buf 大小
163  * @return 0 正常在发送; 小于0失败; 其他为发送成功数据长度
164  */
165 int HILINK_TlsClientWrite(HiLinkTlsClient *ctx, const unsigned char *buf, size_t len);
166 
167 /**
168  * @brief Tls 验证证书
169  *
170  * @param ctx [IN] tls客户端句柄
171  * @return true 有效 false 失效
172  */
173 bool HILINK_TlsClientIsValidCert(HiLinkTlsClient *ctx);
174 
175 /**
176  * @brief Tls 资源释放
177  *
178  * @param ctx [IN] tls客户端句柄
179  * @return 0 成功; 其他失败
180  */
181 int HILINK_TlsClientFreeResource(HiLinkTlsClient *ctx);
182 
183 #ifdef __cplusplus
184 #if __cplusplus
185 }
186 #endif
187 #endif
188 
189 #endif /* HILINK_TLS_CLIENT_H */
190