当前成员版:从通信过程读到算法源码
这份指南随源码包分发,所有链接相对本包。先读接口、协议和失败条件,再进入第三方算法内部;运行平台不等于理解或独立复现算法。AES 业务链已在原平台验证,成员通用固件仅编译和软件验证,成员实机状态见《验证记录.md》。Ascon/SM4 的正确性与电脑演示不能代替业务 UDP。
第一条阅读路线:一条中文消息怎样返回
1. web/board.js:找到发送按钮请求和六步状态展示。页面不会自行替开发板做业务加密;发送原文的 UTF-8 字节是比较基准。
2. member_server.py → member_workbench.py → board_workbench17.py:请求检查、一次确认、限时限条数、设备身份及配对校验。继承的设备层仍有职责,不把它删成无关辅助。
3. aes_console.py → protocol.py:USB 指令装入原文;电脑等待 Wi-Fi 密文,以 `open_packet` 认证解密并检查关联字段,再做严格 UTF-8 字节比对。`acknowledge` 对原文 SHA-256 摘要加密形成 ACK。
4. firmware/main/console_main.c:找到消息命令解析、`counter++`、W9G1 包头构造、`aead_seal`、`sendto`、`aead_open` 和 ACK 摘要比较。计数即使后续加密/发送失败也消耗,不能回收 nonce。
5. firmware/main/aead.c:项目的 AES-GCM 参数、容量、别名与认证失败处理,调用 ESP-IDF 的 mbedTLS GCM。AES 的轮函数在 SDK 中;这个文件是可研究的适配边界,不是从零实现的 AES。
6. message_process17.py:认证、原文比对与最终 ACK 的判定和旧记录缺字段处理。串口写成功不证明板端接收;电脑解密成功也不证明板端 ACK 已确认。
四类文件怎样区分
| 类别 | 必读入口 | 要回答的问题 | 对应检查 |
|---|---|---|---|
| 算法核心与接口 | `firmware/main/aead.h`, `aead.c`, `aead_registry.c`, `ascon_adapter.c`, `sm4_adapter.c` | key/nonce/tag 长度;空输入、容量、别名;认证失败能否输出明文 | `selftest.c`, `ascon_selftest.c`, `sm4_selftest.c` 与 vectors |
| 协议与实验 | `protocol.py`, `console_main.c`, `aes_console.py`, `message_process17.py` | nonce/AAD/方向密钥;帧关联;错误 ACK;计时起止与 CSV 判据 | `tests/test_aes_inherited.py`, `check_member17.py`, `tests/check_message_process17.py` |
| 设备与平台 | `member_setup.py`, `member_runtime.py`, `member_workbench.py`, `member_server.py`, `start_member.py`, `web/` | USB 配网与独立配对;设备锁;人类确认;页面和启动/更新 | `check_member_frontend.js`, `check_member_portable17.py` |
| 生成产物与发布工具 | `host/*.dll`, `release-assets/`, `release_member17.py`, `fetch_assets.py` | 二进制来源与复现;包内清单和许可;不能改 DLL 当源码 | `host/native-provenance.json`, `SOURCE_SHA256.json`, `dependency-lock.json` |
“辅助”不表示不重要:设备身份、nonce、认证判定、USB 配对和确认边界直接影响通信的正确性。第三方源属于算法研究材料,不能只留 DLL 或全部归为不用读。
第二条阅读路线:逐个算法进入内部
**AES-GCM(HWON/OFF)**:先读 `aead.h`/`aead.c` 和 `selftest.c`,再看 `aes_on.defaults`/`aes_off.defaults`、`CMakeLists.txt` 及本次实际 sdkconfig 回执。HWON/OFF 是编译配置,不是另一种密码算法。成员冻结镜像仅 ON;不能把未随包的 OFF 镜像或正式四方案比较当已完成。SDK 外部依赖为 ESP-IDF 5.5.4,许可副本在 `THIRD_PARTY_LICENSES/ESP-IDF/`。
**Ascon-AEAD128**:`ascon_adapter.c` → `vendor/ascon-c/crypto_aead/asconaead128/ref/aead.c` → `ref/permutations.h`, `ref/round.h`, `ref/word.h`;之后对照 `opt32/aead.c`, `opt32/permutations.h`, `opt32/round.h`, `opt32/word.h`。这是标准 AEAD128 的固定版本,不混用旧 Ascon-128a。官方提交 446347f21b209f3921c65ece70027c366cbe1693,许可 CC0-1.0,测试生成器另保留 NIST notice。完整 KAT 在 `vendor/ascon-c/crypto_aead/asconaead128/LWC_AEAD_KAT_128_128.txt`;DLL 来源见 `host/native-provenance.json`。
**SM4-GCM**:`sm4_adapter.c` → `vendor/gmssl/src/sm4_gcm.c` → `sm4_ctr.c`, `ghash.c`, `gf128.c` → `sm4.c`,对照 `include/gmssl/sm4.h` 和 `tests/sm4_gcmtest.c`。SM4 分组密码、CTR 和 GCM 的认证部分分别有职责。GmSSL 固定提交 24ae482701a7b124826c382fffc55c19f76d475d,Apache-2.0;字节、来源和许可见 `vendor/gmssl/UPSTREAM.json` 与 `LICENSE`,项目约束见 `SM4_PROFILE.md`。
协议参数与实验解释
成员 AES 的 key_id=17;`protocol.py` 留有旧演示默认值9,但成员路径显式传入17和设备独立的 D2P/P2D 两方向密钥,不能调用默认值替代配对。W9G1 包头32字节并参与 AAD;业务 nonce 是8字节 epoch 加4字节 counter(网络字节序),tag16字节。板端 `w9nonce` 保存 epoch;热点和配对写各自 `w17wifi`/`w17keys`,不会把私人密码写回共享源码。长期防重放和至少20次重启验收仍有缺口,不以启动编号本身宣称安全性完成。
板端 `seal_us`/`ack_open_us` 与完整 `rtt_us` 起止范围不同。第16周纯 Ascon 微基准在作者完整历史项目中,不随本源码包重新生成;小量功能 RTT 不能作算法速度排名。正式比较须固定负载、AAD、构建参数、时钟、计时开销和有效样本数,并分别记录超时;缺失 RTT 不填0。
如何核对和复现
- 先核对源码包的 `SOURCE_SHA256.json` 和两个 ZIP 的公开 SHA256,再核对依赖锁与固定上游提交。文件清单不证明实机成功。
- 日常运行使用另一份 Windows-x64 运行包中的 `启动平台.cmd`,无需安装工具。源码研究用相对路径的 `member-research.code-workspace`;`member-development.code-workspace` 是现有开发入口。
- 软件检查:源码入口 `check_member17.py`(模拟设备及当前用户 DPAPI)、`check_member_frontend.js`(DOM/API 夹具)、`check_member_portable17.py --zip <运行ZIP> --folder <新的隔离目录>`。DOM 夹具不等于渲染,PATH 剥离不等于干净 Windows。
- 固件需要已有 ESP-IDF 5.5.4,按照 `开发与发布.md`、`build-member.ps1` 和 `toolchain.example.json` 配置;实际源码和新外部缓存路径保持 ASCII。不复用作者本机路径或旧周缓存。
- 真机验证单列烧录、启动 ELF、热点入网、独立配对、网页原文、板端加密/Wi-Fi返回、认证/比对、ACK 和原始 CSV。每个人分别完成,不能把作者/AI的成功算作所有成员的结果。
学习建议:先沿一条消息标出每个函数收到什么、发出什么、失败时留下什么证据;能自己解释方向密钥和 ACK 后,再研究 round/permutation。改算法前保留正确性基线与错误路径,不跳过认证测试。