Работа с Node :: Buffers в надстройках узлов C ++ - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над надстройкой Node, которая шифрует данные с помощью Windows DPAPI. Я передаю два Javascript Uint8Array коду C ++ с использованием NAN.

Вот как выглядит интерфейс машинописного текста:

export interface DpapiBindings{
    protectData(dataToEncrypt: Uint8Array, optionalEntropy: Uint8Array, scope: string): Uint8Array
}

Затем я хотел бы создать узел: : Buffer в коде C ++:

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 ++, мой вопрос: при работе с node :: Buffer :: Data и node :: Buffer :: Length в коде C ++ и вызывая CryptProtectData, мне нужно беспокоиться о переполнении буфера? Если да, то как мне от него защититься? Должен ли я добавлять нулевой символ к buffer и len?

1 Ответ

1 голос
/ 10 июля 2020

Нет, вам не нужно беспокоиться о переполнении. Структуры 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 выделяет этот буфер в зависимости от необходимого ему размера.

...