我正在尝试在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) Emscripten教程给出了如何与C函数交互的一个很好的解释:https://github.com/kripken/emscripten/wiki/Interacting-with-code
但是你如何与C++类交互:
我正在尝试使用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函数,则验证失败.我试图"防弹"它.
我目前正在使用 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) 我正在使用emscripten为某些库提供Javascript绑定.Emsripten将代码打包到名称空间(global var)中,称为"模块".
我想更改命名,以便我可以使用反映库所用内容的名称,并且还可以防止变量名称冲突,因为我为其他库编写了绑定.
我在文档中找不到任何地方,它显示了如何执行此操作.有谁知道如何更改emscripten使用的默认命名空间?
我在这里浏览源代码: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)
var在另一个内联标记中再次声明它,这次它检查模块是否存在.我的问题:如果只尝试再次返回模块,那么使用自调用函数声明Module有什么意义呢?是不是已经证明它不存在?为什么不直接将Module声明为{}?
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.
我想移植一个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) 以下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) 我正在尝试在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) emscripten ×10
javascript ×7
webassembly ×5
c ×4
c++ ×1
eval ×1
http ×1
jwt ×1
security ×1
sha256 ×1
struct ×1
webpack ×1