NodeJS:node-ffi、ref-struct、ref-array
NodeJS: node-ffi, ref-struct, ref-array
我正在使用 nodejs 插件 ffi
、ref
、ref-struct
和 ref-array
编写 PKCS11 cryptoki 包装器。我有这个代码。
var hSession = this.session.handle;
var hObject = this.handle;
var $label = new (arrayType(cki.CK_UTF8CHAR))(80);
var template = new (arrayType(cki.CK_ATTRIBUTE))(1);
template[0] = new cki.CK_ATTRIBUTE({
type:cki.CKA_LABEL,
pValue: $label.ref(),
ulValueLen: 80})
var res = this.cki.C_GetAttributeValue(hSession, hObject, template.ref(), 1);
if (res == cki.CKR_OK) {
console.log("Ok");
}
else{
console.log("Wrong "+res);
}
当我调用这个函数时,我得到了错误的结果(CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_TYPE_INVALID)。
请帮我找出错误。
FFI 函数
"C_GetAttributeValue":[t.CK_RV, [t.CK_SESSION_HANDLE, t.CK_OBJECT_HANDLE, t.CK_ATTRIBUTE_PTR, t.CK_ULONG]],
类型
/* CK_ATTRIBUTE is a structure that includes the type, length
* and value of an attribute */
t.CK_ATTRIBUTE = struct({
type: t.CK_ATTRIBUTE_TYPE,
pValue: t.CK_VOID_PTR,
/* ulValueLen went from CK_USHORT to CK_ULONG for v2.0 */
ulValueLen: t.CK_ULONG /* in bytes */
});
(评论中的讨论记录)
使用纯Buffer
提供缓冲区来存储属性值:
var $label = new Buffer(80);
在结构中传递如下:
template[0] = new cki.CK_ATTRIBUTE({
type:cki.CKA_LABEL,
pValue: $label,
ulValueLen: $label.length})
然后使用$label.toString('utf8',0,<ulValueLen>)
得到实际的字符串。
注意:我不精通 Node FFI,但这种方法似乎很管用。
我正在使用 nodejs 插件 ffi
、ref
、ref-struct
和 ref-array
编写 PKCS11 cryptoki 包装器。我有这个代码。
var hSession = this.session.handle;
var hObject = this.handle;
var $label = new (arrayType(cki.CK_UTF8CHAR))(80);
var template = new (arrayType(cki.CK_ATTRIBUTE))(1);
template[0] = new cki.CK_ATTRIBUTE({
type:cki.CKA_LABEL,
pValue: $label.ref(),
ulValueLen: 80})
var res = this.cki.C_GetAttributeValue(hSession, hObject, template.ref(), 1);
if (res == cki.CKR_OK) {
console.log("Ok");
}
else{
console.log("Wrong "+res);
}
当我调用这个函数时,我得到了错误的结果(CKR_ARGUMENTS_BAD、CKR_ATTRIBUTE_TYPE_INVALID)。 请帮我找出错误。
FFI 函数
"C_GetAttributeValue":[t.CK_RV, [t.CK_SESSION_HANDLE, t.CK_OBJECT_HANDLE, t.CK_ATTRIBUTE_PTR, t.CK_ULONG]],
类型
/* CK_ATTRIBUTE is a structure that includes the type, length
* and value of an attribute */
t.CK_ATTRIBUTE = struct({
type: t.CK_ATTRIBUTE_TYPE,
pValue: t.CK_VOID_PTR,
/* ulValueLen went from CK_USHORT to CK_ULONG for v2.0 */
ulValueLen: t.CK_ULONG /* in bytes */
});
(评论中的讨论记录)
使用纯Buffer
提供缓冲区来存储属性值:
var $label = new Buffer(80);
在结构中传递如下:
template[0] = new cki.CK_ATTRIBUTE({
type:cki.CKA_LABEL,
pValue: $label,
ulValueLen: $label.length})
然后使用$label.toString('utf8',0,<ulValueLen>)
得到实际的字符串。
注意:我不精通 Node FFI,但这种方法似乎很管用。