5.2 KiB
5.2 KiB
PCIe密码卡强类型封装设计(第一期)
- 日期:2026-02-28
- 范围:基于
0018接口.pdf(国密标准SDF)与PCIE密码卡应用接口说明书.docx(SDFE扩展) - 目标:为上层提供强类型业务方法,屏蔽底层JNA细节
1. 设计目标与约束
1.1 目标
- 提供强类型业务方法,不要求上层使用
execute(command, params)。 - 采用短连接会话模型:每个业务方法内部完成
openDevice/openSession/call/closeSession/closeDevice。 - 第一期开通核心子集接口,覆盖设备管理、会话、HMAC、LMK与常用密钥管理。
- 统一错误模型与错误码映射,便于上层处理与运维排障。
1.2 非目标
- 不在第一期覆盖文档所有SDF/SDFE接口。
- 不在第一期做多设备负载均衡与高并发优化。
- 不在第一期实现JNI桥代码生成。
2. 方案选型
2.1 备选方案
- 动态命令入口(
execute(command, params))+ 强类型外观。 - 纯强类型服务(推荐)。
- 从头文件自动生成绑定与服务代码。
2.2 选型结论
采用方案2:新增 PcieCryptoService 及其 JnaPcieCryptoService 实现,
强类型方法直接调用JNA映射,统一通过短连接模板管理句柄生命周期。
3. 总体架构
3.1 分层
PcieCryptoService:面向上层的强类型业务接口。JnaPcieCryptoService:服务实现,调用PcieNativeLibrary。PcieSessionTemplate:统一短连接模板。PcieNativeLibrary:JNA native函数映射。PcieErrorMapper:错误码映射(retCode -> 业务可读信息)。
3.2 调用路径
上层业务 -> PcieCryptoService 强类型方法 -> PcieSessionTemplate -> PcieNativeLibrary -> 厂商 .so
4. 第一期开通接口(核心子集)
4.1 设备与会话
getDeviceNumber()->SDFE_GetDeviceNumbergetNormalDeviceNumber()->SDFE_GetNormalDeviceNumberdeviceSelfTest()->SDFE_DeviceSelfTestdeviceConfGet()->SDFE_DeviceConfGetinitIdentify(oldPin, newPin)->SDFE_InitIdentify
注:
open/close作为模板内部行为,不暴露给上层业务接口。
4.2 常用密钥管理(用户确认的8组)
generateKeyPairEcc/generateKeyPairRsagenerateKekbackupUserKey/recoverUserKeybackupKek/recoverKekdeleteUserKey/deleteKekstatusUserKeyEcc/statusUserKeyRsastatusKekchangePrivateKeyAccessPassword
4.3 HMAC
hmac(algId, key, data)- 内部流程:
SDFE_HmacInit->SDFE_HmacUpdate->SDFE_HmacFinal
4.4 LMK(核心)
generateLmk/loadLmk/backupLmk/recoverLmk/destroyLmkcheckLmk/exportLmkSeedMac
5. 强类型模型
5.1 请求对象
GenerateKeyRequest:keyIndex,keyBits,keyTypeRecoverUserKeyRequest:keyIndex,keyType,cipherKeyData,storeFlagRecoverKekRequest:keyIndex,cipherKeyDataChangePrivateKeyPasswordRequest:keyIndex,oldPassword,newPasswordHmacRequest:algId,key,data
5.2 响应对象
OperationResult:success,retCode,messageDeviceCountResult:deviceNumber,normalDeviceNumberDeviceConfResult:映射SDFE_DeviceConfBackupUserKeyResult/BackupKekResult:data,lengthKeyStatusResult:keyStateHmacResult:hmac,hmacLength
6. 会话模板(短连接)
定义统一模板方法:
executeWithSession(apiName, callback):
SDF_OpenDevice
SDF_OpenSession
callback(session)
SDF_CloseSession
SDF_CloseDevice
约束:
- 所有强类型方法必须通过模板执行。
- 关闭失败仅记录日志,不覆盖主调用错误。
- 模板保证异常场景也能回收句柄。
7. 错误处理
retCode == 0:成功。retCode != 0:抛PcieCryptoException(apiName, retCode, mappedMessage)。- 映射文档补充错误码:
SDR_UKEYERRSDR_GENKEYERRSDR_STATEERRSDR_RETRYERRSDR_DEVICE_BUSYSDR_RET_ERR_STATUSSDR_RET_INIT_STATUSSDR_RET_LOGINEDSDR_RET_GD32_TIMEOUT
- 参数校验失败在服务层抛
IllegalArgumentException,不下发至设备。
8. 并发与安全
- 第一期开启串行访问(单设备锁)避免状态错乱。
- PIN/口令参数不打印明文日志。
- 密钥备份字节在服务层保持二进制,不做文本日志输出。
9. 对上层的使用方式
示例:
pcieCryptoService.generateLmk()pcieCryptoService.backupKek(keyIndex, outBufferSize)pcieCryptoService.hmac(request)
上层仅依赖强类型接口与DTO,不直接依赖JNA类型和指针。
10. 验收标准
- 强类型接口可完成第一期核心子集调用。
- 每个方法均使用短连接模板。
- 统一异常中包含
apiName + retCode + mappedMessage。 mvn -DskipTests compile通过。- 关键路径联调用例可跑通:
getDeviceNumberdeviceConfGethmacgenerateKek + statusKek
11. 后续扩展
- 第二期覆盖U盾与内部密钥管理。
- 第三期覆盖全量SDF/SDFE并补充结构体严格对齐校验。
- 加入真实设备集成测试与回放测试。