标签: emscripten

使用Emscripten编译的WebAssembly中的HmacSHA256

我正在尝试在WebAssembly中实现JWT令牌(仅编码),目标是拥有一个非常轻量级的 wasm模块.作为Web开发人员,我的C知识是有限的.现在我已经实现了以下功能(从JS移植)来编码url-safe Base64编码器,它完美地工作.

char _keyStr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";
char ret_val[200];

char* encode (char *data){
    int len = strlen(data);
    int i = 0;
    int j = 0;

    while(i<len){
        char chr1 = data[i++];
        int chr2Out = (i > len - 1)? 1:0;
        char chr2 = data[i++];
        int chr3Out = (i > len - 1)? 1:0;;
        char chr3 = data[i++];


        char enc1 = chr1 >> 2;
        char enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        char enc3 = ((chr2 & …
Run Code Online (Sandbox Code Playgroud)

c sha256 jwt emscripten webassembly

15
推荐指数
2
解决办法
580
查看次数

与Emscripten中的C++类交互

Emscripten教程给出了如何与C函数交互的一个很好的解释:https://github.com/kripken/emscripten/wiki/Interacting-with-code

但是你如何与C++类交互:

  • 调用构造函数来创建对象
  • 删除obj
  • 防止类代码及其方法的死代码消除

emscripten

14
推荐指数
2
解决办法
5949
查看次数

WASM可以用来检查JS方法的完整性吗?

我正在尝试使用webAssembly并尝试找出一种验证webAssembly模块使用的JS方法的完整性的方法.

出于讨论的目的,让我们假设二进制模块不是hackable(我知道情况并非如此),但JS方面是.

给出以下C代码:

#include <emscripten.h>

//js method to validate
void validateMe();

int validateMethods(){
    // check validateMe integrity.
    // return 1 if validation succeeded.
}

EMSCRIPTEN_KEEPALIVE
void doStuff(){
    if (validateMethods()){
       // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我想doStuff()从JS方面打电话,doStuff()只有在完整性检查成功后才会运行.我想做一些完整性检查,类似于Subresource,检查方法的toString表示.但是,如果我想获得当前(内存中)JS方法toString,我将不得不调用可能被泄露的JS.

问:我可以以某种方式以不同的方式获取toString吗?任何其他方法也将不胜感激.

更新:深入挖掘后,阅读本文,似乎没有办法访问共享数组以外的JS内存.因此,任何验证技术将不胜感激.


更新2(目标):我的最终目标是确保WASM部分仅适用于特定的JS,或者至少使得与操纵的JS交互更加困难.

小提琴实施例:下列小提琴,是一种幼稚功能验证,通过炭比较功能炭的的toString.如果更改validateMe函数,则验证失败.我试图"防弹"它.

javascript c security emscripten webassembly

14
推荐指数
1
解决办法
341
查看次数

使用 webpack 将 Wasm + JS 文件打包成一个文件

我目前正在使用 Emscripten 将我们的 C++ 代码编译成 Wasm。通过这样做,我输出了两个文件 *.js 和 *.wasm。后来我使用我们的实现在上面写了更多的 Javascript 代码,这导致我们得到 3 个文件:

 index.js
 wasmFile.js
 wasmFile.wasm
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 webpack 创建一个文件,该文件将在构建时而不是运行时使用这段代码打包所有内容:

function loadScript(url = "wasmFile.js") {
    var script = document.createElement( "script" );
    script.src = url;
    document.getElementsByTagName( "head" )[0].appendChild( script );
    await new Promise<void>((res) => {
        Module.onRuntimeInitialized = () => res();
    });
}
Run Code Online (Sandbox Code Playgroud)

我已经查看了https://github.com/ballercat/wasm-loader但是,看起来我需要为我的所有函数创建一个 WebAssembly.Instance - 并且 Wasm 文件有很多函数来创建一个实例每个。

这就是我们的 WebPack 配置目前的样子:

module.exports = {
    entry: './src/index.ts',
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules/
            },
            {
                test: …
Run Code Online (Sandbox Code Playgroud)

javascript emscripten webpack webassembly

13
推荐指数
1
解决办法
1129
查看次数

在emscripten中更改默认命名空间"Module"

我正在使用emscripten为某些库提供Javascript绑定.Emsripten将代码打包到名称空间(global var)中,称为"模块".

我想更改命名,以便我可以使用反映库所用内容的名称,并且还可以防止变量名称冲突,因为我为其他库编写了绑定.

我在文档中找不到任何地方,它显示了如何执行此操作.有谁知道如何更改emscripten使用的默认命名空间?

javascript emscripten

12
推荐指数
1
解决办法
1861
查看次数

这个eval条件的目的是什么?

我在这里浏览源代码:http://js-dos.com/games/doom2.exe.html并注意到一些事情:

if (typeof Module === 'undefined') 
{
    Module = eval('(function() {try { return Module || {} } catch(e) { return {} }})()');
}
Run Code Online (Sandbox Code Playgroud)
  • Module函数使用内联脚本标记定义
  • 稍后var在另一个内联标记中再次声明它,这次它检查模块是否存在.

我的问题:如果只尝试再次返回模块,那么使用自调用函数声明Module有什么意义呢?是不是已经证明它不存在?为什么不直接将Module声明为{}

javascript eval conditional-statements emscripten

11
推荐指数
1
解决办法
235
查看次数

Emscripten:emmake生成.js文件

根据Emscripten Docs

Make生成链接的LLVM bitcode.它不会在链接期间自动生成JavaScript,因为所有文件都必须使用相同的优化和编译器选项进行编译 - 并且在从bitcode到JavaScript的最终转换中执行此操作是有意义的.

这很棒,我想做什么.但是,运行Emscripten来编译openjpeg .jp2库会-O0在5-6mb范围内生成4个未压缩的(.).js文件,以及514kb的三个相同的字节码.so文件,这些文件似乎不包含我需要的代码.当我运行它们时,emcc它们以141kb的形式出现,没有_main函数或任何可识别的东西,并且与其他.js文件的行为不同.

我需要更改以使用emmake命令而不是.js文件生成正确的字节码?

emcmake cmake完成确定然后emmake make工作,但我没有选择尝试各种优化或任何emcc通常会给出的选项.

我正在Win 8下的vbox中尝试在Lubuntu 15.04上进行编译.这是我的第一个emscripten项目,而不是教程.我也不太熟悉c或c ++或编译(尽管我可以将这个项目编译成Linux应用程序而没有任何问题).

我知道j2k.js,但我正在寻找obj_compress,而不是obj_decompress.

javascript c++ emscripten

11
推荐指数
1
解决办法
800
查看次数

如何添加自己的struct_info.json?(emscripten)

我想移植一个C库.这里有一个非常简短的教程:与代码交互

我需要使用javascript创建一个struct,并返回一个指向它的指针.我查看了已经移植过的库.我的代码看起来像这样:

var ptr = _malloc({{{ C_STRUCTS.MyStruct.__size__ }}});

{{{ makeSetValue('ptr', C_STRUCTS.MyStruct.attr, '0', 'i8') }}};
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为emscripten不知道MyStruct.

我的库定义被添加到项目中--js-library 但是我不知道,如何添加结构定义(struct_info.json)

在C代码中,我有:

struct MyStruct {
    int8_t attr;
    //...
}
Run Code Online (Sandbox Code Playgroud)

javascript c struct emscripten

11
推荐指数
1
解决办法
411
查看次数

WebAssembly链接错误:导入对象字段'DYNAMICTOP_PTR'不是数字

以下C文件使用emscripten编译为wasm:

int counter = 100;

int count() {
    counter += 1;
    return counter;
}
Run Code Online (Sandbox Code Playgroud)
$ emcc counter.c -o counter.wasm -s WASM=1 -s SIDE_MODULE=1
Run Code Online (Sandbox Code Playgroud)

没有问题.然后我让webpack加载wasm文件(使用wasm-loader)作为UInt8Array:

var buffer = new ArrayBuffer(648);
var uint8 = new Uint8Array(buffer);
uint8.set([0,97,115,109,1,0,0,0,0,12,6,100,121,108,105,110,107,144,128,192,2,0,1,150,128,128,128,0,5,96,1,127,0,96,1,127,1,127,96,0,1,127,96,2,127,127,0,96,0,0,2,179,129,128,128,0,10,3,101,110,118,14,68,89,78,65,77,73,67,84,79,80,95,80,84,82,3,127,0,3,101,110,118,13,116,101,109,112,68,111,117,98,108,101,80,116,114,3,127,0,3,101,110,118,5,65,66,79,82,84,3,127,0,3,101,110,118,10,109,101,109,111,114,121,66,97,115,101,3,127,0,3,101,110,118,9,116,97,98,108,101,66,97,115,101,3,127,0,6,103,108,111,98,97,108,3,78,97,78,3,124,0,6,103,108,111,98,97,108,8,73,110,102,105,110,105,116,121,3,124,0,3,101,110,118,18,97,98,111,114,116,83,116,97,99,107,79,118,101,114,102,108,111,119,0,0,3,101,110,118,6,109,101,109,111,114,121,2,0,128,2,3,101,110,118,5,116,97,98,108,101,1,112,0,0,3,137,128,128,128,0,8,1,2,0,3,3,2,4,4,6,242,128,128,128,0,20,127,1,35,0,11,127,1,35,1,11,127,1,35,2,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,124,1,35,5,11,124,1,35,6,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,127,1,65,0,11,124,1,68,0,0,0,0,0,0,0,0,11,127,1,65,0,11,125,1,67,0,0,0,0,11,125,1,67,0,0,0,0,11,127,0,65,0,11,7,184,128,128,128,0,4,6,95,99,111,117,110,116,0,6,18,95,95,112,111,115,116,95,105,110,115,116,97,110,116,105,97,116,101,0,8,11,114,117,110,80,111,115,116,83,101,116,115,0,7,8,95,99,111,117,110,116,101,114,3,26,9,129,128,128,128,0,0,10,190,129,128,128,0,8,173,128,128,128,0,1,1,127,2,64,35,10,33,1,35,10,32,0,106,36,10,35,10,65,15,106,65,112,113,36,10,35,10,35,11,78,4,64,32,0,16,0,11,32,1,15,0,11,0,11,133,128,128,128,0,0,35,10,15,11,134,128,128,128,0,0,32,0,36,10,11,141,128,128,128,0,0,2,64,32,0,36,10,32,1,36,11,11,11,146,128,128,128,0,0,35,12,65,0,70,4,64,32,0,36,12,32,1,36,13,11,11,161,128,128,128,0,1,4,127,2,64,35,10,33,3,35,3,65,0,106,40,2,0,33,0,32,0,65,1,106,33,1,32,1,15,0,11,0,11,133,128,128,128,0,1,1,127,1,11,152,128,128,128,0,0,2,64,35,3,65,16,106,36,10,35,10,65,128,128,192,2,106,36,11,16,7,11,11,11,135,128,128,128,0,1,0,35,3,11,1,100,]);
Run Code Online (Sandbox Code Playgroud)

我的JS代码然后调用以下内容:

import Counter from './wasm/counter'
const counter = new Counter();
Run Code Online (Sandbox Code Playgroud)

并且在实例化时失败并出现以下错误:

LinkError: import object field 'DYNAMICTOP_PTR' is not a Number
Run Code Online (Sandbox Code Playgroud)

wasm-loader使用以下默认选项(importObject)WebAssembly.Instance(module, importObject):

{
  'global': {},
  'env': {
    'memory': new Memory({initial: 10, limit: 100}),
    'table': new Table({initial: 0, element: 'anyfunc'})
  }
} …
Run Code Online (Sandbox Code Playgroud)

javascript emscripten webassembly

11
推荐指数
2
解决办法
3606
查看次数

是否可以使用WebAssembly提交HTTP请求?

我正在尝试在WebAssembly中提交一个简单的HTTP GET请求.为此,我编写了这个程序(从Emscripten网站复制,稍作修改):

#include <stdio.h>
#include <string.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/fetch.h>
#include <emscripten.h>
#endif


void downloadSucceeded(emscripten_fetch_t *fetch) {
  printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
  // The data is now available at fetch->data[0] through fetch->data[fetch->numBytes-1];
  emscripten_fetch_close(fetch); // Free data associated with the fetch.
}

void downloadFailed(emscripten_fetch_t *fetch) {
  printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status);
  emscripten_fetch_close(fetch); // Also free data on failure.
}

unsigned int EMSCRIPTEN_KEEPALIVE GetRequest() {
  emscripten_fetch_attr_t attr;
  emscripten_fetch_attr_init(&attr);
  strcpy(attr.requestMethod, "GET");
  attr.attributes …
Run Code Online (Sandbox Code Playgroud)

c http xmlhttprequest emscripten webassembly

11
推荐指数
2
解决办法
3272
查看次数