feat: add shared typescript utility methods, and stores for ui layer
This commit is contained in:
parent
af1a34e510
commit
7a729934dd
|
@ -0,0 +1,46 @@
|
|||
import { x25519 } from "@noble/curves/ed25519";
|
||||
import {
|
||||
getCommunicationKey,
|
||||
getRemoteCommunicationKey,
|
||||
setCommunicationKey,
|
||||
setRemoteCommunicationKey,
|
||||
} from "./vars.js";
|
||||
import { queryBackground } from "./util.js";
|
||||
import { bytesToHex, hexToBytes, randomBytes } from "@lumeweb/libweb";
|
||||
import { secretbox } from "@noble/ciphers/salsa";
|
||||
|
||||
export function generateCommunicationKey() {
|
||||
return x25519.utils.randomPrivateKey();
|
||||
}
|
||||
|
||||
export async function exchangeCommunicationKeys() {
|
||||
if (!getCommunicationKey()) {
|
||||
setCommunicationKey(generateCommunicationKey());
|
||||
}
|
||||
|
||||
const pubKey = await queryBackground(
|
||||
"exchangeCommunicationKeys",
|
||||
bytesToHex(x25519.getPublicKey(getCommunicationKey())),
|
||||
);
|
||||
|
||||
if (!pubKey) {
|
||||
throw new Error("could not get communication key");
|
||||
}
|
||||
|
||||
setRemoteCommunicationKey(hexToBytes(pubKey));
|
||||
}
|
||||
|
||||
export async function setLoginKey(key: Uint8Array) {
|
||||
const privKey = getCommunicationKey();
|
||||
const pubKey = getRemoteCommunicationKey();
|
||||
|
||||
const secret = x25519.getSharedSecret(privKey, pubKey);
|
||||
const nonce = randomBytes(24);
|
||||
const box = secretbox(secret, nonce);
|
||||
const ciphertext = box.seal(key);
|
||||
|
||||
await queryBackground("setLoginKey", {
|
||||
data: bytesToHex(ciphertext),
|
||||
nonce: bytesToHex(nonce),
|
||||
});
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
import browser from "webextension-polyfill";
|
||||
|
||||
import { createClient } from "@lumeweb/kernel-swarm-client";
|
||||
|
||||
let swarmClient = createClient();
|
||||
|
||||
export async function queryBackground(method: string, data = {}) {
|
||||
let resp;
|
||||
try {
|
||||
resp = await browser.runtime.sendMessage({
|
||||
method,
|
||||
data,
|
||||
});
|
||||
} catch (e) {
|
||||
throw e;
|
||||
}
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
||||
export async function waitForBoot() {
|
||||
await queryBackground("waitForBoot");
|
||||
}
|
||||
|
||||
export async function waitForConnected(cb?: Function) {
|
||||
await waitForBoot();
|
||||
await swarmClient.ready();
|
||||
await cb?.();
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
let communicationKey: Uint8Array;
|
||||
let remoteCommunicationKey: Uint8Array;
|
||||
|
||||
export function setCommunicationKey(key: Uint8Array) {
|
||||
communicationKey = key;
|
||||
}
|
||||
|
||||
export function getCommunicationKey() {
|
||||
return communicationKey;
|
||||
}
|
||||
export function setRemoteCommunicationKey(key: Uint8Array) {
|
||||
remoteCommunicationKey = key;
|
||||
}
|
||||
|
||||
export function getRemoteCommunicationKey() {
|
||||
return remoteCommunicationKey;
|
||||
}
|
Reference in New Issue