调用PKCS#11的C_FindObjectsInit查找AES密钥时发生段错误
解决PKCS#11 C_FindObjectsInit段错误问题
从你提供的代码和描述来看,触发段错误大概率是几个常见的PKCS#11开发问题导致的,我们逐个排查并给出修复方案:
1. 错误传递ID长度:sizeof(id)取的是指针大小而非实际ID长度
在调用find_object时,你传入了sizeof(id)作为ID长度,但id是指针类型,sizeof(id)返回的是指针本身的字节数(比如64位系统下是8字节),完全不是你设置的密钥ID的真实长度。如果你的find_object后续会把CKA_ID加入查询属性,这个错误的长度会直接导致内存访问越界,触发段错误。
修复方式:确保传入实际的ID长度。如果是固定数组直接用数组的sizeof,如果是动态分配的ID,需要单独保存长度值传递:
// 示例:假设id是一个实际的字节数组 unsigned char id[] = {0x01, 0x02, 0x03, 0x04}; // 调用时传入正确的长度 if (find_object(session, CKO_SECRET_KEY, &key, id, sizeof(id), 0)) { printf("Key handle found\n"); }
2. PKCS#11函数指针未正确初始化
如果pfunc11没有通过C_GetFunctionList正确获取库的函数指针表,它会是一个野指针,调用pfunc11->C_FindObjectsInit时必然触发段错误。
检查初始化代码,确保完成了函数指针的正确加载:
CK_FUNCTION_LIST_PTR pfunc11; CK_RV rv = C_GetFunctionList(&pfunc11); if (rv != CKR_OK) { fprintf(stderr, "Failed to load PKCS#11 function list: 0x%08X\n", rv); return -1; }
3. 会话句柄无效或已关闭
确认session是通过C_OpenSession成功获取的有效句柄,且没有被提前关闭。可以在调用find_object前添加简单验证:
CK_SESSION_INFO session_info; rv = pfunc11->C_GetSessionInfo(session, &session_info); if (rv != CKR_OK) { fprintf(stderr, "Invalid session handle: 0x%08X\n", rv); return -1; }
4. 属性数组越界风险
你当前的代码只设置了CKA_CLASS属性,但如果后续要添加CKA_ID,要确保attrs数组的大小足够。如果nattrs超过数组容量,会破坏栈内存引发段错误。建议在find_object中增加边界检查:
static int find_object(CK_SESSION_HANDLE sess, CK_OBJECT_CLASS cls, CK_OBJECT_HANDLE_PTR ret, const unsigned char *id, size_t id_len, int obj_index) { CK_ATTRIBUTE attrs[2]; unsigned int nattrs = 0; CK_RV rv; attrs[0].type = CKA_CLASS; attrs[0].pValue = &cls; attrs[0].ulValueLen = sizeof(cls); nattrs++; // 仅当ID有效时添加CKA_ID属性,同时检查数组容量 if (id != NULL && id_len > 0) { if (nattrs >= sizeof(attrs)/sizeof(attrs[0])) { fprintf(stderr, "Attribute array size is insufficient\n"); return -1; } attrs[nattrs].type = CKA_ID; attrs[nattrs].pValue = (void*)id; attrs[nattrs].ulValueLen = id_len; nattrs++; } rv = pfunc11->C_FindObjectsInit(sess, attrs, nattrs); if (rv != CKR_OK) { fprintf(stderr, "C_FindObjectsInit failed: 0x%08X\n", rv); return -1; } // 后续执行C_FindObjects、C_FindObjectsFinal逻辑... }
优先排查前两个问题——ID长度传递错误和函数指针初始化问题,这是PKCS#11开发中最常见的段错误诱因。
内容的提问来源于stack exchange,提问作者ejohnson
相关产品推荐
相关产品推荐

