JavaScript — NodeJS: узел-ffi, ref-struct, ref-array

Я пишу обертку криптоки PKCS11 с помощью плагинов nodejs ffi, ref, ref-struct а также ref-array, У меня есть этот код.

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 */
});

0

Решение

(Стенограмма обсуждения в комментариях)

Используйте чистый 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, но этот подход просто похоже на работу.

1

Другие решения


По вопросам рекламы [email protected]