josevcm/hce-laboratory

GitHub: josevcm/hce-laboratory

专为 PN7160 设计的 PC 端 NFC 主机卡模拟框架,提供 DESFire EV1 与 MifarePlus SL3 的完整协议级仿真和调试能力。

Stars: 9 | Forks: 2

# HCE Laboratory - PN7160 的主机卡模拟器 专为 **PN7160** NFC 控制器设计的高性能、低延迟 **ISO/IEC 14443-4 (ISO-DEP)** HCE 实现。该框架支持在 **PC** 平台上进行高级的卡模拟 (CE) 和协议分析。 ## 概述 该项目利用 **NCI (NFC Controller Interface) 2.0** 标准,为 PN7160 提供了一个稳健的抽象层。与标准的高级 API 不同,该协议栈完全控制了协议传输和 APDU 交换,使其成为研究人员和近场通信系统开发人员的理想工具。 核心引擎处理现代安全元件模拟所需的复杂状态机,确保与专业近场通信读卡器的高度兼容性。 ## 主要特性 * **符合 ISO-DEP 标准**:完全实现了基于 ISO/IEC 14443-4 的 T4T 模拟。 * **DESFire EV1 模拟**:包含 43 条命令的完整 DESFire 协议服务端实现,支持原生(专有)和经 ISO 7816-4 封装的 APDU。 * **MifarePlus SL3 模拟**:安全等级 3 (Security Level 3) 模拟,支持 AES-128 双向认证、基于扇区的密钥管理、值块运算(增、减、恢复、转移)以及加密读写操作。已实现 17 条命令。 * **硬件级优化**:针对 PN7160 NCI 2.0 接口进行了优化,实现了极短的帧周转时间(2.5–4 ms)。 * **加密支持**:支持 AES-128、2K3DES 和 3K3DES 会话密钥派生,并提供 CMAC 完整性保护。 * **事务支持**:完全的提交/中止事务模型,支持 DESFire 数据文件和记录的回滚。 * **基于 JSON 的卡片镜像**:卡片配置从 JSON 文件加载 — UID、密钥、文件、应用和访问权限均可完全配置。 * **双协议模式**:自动检测原生 DESFire 和经 ISO 7816-4 封装的命令帧。 * **APDU 透明性**:完整记录和拦截 APDU,以用于诊断和审计。 * **集成测试套件**:165 项自动化测试 — 包含 5 个类别(安全、PICC、应用、ISO、事务)的 49 项 DESFire 测试,以及 116 项 MifarePlus SL3 测试 — 均可针对进程内环回模拟器或物理 PCSC 读卡器运行。 * **跨平台架构**:基于 C++17 构建的模块化核心,支持 Linux 和 Windows (MSYS2)。 ## 截图 此截图展示了带有桌面读卡器与 DESFire 模拟器之间 ISO-DEP 通信功能的 Qt6 GUI 应用程序。 ![hce-lab-screenshot1.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/68/68cdd31371f4672a8c3f3ccfc52c1c472d73a5e53f46bda870570c1670f78f4c.png) ![hce-lab-screenshot2.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/5e/5e231ed481487a6c5c8fb890499ea00409d9b70f2eff4657ff49ada5e86aba2f.png) 使用 [nfc-laboratory](https://github.com/josevcm/nfc-laboratory) 并以 Android 手机作为读卡器、PN7160 作为卡模拟器进行的时间测量 — 响应延迟为 2.5–3.5 ms: ![nfc-lab-screenshot2.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/7f/7fc7a18ad2c65f574d90b01f6070ad36f381518752f3386aae49d86c46c64cec.png) ## 技术规格 | 层级 | 标准 / 协议 | | :--- |:---| | **物理层 / MAC** | ISO/IEC 14443-A, ISO/IEC 14443-B | | **数据链路层** | ISO/IEC 14443-4 (ISO-DEP) | | **控制器接口** | NCI 2.0 (I2C / SPI) | | **模拟模式** | 邻近集成电路卡 (PICC) | | **数据速率** | 106, 212, 424 和 848 kbit/s | ## 支持的目标 ### T4T (Type 4 Tag) 符合 ISO 14443-4 标准的精简目标。可响应所有 APDU,并作为自定义模拟的基础。 ### DESFire EV1 功能齐全的服务端模拟器。卡片镜像从 JSON 配置文件加载(完整的格式参考请参阅 [DESFIRE.md](DESFIRE.md))。 **支持的加密模式:** | 模式 | 密钥类型 | 密钥大小 | |------|----------|----------| | Legacy | 2K3DES | 16 字节 | | ISO | 3K3DES | 24 字节 | | AES | AES-128 | 16 字节 | #### DESFire 命令参考 所有命令均支持在 **原生协议** (`CLA=0x90`) 和 **ISO 7816-4 封装** (`CLA=0x00`) 模式下响应。 ##### 安全与密钥管理 | INS | 命令 | 描述 | |-----|---------|-------------| | `0x0A` | `Authenticate` | 旧版 DES/2K3DES 认证(两步挑战-响应) | | `0x1A` | `AuthenticateISO` | ISO 2K3DES/3K3DES 认证 | | `0xAA` | `AuthenticateAES` | AES-128 双向认证与会话密钥派生 | | `0x45` | `GetKeySettings` | 读取当前应用的密钥配置和访问权限 | | `0x54` | `ChangeKeySettings` | 更新应用密钥设置(需要主密钥认证) | | `0x64` | `GetKeyVersion` | 读取特定密钥的版本字节 | | `0xC4` | `ChangeKey` | 替换当前应用内的某个密钥 | | `0x5C` | `SetConfiguration` | 修改 PICC 级别的配置参数 | ##### PICC 级别命令 | INS | 命令 | 描述 | |-----|---------|-------------| | `0x60` | `GetVersion` | 读取硬件/软件版本及生产批次信息 | | `0x6E` | `GetFreeMemory` | 查询可用的 EEPROM 空间 | | `0x51` | `GetCardUID` | 检索卡片的 7 字节 UID(需要 AES 认证) | | `0xCA` | `CreateApplication` | 使用密钥设置和加密模式创建新应用 | | `0xDA` | `DeleteApplication` | 删除应用及其所有文件 | | `0x5A` | `SelectApplication` | 切换活动的应用上下文 | | `0x6A` | `GetApplicationIDs` | 列出卡片上的所有应用 AID | | `0x6D` | `GetDFNames` | 列出已启用 ISO 模式的应用的 ISO DF 名称 | | `0xFC` | `FormatPICC` | 擦除所有应用和文件(需要 PICC 主密钥) | ##### 应用级别命令 | INS | 命令 | 描述 | |-----|---------|-------------| | `0xCD` | `CreateStandardFile` | 创建标准数据文件(明文/MAC/加密) | | `0xCB` | `CreateBackupFile` | 创建支持备份/回滚的数据文件 | | `0xCC` | `CreateValueFile` | 创建带上下限的有符号 32 位计数器 | | `0xC1` | `CreateLinearRecordFile` | 创建固定大小的记录文件(仅追加) | | `0xC0` | `CreateCyclicRecordFile` | 创建环形缓冲区记录文件 | | `0x6F` | `GetFileIDs` | 列出当前应用中的文件编号 | | `0x61` | `GetISOFileIDs` | 列出已启用 ISO 模式的文件的 ISO EF ID | | `0xF5` | `GetFileSettings` | 读取文件类型、通信模式和访问权限 | | `0x5F` | `ChangeFileSettings` | 更新文件的通信模式和访问权限 | | `0xDF` | `DeleteFile` | 从当前应用中移除文件 | ##### 数据操作命令 | INS | 命令 | 描述 | |-----|---------|-------------| | `0xBD` | `ReadData` | 从标准或备份数据文件中读取字节 | | `0x3D` | `WriteData` | 向标准或备份数据文件写入字节 | | `0x6C` | `GetValue` | 读取值文件的当前值 | | `0x0C` | `Credit` | 增加值文件计数器(在上限内) | | `0xDC` | `Debit` | 减少值文件计数器(在下限内) | | `0x1C` | `LimitedCredit` | 在文件创建时定义的每笔事务限额内进行充值 | | `0xBB` | `ReadRecords` | 从记录文件中读取一条或多条记录 | | `0x3B` | `WriteRecord` | 将记录追加到线性或循环记录文件中 | | `0xEB` | `ClearRecordFile` | 删除记录文件中的所有记录 | | `0xC7` | `CommitTransaction` | 持久化所有待写入操作(扣款、写入、追加) | | `0xA7` | `AbortTransaction` | 放弃所有待处理更改并恢复先前状态 | ##### ISO 7816-4 命令(封装模式) | INS | 命令 | 描述 | |-----|---------|-------------| | `0xA4` | `ISOSelectFile` | 通过 DF 名称选择应用或通过 EF ID 选择文件 | | `0xB0` | `ISOReadBinary` | 从透明 EF 中读取字节(绝对偏移量或 SFI) | | `0xD6` | `ISOUpdateBinary` | 向透明 EF 写入字节(绝对偏移量或 SFI) | | `0xB2` | `ISOReadRecords` | 从记录 EF 中读取记录 | | `0xD7` | `ISOAppendRecord` | 向线性记录 EF 追加记录 | | `0x84` | `ISOGetChallenge` | 请求用于外部认证的随机挑战 | | `0x88` | `ISOInternalAuthenticate` | 执行内部认证 | | `0x82` | `ISOExternalAuthenticate` | 完成双向认证握手 | ### MifarePlus SL3 具有 AES-128 双向认证和加密存储器访问功能的安全等级 3 (SL3) 模拟。配置从 JSON 卡片镜像加载(参见 `targets/mifareplus/`)。 **存储器模型:** 分组为扇区的 16 字节块(2 KB 为 32 个扇区,4 KB 为 40 个扇区)。每个扇区都有独立的 KeyA 和 KeyB 对。 #### MifarePlus SL3 命令参考 所有命令均使用 AES-128 CMAC (`CMAC(sessionMacKey, TI || data)[0:8]`) 以保证请求/响应的完整性。加密操作使用 AES-128 CBC 和会话加密密钥。 ##### 认证命令 | INS | 命令 | 描述 | |-----|---------|-------------| | `0x70` | `FirstAuthenticate` (KeyA) | 使用 KeyA 开始针对扇区的 3 步 AES-128 双向认证 | | `0x72` | `FirstAuthenticate` (KeyB) | 使用 KeyB 开始针对扇区的 3 步 AES-128 双向认证 | | `0x76` | `FollowingAuthenticate` (KeyA) | 使用 KeyA 将活动会话扩展到额外的扇区(重用事务标识符) | | `0x77` | `FollowingAuthenticate` (KeyB) | 使用 KeyB 将活动会话扩展到额外的扇区(重用事务标识符) | | `0x78` | `ResetAuthentication` | 使当前已认证的会话状态失效 | ##### 存储器访问命令 | INS | 命令 | 描述 | |-----|---------|-------------| | `0x30` | `Read` | 读取一个或多个连续的明文块,带有 CMAC 响应完整性 | | `0x31` | `ReadEncrypted` | 读取一个或多个 AES-CBC 加密的块;在请求和响应上均验证 MAC | | `0xA0` | `Write` | 写入明文数据块;MAC 涵盖 `TI \|\| blockAddr \|\| data` | | `0xA1` | `WriteEncrypted` | 写入 AES-CBC 加密的块,并进行请求/响应 MAC 验证 | ##### 值块命令 值块操作遵循两步模型:**load** 命令(`Increment`/`Decrement`/`Restore`)将结果放入内部传输寄存器,随后由 `Transfer` 将其提交至目标块。原子的 `*Transfer` 变体将这两个步骤合二为一。 | INS | 命令 | 描述 | |--------------|-------------| | `0xC0` | `Increment` | 将有符号的 32 位增量加到值块上,并将结果存入传输寄存器 | | `0xC1` | `Decrement` | 从值块中减去有符号的 32 位增量,并将结果存入传输寄存器 | | `0xC2` | `Restore` | 将值块原样复制到传输寄存器(无算术运算) | | `0xB0` | `Transfer` | 将传输寄存器的内容写入指定的目标块 | | `0x35` | `IncrementTransfer` | 自动将增量加到源值块上,并将结果写入目标块 | | `0x36` | `DecrementTransfer` | 自动从源值块中减去增量,并将结果写入目标块 | | `0x37` | `RestoreTransfer` | 自动将源值块复制到目标块,不进行算术运算 | ##### 卡片管理命令 | INS | 命令 | 描述 | |-----|---------|-------------| | `0x56` | `GetUID` | 检索使用会话密钥加密的卡片 7 字节 UID(需要先前的认证) | ## 卡片配置 (JSON 格式) 卡片镜像存储在 `targets/` 中并在启动时加载: ``` targets/ ├── desfire/ │ ├── desfire-factory.json — blank factory card (all-zero keys) │ ├── desfire-ndef.json — NDEF application layout │ └── mifareplus/ └── mifareplus-factory.json — blank factory card ``` JSON 格式在 [DESFIRE.md](DESFIRE.md) 中有完整记录。DESFire 卡片的快速概览: ``` { "type": "desfire", "version": 1, "discovery": { "UID": "04A1B2C3D4E5F6", "ATQA": 17411, "SAK": 32, "ATS": { "TB1": 129, "TC1": 2, "HB": "80" } }, "payload": { "info": { "hw": { "vendor": 4, "type": 1, "subtype": 1, "version": 256, "storage": 24, "protocol": 5 }, "sw": { "vendor": 4, "type": 1, "subtype": 1, "version": 260, "storage": 24, "protocol": 5 }, "tr": { "batch": 690199491770, "week": 8, "year": 22 } }, "directory": [ { "aid": 0, "isoId": 16128, "isoName": "D2760000850100", "keySettings1": 15, "keySettings2": 1, "keys": [ { "id": 0, "type": 0, "version": 0, "value": "00000000000000000000000000000000" } ] } ] } } ``` 密钥类型值:`0` = 2K3DES(16 字节),`1` = 3K3DES(24 字节),`2` = AES-128(16 字节)。 ## 集成测试套件 (`hce-ut`) `hce-ut` 二进制文件是一个独立的集成测试套件,涵盖了 DESFire 和 MifarePlus 客户端 API。测试在两种模式下运行: | 模式 | 描述 | |------|-------------| | **环回** (默认) | 进程内模拟器 — 无需硬件 | | **PCSC** (`--pcsc`) | 物理 NFC 读卡器 + 原始 DESFire 卡 | ### DESFire 测试类别 | 类别 | 标志 | 测试 | 覆盖范围 | |----------|------|-------|----------| | 安全 | `--test-security` | 10 | Legacy/ISO/AES 认证、密钥更改、会话密钥派生、错误码 | | PICC | `--test-picc` | 10 | GetVersion, GetFreeMemory, GetCardUID、创建/删除/选择应用、访问控制、格式化 | | 应用 | `--test-application` | 14 | 标准、备份、值、线性记录、循环记录文件;文件设置;有限额度 | | ISO 7816-4 | `--test-iso` | 7 | ISOSelect (名称/ID), ISOReadBinary (绝对/SFI), ISOUpdateBinary, GetISOFileIDs | | 事务 | `--test-transaction` | 8 | 提交、中止、记录清除、链式、MAC 模式、AES 加密模式、CMAC 明文 | **总计:5 个类别共 49 项测试。** ### MifarePlus 测试套件 | 类别 | 标志 | 测试 | 覆盖范围 | |----------|------|-------|----------| | 认证 | `--test-mfp` | 116 | FirstAuthenticate (KeyA/KeyB), FollowingAuthenticate, ResetAuthentication、认证错误案例、错误密钥拒绝、未认证访问、扇区作用域强制执行 | | 存储器访问 | `--test-mfp` | — | 带 CMAC 完整性的明文读/写、带 AES-CBC 的加密读/写、多块操作、块 0 保护、跨扇区拒绝 | | 值块 | `--test-mfp` | — | Increment→Transfer, Decrement→Transfer, Restore→Transfer, IncrementTransfer, DecrementTransfer, RestoreTransfer、非值块拒绝 | | 卡片管理 | `--test-mfp` | — | GetUID(已认证)、GetUID(未认证错误)、16 字节解密 UID 块 | | 多扇区 | `--test-mfp` | — | 跨扇区的后续认证、扇区更改后的跨扇区读取拒绝 | **总计:116 项断言** 作为单个 `--test-mfp` 套件运行。 ### 测试标志 | 标志 | 效果 | |------|--------| | *(无)* | 运行所有测试类别 — DESFire + MifarePlus(与 `--test-all` 相同) | | `--test-all` | 依次运行所有 DESFire 和 MifarePlus 测试 | | `--test-security` | 仅运行 DESFire 安全命令测试 | | `--test-picc` | 仅运行 DESFire PICC 级别命令测试 | | `--test-application` | 仅运行 DESFire 应用级别命令测试 | | `--test-iso` | 仅运行 DESFire ISO 7816-4 命令测试 | | `--test-transaction` | 仅运行 DESFire 事务控制测试 | | `--test-mfp` | 仅运行 MifarePlus SL3 测试 | | `--pcsc` | 使用物理 PCSC 读卡器代替进程内环回 | | `--verbose` | 启用 `TRACE_LEVEL` 日志记录 — 显示交换的每一个 APDU | | `--help`, `-h` | 打印用法 | ### 在 Linux 上运行测试 ``` # 构建 cmake -DCMAKE_BUILD_TYPE=Debug -DHCE_BUILD_APP_QT=OFF -S . -B build cmake --build build --target hce-ut -- -j$(nproc) # 运行所有测试(环回,无需硬件) ./build/src/hce-app/app-ut/hce-ut # 单独运行 DESFire 类别 ./build/src/hce-app/app-ut/hce-ut --test-security ./build/src/hce-app/app-ut/hce-ut --test-picc ./build/src/hce-app/app-ut/hce-ut --test-application ./build/src/hce-app/app-ut/hce-ut --test-iso ./build/src/hce-app/app-ut/hce-ut --test-transaction # 运行 MifarePlus SL3 测试 ./build/src/hce-app/app-ut/hce-ut --test-mfp # 运行并输出详细 APDU 跟踪 ./build/src/hce-app/app-ut/hce-ut --test-security --verbose # 针对物理 DESFire 卡运行 ./build/src/hce-app/app-ut/hce-ut --pcsc ``` ### 在 Windows (MSYS2) 上运行测试 ``` # 定位 MSYS2(可能在 C: 或 D: 上) $msys2 = @("C:\develop\msys64", "D:\develop\msys64") | Where-Object { Test-Path $_ } | Select-Object -First 1 $env:PATH = "$msys2\ucrt64\bin;$msys2\usr\bin;" + $env:PATH # 构建 cmake --build cmake-build-debug --target hce-ut # 运行所有测试 .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe # 单独运行 DESFire 类别 .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-security .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-picc .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-application .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-iso .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-transaction # 运行 MifarePlus SL3 测试 .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-mfp # 运行并输出详细 APDU 跟踪 .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --test-security --verbose # 针对物理 DESFire 卡运行 .\cmake-build-debug\src\hce-app\app-ut\hce-ut.exe --pcsc ``` ### 测试输出 ``` === Security Commands Tests === [PASS] authenticateLegacy [PASS] authenticateISO [PASS] authenticateAES ... === Security Tests Results: 10 passed, 0 failed === === Mifare Plus Tests === [PASS] authenticate(sector=0) returns STATUS_OK [PASS] authenticateFollowing(sector=1) returns STATUS_OK ... === Mifare Plus Tests Results: 116 passed, 0 failed === ``` 所有测试通过时退出码为 `0`;发生任何失败则为 `1`。 ## 项目目标 1. **协议研究**:用于研究近场通信读卡器行为及其国际标准实现的可靠工具。 2. **系统审计**:使安全专业人员能够对访问控制基础设施执行压力测试和延迟分析。 3. **硬件赋能**:为 PN7160 控制器提供现代、开源的替代方案,摆脱如 PN532 等老旧芯片。 ## 支持的硬件 该协议栈旨在与高性能硬件桥接器配合工作,以确保在 ISO-DEP 事务期间实现最低延迟(目前为 2.5 ms 至 4 ms)。 ### 1. NFC 控制器:NXP PN7160 **PN7160** 是模拟引擎的核心。与旧版控制器不同,它支持最新的 NCI 标准,并在卡模拟 (CE) 模式下提供卓越的稳定性。 ### 2. USB 桥接器:FTDI FT232H 为了将 PN7160 与 PC 连接,该项目使用处于 **SPI 模式**(通过 MPSSE - 多协议同步串行引擎)的 **FT232H**。由于以下原因,这比 I2C 更受青睐: * **更高的吞吐量**:对于高比特率的 ISO-DEP 帧至关重要。 * **更低的延迟**:对于满足 ISO 14443-4 严格的帧等待时间 (FWT) 要求至关重要。 对于 PN7160,我使用带有 [Adafruit FT232H Breakout](https://www.adafruit.com/product/2264)(或类似产品)的开发板 [OM27160B1](https://www.nxp.com/design/design-center/development-boards-and-designs/PN7160-EVK)。 **OM27160B1HN 板 (OM27160A1HN 为 I2C 版本)** ![OM27160B1.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/84/84554e6cee28af62b5ff39ac1397eb693b73d75484d78a786aac18ce4c73daeb.png) | J1 | PN7160 信号 | |:---|:---| | #1 | VDD(PAD): 1.8 V 或 3.3 V 主机接口电压参考 | | #2 | VDD(UP)/VBAT: 2.8 V 至 5.5 V 供电电压 | | J2 | PN7160 信号 (仅与 OM27160A1HN I2C 版本相关) | |:---|:---| | #1 | I2C_SDA: I2C 总线串行数据 | | #2 | I2C_SCL: I2C 总线串行时钟输入 | | J3 | PN7160 信号 | |:---|:---| | #1 | 未连接 | | #2 | GND: 接地 | | #3 | IRQ: 中断请求输出 | | #4 | VEN: 重置引脚输入 | | #5 | DWL_REQ: 下载请求引脚输入 | | #6 | 未连接 | | J4 | PN7160 信号 | |:----|:---| | #1 | SPI_COTI: SPI 总线控制器输出,目标输入数据 (MOSI) | | #2 | SPI_CITO: SPI 总线控制器输入,目标输出数据 (MISO) | | #3 | SPI_NSS: SPI 总线目标选择 (CS) | | #4 | SPI_SCK: SPI 总线串行时钟 (SCK) | | #5 | 未连接 | | #6 | 未连接 | **FT232H Breakout (USB-C 转 SPI 桥接器)** ![FT232H-breakout.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/7f/7fcbfd324ad513681d3fa721d60fafe59cf2f1d33b891ac310d62c2851abdd76.png) ## 硬件连接原理图 (SPI 模式) | FT232H 引脚 | OM27160B1HN 引脚 | 功能 | 描述 | |:-----------|:----------------|:---------|:------------| | D0 | J4/#4 - SCK | 串行时钟 | SPI 时钟信号 | | D1 | J4/#1 - MOSI | 主出从入 | 从 PC 到 PN7160 的数据 | | D2 | J4/#2 - MISO | 主入从出 | 从 PN7160 到 PC 的数据 | | D3 | J4/#3 - NSS | 片选 | SPI 从机选择(低电平有效) | | D5 | J3/#3 - IRQ | 中断请求 | PN7160 数据就绪信号 | | C2 | J3/#5 - DWL_REQ | 下载请求 | 固件更新 / Bootloader 模式 | | C3 | J3/#4 - VEN | PN7160 使能 | PN7160 的重置/电源控制 | | GND | J3/#2 - GND | 共地 | 共享参考 | | 3V | J1/#1 - 3V | 逻辑电平 VCC | I/O 逻辑电平参考 | | 5V | J1/#2 - 5V | 系统电源 | 开发板的主电源 | ### FT232H & OM27160B1HN 连接 ![FT232H-OM27160B1HN-connection.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/57/5787b627330cb7d3e62c4581b9e39708e0c37233f9f4feeacab3ed25027f2372.png) **自制电路板堆叠** ![FT232H-OM27160B1HN.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/b4/b4c05ffaf5c56a7b2e023c7a11e4db5c4656fe81247291d4416529c95c9ed179.png) *注意:C1 引脚的连接仅为了机械稳定性,不再使用。* ## 模拟时序 使用这些开发板以 1 MHz 频率的 SPI 进行通信时,我实现了 2.5 到 3.5 ms 之间的响应时间。这主要是由于 USB 总线延迟造成的 — 通过仔细调整可以更低,但永远不会低于 ~1.5 ms。相比之下,主机 CPU 的处理时间可以忽略不计。 # 构建说明 ## 前置条件 | 工具 | 版本 | 备注 | |------|---------|-------| | CMake | 3.21+ | | | C++ 编译器 | C++17 | 推荐在 Windows 上使用 GCC 11+, MSYS2 UCRT | | Qt6 | 6.x | 需要 Base 和 SVG 模块 | | libusb | 1.0 | | | libftdi | 1.x | | ### 应用程序目标 | 目标 | 二进制文件 | 描述 | |--------|--------|-------------| | `hce-lab` | `hce-lab` / `hce-lab.exe` | Qt6 GUI 应用程序 | | `hce-ut` | `hce-ut` / `hce-ut.exe` | 集成测试套件 | | `hce-t4t` | `hce-t4t` / `hce-t4t.exe` | CLI 测试工具 (无 Qt) | ## 在 Linux 上构建 安装依赖项 (Ubuntu/Debian): ``` sudo apt install cmake g++ qt6-base-dev libqt6svg6 libusb-1.0-0-dev zlib1g-dev libgl1-mesa-dev libftdi1-dev ``` 克隆并构建: ``` git clone https://github.com/josevcm/hce-laboratory.git cd hce-laboratory # Release 构建(GUI 应用程序) cmake -DCMAKE_BUILD_TYPE=Release -S . -B build cmake --build build --target hce-lab -- -j$(nproc) # Debug 构建并附带测试套件 cmake -DCMAKE_BUILD_TYPE=Debug -S . -B build-debug cmake --build build-debug --target hce-ut -- -j$(nproc) # 启动 GUI 应用程序 ./build/src/hce-app/app-qt/hce-lab ``` ## 在 Windows (MSYS2 UCRT) 上构建 ### 1. 安装 MSYS2 从 [msys2.org](https://www.msys2.org/) 下载 MSYS2 安装程序,并安装至 `C:\develop\msys64` 或 `D:\develop\msys64`。 ![msys2-install-1.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/a0/a096ab6d7517f1d1dc689dabfc2d61254d8afe9407730fc9c8c4b1381dbaadb8.png) ### 2. 安装依赖项 打开 **YS2 UCRT64** shell 并运行: ``` pacman -S mingw-w64-ucrt-x86_64-qt6-base pacman -S mingw-w64-ucrt-x86_64-qt6-svg pacman -S mingw-w64-ucrt-x86_64-gcc pacman -S mingw-w64-ucrt-x86_64-cmake pacman -S mingw-w64-ucrt-x86_64-ninja pacman -S mingw-w64-ucrt-x86_64-libusb pacman -S mingw-w64-ucrt-x86_64-libftdi ``` ### 3. 克隆并构建 打开 **PowerShell** 并找到您的 MSYS2 安装路径: ``` $msys2 = @("C:\develop\msys64", "D:\develop\msys64") | Where-Object { Test-Path $_ } | Select-Object -First 1 $env:PATH = "$msys2\ucrt64\bin;$msys2\usr\bin;" + $env:PATH git clone https://github.com/josevcm/hce-laboratory.git cd hce-laboratory ``` 提供了两个预配置的构建树: ``` # Release 构建(GUI 应用程序) cmake --build cmake-build-release --target hce-lab # Debug 构建并附带测试套件 cmake --build cmake-build-debug --target hce-ut # 复制应用程序二进制文件以便访问 cp .\cmake-build-release\src\hce-app\app-qt\hce-lab.exe hce-lab.exe ``` ## FT232H 驱动程序设置 (仅限 Windows) ### 使用 FT_PROG 配置 IO 引脚 下载并安装 [FT_PROG](https://ftdichip.com/utilities/)。连接 FT232H 并选择 **DEVICES → Scan and Parse**。 ![ft_prog-config1.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/14/14f31d599b664f4caad0f31cafd6a97bf54b1186cd664b13b99b9d379ec2aec8.png) 在 **Hardware Specific → IO Controls** 中,将所有端口设置为 **Tristate**: ![ft_prog-config2.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/1f/1ffa6757c31afad6de279c6e5222efb0ca00381d25d5eb4399aef6d41cce7492.png) ### 使用 Zadig 替换驱动程序 下载 [zadig](https://zadig.akeo.ie/)。选择 **Options → List All Devices**,找到您的 FT232H 适配器(列作 **Single RS232-HS**),选择 **libusbK**(或 WinUSB),然后按下 **Replace Driver**。 ![zadig-config1.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/20/20a7e082856920e504219aa245911193b5385ec2fdbe438440c5b4f98da0103b.png) ![zadig-config2.png](https://static.pigsec.cn/wp-content/uploads/repos/cas/6d/6db8efe9f88612dd464daf343158ad458f633e945c9b9dce524e1e9312620453.png) ## 参考链接 以下资源在此存档,作为模拟工作原理的参考: * [ISO/IEC 7816-4 标准](https://www.freecalypso.org/pub/GSM/ISO7816/ISO_7816-4_2005.pdf) * [DESFire EV0 数据手册 (M075031, 2004 年 4 月)](https://web.archive.org/web/20170201031920/http://neteril.org/files/M075031_desfire.pdf) * [DESFire 功能规范 (MF3ICD81, 2008 年 11 月)](https://web.archive.org/web/20201115030854/https://marvin.blogreen.org/~romain/nfc/MF3ICD81%20-%20MIFARE%20DESFire%20-%20Functional%20specification%20-%20Rev.%203.5%20-%2028%20November%202008.pdf) * [Mifare Plus (MF1PLUSx0y1, 2009 年 3 月)](https://marvin.blogreen.org/~romain/nfc/Mifare%20Plus.pdf) * [NXP 应用笔记 AN12343](https://www.nxp.com/docs/en/application-note/AN12343.pdf) * [TI DESFire EV1 标签 AES 认证规范 (sloa213.pdf)](https://www.ti.com/lit/an/sloa213/sloa213.pdf) * [NXP 应用笔记 AN10833](https://www.nxp.com/docs/en/application-note/AN10833.pdf) ## 许可证 本项目基于 **GNU General Public License v3.0 (GPL-3.0)** 授权。这确保了核心协议栈保持开源并造福全球安全社区。 ## 商标声明 MIFARE 和 DESFire 是 NXP Semiconductors 的注册商标。PN7160 及相关产品名称是 NXP Semiconductors 的商标。本项目与 NXP Semiconductors 没有任何关联、认可或赞助关系。 *免责声明:本项目仅供教育和专业审计目的使用。在对您不拥有的系统进行测试之前,请务必确保您已获得许可。*
标签:Bash脚本, Homebrew安装, NFC, 主机卡模拟, 射频识别, 智能卡仿真, 物联网, 硬件接口