147 lines
5.7 KiB
C++
147 lines
5.7 KiB
C++
#pragma once
|
||
|
||
#include <string>
|
||
|
||
// 对生成服务端功能进行加密
|
||
|
||
std::string getHardwareID();
|
||
|
||
// Enhanced hardware ID for VPS (includes UUID and MachineGuid)
|
||
std::string getHardwareID_V2();
|
||
|
||
std::string hashSHA256(const std::string& data);
|
||
|
||
std::string genHMAC(const std::string& pwdHash, const std::string& superPass);
|
||
|
||
std::string genHMACbyHash(const std::string& pwdHash, const std::string& superHash);
|
||
|
||
std::string getFixedLengthID(const std::string& hash);
|
||
|
||
std::string deriveKey(const std::string& password, const std::string& hardwareID);
|
||
|
||
std::string getDeviceID(const std::string &hardwareId);
|
||
|
||
// Use HMAC to sign a message.
|
||
uint64_t SignMessage(const std::string& pwd, BYTE* msg, int len);
|
||
|
||
bool VerifyMessage(const std::string& pwd, BYTE* msg, int len, uint64_t signature);
|
||
|
||
// ============================================================================
|
||
// ECDSA P-256 非对称签名 (v2 授权)
|
||
// ============================================================================
|
||
|
||
// V2 签名长度 (ECDSA P-256: 64 bytes)
|
||
#define V2_SIGNATURE_SIZE 64
|
||
// V2 公钥长度 (ECDSA P-256: 64 bytes, X+Y coordinates)
|
||
#define V2_PUBKEY_SIZE 64
|
||
// V2 私钥长度 (ECDSA P-256: 32 bytes)
|
||
#define V2_PRIVKEY_SIZE 32
|
||
|
||
// 生成 V2 密钥对,保存到文件
|
||
// privateKeyFile: 私钥保存路径
|
||
// publicKeyOut: 输出公钥 (64 bytes),用于内嵌到程序
|
||
// 返回: true 成功
|
||
bool GenerateKeyPairV2(const char* privateKeyFile, BYTE* publicKeyOut);
|
||
|
||
// 使用私钥签名消息 (类似 SignMessage)
|
||
// privateKeyFile: 私钥文件路径
|
||
// msg: 待签名数据
|
||
// len: 数据长度
|
||
// signatureOut: 输出签名 (64 bytes)
|
||
// 返回: true 成功
|
||
bool SignMessageV2(const char* privateKeyFile, const BYTE* msg, int len, BYTE* signatureOut);
|
||
|
||
// 使用公钥验证签名 (类似 VerifyMessage)
|
||
// publicKey: 公钥数据 (64 bytes)
|
||
// msg: 原始数据
|
||
// len: 数据长度
|
||
// signature: 签名数据 (64 bytes)
|
||
// 返回: true 验证通过
|
||
bool VerifyMessageV2(const BYTE* publicKey, const BYTE* msg, int len, const BYTE* signature);
|
||
|
||
// 签名口令 (V2)
|
||
// deviceId: 设备ID (如 "XXXX-XXXX-XXXX-XXXX")
|
||
// password: 口令字符串 (如 "20250301-20261231-0002-XXXXXXXX")
|
||
// privateKeyFile: 私钥文件路径
|
||
// 返回: HMAC 字段值 (如 "v2:BASE64_SIGNATURE"),失败返回空字符串
|
||
std::string signPasswordV2(const std::string& deviceId, const std::string& password, const char* privateKeyFile);
|
||
|
||
// 验证口令签名 (V2)
|
||
// deviceId: 设备ID
|
||
// password: 口令字符串
|
||
// hmacField: HMAC 字段值 (应以 "v2:" 开头)
|
||
// publicKey: 内嵌公钥 (64 bytes)
|
||
// 返回: true 签名验证通过
|
||
bool verifyPasswordV2(const std::string& deviceId, const std::string& password,
|
||
const std::string& hmacField, const BYTE* publicKey);
|
||
|
||
// Base64 编解码
|
||
std::string base64Encode(const BYTE* data, size_t len);
|
||
bool base64Decode(const std::string& encoded, BYTE* dataOut, size_t* lenOut);
|
||
|
||
// 格式化公钥为 C 数组代码
|
||
std::string formatPublicKeyAsCode(const BYTE* publicKey);
|
||
|
||
// ============================================================================
|
||
// Authorization 签名 (多层授权)
|
||
// ============================================================================
|
||
|
||
// 签名 Authorization(不绑定 deviceID,绑定 snHashPrefix,可在同一第一层的下级间共享)
|
||
// license: 授权信息 (如 "20260317|20270317|0256")
|
||
// snHashPrefix: 第一层 SN/deviceID 的前8字符哈希,用于隔离不同第一层
|
||
// privateKeyFile: 私钥文件路径
|
||
// 返回: 签名字段值 (如 "v2:BASE64_SIGNATURE"),失败返回空字符串
|
||
std::string signAuthorizationV2(const std::string& license, const std::string& snHashPrefix, const char* privateKeyFile);
|
||
|
||
// 计算 snHashPrefix(用于 Authorization 隔离)
|
||
// deviceID: 第一层的设备ID(如 "XXXX-XXXX-XXXX-XXXX")
|
||
// 返回: SHA256(deviceID).substr(0, 8)
|
||
std::string computeSnHashPrefix(const std::string& deviceID);
|
||
|
||
// ============================================================================
|
||
// FRP 自动代理配置生成
|
||
// ============================================================================
|
||
|
||
// FRP 认证模式
|
||
enum FrpAuthModeGen {
|
||
FRP_AUTH_MODE_TOKEN = 0, // 官方 FRP: 直接使用 token (编码为 ENC:xxx)
|
||
FRP_AUTH_MODE_PRIVILEGE_KEY = 1 // 自定义 FRP: 使用 privilegeKey = MD5(token + timestamp)
|
||
};
|
||
|
||
// XOR 编码 Token(用于官方 FRP 模式)
|
||
// 格式: "ENC:" + Base64(XOR(token, key))
|
||
// 下级检测到 ENC: 前缀后解码使用
|
||
std::string EncodeFrpToken(const std::string& token);
|
||
|
||
// XOR 解码 Token
|
||
// 输入: "ENC:xxx" -> 输出: 原始 token
|
||
// 如果不是 ENC: 前缀,返回空字符串
|
||
std::string DecodeFrpToken(const std::string& encoded);
|
||
|
||
// 检测 privilegeKey 是否为编码的 token
|
||
// 返回: true 如果以 "ENC:" 开头
|
||
bool IsFrpTokenEncoded(const std::string& privilegeKey);
|
||
|
||
// 日期字符串转 Unix 时间戳(当天 23:59:59 UTC)
|
||
// 输入: "20260323" -> 输出: 1774329599
|
||
time_t FrpDateToTimestamp(const std::string& dateStr);
|
||
|
||
// 生成 FRP 配置字符串
|
||
// serverAddr: FRPS 服务器地址
|
||
// serverPort: FRPS 服务器端口
|
||
// remotePort: 分配给下级的远程端口
|
||
// frpToken: FRPS 认证 Token
|
||
// expireDate: 有效日期(YYYYMMDD 格式),最大 "20371231"(32位timestamp限制)
|
||
// authMode: 认证模式 (FRP_AUTH_MODE_TOKEN 或 FRP_AUTH_MODE_PRIVILEGE_KEY)
|
||
// 返回: "serverAddr:serverPort-remotePort-expireDate-privilegeKey"
|
||
// 官方模式: privilegeKey = "ENC:xxx" (编码的 token)
|
||
// 自定义模式: privilegeKey = MD5(token + timestamp)
|
||
std::string GenerateFrpConfig(
|
||
const std::string& serverAddr,
|
||
int serverPort,
|
||
int remotePort,
|
||
const std::string& frpToken,
|
||
const std::string& expireDate,
|
||
int authMode = FRP_AUTH_MODE_PRIVILEGE_KEY
|
||
);
|