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