{"version":3,"file":"email-crypto-CoRbTphp.mjs","names":[],"sources":["../src/key-wrapper/aesWrapper.ts","../src/email-crypto/errors.ts","../src/email-crypto/core.ts","../src/email-crypto/hybridEncyptedEmail.ts","../src/email-crypto/pwdProtectedEmail.ts","../src/email-crypto/coreSubject.ts","../src/email-crypto/hybridEncryptedEmailAndSubject.ts","../src/email-crypto/pwdProtectedEmailAndSubject.ts","../src/email-crypto/emailKeys.ts"],"sourcesContent":["import { aeskw } from '@noble/ciphers/aes.js';\n\n/**\n * Unwraps the given wrapped key\n *\n * @param encryptedKey - The wrapped key\n * @param wrappingKey - The secret key used for unwrapping\n * @returns The resulting key\n */\nexport async function unwrapKey(encryptedKey: Uint8Array, wrappingKey: Uint8Array): Promise<Uint8Array> {\n  return aeskw(wrappingKey).decrypt(encryptedKey);\n}\n\n/**\n * Wraps the given key\n *\n * @param key - The key to be wrapped\n * @param wrappingKey - The secret key used for wrapping\n * @returns The resulting ciphertext\n */\nexport async function wrapKey(key: Uint8Array, wrappingKey: Uint8Array): Promise<Uint8Array> {\n  return aeskw(wrappingKey).encrypt(key);\n}\n","export class FailedToEncryptEmail extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to encrypt email: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, FailedToEncryptEmail.prototype);\n  }\n}\n\nexport class EmailSymmetricEncryptionError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to symmetrically encrypt email: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailSymmetricEncryptionError.prototype);\n  }\n}\n\nexport class EmailSymmetricDecryptionError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to symmetrically decrypt email: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailSymmetricDecryptionError.prototype);\n  }\n}\n\nexport class EmailPreviewSymmetricDecryptionError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to symmetrically decrypt email preview: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailPreviewSymmetricDecryptionError.prototype);\n  }\n}\n\nexport class EmailHybridEncryptionError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to hybridly encrypt the key: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailHybridEncryptionError.prototype);\n  }\n}\n\nexport class EmailHybridDecryptionError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to hybridly decrypt the key: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailHybridDecryptionError.prototype);\n  }\n}\n\nexport class EmailPasswordProtectError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to password-protect the key: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailPasswordProtectError.prototype);\n  }\n}\n\nexport class EmailPasswordOpenError extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to open password-protected key: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, EmailPasswordOpenError.prototype);\n  }\n}\n\nexport class InvalidInputEmail extends Error {\n  constructor() {\n    super('Invalid input');\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, InvalidInputEmail.prototype);\n  }\n}\n\nexport class FailedToDecryptEmail extends Error {\n  constructor(errorMsg?: string) {\n    super('Failed to decrypt email: ' + errorMsg);\n\n    this.name = this.constructor.name;\n    Object.setPrototypeOf(this, FailedToDecryptEmail.prototype);\n  }\n}\n","import { HybridEncKey, PwdProtectedKey, Email, RecipientWithPublicKey, EmailEncrypted } from '../types';\nimport { encryptSymmetrically, decryptSymmetrically, genSymmetricKey } from '../symmetric-crypto';\nimport { encapsulateHybrid, decapsulateHybrid } from '../hybrid-crypto';\nimport { wrapKey, unwrapKey } from '../key-wrapper';\nimport { getKeyFromPassword, getKeyFromPasswordAndSalt } from '../derive-password';\nimport { UTF8ToUint8, base64ToUint8Array, uint8ArrayToBase64, uint8ToUTF8 } from '../utils';\nimport {\n  EmailHybridDecryptionError,\n  EmailHybridEncryptionError,\n  InvalidInputEmail,\n  EmailSymmetricDecryptionError,\n  EmailSymmetricEncryptionError,\n  EmailPasswordOpenError,\n  EmailPasswordProtectError,\n  EmailPreviewSymmetricDecryptionError,\n} from './errors';\n\n/**\n * Symmetrically encrypts email.\n *\n * @param email - The email to encrypt.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting encrypted email and symmetric key used for encryption\n */\nexport async function encryptEmail(\n  email: Email,\n  aux?: Uint8Array,\n): Promise<{\n  encEmail: EmailEncrypted;\n  encryptionKey: Uint8Array;\n}> {\n  if (!email.text) {\n    throw new InvalidInputEmail();\n  }\n  try {\n    const encryptionKey = genSymmetricKey();\n    const encEmail = await encryptEmailWithKey(email, encryptionKey, aux);\n\n    return { encEmail, encryptionKey };\n  } catch (error) {\n    throw new EmailSymmetricEncryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Symmetrically encrypts email with the given key.\n *\n * @param email - The email to encrypt.\n * @param encryptionKey - The symmetric key to encrypt the email.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting encrypted email and symmetric key used for encryption\n */\nexport async function encryptEmailWithKey(\n  email: Email,\n  encryptionKey: Uint8Array,\n  aux?: Uint8Array,\n): Promise<EmailEncrypted> {\n  try {\n    const text = UTF8ToUint8(email.text);\n    const preview = UTF8ToUint8(email.preview);\n\n    const encryptedText = await encryptSymmetrically(encryptionKey, text, aux);\n    const encText = uint8ArrayToBase64(encryptedText);\n\n    const encryptedPreview = await encryptSymmetrically(encryptionKey, preview, aux);\n    const encPreview = uint8ArrayToBase64(encryptedPreview);\n\n    const encryptedAttachmentsSessionKey = await encryptSymmetrically(encryptionKey, email.attachmentsSessionKey, aux);\n    const encAttachmentsSessionKey = uint8ArrayToBase64(encryptedAttachmentsSessionKey);\n\n    return { encText, encPreview, encAttachmentsSessionKey };\n  } catch (error) {\n    throw new EmailSymmetricEncryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Decrypts symmetrically encrypted email preview.\n *\n * @param encEmailPreview - The email preview to decrypt.\n * @param encryptionKey - The symmetric key to decrypt the email.\n * @param aux - An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting decrypted email\n */\nexport async function decryptPreview(\n  encEmailPreview: string,\n  encryptionKey: Uint8Array,\n  aux?: Uint8Array,\n): Promise<string> {\n  try {\n    const encPreview = base64ToUint8Array(encEmailPreview);\n    const previewArray = await decryptSymmetrically(encryptionKey, encPreview, aux);\n    const preview = uint8ToUTF8(previewArray);\n\n    return preview;\n  } catch (error) {\n    throw new EmailPreviewSymmetricDecryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Decrypts symmetrically encrypted email.\n *\n * @param encEmail - The email to decrypt.\n * @param encryptionKey - The symmetric key to decrypt the email.\n * @param aux - An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting decrypted email\n */\nexport async function decryptEmail(\n  encEmail: EmailEncrypted,\n  encryptionKey: Uint8Array,\n  aux?: Uint8Array,\n): Promise<Email> {\n  try {\n    const encText = base64ToUint8Array(encEmail.encText);\n    const textArray = await decryptSymmetrically(encryptionKey, encText, aux);\n    const text = uint8ToUTF8(textArray);\n\n    const encPreview = base64ToUint8Array(encEmail.encPreview);\n    const previewArray = await decryptSymmetrically(encryptionKey, encPreview, aux);\n    const preview = uint8ToUTF8(previewArray);\n\n    const encAttachementSessionKey = base64ToUint8Array(encEmail.encAttachmentsSessionKey);\n    const attachmentsSessionKey = await decryptSymmetrically(encryptionKey, encAttachementSessionKey, aux);\n\n    return { text, preview, attachmentsSessionKey };\n  } catch (error) {\n    throw new EmailSymmetricDecryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Encrypts the email symmetric key using hybrid encryption.\n *\n * @param emailEncryptionKey - The symmetric key used for email encryption.\n * @param recipient - The recipient with a public hybrid key.\n * @returns The encrypted email symmetric key\n */\nexport async function encryptKeysHybrid(\n  emailEncryptionKey: Uint8Array,\n  recipient: RecipientWithPublicKey,\n): Promise<HybridEncKey> {\n  try {\n    const { cipherText, sharedSecret } = encapsulateHybrid(recipient.publicHybridKey);\n    const encryptedKey = await wrapKey(emailEncryptionKey, sharedSecret);\n    const encryptedKeyBase64 = uint8ArrayToBase64(encryptedKey);\n    const kyberCiphertextBase64 = uint8ArrayToBase64(cipherText);\n\n    return {\n      encryptedKey: encryptedKeyBase64,\n      hybridCiphertext: kyberCiphertextBase64,\n      encryptedForEmail: recipient.email,\n    };\n  } catch (error) {\n    throw new EmailHybridEncryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Decrypts the email symmetric key encrypted via hybrid encryption.\n *\n * @param encryptedKey - The encrypted email key.\n * @param recipientPrivateKey - The private key of the recipient.\n * @returns The email encryption key\n */\nexport async function decryptKeysHybrid(\n  encryptedKey: HybridEncKey,\n  recipientPrivateKey: Uint8Array,\n): Promise<Uint8Array> {\n  try {\n    const kyberCiphertext = base64ToUint8Array(encryptedKey.hybridCiphertext);\n    const encKey = base64ToUint8Array(encryptedKey.encryptedKey);\n    const sharedSecret = decapsulateHybrid(kyberCiphertext, recipientPrivateKey);\n    const encryptionKey = await unwrapKey(encKey, sharedSecret);\n    return encryptionKey;\n  } catch (error) {\n    throw new EmailHybridDecryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Password-protects the email symmetric key.\n *\n * @param emailEncryptionKey - The symmetric key used for email encryption.\n * @param password - The secret password for key protection.\n * @returns The password-protected email symmetric key\n */\nexport async function passwordProtectKey(emailEncryptionKey: Uint8Array, password: string): Promise<PwdProtectedKey> {\n  try {\n    const { key, salt } = await getKeyFromPassword(password);\n    const encryptedKey = await wrapKey(emailEncryptionKey, key);\n    const saltStr = uint8ArrayToBase64(salt);\n    const encryptedKeyStr = uint8ArrayToBase64(encryptedKey);\n    return { encryptedKey: encryptedKeyStr, salt: saltStr };\n  } catch (error) {\n    throw new EmailPasswordProtectError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Removes passoword-protection and exposes the email symmetric key.\n *\n * @param emailEncryptionKey -  The password-protected email key.\n * @param password - The secret password for key protection.\n * @returns The email encryption key\n */\nexport async function removePasswordProtection(\n  emailEncryptionKey: PwdProtectedKey,\n  password: string,\n): Promise<Uint8Array> {\n  try {\n    const salt = base64ToUint8Array(emailEncryptionKey.salt);\n    const encryptedKey = base64ToUint8Array(emailEncryptionKey.encryptedKey);\n    const key = await getKeyFromPasswordAndSalt(password, salt);\n    const encryptionKey = await unwrapKey(encryptedKey, key);\n    return encryptionKey;\n  } catch (error) {\n    throw new EmailPasswordOpenError(error instanceof Error ? error.message : String(error));\n  }\n}\n","import { Email, RecipientWithPublicKey, HybridEncKey, EmailEncrypted } from '../types';\nimport { decryptEmail, decryptPreview, encryptKeysHybrid, decryptKeysHybrid, encryptEmail } from './core';\nimport { InvalidInputEmail } from './errors';\n\n/**\n * Encrypts the email using hybrid encryption for multiple recipients.\n *\n * @param email - The email to encrypt for multiple recipients.\n * @param recipients - The recipients with corresponding public keys.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The set of encrypted keys (one per user) and encrypted email\n */\nexport async function encryptEmailHybridForMultipleRecipients(\n  email: Email,\n  recipients: RecipientWithPublicKey[],\n  aux?: Uint8Array,\n): Promise<{ encryptedKeys: HybridEncKey[]; encEmail: EmailEncrypted }> {\n  if (!recipients || recipients.length === 0) {\n    throw new InvalidInputEmail();\n  }\n  const { encryptionKey, encEmail } = await encryptEmail(email, aux);\n\n  const encryptedKeys = await Promise.all(recipients.map((recipient) => encryptKeysHybrid(encryptionKey, recipient)));\n\n  return { encryptedKeys, encEmail };\n}\n\n/**\n * Decrypts the email using hybrid encryption.\n *\n * @param encEmail - The encrypted email.\n * @param encryptedKey - The encrypted key for this recipient.\n * @param recipientPrivateHybridKeys - The private key of the recipient.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The decrypted email\n */\nexport async function decryptEmailHybrid(\n  encEmail: EmailEncrypted,\n  encryptedKey: HybridEncKey,\n  recipientPrivateHybridKeys: Uint8Array,\n  aux?: Uint8Array,\n): Promise<Email> {\n  const encryptionKey = await decryptKeysHybrid(encryptedKey, recipientPrivateHybridKeys);\n  return await decryptEmail(encEmail, encryptionKey, aux);\n}\n\nexport async function decryptEmailPreviewHybrid(\n  encPreview: string,\n  encryptedKey: HybridEncKey,\n  recipientPrivateHybridKeys: Uint8Array,\n  aux?: Uint8Array,\n): Promise<{ preview: string; encryptionKey: Uint8Array }> {\n  const encryptionKey = await decryptKeysHybrid(encryptedKey, recipientPrivateHybridKeys);\n  const preview = await decryptPreview(encPreview, encryptionKey, aux);\n  return { preview, encryptionKey };\n}\n","import { PwdProtectedEmail, Email } from '../types';\nimport { decryptEmail, passwordProtectKey, removePasswordProtection, encryptEmail } from './core';\nimport {\n  EmailSymmetricEncryptionError,\n  FailedToDecryptEmail,\n  FailedToEncryptEmail,\n  EmailPasswordProtectError,\n  EmailSymmetricDecryptionError,\n  EmailPasswordOpenError,\n  InvalidInputEmail,\n} from './errors';\n/**\n * Creates a password-protected email.\n *\n * @param email - The email to password-protect\n * @param password - The secret password shared among recipients\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The password-protected email\n */\nexport async function createPwdProtectedEmail(\n  email: Email,\n  password: string,\n  aux?: Uint8Array,\n): Promise<PwdProtectedEmail> {\n  try {\n    const { encryptionKey, encEmail } = await encryptEmail(email, aux);\n    const encryptedKey = await passwordProtectKey(encryptionKey, password);\n\n    return { encEmail, encryptedKey };\n  } catch (error) {\n    if (error instanceof InvalidInputEmail) throw error;\n    if (error instanceof EmailSymmetricEncryptionError) throw error;\n    if (error instanceof EmailPasswordProtectError) throw error;\n    throw new FailedToEncryptEmail(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Opens a password-protected email.\n *\n * @param encryptedEmail - The encrypted email\n * @param password - The secret password shared among recipients.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The decrypted email\n */\nexport async function decryptPwdProtectedEmail(\n  encryptedEmail: PwdProtectedEmail,\n  password: string,\n  aux?: Uint8Array,\n): Promise<Email> {\n  if (!encryptedEmail?.encEmail || !encryptedEmail?.encryptedKey) {\n    throw new InvalidInputEmail();\n  }\n  try {\n    const encryptionKey = await removePasswordProtection(encryptedEmail.encryptedKey, password);\n    return await decryptEmail(encryptedEmail.encEmail, encryptionKey, aux);\n  } catch (error) {\n    if (error instanceof EmailPasswordOpenError) throw error;\n    if (error instanceof EmailSymmetricDecryptionError) throw error;\n    throw new FailedToDecryptEmail(error instanceof Error ? error.message : String(error));\n  }\n}\n","import { EmailAndSubject, EmailAndSubjectEncrypted } from '../types';\nimport { encryptSymmetrically, decryptSymmetrically, genSymmetricKey } from '../symmetric-crypto';\nimport { encryptEmailWithKey, decryptEmail } from './core';\nimport { UTF8ToUint8, base64ToUint8Array, uint8ArrayToBase64, uint8ToUTF8 } from '../utils';\nimport { InvalidInputEmail, EmailSymmetricDecryptionError, EmailSymmetricEncryptionError } from './errors';\n\n/**\n * Symmetrically encrypts email and subject.\n *\n * @param email - The email and subject to encrypt.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting encrypted email and symmetric key used for encryption\n */\nexport async function encryptEmailAndSubject(\n  email: EmailAndSubject,\n  aux?: Uint8Array,\n): Promise<{\n  encEmail: EmailAndSubjectEncrypted;\n  encryptionKey: Uint8Array;\n}> {\n  if (!email.text || !email.subject) {\n    throw new InvalidInputEmail();\n  }\n  try {\n    const encryptionKey = genSymmetricKey();\n    const encEmail = await encryptEmailAndSubjectWithKey(email, encryptionKey, aux);\n\n    return { encEmail, encryptionKey };\n  } catch (error) {\n    throw new EmailSymmetricEncryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Symmetrically encrypts email and subject with the given key.\n *\n * @param email - The email and subject to encrypt.\n * @param encryptionKey - The symmetric key to encrypt the email.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting encrypted email and symmetric key used for encryption\n */\nexport async function encryptEmailAndSubjectWithKey(\n  email: EmailAndSubject,\n  encryptionKey: Uint8Array,\n  aux?: Uint8Array,\n): Promise<EmailAndSubjectEncrypted> {\n  try {\n    const enc = await encryptEmailWithKey(email, encryptionKey, aux);\n    const subject = UTF8ToUint8(email.subject);\n    const subjectEnc = await encryptSymmetrically(encryptionKey, subject, aux);\n    const encSubject = uint8ArrayToBase64(subjectEnc);\n\n    return { ...enc, encSubject };\n  } catch (error) {\n    throw new EmailSymmetricEncryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Decrypts symmetrically encrypted email and email subject.\n *\n * @param encEmail - The encrypted email and subject to decrypt.\n * @param encryptionKey - The symmetric key to decrypt the email.\n * @param aux - An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The resulting decrypted email and subject\n */\nexport async function decryptEmailAndSubject(\n  encEmail: EmailAndSubjectEncrypted,\n  encryptionKey: Uint8Array,\n  aux?: Uint8Array,\n): Promise<EmailAndSubject> {\n  try {\n    const encSubject = base64ToUint8Array(encEmail.encSubject);\n    const subjectArray = await decryptSymmetrically(encryptionKey, encSubject, aux);\n    const subject = uint8ToUTF8(subjectArray);\n    const email = await decryptEmail(encEmail, encryptionKey, aux);\n\n    return { ...email, subject };\n  } catch (error) {\n    throw new EmailSymmetricDecryptionError(error instanceof Error ? error.message : String(error));\n  }\n}\n","import { RecipientWithPublicKey, EmailAndSubject, EmailAndSubjectEncrypted, HybridEncKey } from '../types';\nimport { encryptKeysHybrid, decryptKeysHybrid } from './core';\nimport { encryptEmailAndSubject, decryptEmailAndSubject } from './coreSubject';\nimport {\n  InvalidInputEmail,\n} from './errors';\n\n/**\n * Encrypts the email and its subject using hybrid encryption for multiple recipients.\n *\n * @param email - The email and subject to encrypt for multiple recipients.\n * @param recipients - The recipients with corresponding public keys.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The set of encrypted keys and encrypted email and subject\n */\nexport async function encryptEmailAndSubjectHybridForMultipleRecipients(\n  email: EmailAndSubject,\n  recipients: RecipientWithPublicKey[],\n  aux?: Uint8Array,\n): Promise<{ encryptedKeys: HybridEncKey[]; encEmail: EmailAndSubjectEncrypted }> {\n    if (!recipients || recipients.length === 0) {\n      throw new InvalidInputEmail();\n    }\n    const { encryptionKey, encEmail } = await encryptEmailAndSubject(email, aux);\n\n    const encryptedKeys = await Promise.all(recipients.map((recipient) => encryptKeysHybrid(encryptionKey, recipient)));\n\n    return { encEmail, encryptedKeys };\n}\n\n/**\n * Decrypts the email and its subject using hybrid encryption.\n *\n * @param encEmail - The encrypted email and subject.\n * @param encryptedKey - The encrypted key for this recipient.\n * @param recipientPrivateHybridKeys - The private key of the recipient.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The decrypted email and subject\n */\nexport async function decryptEmailAndSubjectHybrid(\n  encEmail: EmailAndSubjectEncrypted,\n  encryptedKey: HybridEncKey,\n  recipientPrivateHybridKeys: Uint8Array,\n  aux?: Uint8Array,\n): Promise<EmailAndSubject> {\n    const encryptionKey = await decryptKeysHybrid(encryptedKey, recipientPrivateHybridKeys);\n    return await decryptEmailAndSubject(encEmail, encryptionKey, aux);\n}\n","import { EmailAndSubject, PwdProtectedEmailAndSubject } from '../types';\nimport { passwordProtectKey, removePasswordProtection } from './core';\nimport { encryptEmailAndSubject, decryptEmailAndSubject } from './coreSubject';\nimport {\n  FailedToDecryptEmail,\n  FailedToEncryptEmail,\n  InvalidInputEmail,\n  EmailPasswordOpenError,\n  EmailPasswordProtectError,\n  EmailSymmetricDecryptionError,\n  EmailSymmetricEncryptionError,\n} from './errors';\n\n/**\n * Creates a password-protected email and subject.\n *\n * @param email - The email and subject to password-protect\n * @param password - The secret password shared among recipients\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The password-protected email\n */\nexport async function createPwdProtectedEmailAndSubject(\n  email: EmailAndSubject,\n  password: string,\n  aux?: Uint8Array,\n): Promise<PwdProtectedEmailAndSubject> {\n  try {\n    const { encryptionKey, encEmail } = await encryptEmailAndSubject(email, aux);\n    const encryptedKey = await passwordProtectKey(encryptionKey, password);\n\n    return { encEmail, encryptedKey };\n  } catch (error) {\n    if (error instanceof InvalidInputEmail) throw error;\n    if (error instanceof EmailSymmetricEncryptionError) throw error;\n    if (error instanceof EmailPasswordProtectError) throw error;\n    throw new FailedToEncryptEmail(error instanceof Error ? error.message : String(error));\n  }\n}\n\n/**\n * Opens a password-protected email and subject.\n *\n * @param encryptedEmail - The encrypted email and subject\n * @param password - The secret password shared among recipients.\n * @param aux -  An optional auxilary sting for AEAD (e.g., email ID or timestamp).\n * @returns The decrypted email and subject\n */\nexport async function decryptPwdProtectedEmailAndSubject(\n  encryptedEmail: PwdProtectedEmailAndSubject,\n  password: string,\n  aux?: Uint8Array,\n): Promise<EmailAndSubject> {\n  if (!encryptedEmail?.encEmail || !encryptedEmail?.encryptedKey) {\n    throw new InvalidInputEmail();\n  }\n  try {\n    const encryptionKey = await removePasswordProtection(encryptedEmail.encryptedKey, password);\n    return await decryptEmailAndSubject(encryptedEmail.encEmail, encryptionKey, aux);\n  } catch (error) {\n    if (error instanceof EmailPasswordOpenError) throw error;\n    if (error instanceof EmailSymmetricDecryptionError) throw error;\n    throw new FailedToDecryptEmail(error instanceof Error ? error.message : String(error));\n  }\n}\n","import { genHybridKeys } from '../hybrid-crypto';\nimport { HybridKeyPair } from '../types';\nimport { deriveKeyFromMnemonic } from '../derive-key';\nimport { CONTEXT_DATABASE, CONTEXT_DRAFT } from '../constants';\n\n/**\n * Generates public and private keys for email encryption.\n *\n * @returns The user's private and public keys\n */\nexport async function generateEmailKeys(): Promise<HybridKeyPair> {\n  return genHybridKeys();\n}\n\n/**\n * Derives database encryption key for the given user\n *\n * @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)\n * @returns The symmetric key for protecting database\n */\nexport const deriveDatabaseKey = async (mnemonic: string): Promise<Uint8Array> => {\n  return deriveKeyFromMnemonic(mnemonic, CONTEXT_DATABASE);\n};\n\n/**\n * Derives email draft encryption key for the given user\n *\n * @param mnemonic - The user's mnemonic (machine-generated with secure PRNG)\n * @returns The symmetric key for protecting email drafts\n */\nexport const deriveEmailDraftKey = async (mnemonic: string): Promise<Uint8Array> => {\n  return deriveKeyFromMnemonic(mnemonic, CONTEXT_DRAFT);\n};\n"],"mappings":"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"}