import { Hex, slice, toBytes, toHex } from 'viem'; import { privateKeyToAddress } from 'viem/accounts'; export function generateKey() { const array = new Uint8Array(32); crypto.getRandomValues(array); return toHex(array); } export function generateSecret() { const secret = generateKey(); const publicKey = privateKeyToAddress(secret); return { secret, publicKey }; } export function generateShortCode() { const array = new Uint8Array(16); crypto.getRandomValues(array); const hexCode = toHex(array); return hexCode; } export async function encryptByTmpSecret(secret: Hex, hexData: Hex) { const { key, iv } = secretToKeyAndIV(secret); const secretKey = await crypto.subtle.importKey( 'raw', key, 'AES-CTR', false, ['encrypt', 'decrypt'] ); const buf = await crypto.subtle.encrypt( { name: 'AES-CTR', counter: iv, length: 128, }, secretKey, Buffer.from(toBytes(hexData)) ); return toHex(new Uint8Array(buf)); } export async function decryptByTmpSecret(secret: Hex, hexData: Hex) { const { key, iv } = secretToKeyAndIV(secret); const secretKey = await crypto.subtle.importKey( 'raw', key, 'AES-CTR', false, ['encrypt', 'decrypt'] ); const decrypted = await crypto.subtle.decrypt( { name: 'AES-CTR', counter: iv, length: 128 }, secretKey, Buffer.from(toBytes(hexData)) ); return toHex(new Uint8Array(decrypted)); } function secretToKeyAndIV(secret: Hex) { return { key: Buffer.from(toBytes(slice(secret, 0, 16))), iv: Buffer.from(toBytes(slice(secret, 16, 32))), }; }