test
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
mol
2024-07-06 22:23:31 +08:00
parent 08173d8497
commit 263cb5ef03
1663 changed files with 526884 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1 @@
module.exports = require('./build/Release/vsda');

View File

@ -0,0 +1,35 @@
{
"name": "vsda",
"description": "VS Code debug handshake module",
"version": "1.4.1",
"author": {
"name": "Microsoft"
},
"devDependencies": {
"cross-env": "^7.0.3",
"esbuild": "^0.17.19",
"mocha": "^6.1.4",
"rimraf": "^5.0.0"
},
"homepage": "https://github.com/Microsoft/vscode",
"main": "index.js",
"browser": "rust/web/vsda.js",
"types": "index.d.ts",
"os": [
"win32",
"linux",
"darwin"
],
"scripts": {
"build": "node-gyp build",
"configure": "node-gyp configure",
"install": "node-gyp rebuild",
"test": "mocha test.js",
"test-rust": "cd rust && cargo test",
"build-wasm": "yarn test-rust && yarn build-wasm-compile && mocha rust/test.js && yarn build-wasm-encrypt && yarn build-wasm-convert-to-iife && rimraf rust/web/.gitignore rust/nodejs",
"build-wasm-compile": "yarn build-wasm-base -- --target nodejs --out-dir nodejs --features wasm && yarn build-wasm-base -- --target web --out-dir web --features wasm",
"build-wasm-encrypt": "node rust/crypt encrypt rust/web/vsda_bg.wasm",
"build-wasm-convert-to-iife": "esbuild ./rust/web/vsda.js --format=iife --platform=browser --outfile=rust/web/vsda.js --allow-overwrite --global-name=vsda_web",
"build-wasm-base": "cd rust && cross-env WASM_BINDGEN_WEAKREF=1 wasm-pack build --release"
}
}

View File

@ -0,0 +1,277 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "base64"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
[[package]]
name = "block-buffer"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
dependencies = [
"generic-array",
]
[[package]]
name = "bumpalo"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cpufeatures"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
dependencies = [
"libc",
]
[[package]]
name = "crypto-common"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"typenum",
]
[[package]]
name = "digest"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
dependencies = [
"block-buffer",
"crypto-common",
]
[[package]]
name = "generic-array"
version = "0.14.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
dependencies = [
"typenum",
"version_check",
]
[[package]]
name = "getrandom"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"wasi",
"wasm-bindgen",
]
[[package]]
name = "js-sys"
version = "0.3.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
dependencies = [
"wasm-bindgen",
]
[[package]]
name = "libc"
version = "0.2.139"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
[[package]]
name = "log"
version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
[[package]]
name = "once_cell"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro2"
version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]]
name = "sha2"
version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]]
name = "syn"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "typenum"
version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
[[package]]
name = "unicode-ident"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "vsda"
version = "0.1.0"
dependencies = [
"base64",
"getrandom",
"rand",
"sha2",
"wasm-bindgen",
]
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
dependencies = [
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"

View File

@ -0,0 +1,21 @@
[package]
name = "vsda"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[features]
default = []
wasm = ["getrandom/js", "wasm-bindgen"]
[dependencies]
base64 = "0.21.0"
rand = { version = "0.8.5", features = ["std_rng"] }
sha2 = "0.10"
wasm-bindgen = { version = "0.2", optional = true }
getrandom = { version = "0.2" }
[profile.release]
lto = true

View File

@ -0,0 +1,58 @@
const fs = require('fs');
const crypto = require('crypto');
const key = [
"*",
"* Visual Studio Code Server",
"*",
"* By using the software, you agree to",
"* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and",
"* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).",
"*"
].join('\n');
const keyBytes = new TextEncoder().encode(key);
const keySize = 32;
const ivSize = 16;
const step = keySize + ivSize;
/**
* @param {BufferSource} contents
* @returns Promise<ArrayBuffer>
*/
exports.encrypt = async (contents) => {
for (let i = Math.floor(keyBytes.length / step - 1) * step; i >= 0; i -= step) {
const key = await crypto.subtle.importKey('raw', keyBytes.slice(i + ivSize, i + ivSize + keySize), { name: 'AES-CBC' }, false, ['encrypt']);
contents = await crypto.subtle.encrypt({ name: 'AES-CBC', iv: keyBytes.slice(i, i + ivSize) }, key, contents);
}
return contents;
};
/**
* @param {BufferSource} contents
* @returns Promise<ArrayBuffer>
*/
exports.decrypt = async (contents) => {
for (let i = 0; i + step < keyBytes.length; i += step) {
const key = await crypto.subtle.importKey('raw', keyBytes.slice(i + ivSize, i + ivSize + keySize), { name: 'AES-CBC' }, false, ['decrypt']);
contents = await crypto.subtle.decrypt({ name: 'AES-CBC', iv: keyBytes.slice(i, i + ivSize) }, key, contents);
}
return contents;
};
if (require.main === module) {
(async () => {
const [a0, a1, operation, file] = process.argv;
if (file && operation === 'encrypt') {
fs.writeFileSync(file, Buffer.from(await exports.encrypt(fs.readFileSync(file))));
} else if (file && operation === 'decrypt') {
fs.writeFileSync(file, Buffer.from(await exports.decrypt(fs.readFileSync(file))));
} else {
console.error(`Usage: ${a0} ${a1} <encrypt|decrypt> <file>`);
process.exit(1);
}
})();
}

View File

@ -0,0 +1,202 @@
use base64::Engine;
use rand::prelude::*;
use sha2::{Digest, Sha256};
#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
// Total number of license slots. IMPORTANT: value must be single digit because of how the indexes are stored
const COUNT_LICENSES: usize = 10;
// Portions of the restricted license for the C# / C++ extensions to use
// as random text. 2 of these are selected at random for each handshake
const LICENSE_ARRAY: [&[u8]; COUNT_LICENSES] = [
b"You may only use the C/C++ Extension for Visual Studio Code and C# Extension for Visual Studio Code",
b"with Visual Studio Code, Visual Studio or Xamarin Studio software to help you develop and test your applications.",
b"The software is licensed, not sold.",
b"This agreement only gives you some rights to use the software.",
b"Microsoft reserves all other rights",
b"You may not work around any technical limitations in the software;",
b"reverse engineer, decompile or disassemble the software",
b"remove, minimize, block or modify any notices of Microsoft or ",
b"its suppliers in the software share, publish, rent, or lease ",
b"the software, or provide the software as a stand-alone hosted as solution for others to use."
];
// The number of license text chunks to be randomly selected and added to the string before hashing.
const HASHED_LICENSES: usize = 2;
// Total number of salt slots. IMPORTANT: must be single digit because of how the indexes are stored
// in the message.
const COUNT_SALTS: usize = 10;
// Salt values to append to the result as well. This includes non printable characters
// and makes brute forcing the result hash more difficult by causing rainbow tables
// to be of little use.
const SALT_ARRAY: [&[u8]; COUNT_SALTS] = [
b"V+y,(H`v&A\\@x+;4GuK<$z]..?8#wVZn'*+}j1E\\$k0$/lvkpb846K:kf\"CI\\Yl*d4 / .R,{ ",
b"B%&BH</'e{U`>F>ks3lkgSX>ETq{Vsu-i<kVc})P(H`wKlTvuPED>BLAX)C0X1sN\\[u4,H",
b"bk@wJr&7h+N\\`Jfk4D$nbcdKen^VkOH<'KN:%uVO'G3ev#).$gM$r/==qtY]PJ[",
b".owCo\\1\\B:964'42){c0<q,>\\\\1\" - !@1w}Xt",
b"V'+|i5?}]WPLSze1WE6;'}Tg;83v8V2z}ov&x*",
b"$Xjm#X:vcKdYn0VnkrLQDOwy\"; .3RBSW%RIdLOZ7(GKR / 1>(wcime:5qDs ? [l5b5DKR = 9",
b"1UHJ^7Qt.SPtc<Q>6>#$jE+>>e\"P*Mb | bL / `H5'h7nP:ow + }zaqDB2,\"\\(86Xa",
b";JNC{6bB,>R2GMy>t!&J^RSy}22@yP8|Q;ph:\\mjV=xL#y')y+N|c",
b"/vJ{#Oc$xgduO$\\6UR>C_5s?M2X[eXma:)UyrxbK",
b"?MY\",4_b9Lp\"yqGu37h4.}]w#(vbN0cK^?R]\"v<XFg$\\NZ`[K6",
];
/// Creates a salted message to use as a basis for signing/verification.
#[cfg_attr(feature = "wasm", wasm_bindgen(js_name = createNewMessage))]
pub fn create_new_message(original: &str) -> String {
if original.len() < 4 {
return String::new();
}
let mut hasher = Sha256::new();
hasher.update(original);
let mut rng = rand::thread_rng();
let len = rng.gen_range(30..80);
for _ in 0..len {
hasher.update(&[rng.gen_range(b'!'..b'~')]);
}
base64_encode(hasher.finalize().as_slice())
}
/// Signs a salted message return from create_new_message.
#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn sign(salted_message: &str) -> String {
if salted_message.len() < 4 {
return String::new();
}
let mut hasher = Sha256::new();
hasher.update(salted_message);
let mut rng = rand::thread_rng();
let mut indexes: [usize; HASHED_LICENSES + 1] = [0; HASHED_LICENSES + 1];
for i in 0..HASHED_LICENSES {
let index = rng.gen_range(0..COUNT_LICENSES);
indexes[i] = index;
hasher.update(LICENSE_ARRAY[index]);
}
let salt_index = rng.gen_range(0..COUNT_SALTS);
indexes[HASHED_LICENSES] = salt_index;
hasher.update(SALT_ARRAY[salt_index]);
let mut final_value = String::new();
for i in indexes {
final_value.push_str(&i.to_string());
}
final_value.push_str(&base64_encode(hasher.finalize().as_slice()));
final_value
}
/// Validates the signature for the given original message.
#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub fn validate(original_message: &str, signature: &str) -> bool {
if signature.len() < COUNT_LICENSES + 2 {
return false;
}
let mut hasher = Sha256::new();
hasher.update(original_message);
let mut final_value = String::new();
for (i, chr) in signature.chars().take(HASHED_LICENSES + 1).enumerate() {
if chr < '0' || chr > '9' {
return false;
}
let index = (chr as usize) - (b'0' as usize);
let arr = if i == HASHED_LICENSES {
SALT_ARRAY
} else {
LICENSE_ARRAY
};
if index > arr.len() {
return false;
}
hasher.update(arr[index]);
final_value.push_str(&index.to_string());
}
final_value.push_str(&base64_encode(hasher.finalize().as_slice()));
signature == final_value
}
/// Compatibility for histoic vsda interface
#[cfg(feature = "wasm")]
#[wasm_bindgen(js_name = signer)]
pub struct Signer {}
#[cfg(feature = "wasm")]
#[wasm_bindgen(js_class = signer)]
impl Signer {
#[wasm_bindgen(constructor)]
pub fn new() -> Signer {
Signer {}
}
#[wasm_bindgen]
pub fn sign(&mut self, salted_message: &str) -> String {
sign(salted_message)
}
}
/// Compatibility for histoic vsda interface
#[cfg(feature = "wasm")]
#[wasm_bindgen(js_name = validator)]
pub struct Validator {
salted_message: String,
}
#[cfg(feature = "wasm")]
#[wasm_bindgen(js_class = validator)]
impl Validator {
#[wasm_bindgen(constructor)]
pub fn new() -> Validator {
Validator {
salted_message: String::new(),
}
}
#[wasm_bindgen(js_name = createNewMessage)]
pub fn create_new_message(&mut self, original: &str) -> String {
let msg = create_new_message(original);
self.salted_message = msg.clone();
msg
}
#[wasm_bindgen]
pub fn validate(&mut self, signed_message: &str) -> String {
match validate(&self.salted_message, signed_message) {
true => "ok",
false => "error"
}.to_string()
}
}
fn base64_encode(input: &[u8]) -> String {
base64::engine::general_purpose::STANDARD.encode(input)
}
#[cfg(test)]
mod tests {
use crate::{create_new_message, sign, validate};
#[test]
fn it_works() {
let original = "test";
let message = create_new_message(original);
let signed_message = sign(&message);
assert!(validate(&message, &signed_message));
}
}

View File

@ -0,0 +1,73 @@
'use strict';
const assert = require('assert');
const vsda = require('./nodejs/vsda');
const vsdaNative = require('../index');
const enc = require('./crypt');
it('encrypts and decrypts', async () => {
const encrypted = await enc.encrypt(Buffer.from('hello world!'));
assert.notDeepStrictEqual(new Uint8Array(encrypted), new Uint8Array(Buffer.from('hello world!')));
const decrypted = await enc.decrypt(encrypted);
assert.deepStrictEqual(new Uint8Array(decrypted), new Uint8Array(Buffer.from('hello world!')));
});
describe('vsda module', () => {
it('has signer interface', () => {
assert.strictEqual(typeof vsda.signer, 'function');
assert.strictEqual(typeof Object.getOwnPropertyDescriptor(
vsda.signer.prototype, 'sign').value, 'function');
});
it('has validator interface', () => {
assert.strictEqual(typeof vsda.validator, 'function');
assert.strictEqual(typeof Object.getOwnPropertyDescriptor(
vsda.validator.prototype, 'createNewMessage').value, 'function');
assert.strictEqual(typeof Object.getOwnPropertyDescriptor(
vsda.validator.prototype, 'validate').value, 'function');
});
it('can sign with a valid string input', () => {
const signer = new vsda.signer();
const validator = new vsda.validator();
const message = validator.createNewMessage("test");
const signed_message = signer.sign(message);
assert.strictEqual(validator.validate(signed_message), "ok");
})
it('is cross compatible wasm->native', () => {
const validator = new vsda.validator();
const message = validator.createNewMessage("test");
const signed_message = new vsdaNative.signer().sign(message);
assert.strictEqual(validator.validate(signed_message), "ok");
})
it('is cross compatible native->wasm', () => {
const validator = new vsdaNative.validator();
const message = validator.createNewMessage("test");
const signed_message = new vsda.signer().sign(message);
assert.strictEqual(validator.validate(signed_message), "ok");
})
it('throws for invalid input', () => {
const signer = new vsda.signer();
const validator = new vsda.validator();
assert.throws(() => {
validator.createNewMessage()
}, "/^Error: Wrong number of arguments$/");
assert.throws(() => {
validator.createNewMessage(1)
}, "/^Error: Wrong type of argment. Expects a string.$/");
assert.throws(() => {
validator.validate(1, 2)
}, "/^Error: Wrong number of arguments$/");
assert.throws(() => {
validator.validate(1)
}, "/^Error: Wrong type of argment. Expects a string.$/");
assert.throws(() => {
signer.sign(undefined)
}, "/^Error: Wrong type of argment. Expects a string.$/");
})
});

View File

@ -0,0 +1,14 @@
{
"name": "vsda",
"version": "0.1.0",
"files": [
"vsda_bg.wasm",
"vsda.js",
"vsda.d.ts"
],
"module": "vsda.js",
"types": "vsda.d.ts",
"sideEffects": [
"./snippets/*"
]
}

View File

@ -0,0 +1,462 @@
var vsda_web = (() => {
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var vsda_exports = {};
__export(vsda_exports, {
createNewMessage: () => createNewMessage,
default: () => vsda_default,
initSync: () => initSync,
sign: () => sign,
signer: () => signer,
validate: () => validate,
validator: () => validator
});
const import_meta = {};
let wasm;
const heap = new Array(32).fill(void 0);
heap.push(void 0, null, true, false);
function getObject(idx) {
return heap[idx];
}
let heap_next = heap.length;
function addHeapObject(obj) {
if (heap_next === heap.length)
heap.push(heap.length + 1);
const idx = heap_next;
heap_next = heap[idx];
heap[idx] = obj;
return idx;
}
function dropObject(idx) {
if (idx < 36)
return;
heap[idx] = heap_next;
heap_next = idx;
}
function takeObject(idx) {
const ret = getObject(idx);
dropObject(idx);
return ret;
}
const cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
let cachedUint8Memory0 = new Uint8Array();
function getUint8Memory0() {
if (cachedUint8Memory0.byteLength === 0) {
cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
}
return cachedUint8Memory0;
}
function getStringFromWasm0(ptr, len) {
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
}
let WASM_VECTOR_LEN = 0;
const cachedTextEncoder = new TextEncoder("utf-8");
const encodeString = typeof cachedTextEncoder.encodeInto === "function" ? function(arg, view) {
return cachedTextEncoder.encodeInto(arg, view);
} : function(arg, view) {
const buf = cachedTextEncoder.encode(arg);
view.set(buf);
return {
read: arg.length,
written: buf.length
};
};
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === void 0) {
const buf = cachedTextEncoder.encode(arg);
const ptr2 = malloc(buf.length);
getUint8Memory0().subarray(ptr2, ptr2 + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr2;
}
let len = arg.length;
let ptr = malloc(len);
const mem = getUint8Memory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 127)
break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3);
const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
const ret = encodeString(arg, view);
offset += ret.written;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
let cachedInt32Memory0 = new Int32Array();
function getInt32Memory0() {
if (cachedInt32Memory0.byteLength === 0) {
cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);
}
return cachedInt32Memory0;
}
function createNewMessage(original) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(original, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
wasm.createNewMessage(retptr, ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1];
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(r0, r1);
}
}
function sign(salted_message) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(salted_message, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
wasm.sign(retptr, ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1];
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(r0, r1);
}
}
function validate(original_message, signature) {
const ptr0 = passStringToWasm0(original_message, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
const ptr1 = passStringToWasm0(signature, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
const ret = wasm.validate(ptr0, len0, ptr1, len1);
return ret !== 0;
}
function handleError(f, args) {
try {
return f.apply(this, args);
} catch (e) {
wasm.__wbindgen_exn_store(addHeapObject(e));
}
}
function getArrayU8FromWasm0(ptr, len) {
return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
}
const signerFinalization = new FinalizationRegistry((ptr) => wasm.__wbg_signer_free(ptr));
class signer {
static __wrap(ptr) {
const obj = Object.create(signer.prototype);
obj.ptr = ptr;
signerFinalization.register(obj, obj.ptr, obj);
return obj;
}
__destroy_into_raw() {
const ptr = this.ptr;
this.ptr = 0;
signerFinalization.unregister(this);
return ptr;
}
free() {
const ptr = this.__destroy_into_raw();
wasm.__wbg_signer_free(ptr);
}
/**
*/
constructor() {
const ret = wasm.signer_new();
return signer.__wrap(ret);
}
/**
* @param {string} salted_message
* @returns {string}
*/
sign(salted_message) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(salted_message, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
wasm.signer_sign(retptr, this.ptr, ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1];
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(r0, r1);
}
}
}
const validatorFinalization = new FinalizationRegistry((ptr) => wasm.__wbg_validator_free(ptr));
class validator {
static __wrap(ptr) {
const obj = Object.create(validator.prototype);
obj.ptr = ptr;
validatorFinalization.register(obj, obj.ptr, obj);
return obj;
}
__destroy_into_raw() {
const ptr = this.ptr;
this.ptr = 0;
validatorFinalization.unregister(this);
return ptr;
}
free() {
const ptr = this.__destroy_into_raw();
wasm.__wbg_validator_free(ptr);
}
/**
*/
constructor() {
const ret = wasm.validator_new();
return validator.__wrap(ret);
}
/**
* @param {string} original
* @returns {string}
*/
createNewMessage(original) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(original, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
wasm.validator_createNewMessage(retptr, this.ptr, ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1];
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(r0, r1);
}
}
/**
* @param {string} signed_message
* @returns {string}
*/
validate(signed_message) {
try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(signed_message, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN;
wasm.validator_validate(retptr, this.ptr, ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1];
return getStringFromWasm0(r0, r1);
} finally {
wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(r0, r1);
}
}
}
async function load(module2, imports) {
if (typeof Response === "function" && module2 instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === "function") {
try {
return await WebAssembly.instantiateStreaming(module2, imports);
} catch (e) {
if (module2.headers.get("Content-Type") != "application/wasm") {
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
} else {
throw e;
}
}
}
const bytes = await module2.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module2, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module: module2 };
} else {
return instance;
}
}
}
function getImports() {
const imports = {};
imports.wbg = {};
imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
const ret = getObject(arg0);
return addHeapObject(ret);
};
imports.wbg.__wbg_crypto_e1d53a1d73fb10b8 = function(arg0) {
const ret = getObject(arg0).crypto;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_is_object = function(arg0) {
const val = getObject(arg0);
const ret = typeof val === "object" && val !== null;
return ret;
};
imports.wbg.__wbg_process_038c26bf42b093f8 = function(arg0) {
const ret = getObject(arg0).process;
return addHeapObject(ret);
};
imports.wbg.__wbg_versions_ab37218d2f0b24a8 = function(arg0) {
const ret = getObject(arg0).versions;
return addHeapObject(ret);
};
imports.wbg.__wbg_node_080f4b19d15bc1fe = function(arg0) {
const ret = getObject(arg0).node;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_is_string = function(arg0) {
const ret = typeof getObject(arg0) === "string";
return ret;
};
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0);
};
imports.wbg.__wbg_msCrypto_6e7d3e1f92610cbb = function(arg0) {
const ret = getObject(arg0).msCrypto;
return addHeapObject(ret);
};
imports.wbg.__wbg_newwithlength_f5933855e4f48a19 = function(arg0) {
const ret = new Uint8Array(arg0 >>> 0);
return addHeapObject(ret);
};
imports.wbg.__wbg_require_78a3dcfbdba9cbce = function() {
return handleError(function() {
const ret = module.require;
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbindgen_is_function = function(arg0) {
const ret = typeof getObject(arg0) === "function";
return ret;
};
imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
const ret = getStringFromWasm0(arg0, arg1);
return addHeapObject(ret);
};
imports.wbg.__wbg_call_168da88779e35f61 = function() {
return handleError(function(arg0, arg1, arg2) {
const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbg_self_6d479506f72c6a71 = function() {
return handleError(function() {
const ret = self.self;
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbg_window_f2557cc78490aceb = function() {
return handleError(function() {
const ret = window.window;
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbg_globalThis_7f206bda628d5286 = function() {
return handleError(function() {
const ret = globalThis.globalThis;
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbg_global_ba75c50d1cf384f4 = function() {
return handleError(function() {
const ret = global.global;
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbindgen_is_undefined = function(arg0) {
const ret = getObject(arg0) === void 0;
return ret;
};
imports.wbg.__wbg_newnoargs_b5b063fc6c2f0376 = function(arg0, arg1) {
const ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbg_call_97ae9d8645dc388b = function() {
return handleError(function(arg0, arg1) {
const ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
}, arguments);
};
imports.wbg.__wbg_randomFillSync_6894564c2c334c42 = function() {
return handleError(function(arg0, arg1, arg2) {
getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2));
}, arguments);
};
imports.wbg.__wbg_subarray_58ad4efbb5bcb886 = function(arg0, arg1, arg2) {
const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
imports.wbg.__wbg_getRandomValues_805f1c3d65988a5a = function() {
return handleError(function(arg0, arg1) {
getObject(arg0).getRandomValues(getObject(arg1));
}, arguments);
};
imports.wbg.__wbg_length_9e1ae1900cb0fbd5 = function(arg0) {
const ret = getObject(arg0).length;
return ret;
};
imports.wbg.__wbindgen_memory = function() {
const ret = wasm.memory;
return addHeapObject(ret);
};
imports.wbg.__wbg_buffer_3f3d764d4747d564 = function(arg0) {
const ret = getObject(arg0).buffer;
return addHeapObject(ret);
};
imports.wbg.__wbg_new_8c3f0052272a457a = function(arg0) {
const ret = new Uint8Array(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_set_83db9690f9353e79 = function(arg0, arg1, arg2) {
getObject(arg0).set(getObject(arg1), arg2 >>> 0);
};
imports.wbg.__wbindgen_throw = function(arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
};
return imports;
}
function initMemory(imports, maybe_memory) {
}
function finalizeInit(instance, module2) {
wasm = instance.exports;
init.__wbindgen_wasm_module = module2;
cachedInt32Memory0 = new Int32Array();
cachedUint8Memory0 = new Uint8Array();
return wasm;
}
function initSync(module2) {
const imports = getImports();
initMemory(imports);
if (!(module2 instanceof WebAssembly.Module)) {
module2 = new WebAssembly.Module(module2);
}
const instance = new WebAssembly.Instance(module2, imports);
return finalizeInit(instance, module2);
}
async function init(input) {
if (typeof input === "undefined") {
input = new URL("vsda_bg.wasm", import_meta.url);
}
const imports = getImports();
if (typeof input === "string" || typeof Request === "function" && input instanceof Request || typeof URL === "function" && input instanceof URL) {
input = fetch(input);
}
initMemory(imports);
const { instance, module: module2 } = await load(await input, imports);
return finalizeInit(instance, module2);
}
var vsda_default = init;
return __toCommonJS(vsda_exports);
})();

Binary file not shown.

53
vscode-server-linux-x64-web/node_modules/vsda/test.js generated vendored Normal file
View File

@ -0,0 +1,53 @@
'use strict';
const assert = require('assert');
const vsda = require('./index');
describe('vsda module', () => {
it('has signer interface', () => {
assert.strictEqual(typeof vsda.signer, 'function');
assert.strictEqual(typeof Object.getOwnPropertyDescriptor(
vsda.signer.prototype, 'sign').value, 'function');
});
it('has validator interface', () => {
assert.strictEqual(typeof vsda.validator, 'function');
assert.strictEqual(typeof Object.getOwnPropertyDescriptor(
vsda.validator.prototype, 'createNewMessage').value, 'function');
assert.strictEqual(typeof Object.getOwnPropertyDescriptor(
vsda.validator.prototype, 'validate').value, 'function');
});
it('can sign with a valid string input', () => {
const signer = new vsda.signer();
const validator = new vsda.validator();
const message = validator.createNewMessage("test");
const signed_message = signer.sign(message);
assert.strictEqual(validator.validate(signed_message), "ok");
})
it('throws for invalid input', () => {
const signer = new vsda.signer();
const validator = new vsda.validator();
assert.throws(() => {
validator.createNewMessage()
}, "/^Error: Wrong number of arguments$/");
assert.throws(() => {
validator.createNewMessage(1)
}, "/^Error: Wrong type of argment. Expects a string.$/");
assert.throws(() => {
validator.validate(1, 2)
}, "/^Error: Wrong number of arguments$/");
assert.throws(() => {
validator.validate(1)
}, "/^Error: Wrong type of argment. Expects a string.$/");
assert.throws(() => {
signer.sign("test1", "test2")
}, "/^Error: Wrong number of arguments$/");
assert.throws(() => {
signer.sign(undefined)
}, "/^Error: Wrong type of argment. Expects a string.$/");
})
});