V1（2026-10-21）—— 首个正式版

【新增】
· 加密 0-5 全支持
    - 0 不加密
    - 1 AES-256-CBC
    - 2 自定义 Base64 编码集
    - 3 极验 EnvProto（与网页端协议 A 共用）
    - 4 JiYan-Seal v1（HMAC 密钥流 + 8 字节完整性标签）← 新增
    - 5 AES-256-CBC + HMAC-SHA256（Encrypt-then-MAC）← 新增
· 签名 0-13 全支持
    - 12 JiYan-Sign（HMAC-SHA256）← 新增
    - 13 JiYan-Sign+（双段 HMAC）← 新增

· 传输层二选一（编译宏切换，不共存）
    - JIYAN_NET_JNI：JNI 转发 HttpsURLConnection，零额外库、证书校验白送
    - JIYAN_NET_OPENSSL：dlopen libssl/libcrypto，纯 NativeActivity 可用
    - 两者都不定义时默认 OPENSSL；同时定义会 #error

· 心跳与二次校验
    - Use_Card 成功后自动起后台线程，按 heartbeat_interval 分钟发 heartbeat
    - 连续失败 2 次（网络错误也算）→ locked=true
    - 收到 code=2004 → 立即 locked
    - locked 后业务请求直接拒发
    - 主线程可 Is_Locked() / Reset_Lock()

· 零外部依赖
    - MD5 / SHA1 / SHA2 / SHA3 / RIPEMD-160 / CRC-32b / HMAC-SHA256 / AES-256-CBC
      全部自带实现，不链接 OpenSSL（AES key 扩展、S-box、Keccak-f1600 均自实现）
    - 唯一第三方：nlohmann/json 单头（MIT）

【修复的参考包 5 个 bug】
  #1 SDK_Api.cpp::push_back_params 对 object 调 json::push_back 会抛 type_error
     → 改为 result["k"] = v 逐个赋值（本包无任何 push_back 到 object 的写法）
  #2 SDK_Init.cpp::Close_SingleThreaded 函数体写成 bUseSingleThreaded = true
     → 改为 false（原文语义完全相反，导致心跳线程与主线程互阻）
  #3 Env_Signature.cpp 里 static std::string result 多线程共享
     → 去掉 static，全部用局部变量
  #4 各 Use/Create 内 static nlohmann::json data 共享
     → 改成局部变量，心跳线程与主线程并发不再互相污染
  #5 API_Request 拼 query 不做 urlencode
     → 一律走 rawurlencode（Url_Encode 严格 %XX，空格 %20，不转 ~）

【修复的其它问题（参考包没有但会炸）】
  · 参考包写死 htons(80) 裸 socket。本站 nginx 只听 80、TLS 由 CDN 终结，
    裸 socket 连 80 会拿 301（已实测）。本包固定 https:443，http:// 自动升级，
    且 301/302/307/308 一律不跟随（防止明文 POST 泄露到 80）。
  · 参考包用 nlohmann::json 重新 dump 响应 data 去验签 → 键被字典序重排 → 永远失败。
    本包从原始 JSON 文本里原样截取 data 子串（平衡括号扫描），与服务端
    json_encode 的字节序完全一致。
  · 服务端响应里 data 一定被塞 rc，客户端必须比对；本包已实现。
  · 客户端必须先识别 (Env-Error) 明文前缀再决定是否解密；本包已实现。

【已知限制】
  · JIYAN_NET_OPENSSL 模式下不启用 VERIFY_PEER（Android 上 libssl 默认不加载系统 CA，
    开启会全部握手失败）。在意中间人的请改用 JIYAN_NET_JNI。
  · 加密 2 要求 api_key >= 64 位；不足直接返回空串（禁止补齐，这是故意的）。
  · 心跳间隔由服务端下发，客户端允许 1~1440 分钟。

【自检】
  · 向量自检：84 组（6 加密 × 14 签名）+ 5 条负向断言，通过 349 项，失败 0 项
  · 真机联调：13 项全过（含 http 自动升级、错 key 不崩溃、未知编号拒收）
  · 向量来源：jiyan_app/tools/gen_vectors.php（服务端 AppCrypto.php 实际输出）

—— 极验网络
