Skip to content

Commit 4a43aa3

Browse files
committed
add methods and struct for e2ee
Signed-off-by: Michael Lodder <[email protected]>
1 parent 80b49b2 commit 4a43aa3

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

packages/crypto/src/lib/crypto.ts

+98
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
SessionKeyPair,
1818
SigningAccessControlConditionJWTPayload,
1919
SigShare,
20+
WalletEncryptedPayload,
2021
} from '@lit-protocol/types';
2122
import {
2223
uint8arrayFromString,
@@ -372,6 +373,103 @@ async function getAmdCert(url: string): Promise<Uint8Array> {
372373
}
373374
}
374375

376+
export const walletEncrypt = async(
377+
myWalletSecretKey: Uint8Array,
378+
theirWalletPublicKey: Uint8Array,
379+
sessionSig: Uint8Array,
380+
message: Uint8Array
381+
): Promise<WalletEncryptedPayload> => {
382+
const random = new Uint8Array(16);
383+
window.crypto.getRandomValues(random);
384+
const dateNow = Date.now();
385+
const createdAt = Math.floor(dateNow / 1000);
386+
const timestamp = Buffer.alloc(8);
387+
timestamp.writeBigUInt64BE(BigInt(createdAt), 0);
388+
389+
const myWalletPublicKey = new Uint8Array(32);
390+
nacl.crypto_scalarmult_base(myWalletPublicKey, myWalletSecretKey);
391+
392+
// Construct AAD
393+
const sessionSignature = Buffer.from(sessionSig); // Replace with actual session signature
394+
const theirPublicKey = Buffer.from(theirWalletPublicKey); // Replace with their public key
395+
const myPublicKey = Buffer.from(myWalletPublicKey); // Replace with your wallet public key
396+
397+
const aad = Buffer.concat([
398+
sessionSignature,
399+
random,
400+
timestamp,
401+
theirPublicKey,
402+
myPublicKey,
403+
]);
404+
405+
const hash = new Uint8Array(64);
406+
nacl.crypto_hash(hash, aad);
407+
408+
const nonce = hash.slice(0, 24);
409+
const ciphertext = nacl.box(message, nonce, theirPublicKey, myWalletSecretKey);
410+
return {
411+
V1: {
412+
verification_key: uint8ArrayToHex(myWalletPublicKey),
413+
ciphertext_and_tag: uint8ArrayToHex(ciphertext),
414+
session_signature: uint8ArrayToHex(sessionSignature),
415+
random: uint8ArrayToHex(random),
416+
created_at: dateNow.toISOString(),
417+
}
418+
};
419+
}
420+
421+
export const walletDecrypt = async(
422+
myWalletSecretKey: Uint8Array,
423+
payload: WalletEncryptedPayload
424+
): Promise<Uint8Array> => {
425+
const dateSent = new Date(payload.V1.created_at)
426+
const createdAt = Math.floor(dateSent / 1000);
427+
const timestamp = Buffer.alloc(8);
428+
timestamp.writeBigUInt64BE(BigInt(createdAt), 0);
429+
430+
const myWalletPublicKey = new Uint8Array(32);
431+
nacl.crypto_scalarmult_base(myWalletPublicKey, myWalletSecretKey);
432+
433+
// Construct AAD
434+
const random = Buffer.from(hexToUint8Array(payload.V1.random));
435+
const sessionSignature = Buffer.from(hexToUint8Array(payload.V1.session_signature)); // Replace with actual session signature
436+
const theirPublicKey = hexToUint8Array(payload.V1.verification_key);
437+
const theirPublicKeyBuffer = Buffer.from(theirPublicKey); // Replace with their public key
438+
const myPublicKey = Buffer.from(myWalletPublicKey); // Replace with your wallet public key
439+
440+
const aad = Buffer.concat([
441+
sessionSignature,
442+
random,
443+
timestamp,
444+
theirPublicKeyBuffer,
445+
myPublicKey,
446+
]);
447+
448+
const hash = new Uint8Array(64);
449+
nacl.crypto_hash(hash, aad);
450+
451+
const nonce = hash.slice(0, 24);
452+
const message = nacl.box.open(payload.V1.ciphertext_and_tag, nonce, theirPublicKey, myWalletSecretKey);
453+
return message;
454+
}
455+
456+
function uint8ArrayToHex(array: Uint8Array) {
457+
return Array.from(array)
458+
.map(byte => byte.toString(16).padStart(2, '0'))
459+
.join('');
460+
}
461+
462+
function hexToUint8Array(hexString: string): Uint8Array {
463+
if (hexString.length % 2 !== 0) {
464+
throw new Error("Hex string must have an even length");
465+
}
466+
const bytes = new Uint8Array(hexString.length / 2);
467+
for (let i = 0; i < bytes.length; i++) {
468+
bytes[i] = parseInt(hexString.slice(i * 2, i * 2 + 2), 16);
469+
}
470+
return bytes;
471+
}
472+
375473
/**
376474
*
377475
* Check the attestation against AMD certs

packages/types/src/lib/interfaces.ts

+10
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,16 @@ export interface CombinedECDSASignature {
871871
signature: `0x${string}`;
872872
}
873873

874+
export interface WalletEncryptedPayload {
875+
V1: {
876+
verification_key: string;
877+
ciphertext_and_tag: string;
878+
session_signature: string;
879+
random: string;
880+
created_at: string;
881+
}
882+
}
883+
874884
export interface HandshakeWithNode {
875885
url: string;
876886
challenge: string;

0 commit comments

Comments
 (0)