gpt4 book ai didi

cryptography - PKCS #11 C_FindObjects 中的内存所有权,其中 ulMaxObjectCount != 1

转载 作者:行者123 更新时间:2023-12-04 04:42:43 34 4
gpt4 key购买 nike

当 API 返回可变长度的项目列表时,PKCS #11 v2.40 的作者使用了一种通用模式。在 API 中,例如 C_GetSlotListC_GetMechanismList ,应用程序应该调用 API 两次。在第一次调用中,指向 CK_ULONG 的指针设置为将在下一次调用时返回的项目数。这允许应用程序分配足够的内存并再次调用 API 来检索结果。
C_FindObjects call 也返回可变数量的项目,但它使用不同的范例。参数CK_OBJECT_HANDLE_PTR phObject设置为结果列表的头部。参数CK_ULONG_PTR pulObjectCount设置为返回的项目数,确保小于CK_ULONG ulMaxObjectCount .

该标准没有明确说明 phObject必须是一个有效指针,指向足够大的内存块以容纳 ulMaxObjectCount CK_OBJECT_HANDLE s。

可以将标准解释为应用程序必须悲观地为 ulMaxObjectCount 分配足够的内存。对象。或者,可以将标准解释为 PKCS #11 实现将分配 pulObjectCount CK_OBJECT_HANDLE s 然后应用程序负责释放该内存。然而,这种后来的解释似乎值得怀疑,因为标准中的其他任何地方都没有 PKCS #11 的实现分配内存。

段落是:

C_FindObjects continues a search for token and session objects that 
match a template, obtaining additional object handles. hSession is
the session’s handle; phObject points to the location that receives
the list (array) of additional object handles; ulMaxObjectCount is
the maximum number of object handles to be returned; pulObjectCount
points to the location that receives the actual number of object
handles returned.

If there are no more objects matching the template, then the location
that pulObjectCount points to receives the value 0.

The search MUST have been initialized with C_FindObjectsInit.

非规范示例不是很有帮助,因为它设置了 ulMaxObjectCount到 1. 但是,它确实为该条目分配了内存。这似乎表明应用程序必须悲观地预先分配内存。
CK_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hObject;
CK_ULONG ulObjectCount;
CK_RV rv;
.
.
rv = C_FindObjectsInit(hSession, NULL_PTR, 0);
assert(rv == CKR_OK);
while (1) {
rv = C_FindObjects(hSession, &hObject, 1, &ulObjectCount);
if (rv != CKR_OK || ulObjectCount == 0)
break;
.
.
}
rv = C_FindObjectsFinal(hSession);
assert(rv == CKR_OK);

规范链接: http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/pkcs11-base-v2.40.pdf

最佳答案

是的,看起来应用程序负责为 C_FindObjects() 返回的对象句柄分配空间。 .示例代码执行此操作,即使它一次只请求一个对象句柄,您也应该这样做。

您也可以重写示例代码以请求多个对象句柄,例如像这样:

#define MAX_OBJECT_COUNT 100  /* arbitrary value */

K_SESSION_HANDLE hSession;
CK_OBJECT_HANDLE hObjects[MAX_OBJECT_COUNT];
CK_ULONG ulObjectCount, i;
CK_RV rv;

rv = C_FindObjectsInit(hSession, NULL_PTR, 0);
assert(rv == CKR_OK);
while (1) {
rv = C_FindObjects(hSession, hObjects, MAX_OBJECT_COUNT, &ulObjectCount);
if (rv != CKR_OK || ulObjectCount == 0) break;
for (i = 0; i < ulObjectCount; i++) {
/* do something with hObjects[i] here */
}
}
rv = C_FindObjectsFinal(hSession);
assert(rv == CKR_OK);

据推测,在单个 C_FindObjects() 中请求多个对象句柄的能力call 旨在作为性能优化。

FWIW,这几乎就是像 fread() 这样的 C 标准库函数的数量。也可以工作。使用 fgetc() 一次从文件中读取一个字节的数据效率极低。 ,所以 fread()函数允许您分配一个任意大的缓冲区并读取尽可能多的数据。

关于cryptography - PKCS #11 C_FindObjects 中的内存所有权,其中 ulMaxObjectCount != 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617802/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com