#pragma once #include #ifdef NETTUNNELSDK_EXPORTS #define TUNNEL_API __declspec(dllexport) #else #define TUNNEL_API __declspec(dllimport) #endif /** * @brief WireGuard key 最大长度 */ constexpr auto WG_KEY_MAX = (64); /** * @brief 操作系统最大网卡数 */ #define NET_CARD_MAX (32) /** * @brief IP 字符串最大长度(支持IPv6) */ #define MAX_IP_LEN (48) /** * @brief IP 字符串最小长度 */ #define MIN_IP_LEN (7) /** * @brief 网卡名称字符串最大长度(支持IPv6) */ #define MAX_NETCARD_NAME (64) /** * @brief 协议加密类型 * */ typedef enum { CRYPTO_NONE = 0, ///< 不加密 CRYPTO_BASE64 = 1, ///< BASE64 字符串编码 CRYPTO_AES128 = 2, ///< AES 128位秘钥 加密 CRYPTO_3DES = 3, ///< 3DES 加密 CRYPTO_AES256 = 4, ///< AES 256 位秘钥加密 CRYPTO_MAX, } PROTO_CRYPTO_TYPE; /** * @brief 日志等级 * */ enum LOG_LEVEL { LOG_TRACE = 0, ///< TRACE 日志等级 LOG_DEBUG, ///< DEBUG 日志等级 LOG_INFO, ///< INFO 日志等级 LOG_WARN, ///< WARN 日志等级 LOG_ERROR, ///< ERROR 日志等级 LOG_CRITICAL, ///< CRITICAL 日志等级 LOG_OFF ///< 关闭日志 }; /** * @brief Hash 算法类型 * */ typedef enum { HASH_MD2 = 0, ///< MD2 HASH 算法 HASH_MD4, ///< MD4 HASH 算法 HASH_MD5, ///< MD5 HASH 算法 HASH_SHA1, ///< SHA1 HASH 算法 HASH_SHA256, ///< SHA256 HASH 算法 HASH_SHA384, ///< SHA384 HASH 算法 HASH_SHA512 ///< SHA512 HASH 算法 } HASH_TYPE; typedef enum { CHK_SYSTEM_INIT, CHK_WIREGUARD_INSTALL, CHK_WG_INSTALL, CHK_WIREGUARD_CONFIG, CHK_WIREGUARD_SERVICE, CHK_WG_INTERFACE_PRIVATE, CHK_MAX } CHECK_FUNCTION; /** * @brief 网络共享模式 * */ typedef enum { ICS_SHARE_MODE = 0, ///< Internet Share Mode(ICS) 模式 NAT_SHARE_MODE = 1 ///< Net Address Translation(NAT) 模式 } NET_SHARE_MODE; 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 获取当前网络共享模式 * @return 当前网络共享模式 @see NET_SHARE_MODE */ TUNNEL_API NET_SHARE_MODE __cdecl GetCurrentNetShareMode(); /** * @brief 设置获取当前网络共享模式 * @param shareMode 网络共享模式 @see NET_SHARE_MODE */ TUNNEL_API void __cdecl SetCurrentNetShareMode(NET_SHARE_MODE shareMode); /** * @brief 初始化 SDK 运行环境 * @param[in] pWorkDir 程序工作路径,如果不设置系统自动获取 * @param[in] pSvrUrl 管理平台 URL 地址 example: http://localhost:2313, https://localhost:2313 * @param[in] pLogFile 日志文件名称/完整路径 * @param[in] level 日志最低有效等级 * @param[in] isWorkServer SDK 工作模式 * - TRUE 服务端 * - FALSE 客户端 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_ITEM_EXISTS 未找到 WireGuard 程序 * - -ERR_SYS_CALL 获取配置本地配置文件存储目录失败 * - -ERR_CREATE_FILE 创建用户配置文件目录失败 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl TunnelSDKInitEnv(const TCHAR *pWorkDir, const TCHAR *pSvrUrl, const TCHAR *pLogFile, LOG_LEVEL level, bool isWorkServer); /** * @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 成功 */ TUNNEL_API int __cdecl SetProtocolEncryptType(const PROTO_CRYPTO_TYPE type, const TCHAR *pProKey); /** * @brief 打开/关闭 SDK 日志开关 * @param enLog 日志开关 * - TRUE 打开日志 * - FALSE 关闭日志 */ TUNNEL_API void __cdecl TunnelLogEnable(bool enLog); /** * @brief 查找 WireGuard 运行环境 * @param[out] pFullPath wireguard.exe 程序路径 * @param[in] maxSize pFullPath 缓冲区最大字节数 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_MALLOC_MEMORY 分配内存失败 * - -ERR_FILE_NOT_EXISTS 文件不存在 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl FindWireguardExe(TCHAR *pFullPath, int maxSize); /** * @brief 设置 wireguard.exe 程序路径 * @param[in] pPath wireguard.exe 程序路径 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_ITEM_UNEXISTS 文件不存在 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl SetWireguardPath(const TCHAR *pPath); /** * @brief 创建 WireGuard 密钥对 * @param[out] pPubKey 公钥缓冲区 * @param[in] pubkeySize 公钥缓冲区大小(字节数) * @param[out] pPrivKey 私钥缓冲区 * @param[in] privKeySize 私钥缓冲区大小(字节数) * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_ITEM_UNEXISTS WireGuard 未配置或未安装 * - -ERR_CALL_SHELL 调用操作系统命令行工具失败 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl GenerateWireguardKeyPairs(TCHAR *pPubKey, int pubkeySize, TCHAR *pPrivKey, int privKeySize); /** * @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 成功 */ TUNNEL_API int __cdecl 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 成功 */ TUNNEL_API int __cdecl WireGuardCreateClientConfig(const PWGCLIENT_CONFIG pWgConfig); /** * @brief 安装/卸载 WireGuard 服务 * @param[in] bInstall TRUE 安装服务, FALSE 卸载服务 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO */ TUNNEL_API int __cdecl 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 成功 */ TUNNEL_API int __cdecl 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 成功 */ TUNNEL_API int __cdecl WireGuardUnInstallServerService(const TCHAR *pTunnelName); /** * @brief 判断当前网络服务工作模式 客户端/服务端 * @param[out] pIsWorkServer 工作模式 * - TRUE 服务端 * - FALSE 客户端 * @return 函数执行结果 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl GetWireGuardWorkMode(bool *pIsWorkServer); /** * @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 成功 */ TUNNEL_API int __cdecl IsWireGuardServerInstalled(bool *pIsInstalled); /** * @brief 获取当前 WireGuard 服务隧道是否正则运行 * @param[in] pIfName WireGuard 隧道网络接口名称 * @param[out] pIsRunning WireGuard 服务隧道运行状态 * - TRUE 已经安装 * - FALSE 未安装 * @return 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_MALLOC_MEMORY 分配内存失败 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl IsWireGuardServerRunning(const TCHAR *pIfName, bool *pIsRunning); /** * @brief 清理 SDK 运行资源 */ TUNNEL_API void __cdecl TunnelSDKUnInit(); /** * @brief SCG 代理服务开关 * @param isEnable TRUE: 启动 SCG 代理, FALSE: 禁用 SCG 代理 */ TUNNEL_API void __cdecl EnableSCGProxy(bool isEnable); /** * @brief 获取当前 SCG 代理服务状态 * @return TRUE: SCG 代理启动, FALSE: SCG 代理禁用 */ TUNNEL_API bool __cdecl GetSCGProxyStatus(); /** * @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 成功 */ TUNNEL_API int __cdecl CalcFileHash(const HASH_TYPE type, const TCHAR *pPath, TCHAR outHash[]); //+++++++++++++++++++++++++++++++++++++++++Temp Interface //TUNNEL_API int __cdecl ProtoGetUserConfigure(const TCHAR *pUser, const TCHAR *pToken); //TUNNEL_API const TCHAR* __cdecl GetInterfaceGUIDByName(const TCHAR *pInterfaceName, GUID* pGuid); //------------------------------------------End Temp Interface #if 0 /** * @brief 安装 Windows NAT 自定义 PowerShell 命令 * @return 0: 成功, 小于0 失败 @see USER_ERRNO * - -ERR_INPUT_PARAMS 输入参数错误 * - -ERR_OPEN_FILE 打开文件失败 * - -ERR_MEMORY_STR 字符串处理 * - -ERR_ITEM_UNEXISTS 资源不存在 * - -ERR_CALL_SHELL 调用系统命令行失败 * - ERR_SUCCESS 成功 */ TUNNEL_API int __cdecl InstallWindowsNATCommand(); TUNNEL_API int __cdecl WireGuardNetConnectionSharingEnable(); #endif #ifdef __cplusplus } #endif