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 应用程序。


使用 [nfc-laboratory](https://github.com/josevcm/nfc-laboratory) 并以 Android 手机作为读卡器、PN7160 作为卡模拟器进行的时间测量 — 响应延迟为 2.5–3.5 ms:

## 技术规格
| 层级 | 标准 / 协议 |
| :--- |:---|
| **物理层 / 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 版本)**

| 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 桥接器)**

## 硬件连接原理图 (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 连接

**自制电路板堆叠**

*注意: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`。

### 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**。

在 **Hardware Specific → IO Controls** 中,将所有端口设置为 **Tristate**:

### 使用 Zadig 替换驱动程序
下载 [zadig](https://zadig.akeo.ie/)。选择 **Options → List All Devices**,找到您的 FT232H 适配器(列作 **Single RS232-HS**),选择 **libusbK**(或 WinUSB),然后按下 **Replace Driver**。


## 参考链接
以下资源在此存档,作为模拟工作原理的参考:
* [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, 主机卡模拟, 射频识别, 智能卡仿真, 物联网, 硬件接口