将 unsigned char 字符串从本机客户端模块发送到浏览器

Send unsigned char string from native client module to browser

在一个 chrome NaCl 扩展中,它加密了从浏览器接收到的数据,并且应该 return 通过 PostMessage() 加密的文本 我在发送数据类型 [= =13=] 对于 ciphertextpp::Var 规范没有提及任何关于这种形式的数据。我尝试将 unsigned char 转换为 std::string 但没有找到合适的方法。我的代码片段如下:

if(action == "encryption")
    {
      pp::Var var_content = dict_message.Get("content");
      if (!var_action.is_string())
        return;
      std::string content = var_content.AsString();

      //encryption code starts here
      const char *password = "password";
      unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
      int len = content.length()+EVP_MAX_BLOCK_LENGTH;
      unsigned char *ciphertext = (unsigned char*)malloc(len*sizeof(unsigned char));

      aes_init(password, (int)strlen(password), key, iv);
      len = encrypt((unsigned char*)(content.c_str()), (int)strlen(content.c_str()), key, iv, ciphertext);

      pp::Var var_reply(ciphertext);
      PostMessage(var_reply);
      free(ciphertext);
    }

这 return 是一个编译时错误:

crest.cc:55:15: error: calling a private constructor of class 'pp::Var'
      pp::Var var_reply(ciphertext);
              ^
/home/kunal/Downloads/nacl_sdk/pepper_41/include/ppapi/cpp/var.h:318:3: note: declared private here
  Var(void* non_scriptable_object_pointer);
  ^
1 error generated.
make: *** [pnacl/Release/crest.o] Error 1

私有的构造函数不是你想要的。尝试将密文转换为 (const char*):

pp::Var var_reply(static_cast<const char*>(ciphertext));

请注意,这需要一个 UTF8 字符串。如果您的加密数据不是这种格式(很可能不是),这将无法正常工作。您可能希望将其作为 ArrayBuffer 发送,它允许任意字节序列(未经测试,假设 len 是加密密文的长度):

pp::VarArrayBuffer buffer(len);
void* buffer_ptr = buffer.Map();
memcpy(buffer_ptr, ciphertext, len);
buffer.Unmap();
PostMessage(buffer);

然后在 JavaScript 中,您将收到的对象是一个 JavaScript ArrayBuffer

您可以使用 typed array object:

从中读取数据
function handleMessage(e) {
  var buffer = e.data;
  var view = new Uint8Array(buffer);
  ...
}