升级至Cryptoki v2后C_GenerateRandom调用失败,需修改代码吗?
问题
已升级至Cryptoki v2版本(CK_VERSION 204,文件版本4.4.0.0),此前正常运行的代码如今出现异常:
// key is BYTE[32] RV rv; CK_FLAGS flags = CKF_SERIAL_SESSION | CKF_RW_SESSION; CK_SESION_HANDLE handle; rv = C_OpenSession(slot_id, flags, (void*)"MyApp", 0, &handle); // 此调用成功 int keyLen = 32; rv = C_GenerateRandom(handle, key, keyLen); // 此处失败,rv = 0x8000001A
已提前调用C_Initialize,请问是否需要修改代码?
分析与解决方案
首先明确错误码0x8000001A对应Cryptoki定义的CKR_SESSION_READ_ONLY,表示当前会话为只读模式,无法执行需要读写权限的操作。结合你的代码和版本升级后的变化,可按以下步骤排查修复:
1. 修正变量拼写错误
代码中CK_SESION_HANDLE存在拼写错误,正确的类型应为CK_SESSION_HANDLE(缺少字母S)。虽然C_OpenSession调用成功,但这种拼写错误会导致未定义行为,必须修正:
CK_SESSION_HANDLE handle; // 修正拼写
2. 验证会话实际权限
即使你指定了CKF_RW_SESSION,Cryptoki实现可能因令牌限制返回只读会话。可通过C_GetSessionInfo验证会话实际权限:
CK_SESSION_INFO info; rv = C_GetSessionInfo(handle, &info); if (rv == CKR_OK) { if (!(info.flags & CKF_RW_SESSION)) { // 会话实际为只读,需进一步排查令牌状态 } }
3. 检查令牌读写状态
调用C_GetTokenInfo查看令牌是否处于写保护状态:
CK_TOKEN_INFO tokenInfo; rv = C_GetTokenInfo(slot_id, &tokenInfo); if (rv == CKR_OK) { if (tokenInfo.flags & CKF_WRITE_PROTECTED) { // 令牌已写保护,无法创建读写会话,需解除写保护或更换令牌 } }
4. 尝试登录会话
部分Cryptoki v2实现要求必须登录(即使C_GenerateRandom通常无需登录)才能获取读写会话权限。可添加登录逻辑:
// 替换为实际的用户PIN CK_UTF8CHAR pin[] = "your_user_pin"; rv = C_Login(handle, CKU_USER, pin, sizeof(pin)-1); if (rv == CKR_OK) { rv = C_GenerateRandom(handle, key, keyLen); }
5. 调整会话标志组合
新版本库可能对CKF_SERIAL_SESSION与CKF_RW_SESSION的组合支持有变化,尝试单独使用CKF_RW_SESSION:
CK_FLAGS flags = CKF_RW_SESSION; // 去掉CKF_SERIAL_SESSION rv = C_OpenSession(slot_id, flags, (void*)"MyApp", 0, &handle);
内容的提问来源于stack exchange,提问作者grunt
相关产品推荐
相关产品推荐

