FMO_PRIKEY_Extract
$ gh repo view FMO_PRIKEY_Extract --readme
FMO_PRIKEY_Extract
Extract FMO private key offline 从 FMO 中提取设备私钥
fmo-extract
FMO 固件与私钥一键提取工具
从设备固件中自动提取 secp256r1 私钥、Ed25519 设备私钥及全部证书。
项目介绍
Co-developed with deepseek-v4-flash
FMO 盒子的身份密钥(secp256r1、Ed25519)与证书放置在固件的 littlefs 分区与 设备 eFuse 中:
- 固件侧私钥以双层 base64 存于
secp256r1_key_pair.csv; - 证书用 AES-256-GCM 加密,密钥来自设备 eFuse KEY4 的硬件 HMAC(使用 esp32 的 load-ram 来获取密钥);
功能特性
- 一键完整提取:
read-flash(16MB) → 分区表 → littlefs 导出 → secp256r1 → 加载 ram_probe 从 eFuse 派生 AES 密钥 → 证书解密 → Ed25519 私钥 - 单端口设备自动适配:只有 USB-Serial/JTAG(
/dev/cu.usbmodem*)的设备 主 UART 与控制台共用同一端口,自动处理 - 探针后自动复位:捕获完 eFuse HMAC 即复位设备,不残留 RAM 程序
环境要求
- Python ≥ 3.10
- esptool(外部依赖,需单独安装)
littlefs-python、pyserial、cryptography
依赖统一装入仓库根 venv/:
python3 -m venv venv
venv/bin/pip install esptool littlefs-python pyserial cryptography
快速开始
请先将FMO设备连接至您的电脑,确保设备处于可访问状态。 目前只使用 Macos 和 Windows 进行过测试。 均可正常使用。但请注意,windows 需要手动指定 COM 和 Console 口。自动轮询可能失效
cd fmo_extract
# 一键(设备已连接,自动探测串口)
./scripts/extract.sh
也可直接调用包入口:
python -m fmo_extract <子命令>
子命令
| 命令 | 说明 |
|---|---|
extract | 完整提取流程(默认) |
read-flash | 仅读取 16MB 固件(支持 --no-stub ROM 直读) |
probe | 仅加载 ram_probe 并捕获 eFuse HMAC(两把 AES 密钥) |
decrypt | 离线解密(spiffs 镜像或已导出目录) |
ports | 列出候选串口 |
reset | 复位设备,清掉 RAM 探针 |
提取产物
| 产物 | 说明 |
|---|---|
out/spiffs.bin | littlefs 分区镜像 |
out/extracted/* | littlefs 内全部文件(原始字节) |
out/secp256r1_private_key.pem / _sec1.pem | secp256r1 私钥(PKCS#8 / SEC1) |
out/extracted/ed25519_private_key.pem 等 | Ed25519 私钥 / seed / 公钥 |
out/extracted/cert_*.plain | 解密后的证书 JSON |
安全
提取产物含设备身份私钥(secp256r1、Ed25519 seed)与 AES 密钥,属敏感材料,
勿提交、勿外传。out/ 已加入 .gitignore,私钥文件以 0600 写出。
目前 仓库内的 load-ram 源码已经预先编译。您也可以自行 build
License
本项目仅为研究目的,请仅对自有设备使用。
comments
$ tail -n 20 comments/fmo_prikey_extract.log
Comments
// project discussion
加载中...