Untitled

 avatar
unknown
plain_text
10 months ago
1.1 kB
14
Indexable
const bufferToBase64 = (buffer: ArrayBuffer): Promise<string> => {
  return new Promise((resolve, reject) => {
    const blob = new Blob([buffer]);
    const reader = new FileReader();

    reader.onloadend = () => {
      const base64 = (reader.result as string).split(',')[1];
      resolve(base64);
    };

    reader.onerror = () => reject(new Error('FileReader error'));
    reader.readAsDataURL(blob);
  });
};

const encryptJson = async (jsonData: any) => {
  const keyBytes = Uint8Array.from(atob(aesKeyBase64), (c) => c.charCodeAt(0));
  const iv = crypto.getRandomValues(new Uint8Array(12));

  const key = await crypto.subtle.importKey(
    "raw",
    keyBytes,
    { name: "AES-GCM" },
    false,
    ["encrypt"]
  );

  const encoded = new TextEncoder().encode(JSON.stringify(jsonData));
  const ciphertext = await crypto.subtle.encrypt(
    { name: "AES-GCM", iv },
    key,
    encoded
  );

  const encryptedData = await bufferToBase64(ciphertext);
  const encodedIV = await bufferToBase64(iv.buffer);

  return {
    encryptedData,
    iv: encodedIV,
  };
}
Editor is loading...
Leave a Comment