38 lines
1.8 KiB
JavaScript
38 lines
1.8 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import fs from "node:fs";
|
|
import factory from "../../web/app/src/vendor/blender/web_engine.js";
|
|
|
|
const wasmBinary = fs.readFileSync(new URL("../../web/app/src/vendor/blender/web_engine.wasm", import.meta.url));
|
|
const valid = fs.readFileSync(new URL("../../tests/files/web/basic_scene.blend", import.meta.url));
|
|
const encoder = new TextEncoder();
|
|
const cases = [
|
|
{ name: "empty", bytes: new Uint8Array(0) },
|
|
{ name: "random", bytes: Uint8Array.from({ length: 4096 }, (_, index) => (index * 73 + 19) & 0xff) },
|
|
{ name: "truncated-header", bytes: valid.subarray(0, 11) },
|
|
{ name: "truncated-dna", bytes: valid.subarray(0, Math.min(8192, valid.length - 1)) },
|
|
{ name: "forged-block-size", bytes: (() => { const data = new Uint8Array(64); data.set(encoder.encode("BLENDER-v520")); data.set(encoder.encode("TEST"), 12); data.set([0xff, 0xff, 0xff, 0x7f], 16); return data; })() },
|
|
];
|
|
|
|
for (const fixture of cases) {
|
|
const engine = await factory({ wasmBinary });
|
|
const handle = engine._web_engine_create();
|
|
assert.ok(handle > 0);
|
|
try {
|
|
let pointer = 0;
|
|
if (fixture.bytes.byteLength > 0) {
|
|
pointer = engine._malloc(fixture.bytes.byteLength);
|
|
engine.HEAPU8.set(fixture.bytes, pointer);
|
|
}
|
|
const result = engine._web_engine_open_blend(handle, pointer, fixture.bytes.byteLength);
|
|
if (pointer) engine._free(pointer);
|
|
assert.notEqual(result, 0, `${fixture.name} malicious blend was accepted`);
|
|
const message = engine.UTF8ToString(engine._web_engine_last_error_message());
|
|
assert.ok(message.length > 0 && message.length < 1024, `${fixture.name} did not return a bounded structured error`);
|
|
}
|
|
finally {
|
|
engine._web_engine_destroy(handle);
|
|
}
|
|
}
|
|
|
|
process.stdout.write(`malicious-blends-ok rejected=${cases.length}\n`);
|