#pragma once #include "sccsdk.h" typedef enum { CHK_SYSTEM_INIT, CHK_WIREGUARD_CONFIG, CHK_WIREGUARD_SERVICE, CHK_WG_INTERFACE_PRIVATE, CHK_MAX } CHECK_FUNCTION; typedef struct { CHECK_FUNCTION chk; bool result; TCHAR errMsg[MAX_PATH]; } CHK_RESULT, *PCHK_RESULT; /** * @brief WireGuard 服务端配置信息 */ typedef struct { TCHAR Name[64]; ///< WireGuard 网卡名称 TCHAR Address[32]; ///< WireGuard 本地网络IP地址 TCHAR PrivateKey[64]; ///< WireGuard 本机私钥 int ListenPort; ///< WireGuard 服务端监听端口 // 根据系统设计,不支持多个客户端同时连接 TCHAR CliPubKey[64]; ///< WireGuard 客户端公钥 TCHAR AllowNet[256]; ///< WireGuard 允许对端访问本地网络的配置 } WGSERVER_CONFIG, *PWGSERVER_CONFIG; /** * @brief WireGuard 客户端配置信息 */ typedef struct { TCHAR Name[64]; ///< WireGuard 网卡名称 TCHAR PrivateKey[64]; ///< WireGuard 本机私钥 TCHAR Address[32]; ///< WireGuard 本地网络IP地址 // Peer Server TCHAR SvrPubKey[64]; ///< WireGuard 服务端公钥 TCHAR AllowNet[256]; ///< WireGuard 允许对端访问本地网络的配置 TCHAR ServerURL[256]; ///< WireGuard 服务端IP地址和端口 } WGCLIENT_CONFIG, *PWGCLIENT_CONFIG; #ifdef __cplusplus // If used by C++ code, extern "C" { // we need to export the C interface #endif /** * @brief 设置传输协议加密方式,默认 CRYPTO_NONE * @param[in] type 协议加密类型 @see PROTO_CRYPTO_TYPE * @param[in] pProKey 加密秘钥,CRYPTO_NONE, CRYPTO_BASE64 无效忽略 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - ERR_SUCCESS 成功 */ int SetProtocolEncryptType(const PROTO_CRYPTO_TYPE type, const TCHAR *pProKey); /** * @brief 创建 WireGuard 服务端配置文件 * @param[in] pWgConfig 配置文件相关配置项 @see WGSERVER_CONFIG * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_MALLOC_MEMORY 分配内存失败 * - -ERR_OPEN_FILE 打开文件失败 * - -ERR_MEMORY_STR 字符串处理失败 * - ERR_SUCCESS 成功 */ int WireGuardCreateServerConfig(const PWGSERVER_CONFIG pWgConfig); /** * @brief 创建 WireGuard 客户端配置文件 * @param[in] pWgConfig 配置文件相关配置项 @see WGCLIENT_CONFIG * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_MALLOC_MEMORY 分配内存失败 * - -ERR_OPEN_FILE 打开文件失败 * - -ERR_MEMORY_STR 字符串处理失败 * - ERR_SUCCESS 成功 */ int WireGuardCreateClientConfig(const PWGCLIENT_CONFIG pWgConfig); /** * @brief 通过 WireGuard 配置文件安装隧道服务 * @param pInterfaceName 隧道服务名 * @param pWGConfigFilePath 配置文件完整路径 * @return 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_ITEM_UNEXISTS 找不掉对应的服务 * - -ERR_OPEN_SCM 打开服务管理器设备失败 * - -ERR_OPEN_SERVICE 打开服务失败 * - -ERR_CREATE_SERVICE 创建服务失败 * - -ERR_CONFIG_SERVICE 配置服务失败 * - -ERR_START_SERVICE 停止服务失败 * - ERR_SUCCESS 成功 */ int CreateWireGuardService(const TCHAR *pInterfaceName, const TCHAR *pWGConfigFilePath); int GetWireGuradTunnelInfo(const TCHAR *pTunnelName); /** * @brief 移除 WireGuard 隧道服务 * @param pTunnelName 隧道服务名 * @param bIsWaitStop 是否等待隧道服务结束 TRUE: 等待服务结束, FALSE: 不等待直接结束 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_OPEN_SCM 打开服务管理器设备失败 * - -ERR_OPEN_SERVICE 打开服务失败 * - -ERR_STOP_SERVICE 停止服务失败 * - -ERR_DELETE_SERVICE 删除服务失败 * - ERR_SUCCESS 成功 */ int RemoveGuardService(const TCHAR *pTunnelName, bool bIsWaitStop); /** * @brief 安装/卸载 WireGuard 服务 * @param[in] bInstall TRUE 安装服务, FALSE 卸载服务 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO */ int WireGuardInstallDefaultServerService(bool bInstall); /** * @brief 通过 WireGuard 配置文件安装隧道服务 * @param[in] pTunnelCfgPath 配置文件完整路径 * @return 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_ITEM_UNEXISTS 配置文件不存在 * - -ERR_CALL_SHELL 调用 WireGuard 外部服务失败 * - ERR_SUCCESS 成功 */ int WireGuardInstallServerService(const TCHAR *pTunnelCfgPath); /** * @brief 卸载 WireGuard 隧道服务 * @param[in] pTunnelName 隧道服务名 * @return 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_ITEM_UNEXISTS 配置文件不存在 * - -ERR_CALL_SHELL 调用 WireGuard 外部服务失败 * - ERR_SUCCESS 成功 */ int WireGuardUnInstallServerService(const TCHAR *pTunnelName); /** * @brief 获取当前 WireGuard 服务是否安装 * @param[out] pIsInstalled WireGuard 服务安装状态 * - TRUE 已经安装 * - FALSE 未安装 * @return 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_OPEN_SCM, 打开服务管理器设备 * - -ERR_OPEN_SERVICE, 打开服务失败 * - -ERR_GET_SERVICESSTATUS, 获取服务状态失败 * - ERR_SUCCESS 成功 */ int IsWireGuardServerInstalled(bool *pIsInstalled); /** * @brief 计算文件 Hash * @param[in] type Hash 类型 @see HASH_TYPE * @param[in] pPath 需要计算 Hash 值的文件路径 * @param[out] outHash 计算结果 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_ITEM_UNEXISTS 文件不存在 * - -ERR_OPEN_FILE 打开文件失败 * - -ERR_BCRYPT_OPEN 创建加解密算法失败 * - -ERR_BCRYPT_GETPROPERTY 获取加解密算法属性失败 * - -ERR_BCRYPT_CREATEHASH 创建 Hash 算法失败 * - -ERR_BCRYPT_HASHDATA 计算 Hash 数据失败 * - -ERR_BCRYPT_FINISHHASH 计算 Hash 结果失败 * - ERR_SUCCESS 成功 */ int CalcFileHash(HASH_TYPE type, const TCHAR *pPath, TCHAR outHash[]); /** * @brief 计算 HMAC HASH 值 * @param[in] type Hash 类型 @see HASH_TYPE * @param[in] pHashData 需要计算 Hash 值的数据 * @param[in] inSize 需要计算 Hash 值的数据大小(字节数) * @param[in] pKey HMAC Hash 秘钥 * @param[in] keySize HMAC Hash 秘钥大小(字节数) * @param[out] outHash 计算结果 * @param[in] outBase64 是否以 BASE64 字符串输出 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_ITEM_UNEXISTS 文件不存在 * - -ERR_OPEN_FILE 打开文件失败 * - -ERR_BCRYPT_OPEN 创建加解密算法失败 * - -ERR_BCRYPT_GETPROPERTY 获取加解密算法属性失败 * - -ERR_BCRYPT_CREATEHASH 创建 Hash 算法失败 * - -ERR_BCRYPT_HASHDATA 计算 Hash 数据失败 * - -ERR_BCRYPT_FINISHHASH 计算 Hash 结果失败 * - ERR_SUCCESS 成功 */ int CalcHmacHash(HASH_TYPE type, PUCHAR pHashData, int inSize, PUCHAR pKey, int keySize, TCHAR outHash[], bool outBase64); #ifdef __cplusplus } #endif