寻求指导:se05x_Minimal 在 OP-TEE 环境中失败 NXP社区的各位朋友,大家好! 我正在尝试在运行 Linux 和 OP-TEE 的目标板上运行 se05x_Minimal。 根据这篇社区帖子(如何将 Plug and Trust MW 集成到 OP-TEE 中)中推荐的解决方案,我们相应地构建了环境。 具体来说,对于步骤 2,我们在配置设置时没有启用“保持 CAAM 启用”选项。 由于这种配置,连接到 SE05x 的 I2C 总线由 OP-TEE(安全世界)管理,标准的 Linux I2C 设备节点 /dev/i2c-1 在普通世界(Linux)中不可见/不可用。 当直接从 Linux 用户空间控制台执行 `./se05x_Minimal` 时,会遇到以下错误: App :INFO :Running ./se05x_Minimal
App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
App :INFO :PlugAndTrust_v04.07.01_20250519
App :INFO :Using default PlatfSCP03 keys. You can use keys from file using ENV=EX_SSS_BOOT_SCP03_PATH
smCom :ERROR:opening failed...
Failed to open the i2c bus: No such file or directory
smCom :INFO :Pass i2c device address in the format : .
smCom :INFO :Example ./example /dev/i2c-1:0x48 OR ./example /dev/i2c-1
smCom :ERROR:phPalEse_i2c_open_and_configure Failed retry
smCom :ERROR:I2C init Failed: retval d
smCom :ERROR:phPalEse_Init Failed
smCom :ERROR: Failed to create physical connection with ESE
sss :ERROR:SM_I2CConnect Failed. Status 7012
App :ERROR:sss_session_open failed
App :ERROR:ex_sss_session_open Failed
App :ERROR:!ERROR! ret != 0. 环境及硬件设置:评估板:MCIMX8M-WEVK(i.MX 8M 双核/四核) 安全元件板:OM-SE051ARD 安全元件:SE05x(Plug & Trust MW v04.07.01) 操作系统:Linux(普通环境)+ OP-TEE(安全环境) 中间件选项(CMake):-DPTMW_Host=iMXLinux,-DPTMW_SMCOM=T1oI2C 注意:如果启用了 Linux 内核空间直接 I2C (/dev/i2c-1),则 se05x_Minimal 可以正常工作。 smCom 似乎仍在尝试打开物理 Linux I2C 设备 (/dev/i2c-X),该设备在我们的正常世界环境中已不存在。 请问能否提供一些说明,告诉我们需要进行哪些操作或修改,才能使 se05x_Minimal 在此设置下成功运行? SE050 Re: Seeking guidance: se05x_Minimal fails in OP-TEE environment @Kan_Li 非常感谢您的详细解释和提供的C代码示例。 按照您的指导,我们使用标准 PKCS#11 API (libckteec.so.0) 在选项 1 (OP-TEE 独占 I2C 设置) 下实现了一个 C 应用程序。 所有操作——包括密钥生成、AES 加密/解密、RSA 签名/验证和 RSA 加密/解密——现在都完全按预期运行。 感谢您对解决此问题的支持。 Re: Seeking guidance: se05x_Minimal fails in OP-TEE environment 嗨@Uc_S ,
这是一个非常好的重要问题。简而言之:
在选项 1(OP-TEE 专用 I2C)中,Plug & Trust MW SSS API 不能直接从 Linux 用户空间使用。您必须通过 libckteec.so 使用标准的 PKCS#11 C API。
下面提供了所有必要操作的详细说明和完整的 C 代码示例。
为什么在此设置中无法使用 SSS API
Plug & Trust MW SSS API( sss_session_open 、 sss_key_store_set_key 、 sss_asymmetric_sign_digest 等)依赖于传输层与 SE051 通信。所有受支持的传输( T1oI2C 、 JRCP_V1_AM 等)最终都需要 Linux I2C 访问或代理服务器——当 OP-TEE 独占 I2C 总线时,这两者都不可用。
OP-TEE 独占设置中的正确路径是:
Your C App → PKCS#11 C API (cryptoki.h) → libckteec.so → OP-TEE PKCS#11 TA → SE051
libckteec 由 optee-client 提供,并以 OP-TEE PKCS#11 TA 作为其后端实现 Cryptoki 接口。TA 进而通过 OP-TEE 的原生 I2C 驱动程序将加密操作路由到 SE051。
必需的标头和链接
#include /* 标准 Cryptoki 标头 — 来自 optee-client 或 OpenSC */
编译和链接:
gcc -o my_app my_app.c-ldl
或者直接链接:
gcc -o my_app my_app.c/usr/lib/libckteec.so.0
如果使用动态加载,则在运行时设置模块路径:
#define PKCS11_MODULE "/usr/lib/libckteec.so.0"
初始化和令牌设置(启动时调用一次)
#include #include #include #define CHECK_RV(rv, msg) \
如果 ((rv) != CKR_OK) { fprintf(stderr, "%s 失败:0x%lX\n", (msg), (rv)); goto cleanup; }
/* 用户 PIN 码 — 必须与使用 pkcs11-tool --init-pin 设置的 PIN 码一致 */
static CK_UTF8CHAR user_pin[] = "1234";
静态CK_ULONG user_pin_len = 4;
CK_FUNCTION_LIST *p11 = NULL; /* 全局函数列表指针 */
CK_SESSION_HANDLE session = CK_INVALID_HANDLE;
int pkcs11_init(void)
{
CK_RV rv;
CK_ULONG slot_count = 0;
CK_SLOT_ID 插槽 ID;
CK_SLOT_ID slot_list[8];
/* 加载函数列表 — 如果使用动态链接,请使用 C_GetFunctionList() */
rv = C_Initialize(NULL_PTR);
CHECK_RV(rv, "C_Initialize");
/* 获取可用槽位 */
rv = C_GetSlotList(CK_TRUE, NULL_PTR, &slot_count);
CHECK_RV(rv, "C_GetSlotList (count)");
rv = C_GetSlotList(CK_TRUE, slot_list, &slot_count);
CHECK_RV(rv, "C_GetSlotList");
slot_id = slot_list[0]; /* 使用第一个槽位 — OP-TEE PKCS#11 TA */
/* 打开读写会话 */
rv = C_OpenSession(slot_id, CKF_SERIAL_SESSION | CKF_RW_SESSION,
NULL_PTR、NULL_PTR、&session);
CHECK_RV(rv, "C_OpenSession");
/* 以普通用户身份登录 */
rv = C_Login(session, CKU_USER, user_pin, user_pin_len);
CHECK_RV(rv, "C_Login");
返回 0;
清理:
返回 -1;
}
void pkcs11_cleanup(void)
{
C_Logout(session);
C_CloseSession(session);
C_Finalize(NULL_PTR);
}
操作 1:生成 RSA 密钥对并存储在 SE051 中
int generate_rsa_keypair(CK_OBJECT_HANDLE *pub_key, CK_OBJECT_HANDLE *priv_key)
{
CK_RV rv;
CK_MECHANISM mech = { CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0 };
CK_ULONG 密钥位数 = 2048;
CK_BYTE pub_exponent[] = { 0x01, 0x00, 0x01 }; /* 65537 */
CK_BBOOL ck_true = CK_TRUE;
CK_BBOOL ck_false = CK_FALSE;
/* 密钥 ID 存储在 SE051 NVM 中 — 选择一个唯一的 4 字节 ID */
CK_BYTE key_id[] = { 0x10, 0x10, 0x10, 0x10 };
CK_ATTRIBUTE pub_tmpl[] = {
{ CKA_MODULUS_BITS, &key_bits, sizeof(key_bits) },
{ CKA_PUBLIC_EXPONENT, pub_exponent, sizeof(pub_exponent) },
{ CKA_VERIFY, &ck_true, sizeof(ck_true) },
{ CKA_ENCRYPT, &ck_true, sizeof(ck_true) },
{ CKA_TOKEN, &ck_true, sizeof(ck_true) },
{ CKA_ID, key_id, sizeof(key_id) },
};
CK_ATTRIBUTE priv_tmpl[] = {
{ CKA_SIGN, &ck_true, sizeof(ck_true) },
{ CKA_DECRYPT, &ck_true, sizeof(ck_true) },
{ CKA_TOKEN, &ck_true, sizeof(ck_true) },
{ CKA_SENSITIVE, &ck_true, sizeof(ck_true) },
{ CKA_EXTRACTABLE, &ck_false, sizeof(ck_false) },
{ CKA_ID, key_id, sizeof(key_id) },
};
rv = C_GenerateKeyPair(session, &mech,
pub_tmpl,sizeof(pub_tmpl) / sizeof(pub_tmpl[0]),
priv_tmpl, sizeof(priv_tmpl) / sizeof(priv_tmpl[0]),
公钥,私钥);
CHECK_RV(rv, "C_GenerateKeyPair");
printf("RSA-2048 密钥对已生成。私钥保存在 SE051 NVM 中。\n");
返回 0;
清理:
返回 -1;
}
操作 2:生成 AES 密钥并存储在 SE051 中
int generate_aes_key(CK_OBJECT_HANDLE *aes_key)
{
CK_RV rv;
CK_MECHANISM mech = { CKM_AES_KEY_GEN, NULL_PTR, 0 };
CK_ULONG key_len = 32; /* 256 位 AES */
CK_BBOOL ck_true = CK_TRUE;
CK_BBOOL ck_false = CK_FALSE;
CK_BYTE key_id[] = { 0x20, 0x00, 0x00, 0x01 };
CK_ATTRIBUTE aes_tmpl[] = {
{ CKA_VALUE_LEN, &key_len, sizeof(key_len) },
{ CKA_ENCRYPT, &ck_true, sizeof(ck_true) },
{ CKA_DECRYPT, &ck_true, sizeof(ck_true) },
{ CKA_TOKEN, &ck_true, sizeof(ck_true) },
{ CKA_SENSITIVE, &ck_true, sizeof(ck_true) },
{ CKA_EXTRACTABLE, &ck_false, sizeof(ck_false) },
{ CKA_ID, key_id, sizeof(key_id) },
};
rv = C_GenerateKey(session, &mech,
aes_tmpl,sizeof(aes_tmpl) / sizeof(aes_tmpl[0]),
aes_key);
CHECK_RV(rv, "C_GenerateKey (AES)");
printf("AES-256密钥已生成并存储在SE051中。\n");返回 0;
清理:
返回 -1;
}
操作 3 和 4:AES-密码块链接(CBC) 加密/解密
int aes_encrypt(CK_OBJECT_HANDLE aes_key,
const CK_BYTE *plaintext, CK_ULONG plaintext_len,
CK_BYTE *密文,CK_ULONG *密文长度)
{
CK_RV rv;
CK_BYTE iv[16] = { 0 }; /* 示例:全零 IV;生产环境中使用随机 IV */
CK_MECHANISM mech = { CKM_AES_CBC_PAD, iv, sizeof(iv) };
rv = C_EncryptInit(session, &mech, aes_key);
CHECK_RV(rv, "C_EncryptInit");
rv = C_Encrypt(session, (CK_BYTE *)plaintext, plaintext_len,
密文,密文长度);
CHECK_RV(rv, "C_Encrypt");
返回 0;
清理:
返回 -1;
}
int aes_decrypt(CK_OBJECT_HANDLE aes_key,
const CK_BYTE *ciphertext, CK_ULONG ciphertext_len,
CK_BYTE *plaintext, CK_ULONG *plaintext_len)
{
CK_RV rv;
CK_BYTE iv[16] = { 0 }; /* 必须与加密所用的 IV 匹配 */
CK_MECHANISM mech = { CKM_AES_CBC_PAD, iv, sizeof(iv) };
rv = C_DecryptInit(session, &mech, aes_key);
CHECK_RV(rv, "C_DecryptInit");
rv = C_Decrypt(session, (CK_BYTE *)ciphertext, ciphertext_len,
纯文本,纯文本长度);
CHECK_RV(rv, "C_Decrypt");
返回 0;
清理:
返回 -1;
}
操作 5 和 6:RSA 签名(私钥保留在 SE051 中)和验证
int rsa_sign(CK_OBJECT_HANDLE priv_key,
const CK_BYTE *data, CK_ULONG data_len,
CK_BYTE *签名,CK_ULONG *签名长度)
{
CK_RV rv;
/* 安全散列算法(SHA)256-PKCS1v1.5 — SE051 在内部计算 安全散列算法(SHA)-256 摘要,然后进行签名 */
CK_MECHANISM mech = { CKM_SHA256_RSA_PKCS, NULL_PTR, 0 };
rv = C_SignInit(session, &mech, priv_key);
CHECK_RV(rv, "C_SignInit");
rv = C_Sign(session, (CK_BYTE *)data, data_len, signature, sig_len);
CHECK_RV(rv, "C_Sign");
printf("RSA 签名已生成(%lu 字节)。私钥从未离开过 SE051。\n",*sig_len);
返回 0;
清理:
返回 -1;
}
int rsa_verify(CK_OBJECT_HANDLE pub_key,
const CK_BYTE *data, CK_ULONG data_len,
const CK_BYTE *signature, CK_ULONG sig_len)
{
CK_RV rv;
CK_MECHANISM mech = { CKM_SHA256_RSA_PKCS, NULL_PTR, 0 };
rv = C_VerifyInit(session, &mech, pub_key);
CHECK_RV(rv, "C_VerifyInit");
rv = C_Verify(session, (CK_BYTE *)data, data_len,
(CK_BYTE *)签名,sig_len);
如果 (rv == CKR_OK) {
printf("签名验证:成功\n");
返回 0;
} 否则如果 (rv == CKR_SIGNATURE_INVALID) {
printf("签名验证:无效\n");
返回 1;
}
CHECK_RV(rv, "C_Verify");
清理:
返回 -1;
}
操作 7 和 8:RSA 加密/解密
int rsa_encrypt(CK_OBJECT_HANDLE pub_key,
const CK_BYTE *plaintext, CK_ULONG plaintext_len,
CK_BYTE *密文,CK_ULONG *密文长度)
{
CK_RV rv;
/* RSA-OAEP with SHA-256 — 建议在新设计中使用,而非 PKCS1 v1.5 */
CK_RSA_PKCS_OAEP_PARAMS oaep_params = {
.hashAlg= CKM_SHA256,
.mgf= CKG_MGF1_SHA256,
。来源= CKZ_DATA_SPECIFIED,
.pSourceData= NULL,
.ulSourceDataLen= 0
};
CK_MECHANISM mech = { CKM_RSA_PKCS_OAEP, &oaep_params, sizeof(oaep_params) };
rv = C_EncryptInit(session, &mech, pub_key);
CHECK_RV(rv, "C_EncryptInit (RSA-OAEP)");
rv = C_Encrypt(session, (CK_BYTE *)plaintext, plaintext_len,
密文,密文长度);
CHECK_RV(rv, "C_Encrypt (RSA-OAEP)");
返回 0;
清理:
返回 -1;
}
int rsa_decrypt(CK_OBJECT_HANDLE priv_key,
const CK_BYTE *ciphertext, CK_ULONG ciphertext_len,
CK_BYTE *plaintext, CK_ULONG *plaintext_len)
{
CK_RV rv;
CK_RSA_PKCS_OAEP_PARAMS oaep_params = {
.hashAlg= CKM_SHA256,
.mgf= CKG_MGF1_SHA256,
。来源= CKZ_DATA_SPECIFIED,
.pSourceData= NULL,
.ulSourceDataLen= 0
};
CK_MECHANISM mech = { CKM_RSA_PKCS_OAEP, &oaep_params, sizeof(oaep_params) };
rv = C_DecryptInit(session, &mech, priv_key);
CHECK_RV(rv, "C_DecryptInit (RSA-OAEP)");
rv = C_Decrypt(session, (CK_BYTE *)ciphertext, ciphertext_len,
纯文本,纯文本长度);
CHECK_RV(rv, "C_Decrypt (RSA-OAEP)");
printf("RSA 解密完成。"私钥从未离开 SE051。\n");返回 0;
清理:
返回 -1;
}
访问现有密钥(无需重新生成)
如果密钥之前已生成并存储在 SE051 中,则通过 CKA_ID 检索该密钥,而无需再次调用 C_GenerateKey :
int find_key_by_id(CK_BYTE *key_id, CK_ULONG key_id_len,
CK_OBJECT_CLASS obj_class,
CK_OBJECT_HANDLE *handle)
{
CK_RV rv;
CK_ULONG obj_count = 0;
CK_ATTRIBUTE search_tmpl[] = {
{ CKA_CLASS, &obj_class, sizeof(obj_class) },
{ CKA_ID, key_id, key_id_len },
};
rv = C_FindObjectsInit(session, search_tmpl,
sizeof(search_tmpl) / sizeof(search_tmpl[0]));
CHECK_RV(rv, "C_FindObjectsInit");
rv = C_FindObjects(session, handle, 1, &obj_count);
CHECK_RV(rv, "C_FindObjects");
C_FindObjectsFinal(session);
如果 (obj_count == 0) {
fprintf(stderr, "在 SE051 中未找到密钥\n");
返回 -1;
}
返回 0;
清理:
C_FindObjectsFinal(session);
返回 -1;
}
使用示例:
CK_OBJECT_HANDLE priv_key;
CK_BYTE key_id[] = { 0x10, 0x10, 0x10, 0x10 };
CK_OBJECT_CLASS priv_class = CKO_PRIVATE_KEY;
find_key_by_id(key_id, sizeof(key_id), priv_class, &priv_key);
支持的机制(已在 OP-TEE PKCS#11 TA + SE051 上验证)
Operation
机制常数
说明
RSA密钥生成
CKM_RSA_PKCS_KEY_PAIR_GEN
256–4096 位
AES密钥生成
CKM_AES_KEY_GEN
16 或 32 字节
RSA签名/验证
CKM_SHA256_RSA_PKCS
PKCS#1 v1.5
RSA 签名/验证 (PSS)
CKM_SHA256_RSA_PKCS_PSS
PSS 填充
RSA 加密/解密
CKM_RSA_PKCS_OAEP
OAEP推荐
RSA 加密/解密
CKM_RSA_PKCS
PKCS#1 v1.5
AES 加密/解密
CKM_AES_CBC_PAD
密码块链接\(CBC\) 与 PKCS#7
AES 加密/解密
CKM_AES_CBC
无衬垫的密码块链接(CBC)
AES 加密/解密
CKM_AES_CTR
CTR模式
ECC签名/验证
CKM_ECDSA_SHA256
160–521 位
ECDH关键协议
CKM_ECDH1_DERIVE
SSS API 还能继续使用吗?
是的——但仅限于共存设置(选项 2) ,其中 Linux 仍然可以访问 I2C 总线(即,尚未应用 lf-6.12.y-i2c-disabled-se050 DTS 补丁)。在这种情况下,您可以直接从 Linux 使用 AN13030 第 3.3 节中描述的 SSS API。
如果您选择选项 1(OP-TEE 专属),则上面显示的 Cryptoki/PKCS#11 C API 是 Linux 用户空间中正确且唯一支持的路径。
参考
AN13030 Rev. 2.4,第 3.3 节 — 完整的 SSS API 参考(适用于共存/非 OP-TEE 构建)
OP-TEE PKCS#11 TA 测试套件 (pkcs11_1000.c): optee-test/host/xtest/pkcs11_1000.c — 所有 Cryptoki 操作的完整 C 示例
NXP GitHub: se05x-pkcs11 — NXP 的 PKCS#11 独立组网 (SA) 库(非 OP-TEE 版本的 libckteec.so 替代方案)
希望对您有所帮助。
祝你有美好的一天, 坎
------------------------------------------------------------------------------- 笔记: - 如果此回复解答了您的问题,请点击“标记为正确答案”按钮。谢谢你! - 我们会持续关注帖子,从最后一条回复发出后持续7周,之后的回复将被忽略。 如果您之后有相关问题,请另开新帖并引用已关闭的帖子。 ------------------------------------------------------------------------------- Re: Seeking guidance: se05x_Minimal fails in OP-TEE environment @Kan_Li 非常感谢您清晰详细的解释。 我们目前正在考虑根据未来发展的阶段选择方案 1 或方案 2(例如,使用方案 2 进行初步测试/评估,使用方案 1 进行生产)。 关于选项 1(OP-TEE PKCS#11 TA),我们有一个关于 C 语言应用程序开发的问题。 如果要在方案 1 下用 C 程序实现密钥存储、签名/签名生成、签名验证和加密/解密等加密操作,我们应该采取哪种方法? 我们是否应该编写一个 C 程序,通过 OP-TEE PKCS#11 库 (libckteec.so) 直接调用标准 PKCS#11 API(例如 C_Initialize、C_CreateObject、C_SignInit、C_Sign、C_VerifyInit、C_Verify 等)? 或者,在这种设置下是否仍然可以/建议使用 Plug & Trust MW SSS API(例如 sss_key_store_set_key、sss_asymmetric_sign_digest、sss_asymmetric_verify_digest、sss_cipher_update 等)? 如果需要使用 PKCS#11 API,能否提供一个简单的示例代码或参考指南,说明如何在 C 语言中调用 libckteec.so? Re: Seeking guidance: se05x_Minimal fails in OP-TEE environment 嗨@Uc_S ,
感谢您提供的详细报告。根本原因很明确,我可以详细解释为什么会发生这种情况以及你有哪些选择。
根本原因
se05x_Minimal 由 -DPTMW_SMCOM=T1oI2C 构建。这告诉 smCom 层在会话打开时打开一个物理 Linux I2C 设备节点 ( /dev/i2c-X )。由于您应用了 lf-6.12.y-i2c-disabled-se050 DTS 补丁(集成指南的步骤 1),该 I2C 控制器在 Linux 正常世界中被禁用——设备节点根本不存在。OP-TEE 通过 CFG_IMX_I2C=y 独家拥有 I2C 总线,Linux 无法看到或打开它。
这是有意为之——DTS 补丁使 OP-TEE 能够独占、不受竞争地访问 SE051。使用 T1oI2C 构建的 se05x_Minimal 二进制文件与此配置根本不兼容。
你的两个选择
✅ 方案 1 — 使用 OP-TEE PKCS#11 TA(推荐用于生产)
这是 OP-TEE 独占设置中预期的 Linux 用户空间路径。不要运行 se05x_Minimal ,而是使用 pkcs11-tool 或 OpenSSL 和 libckteec.so (OP-TEE PKCS#11 TA 库)。TA 内部使用 SE051 作为其加密后端,通过 OP-TEE 的原生 I2C 驱动程序。
快速验证 SE051 是否可通过 PKCS#11 访问:
# List available PKCS#11 slots — SE051 should appear
pkcs11-tool --module /usr/lib/libckteec.so.0 --list-slots
# Get a random number from SE051 via OP-TEE
pkcs11-tool --module /usr/lib/libckteec.so.0 --generate-random 16 | xxd
如果看到一个插槽和随机字节,则 SE051 可通过 OP-TEE 完全访问。无需运行 se05x_Minimal – 它重复了 PKCS#11 TA 已经提供的功能。
✅ 选项 2 — 共存设置(推荐用于开发/测试)
如果您需要从 Linux 用户空间运行 se05x_Minimal 和其他 Plug & Trust MW 演示程序,请使用共存设置,其中 Linux DTS 仍然启用 I2C(即,不要应用禁用 I2C 的 DTS 补丁)。
步骤:
步骤 1 — 恢复 Linux DTS 以在普通世界中保持 I2C 启用状态
从未经修改的Linux DTS(不带 lf-6.12.y-i2c-disabled-se050 补丁)构建您的 imx8mq-evk.dtb (或等效版本)。SE051 的 I2C 控制器节点必须在 Linux 系统中保持启用状态。
步骤 2 — 保持现有 CMake 标志不变
您当前的 cmake 配置对于共存模式是正确的:
cmake -S . -B ./build/ -DPTMW_Applet=SE05X_C -DPTMW_SE05X_Ver=07_02 -DPTMW_Host=iMXLinux -DPTMW_SMCOM=T1oI2C -DPTMW_HostCrypto=OPENSSL -DPTMW_RTOS=Default -DPTMW_mbedTLS_ALT=None -DPTMW_SCP=SCP03_SSS -DPTMW_SE05X_Auth=PlatfSCP03 -DPTMW_Log=Silent -DCMAKE_BUILD_TYPE=Release -DPTMW_OpenSSL=3_0 -DPTMW_SE_RESET_LOGIC=1
步骤 3 — 运行前设置 I2C 端口
export EX_SSS_BOOT_SSS_PORT=/dev/i2c-1
./se05x_Minimal
权衡:在这种模式下,OP-TEE 和 Linux 都共享到 SE051 的 I2C 总线。OP-TEE 将其用于 RSA/ECC 卸载;Linux 将其用于 MW 演示。并发访问不进行仲裁,这可能导致负载过高时发生 APDU 冲突。适用于开发,但不建议用于生产。
摘要
选项
I2C DTS
se05x_Minimal
OP-TEE独家
推荐用于
PKCS#11 TA ( libckteec.so )
禁用
❌ 不需要
✅ 是
已量产
共存(T1oI2C)
已启用
✅ 作品
⚠️ 共享 I2C
开发/测试
关于集成指南的说明
您引用的社区帖子(步骤 2 — 不使用 CAAM)将 OP-TEE 配置为独占 I2C。该指南中显示的 Linux 端 MW 编译(带有 T1oI2C )旨在用于切换到 OP-TEE 模式之前的初始验证步骤,而不是与 OP-TEE 专用 I2C 设置一起使用。
一旦 OP-TEE 完全拥有 I2C,正确的 Linux 用户空间接口就是OP-TEE PKCS#11 TA ,而不是 Plug & Trust MW SSS API 演示。
请与我们联系哪个选项最符合您的使用场景,我们将提供进一步的指导。
祝你有美好的一天, 坎
------------------------------------------------------------------------------- 笔记: - 如果此回复解答了您的问题,请点击“标记为正确答案”按钮。谢谢你! - 我们会持续关注帖子,从最后一条回复发出后持续7周,之后的回复将被忽略。 如果您之后有相关问题,请另开新帖并引用已关闭的帖子。 -------------------------------------------------------------------------------
View full article