mirror of
https://github.com/planetrenox/inzerosight.git
synced 2026-09-18 10:05:44 +00:00
Release extension 3.2.0 with ZWUS-7 and large text support
This commit is contained in:
2
BUILD.md
2
BUILD.md
@@ -7,7 +7,7 @@
|
||||
## Step-by-Step Build Instructions
|
||||
1. Install dependencies:
|
||||
```bash
|
||||
npm install
|
||||
npm ci
|
||||
```
|
||||
|
||||
2. Build the Firefox extension:
|
||||
|
||||
34
chunked.js
Normal file
34
chunked.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import zwus from 'zwus';
|
||||
|
||||
const SIZE = 65536;
|
||||
|
||||
function encode(values, base, method) {
|
||||
const parts = [];
|
||||
for (let start = 0; start < values.length;) {
|
||||
let end = Math.min(start + SIZE, values.length);
|
||||
if (typeof values === 'string' && end < values.length &&
|
||||
values.charCodeAt(end - 1) >= 0xD800 && values.charCodeAt(end - 1) <= 0xDBFF) end--;
|
||||
parts.push(zwus[method](values.slice(start, end), base));
|
||||
start = end;
|
||||
}
|
||||
return parts.join(zwus[base].unifier);
|
||||
}
|
||||
|
||||
function decode(text, base, method) {
|
||||
const parts = [], sep = zwus[base].unifier;
|
||||
for (let start = 0; start < text.length;) {
|
||||
let end = Math.min(start + SIZE, text.length);
|
||||
if (end < text.length) {
|
||||
const cut = text.lastIndexOf(sep, end - 1);
|
||||
end = cut >= start ? cut + 1 : (text.indexOf(sep, end) + 1 || text.length);
|
||||
}
|
||||
parts.push(zwus[method](text.slice(start, end), base));
|
||||
start = end;
|
||||
}
|
||||
return method === 'decodeToString' ? parts.join('') : parts.flat();
|
||||
}
|
||||
|
||||
export const encodeString = (text, base) => encode(text, base, 'encodeString');
|
||||
export const encodeNumberArray = (numbers, base) => encode(numbers, base, 'encodeNumberArray');
|
||||
export const decodeToString = (text, base) => decode(text, base, 'decodeToString');
|
||||
export const decodeToNumberArray = (text, base) => decode(text, base, 'decodeToNumberArray');
|
||||
69
dash.js
69
dash.js
@@ -1,4 +1,4 @@
|
||||
import zwus from 'zwus';
|
||||
import * as chunked from './chunked.js';
|
||||
import * as speck48_96ctr from './speck48_96ctr.js';
|
||||
import * as speck32_64ecb from './speck32_64ecb.js';
|
||||
import { makeSig, parseSig } from './sig.js';
|
||||
@@ -8,6 +8,9 @@ const encoderDropdown = document.getElementById('encoder');
|
||||
const cipherDropdown = document.getElementById('cipher');
|
||||
const signBtn = document.getElementById('sign');
|
||||
const sigDetect = document.getElementById('sigDetect');
|
||||
const notice = document.getElementById('notice');
|
||||
const buttons = ['encodeButton', 'decodeButton'].map(id => document.getElementById(id));
|
||||
const controls = [...buttons, encoderDropdown, cipherDropdown, signBtn];
|
||||
|
||||
document.getElementById('encodeButton').addEventListener('click', ACT);
|
||||
document.getElementById('decodeButton').addEventListener('click', ACT);
|
||||
@@ -15,9 +18,10 @@ signBtn.addEventListener('click', e =>
|
||||
e.target.classList.toggle('on')
|
||||
);
|
||||
|
||||
let fadeTimer;
|
||||
let fadeTimer, busy = false;
|
||||
|
||||
function ACT(event) {
|
||||
async function ACT(event) {
|
||||
if (busy) return;
|
||||
clearTimeout(fadeTimer);
|
||||
sigDetect.className = '';
|
||||
|
||||
@@ -57,22 +61,49 @@ function ACT(event) {
|
||||
|
||||
if (needsKey && !kStr) return;
|
||||
|
||||
busy = true;
|
||||
controls.forEach(control => control.disabled = true);
|
||||
notice.textContent = 'Processing…';
|
||||
try {
|
||||
let val = DESCRY[op][cipher](text, base, kStr);
|
||||
let val = await DESCRY[op][cipher](text, base, kStr);
|
||||
if (op === 'NO' && signBtn.classList.contains('on'))
|
||||
val = makeSig(base, cipher) + val;
|
||||
textarea.value = val;
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
if (op === 'NO') {
|
||||
textarea.select();
|
||||
document.execCommand('copy');
|
||||
textarea.value = 'Copied to your clipboard.\n A copy has been placed between these brackets [' + textarea.value + ']';
|
||||
notice.textContent = 'Copying…';
|
||||
const copied = await copyText(val);
|
||||
if (copied && val.length <= 65536)
|
||||
textarea.value = 'Copied to your clipboard.\n A copy has been placed between these brackets [' + val + ']';
|
||||
notice.textContent = copied ? `Copied ${val.length.toLocaleString()} characters.` :
|
||||
'Copy failed. The encoded text is in the box; select and copy it manually.';
|
||||
} else notice.textContent = `Decoded ${val.length.toLocaleString()} characters.`;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
notice.textContent = `Could not ${op === 'NO' ? 'encode' : 'decode'}: ${e.message}`;
|
||||
} finally {
|
||||
busy = false;
|
||||
controls.forEach(control => control.disabled = false);
|
||||
}
|
||||
}
|
||||
|
||||
async function copyText(val) {
|
||||
if (navigator.clipboard?.writeText) {
|
||||
let timer;
|
||||
try {
|
||||
await Promise.race([
|
||||
navigator.clipboard.writeText(val),
|
||||
new Promise((_, reject) => timer = setTimeout(() => reject(new Error('Copy timed out')), 5000))
|
||||
]);
|
||||
return true;
|
||||
} catch (e) { console.warn('Clipboard copy failed', e); }
|
||||
finally { clearTimeout(timer); }
|
||||
}
|
||||
if (val.length > 65536) return false;
|
||||
textarea.select();
|
||||
try { return document.execCommand('copy'); }
|
||||
catch (e) { console.warn('Clipboard copy failed', e); return false; }
|
||||
}
|
||||
|
||||
function getCipherKey() {
|
||||
return cipherDropdown.value;
|
||||
}
|
||||
@@ -80,18 +111,18 @@ function getCipherKey() {
|
||||
const DESCRY = {
|
||||
NO: {
|
||||
PLAIN: (ptStr, base) =>
|
||||
zwus.encodeString(ptStr, base),
|
||||
chunked.encodeString(ptStr, base),
|
||||
SPECK48_96CTR: (ptStr, base, kStr) =>
|
||||
zwus.encodeNumberArray(speck48_96ctr.encrypt(ptStr, speck48_96ctr.getKey(kStr)), base),
|
||||
chunked.encodeNumberArray(speck48_96ctr.encrypt(ptStr, speck48_96ctr.getKey(kStr)), base),
|
||||
'SPECK32_64ECB (insecure)': (ptStr, base, kStr) =>
|
||||
zwus.encodeNumberArray(speck32_64ecb.encrypt(ptStr, speck32_64ecb.getKey(kStr)), base),
|
||||
chunked.encodeNumberArray(speck32_64ecb.encrypt(ptStr, speck32_64ecb.getKey(kStr)), base),
|
||||
},
|
||||
YES: {
|
||||
PLAIN: (ptStr, base) =>
|
||||
zwus.decodeToString(ptStr, base),
|
||||
SPECK48_96CTR: (ptStr, base, kStr) =>
|
||||
speck48_96ctr.decrypt(zwus.decodeToNumberArray(ptStr, base), speck48_96ctr.getKey(kStr)),
|
||||
'SPECK32_64ECB (insecure)': (ptStr, base, kStr) =>
|
||||
speck32_64ecb.decrypt(zwus.decodeToNumberArray(ptStr, base), speck32_64ecb.getKey(kStr)),
|
||||
chunked.decodeToString(ptStr, base),
|
||||
SPECK48_96CTR: async (ptStr, base, kStr) =>
|
||||
speck48_96ctr.decrypt(await chunked.decodeToNumberArray(ptStr, base), speck48_96ctr.getKey(kStr)),
|
||||
'SPECK32_64ECB (insecure)': async (ptStr, base, kStr) =>
|
||||
speck32_64ecb.decrypt(await chunked.decodeToNumberArray(ptStr, base), speck32_64ecb.getKey(kStr)),
|
||||
}
|
||||
};
|
||||
|
||||
8
dist/chrome/content.js
vendored
8
dist/chrome/content.js
vendored
File diff suppressed because one or more lines are too long
6
dist/chrome/index.html
vendored
6
dist/chrome/index.html
vendored
@@ -7,15 +7,15 @@
|
||||
<script type="module" crossorigin src="/index.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/index.css">
|
||||
</head>
|
||||
<body>
|
||||
<body>
|
||||
<div id="overbar"><p>inØsight 3.2.0<span id="sigDetect"></span><a id="homepage" href="https://github.com/inzerosight/inzerosight" target="_blank" rel="noopener">source</a></p></div>
|
||||
<textarea id="textarea" placeholder="input text here..."></textarea>
|
||||
<input id="encodeButton" type="button" name="button" value="encode to clipboard"/>
|
||||
<input id="decodeButton" type="button" name="button" value="decode from text"/>
|
||||
<select id="encoder">
|
||||
<optgroup label="Standard">
|
||||
<option>ZWUS-3</option>
|
||||
<option selected>ZWUS-6</option>
|
||||
<option>ZWUS-3</option>
|
||||
<option>ZWUS-6</option>
|
||||
<option selected>ZWUS-7</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
|
||||
8
dist/chrome/index.js
vendored
8
dist/chrome/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/chrome/manifest.json
vendored
2
dist/chrome/manifest.json
vendored
@@ -1 +1 @@
|
||||
{"name":"inØsight","version":"3.1.0","author":"planetrenox@pm.me","homepage_url":"https://github.com/inzerosight/inzerosight","description":"Communicate undetected in plain sight.","icons":{"48":"icon_500.png"},"manifest_version":3,"action":{"default_icon":{"48":"icon_500.png"},"default_title":"inØsight","default_popup":"index.html"},"content_scripts":[{"matches":["<all_urls>"],"js":["content.js"],"run_at":"document_idle"}]}
|
||||
{"name":"inØsight","version":"3.2.0","author":"planetrenox@pm.me","homepage_url":"https://github.com/inzerosight/inzerosight","description":"Communicate undetected in plain sight.","icons":{"48":"icon_500.png"},"permissions":["clipboardWrite"],"manifest_version":3,"action":{"default_icon":{"48":"icon_500.png"},"default_title":"inØsight","default_popup":"index.html"},"content_scripts":[{"matches":["<all_urls>"],"js":["content.js"],"run_at":"document_idle"}]}
|
||||
8
dist/firefox/content.js
vendored
8
dist/firefox/content.js
vendored
File diff suppressed because one or more lines are too long
6
dist/firefox/index.html
vendored
6
dist/firefox/index.html
vendored
@@ -7,15 +7,15 @@
|
||||
<script type="module" crossorigin src="/index.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/index.css">
|
||||
</head>
|
||||
<body>
|
||||
<body>
|
||||
<div id="overbar"><p>inØsight 3.2.0<span id="sigDetect"></span><a id="homepage" href="https://github.com/inzerosight/inzerosight" target="_blank" rel="noopener">source</a></p></div>
|
||||
<textarea id="textarea" placeholder="input text here..."></textarea>
|
||||
<input id="encodeButton" type="button" name="button" value="encode to clipboard"/>
|
||||
<input id="decodeButton" type="button" name="button" value="decode from text"/>
|
||||
<select id="encoder">
|
||||
<optgroup label="Standard">
|
||||
<option>ZWUS-3</option>
|
||||
<option selected>ZWUS-6</option>
|
||||
<option>ZWUS-3</option>
|
||||
<option>ZWUS-6</option>
|
||||
<option selected>ZWUS-7</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
|
||||
8
dist/firefox/index.js
vendored
8
dist/firefox/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/firefox/manifest.json
vendored
2
dist/firefox/manifest.json
vendored
@@ -1 +1 @@
|
||||
{"name":"inØsight","version":"3.1.0","author":"planetrenox@pm.me","homepage_url":"https://github.com/inzerosight/inzerosight","description":"Communicate undetected in plain sight.","icons":{"48":"icon_500.png"},"manifest_version":2,"browser_action":{"browser_style":false,"default_icon":"icon_500.png","default_title":"inØsight","default_popup":"index.html"},"content_security_policy":"script-src 'self'; style-src 'self';","browser_specific_settings":{"gecko":{"id":"{0a73f41c-c59c-404b-9e07-f7392fa830d4}"}},"content_scripts":[{"matches":["<all_urls>"],"js":["content.js"],"run_at":"document_idle"}]}
|
||||
{"name":"inØsight","version":"3.2.0","author":"planetrenox@pm.me","homepage_url":"https://github.com/inzerosight/inzerosight","description":"Communicate undetected in plain sight.","icons":{"48":"icon_500.png"},"permissions":["clipboardWrite"],"manifest_version":2,"browser_action":{"browser_style":false,"default_icon":"icon_500.png","default_title":"inØsight","default_popup":"index.html"},"content_security_policy":"script-src 'self'; style-src 'self';","browser_specific_settings":{"gecko":{"id":"{0a73f41c-c59c-404b-9e07-f7392fa830d4}"}},"content_scripts":[{"matches":["<all_urls>"],"js":["content.js"],"run_at":"document_idle"}]}
|
||||
BIN
dist/inzerosight-chrome.zip
vendored
BIN
dist/inzerosight-chrome.zip
vendored
Binary file not shown.
BIN
dist/inzerosight-firefox-source.zip
vendored
Normal file
BIN
dist/inzerosight-firefox-source.zip
vendored
Normal file
Binary file not shown.
BIN
dist/inzerosight-firefox.zip
vendored
BIN
dist/inzerosight-firefox.zip
vendored
Binary file not shown.
@@ -24,6 +24,7 @@ All operations performed by inØsight—including text encoding, decoding, encry
|
||||
inØsight requests permissions only to function as intended:
|
||||
|
||||
- **Web Page Content (`<all_urls>`):** Used strictly to scan text nodes in the Document Object Model (DOM) for inØsight zero-width Unicode signatures so the local on-screen decode/decrypt button can be displayed. No page content, personal details, or browsing activity is tracked, logged, or recorded.
|
||||
- **Clipboard (`clipboardWrite`):** Used to copy encoded text when requested in the popup. Clipboard contents are processed locally and are not transmitted.
|
||||
|
||||
## 4. Third-Party Disclosures
|
||||
|
||||
|
||||
33
docs/zwus.md
33
docs/zwus.md
@@ -4,20 +4,36 @@ Choosing the right ZWUS base involves balancing **payload size** against **platf
|
||||
|
||||
## Choosing the Optimal Base
|
||||
|
||||
- **Higher Bases (e.g. ZWUS-8):**
|
||||
You generally want to use the highest standard possible because higher bases encode more data per character, resulting in significantly more compact zero-width payloads and smaller storage footprints.
|
||||
- **ZWUS-7:**
|
||||
Ranks printable ASCII characters by frequency so common English letters and spaces use short values. It is the default for casual text.
|
||||
|
||||
- **Compatibility Trade-off:**
|
||||
The higher the base, the larger the alphabet of zero-width Unicode characters required. Certain messaging apps, web services, or platforms may strip, sanitize, or fail to hide some of these characters properly (sometimes rendering visible space or placeholder boxes). If a platform alters or rejects certain characters, lower bases like **ZWUS-6** or **ZWUS-3** offer higher compatibility by restricting the alphabet to a smaller, safer subset of zero-width characters.
|
||||
|
||||
> **Developer Advice:**
|
||||
> - **ZWUS-8:** Only pick ZWUS-8 if you are using lots of Asian or non-standard Unicode characters (where high code points benefit most from base-8 compression).
|
||||
> - **ZWUS-6:** The sweet spot for English text if the target website or platform supports it.
|
||||
> - **ZWUS-7:** Use it for compact everyday English text.
|
||||
> - **ZWUS-6:** Use it when a platform does not preserve ZWUS-7's additional character.
|
||||
> - **ZWUS-3:** Only use ZWUS-3 if you want to be as safe as possible across strict platforms.
|
||||
|
||||
## Why ZWUS-7 Is Smaller
|
||||
|
||||
ZWUS-6 writes each character's Unicode code point in base 6. For example, `t` is code point 116, which needs three base-6 digits. ZWUS-7 first assigns short numbers to printable ASCII characters in an order chosen for ordinary English text, then writes those numbers in base 7:
|
||||
|
||||
| Character | ZWUS-6 value | ZWUS-6 digits | ZWUS-7 rank | ZWUS-7 digits |
|
||||
| :--- | ---: | ---: | ---: | ---: |
|
||||
| `t` | 116 | 3 | 0 | 1 |
|
||||
| `e` | 101 | 3 | 1 | 1 |
|
||||
| space | 32 | 2 | 2 | 1 |
|
||||
| `a` | 97 | 3 | 3 | 1 |
|
||||
| `s` | 115 | 3 | 7 | 2 |
|
||||
|
||||
Ranks 0–6 fit in one zero-width digit; ranks 7–48 fit in two. All lowercase English letters fit in one or two digits, as do the decimal digits. Each encoded character is separated by one zero-width unifier in either standard, so shorter values directly reduce the payload length. ZWUS-7 adds `U+FEFF` as a seventh digit, but the frequency ranking is responsible for most of the saving.
|
||||
|
||||
For example, encoding `hello world` without a signature produces **42 zero-width characters with ZWUS-6** and **28 with ZWUS-7**: one third fewer characters. The count includes separators and measures characters, not UTF-8 bytes. The exact saving depends on the text. Rare printable characters can still need three digits, and control characters such as newlines can be longer in ZWUS-7. Non-ASCII characters retain their code points. Frequency ranking applies to strings only; number arrays use ordinary base-7 numbers.
|
||||
|
||||
## Automatic Detection with Sign
|
||||
|
||||
If you enable **Sign** when encoding, an invisible, collision-free signature is attached to the secret message. When decoding—either in the extension popup or via the on-screen overlay—inØsight automatically identifies and switches to the correct base and cipher every time. You never need to remember or guess which standard was used.
|
||||
If you enable **Sign** when encoding, an invisible signature is attached to the secret message. When decoding—either in the extension popup or via the on-screen overlay—inØsight identifies the base and cipher.
|
||||
|
||||
---
|
||||
|
||||
@@ -46,8 +62,8 @@ Uses 7 unique characters (base 6 digits + delimiter):
|
||||
| **Digit 4** | `U+200B` | Zero Width Space |
|
||||
| **Digit 5** | `U+200E` | Left-to-Right Mark |
|
||||
|
||||
### ZWUS-8
|
||||
Uses 9 unique characters (base 8 digits + delimiter):
|
||||
### ZWUS-7
|
||||
Uses 8 unique characters (base 7 digits + delimiter). Printable ASCII is ranked so frequent English characters take fewer digits; other Unicode code points retain their numeric value (control characters move above the ASCII ranks). Number arrays use ordinary base-7 values:
|
||||
|
||||
| Role | Unicode | Character Name |
|
||||
| :--- | :--- | :--- |
|
||||
@@ -58,5 +74,4 @@ Uses 9 unique characters (base 8 digits + delimiter):
|
||||
| **Digit 3** | `U+2060` | Word Joiner |
|
||||
| **Digit 4** | `U+200B` | Zero Width Space |
|
||||
| **Digit 5** | `U+200E` | Left-to-Right Mark |
|
||||
| **Digit 6** | `U+180E` | Mongolian Vowel Separator |
|
||||
| **Digit 7** | `U+FEFF` | Zero Width No-Break Space (BOM) |
|
||||
| **Digit 6** | `U+FEFF` | Zero Width No-Break Space (BOM) |
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="overbar"><p>inØsight 3.1.0<span id="sigDetect"></span><a id="homepage" href="https://github.com/inzerosight/inzerosight" target="_blank" rel="noopener">source</a></p></div>
|
||||
<div id="overbar"><p>inØsight 3.2.0<span id="sigDetect"></span><a id="homepage" href="https://github.com/inzerosight/inzerosight" target="_blank" rel="noopener">source</a></p></div>
|
||||
<textarea id="textarea" placeholder="input text here..."></textarea>
|
||||
<input id="encodeButton" type="button" name="button" value="encode to clipboard"/>
|
||||
<input id="decodeButton" type="button" name="button" value="decode from text"/>
|
||||
<select id="encoder">
|
||||
<optgroup label="Standard">
|
||||
<option>ZWUS-3</option>
|
||||
<option selected>ZWUS-6</option>
|
||||
<option>ZWUS-8</option>
|
||||
<option>ZWUS-6</option>
|
||||
<option selected>ZWUS-7</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
<select id="cipher">
|
||||
|
||||
3504
package-lock.json
generated
Normal file
3504
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "inzerosight",
|
||||
"version": "3.1.0",
|
||||
"version": "3.2.0",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
@@ -11,9 +11,9 @@
|
||||
"build": "bun run build:firefox && bun run build:chrome"
|
||||
},
|
||||
"dependencies": {
|
||||
"zwus": "2.2.0",
|
||||
"blakejs": "1.2.1",
|
||||
"generic-speck": "1.1.1"
|
||||
"generic-speck": "1.1.1",
|
||||
"zwus": "3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"vite": "^6.3.5",
|
||||
|
||||
@@ -21,8 +21,8 @@ When enabled, prepends an invisible zero-width signature to the output. This all
|
||||
|
||||
## How ZWUS Works
|
||||
|
||||
1. Takes each character's Unicode code point.
|
||||
2. Converts it to the chosen base (3, 6, or 8).
|
||||
1. Takes each character's Unicode code point. ZWUS-7 ranks printable ASCII first so common letters and spaces use short values.
|
||||
2. Converts the value to the chosen base (3, 6, or 7).
|
||||
3. Maps each resulting digit to its assigned zero-width character from the alphabet.
|
||||
4. Joins digits together; separates characters with the base's designated separator (also zero-width).
|
||||
|
||||
|
||||
12
sig.js
12
sig.js
@@ -5,7 +5,7 @@ export const SIG_PREFIX = '\u{200D}\u{200B}\u{00AD}';
|
||||
export const SIG = {
|
||||
3: '\u{200D}\u{200B}\u{00AD}\u{180E}\u{200D}',
|
||||
6: '\u{200D}\u{200B}\u{00AD}\u{200C}\u{200D}',
|
||||
8: '\u{200D}\u{200B}\u{00AD}\u{200C}\u{200C}'
|
||||
7: '\u{200D}\u{200B}\u{00AD}\u{200C}\u{200C}'
|
||||
};
|
||||
|
||||
export const CIPHERS = {
|
||||
@@ -28,16 +28,20 @@ export function makeSig(base, cipher) {
|
||||
}
|
||||
|
||||
export function parseSig(text) {
|
||||
if (!text.includes(SIG_PREFIX)) return null;
|
||||
const base = Object.keys(SIG).find(b => text.includes(SIG[b]));
|
||||
let sigIdx = text.indexOf(SIG_PREFIX), base;
|
||||
while (sigIdx !== -1) {
|
||||
base = Object.keys(SIG).find(b => text.startsWith(SIG[b], sigIdx));
|
||||
if (base) break;
|
||||
sigIdx = text.indexOf(SIG_PREFIX, sigIdx + SIG_PREFIX.length);
|
||||
}
|
||||
if (!base) return null;
|
||||
const sigIdx = text.indexOf(SIG[base]);
|
||||
const after = text.slice(sigIdx + SIG[base].length);
|
||||
const barrier = zwus[base].unifier + zwus[base][0];
|
||||
if (after.startsWith(barrier)) {
|
||||
const zwDigits = Array.from(after.slice(barrier.length, barrier.length + 3));
|
||||
const digits = zwDigits.map(z => Object.keys(zwus[base]).find(k => zwus[base][k] === z)).join('');
|
||||
const cipher = CIPHERS[parseInt(digits, base)];
|
||||
if (!cipher) return { base, cipher: 'PLAIN', payload: after, sigIdx, sigLen: SIG[base].length };
|
||||
const payload = after.slice(barrier.length + 3);
|
||||
const sigLen = SIG[base].length + barrier.length + 3;
|
||||
return { base, cipher, payload, sigIdx, sigLen };
|
||||
|
||||
@@ -12,11 +12,12 @@ export default defineConfig(async ({ mode }) => {
|
||||
manifest: () => {
|
||||
const base = {
|
||||
name: "in\u00D8sight",
|
||||
version: "3.1.0",
|
||||
version: "3.2.0",
|
||||
author: "planetrenox@pm.me",
|
||||
homepage_url: "https://github.com/inzerosight/inzerosight",
|
||||
description: "Communicate undetected in plain sight.",
|
||||
icons: { "48": "icon_500.png" },
|
||||
permissions: ["clipboardWrite"],
|
||||
};
|
||||
|
||||
const content_scripts = [{
|
||||
|
||||
Reference in New Issue
Block a user