在 C++ Node Addons 中使用 Node::Buffers
Working with Node::Buffers in C++ Node Addons
我正在开发一个使用 Windows DPAPI 加密数据的节点插件。我正在使用 NAN 将两个 Javascript Uint8Array 传递给 C++ 代码。
打字稿界面是这样的:
export interface DpapiBindings{
protectData(dataToEncrypt: Uint8Array, optionalEntropy: Uint8Array, scope: string): Uint8Array
}
然后我想在 C++ 代码中创建一个 Node::Buffer:
void ProtectData( Nan::NAN_METHOD_ARGS_TYPE info)
{
v8::Isolate* isolate = info.GetIsolate();
//
auto buffer = node::Buffer::Data(info[0]);
auto len = node::Buffer::Length(info[0]);
DATA_BLOB entropyBlob;
entropyBlob.pbData = nullptr;
if (!info[1]->IsNull())
{
entropyBlob.pbData = reinterpret_cast<BYTE*>(node::Buffer::Data(info[1]));
entropyBlob.cbData = node::Buffer::Length(info[1]);
}
DATA_BLOB dataIn;
DATA_BLOB dataOut;
// initialize input data
dataIn.pbData = reinterpret_cast<BYTE*>(buffer);
dataIn.cbData = len;
success = CryptProtectData(
&dataIn,
nullptr,
entropyBlob.pbData ? &entropyBlob : nullptr,
nullptr,
nullptr,
flags,
&dataOut);
auto returnBuffer = Nan::CopyBuffer(reinterpret_cast<const char*>(dataOut.pbData), dataOut.cbData).ToLocalChecked();
LocalFree(dataOut.pbData);
info.GetReturnValue().Set(returnBuffer);
}
我是 C++ 新手,我的问题是:在 C++ 代码中使用 node::Buffer::Data 和 node::Buffer::Length 并调用 CryptProtectData 时,我需要担心缓冲区溢出吗?如果是这样,我该如何防范?我应该向缓冲区和 len 附加一个空字符吗?
不,您不必担心溢出。 dataIn
和 dataOut
结构是具有长度的指针。
BufferCopy 不是您想要使用的。您要使用:Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char* data, uint32_t size)
.
https://github.com/nodejs/nan/blob/master/doc/buffers.md#api_nan_new_buffer
并确保在完成后释放 dataOut.pbData
内存(我看到你正在使用 LocalFree
调用。)它不能溢出的原因是 CryptProtectData
根据需要的大小分配缓冲区。
我正在开发一个使用 Windows DPAPI 加密数据的节点插件。我正在使用 NAN 将两个 Javascript Uint8Array 传递给 C++ 代码。
打字稿界面是这样的:
export interface DpapiBindings{
protectData(dataToEncrypt: Uint8Array, optionalEntropy: Uint8Array, scope: string): Uint8Array
}
然后我想在 C++ 代码中创建一个 Node::Buffer:
void ProtectData( Nan::NAN_METHOD_ARGS_TYPE info)
{
v8::Isolate* isolate = info.GetIsolate();
//
auto buffer = node::Buffer::Data(info[0]);
auto len = node::Buffer::Length(info[0]);
DATA_BLOB entropyBlob;
entropyBlob.pbData = nullptr;
if (!info[1]->IsNull())
{
entropyBlob.pbData = reinterpret_cast<BYTE*>(node::Buffer::Data(info[1]));
entropyBlob.cbData = node::Buffer::Length(info[1]);
}
DATA_BLOB dataIn;
DATA_BLOB dataOut;
// initialize input data
dataIn.pbData = reinterpret_cast<BYTE*>(buffer);
dataIn.cbData = len;
success = CryptProtectData(
&dataIn,
nullptr,
entropyBlob.pbData ? &entropyBlob : nullptr,
nullptr,
nullptr,
flags,
&dataOut);
auto returnBuffer = Nan::CopyBuffer(reinterpret_cast<const char*>(dataOut.pbData), dataOut.cbData).ToLocalChecked();
LocalFree(dataOut.pbData);
info.GetReturnValue().Set(returnBuffer);
}
我是 C++ 新手,我的问题是:在 C++ 代码中使用 node::Buffer::Data 和 node::Buffer::Length 并调用 CryptProtectData 时,我需要担心缓冲区溢出吗?如果是这样,我该如何防范?我应该向缓冲区和 len 附加一个空字符吗?
不,您不必担心溢出。 dataIn
和 dataOut
结构是具有长度的指针。
BufferCopy 不是您想要使用的。您要使用:Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char* data, uint32_t size)
.
https://github.com/nodejs/nan/blob/master/doc/buffers.md#api_nan_new_buffer
并确保在完成后释放 dataOut.pbData
内存(我看到你正在使用 LocalFree
调用。)它不能溢出的原因是 CryptProtectData
根据需要的大小分配缓冲区。