возвращение CERT_FindUserCertByUsage в JavaScript

Я пытаюсь понять связь между C ++ DLL и JavaScript.
Существует код JS:

cert = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);

где сертификат определяется как

let cert = null;

Однако в C ++ сертификат является структурой

CERTCertificateStr {
char *subjectName;
char *issuerName;
SECItem derCert;            /* original DER for the cert */
.... }

Я пытаюсь получить имя субъекта в JavaScript, и я продолжаю код с

let a = cert.contents.subjectName;

Это неудачно. Он регистрирует ошибку как «не может получить содержимое неопределенного размера»

Что-нибудь, что я пропустил между C ++ и javascript?
Как я могу напечатать subjectName в JavaScript?

1

Решение

Я думаю, что вы делаете jsctypes, и вы на правильном пути. Чтобы получить строку JS, хотя вы должны пометить readString() после приведения его к массиву определенной длины можно перейти к фактической длине как readString() будет читать до первого нулевого символа, который \x00, Хотя, если вы знаете точную длину, которая всегда лучше (вам не нужно указывать длину + 1 для нулевого члена), потому что тогда вы экономите память, поскольку вам не нужно излишне выделять буфер (массив в случае jsctypes) больше необходимой длины.

Так что попробуйте это:

let a = ctypes.cast(cert.contents.subjectName, ctypes.char.array(100).ptr).contents.readString();
console.log('a:', a);

Ошибка cannot get contents of undefined size происходит в таких ситуациях:

var a = ctypes.voidptr_t(ctypes.char.array()('rawr'))
console.log('a:', a.contents);

это выплевывает

Error: cannot get contents of undefined size

Итак, чтобы исправить это, мы делаем следующее:

var b = ctypes.cast(a, ctypes.char.array(5).ptr)
console.log('b:', b.contents);

и это успешно получает доступ к содержимому, оно дает нам (кстати, я использовал 5 для длины, которая составляет 4 для длины rawr +1 для нулевого терминатора, но я действительно не должен был делать это, я мог бы использовать длину всего 4)

CData { length: 5 }

так что теперь мы можем прочитать contents как строка JS, как это:

console.log('b:', b.contents.readString());

и это выплевывает:

rawr

ТАКЖЕ, вы сказали, что функции возвращают структуру, она возвращает указатель на структуру? Или на самом деле структура? Я думаю, что он возвращает указатель на структуру нет? так что в этом случае вы бы сделали это:

let certPtr = CERT_FindUserCertByUsage(certDB, certName.nickname,certUsageEmailSigner, true, null);

let certStruct = ctypes.StructType('CERTCertificateStr', [
{'subjectName': ctypes.char.ptr},
{issuerName: ctypes.char.ptr},
{derCert: ctypes.voidptr_t}
]);

let cert = ctypes.cast(certPtr, certStruct.ptr).contents;
let a = cert.contents.subjectName.readString();
0

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


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