javascript中CERT_FindUserCertByUsage的返回

return of CERT_FindUserCertByUsage in javascript

本文关键字:返回 FindUserCertByUsage CERT javascript      更新时间:2023-10-16

我试图理解c++ dll和JavaScript之间的关系。有一个js代码:

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

其中cert定义为

let cert = null;

但是在c++中,cert是一个结构体

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

我试图在javascript中获得主题名称,我继续使用

代码
let a = cert.contents.subjectName; 

不成功。它将错误记录为"cannot get content of undefined size"

我在c++和javascript之间错过了什么?我如何在javascript打印subjectName ?

我认为你在做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);

this spits out

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();