{"version":3,"file":"VaultEncryptionService.mjs","names":["VaultEncryptionService","header: VaultHeader","recipientWraps: RecipientWrap[]","cek: Uint8Array","thresholdShares: ThresholdShare[]","share: Uint8Array"],"sources":["../../src/services/VaultEncryptionService.ts"],"sourcesContent":["import { injectable } from '@credo-ts/core'\n\nimport {\n  aesGcmEncrypt,\n  aesGcmDecrypt,\n  argon2id,\n  kemWrapCek,\n  kemUnwrapCek,\n  hkdfJoin,\n  shamirSplit,\n  shamirReconstruct,\n  SecretShare,\n  generateCek,\n  generateNonceAesGcm,\n  generateUuid,\n  randomBytes,\n  keyCommitment,\n  verifyKeyCommitment,\n  canonicalAad,\n  toBase64Url,\n  fromBase64Url,\n} from '../crypto'\nimport type { VaultHeader, RecipientWrap, ThresholdShare, AeadAlgorithm } from '../models'\nimport type { VaultDocument } from '../models/VaultDocument'\nimport { BadSuiteError, DecryptAeadError, DecryptKemError, PolicyError } from '../errors'\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════\n\nexport interface EncryptS3Options {\n  docId?: string\n  vaultId?: string\n  epoch?: number // Epoch (default: 1)\n  memory?: number // Argon2 memory in KiB (default: 65536 = 64MiB)\n  iterations?: number // Argon2 iterations (default: 3)\n  aead?: AeadAlgorithm\n}\n\nexport interface EncryptP1Options {\n  docId?: string\n  vaultId?: string\n}\n\nexport interface RecipientKey {\n  kid: string\n  publicKey: Uint8Array\n}\n\nexport interface DecryptedShare {\n  index: number\n  share: Uint8Array\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Service\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Vault Encryption Service\n *\n * Provides client-side encryption/decryption for all vault policy modes:\n * - S3 suite: Passphrase-based (Argon2id → AES-256-GCM)\n * - P1 suite: Post-quantum (ML-KEM-768 → AES-256-GCM)\n *\n * All encryption and decryption happens client-side per ZK-Vault spec.\n */\n@injectable()\nexport class VaultEncryptionService {\n  // ═══════════════════════════════════════════════════════════════════════\n  // S3 SUITE (PASSPHRASE) - For Local Storage\n  // Spec §4.1: CEK = Argon2id(passphrase, salt, m=64-128MiB, t=2-3)\n  // ═══════════════════════════════════════════════════════════════════════\n\n  /**\n   * Encrypt data with passphrase (S3 suite)\n   * All encryption happens CLIENT-SIDE\n   *\n   * @param plaintext - Data to encrypt\n   * @param passphrase - User passphrase\n   * @param options - Encryption options\n   * @returns Encrypted vault document\n   */\n  public async encryptWithPassphrase(\n    plaintext: Uint8Array,\n    passphrase: string,\n    options: EncryptS3Options = {}\n  ): Promise<VaultDocument> {\n    // 1. Generate salt (32 bytes)\n    const salt = randomBytes(32)\n\n    // 2. Derive CEK via Argon2id (spec §4.1 S1/S3 suite)\n    const argon2Params = {\n      memory: options.memory ?? 65536, // 64 MiB\n      iterations: options.iterations ?? 3,\n      parallelism: 1,\n    }\n\n    const cek = await this.deriveKeyArgon2(passphrase, salt, argon2Params)\n\n    // 3. Generate nonce (12 bytes for AES-GCM)\n    const nonce = generateNonceAesGcm()\n\n    // 4. Build document metadata\n    const docId = options.docId ?? generateUuid()\n    const vaultId = options.vaultId ?? docId\n    const epoch = options.epoch ?? 1\n\n    // 5. Build AAD (spec §5.3)\n    const aadFields = {\n      v: 1,\n      suite: 'S3',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      policy: { mode: 'passphrase' as const },\n    }\n    const aad = canonicalAad(aadFields)\n\n    // 6. Encrypt (spec §9.1 step 3)\n    const encResult = aesGcmEncrypt(cek, nonce, plaintext, aad)\n    const ciphertext = encResult.ciphertext\n\n    // 7. Compute key commitment (spec §5.1)\n    const kcmp = keyCommitment(cek)\n\n    // 8. Build header\n    const header: VaultHeader = {\n      v: 1,\n      suite: 'S3',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      nonce: toBase64Url(nonce),\n      kcmp: toBase64Url(kcmp),\n      salt: toBase64Url(salt),\n      argon2: argon2Params,\n      policy: { mode: 'passphrase' },\n    }\n\n    // 9. Zero out CEK from memory (security best practice)\n    this.zeroize(cek)\n\n    return { header, ciphertext }\n  }\n\n  /**\n   * Decrypt passphrase-protected vault (S3 suite)\n   * All decryption happens CLIENT-SIDE\n   *\n   * @param vault - Encrypted vault document\n   * @param passphrase - User passphrase\n   * @returns Decrypted plaintext\n   */\n  public async decryptWithPassphrase(vault: VaultDocument, passphrase: string): Promise<Uint8Array> {\n    const { header, ciphertext } = vault\n\n    // 1. Validate suite\n    if (header.suite !== 'S3' && header.suite !== 'S1') {\n      throw new BadSuiteError(`Expected S1/S3 suite for passphrase vault, got ${header.suite}`)\n    }\n\n    if (!header.salt || !header.argon2) {\n      throw new PolicyError('Missing salt or argon2 params for passphrase vault')\n    }\n\n    // 2. Derive CEK from passphrase\n    const salt = fromBase64Url(header.salt)\n    const cek = await this.deriveKeyArgon2(passphrase, salt, header.argon2)\n\n    // 3. Verify key commitment (spec §9.2 step 3)\n    const expectedKcmp = fromBase64Url(header.kcmp)\n    if (!verifyKeyCommitment(cek, expectedKcmp)) {\n      this.zeroize(cek)\n      throw new DecryptAeadError('Key commitment verification failed - wrong passphrase')\n    }\n\n    // 4. Rebuild AAD\n    const aad = canonicalAad({\n      v: header.v,\n      suite: header.suite,\n      aead: header.aead,\n      docId: header.docId,\n      vaultId: header.vaultId,\n      epoch: header.epoch,\n      policy: header.policy,\n    })\n\n    // 5. Decrypt\n    const nonce = fromBase64Url(header.nonce)\n    try {\n      const plaintext = aesGcmDecrypt(cek, nonce, ciphertext, aad)\n      this.zeroize(cek)\n      return plaintext\n    } catch (e) {\n      this.zeroize(cek)\n      throw new DecryptAeadError('AEAD decryption failed - data may be corrupted or tampered')\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════\n  // P1 SUITE (POST-QUANTUM) - For Multi-Party Sharing\n  // Spec §4.1: KEM = ML-KEM-768, AEAD = AES-256-GCM\n  // ═══════════════════════════════════════════════════════════════════════\n\n  /**\n   * Encrypt with any-of policy (spec §6.1)\n   * Each recipient gets their own KEM-wrapped CEK\n   *\n   * @param plaintext - Data to encrypt\n   * @param recipients - Array of recipient public keys\n   * @param options - Encryption options\n   * @returns Encrypted vault document\n   */\n  public async encryptAnyOf(\n    plaintext: Uint8Array,\n    recipients: RecipientKey[],\n    options: EncryptP1Options = {}\n  ): Promise<VaultDocument> {\n    if (recipients.length === 0) {\n      throw new PolicyError('At least one recipient required for any-of policy')\n    }\n\n    // 1. Generate random CEK\n    const cek = generateCek()\n    const nonce = generateNonceAesGcm()\n    const docId = options.docId ?? generateUuid()\n    const vaultId = options.vaultId ?? docId\n    const epoch = 1\n\n    // 2. Build AAD\n    const aad = canonicalAad({\n      v: 1,\n      suite: 'P1',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      policy: { mode: 'any-of' },\n    })\n\n    // 3. Encrypt plaintext\n    const encResult = aesGcmEncrypt(cek, nonce, plaintext, aad)\n    const ciphertext = encResult.ciphertext\n\n    // 4. KEM-wrap CEK for each recipient (spec §6.1)\n    const recipientWraps: RecipientWrap[] = recipients.map((r) => ({\n      kid: r.kid,\n      kem: 'ML-KEM-768',\n      ct: toBase64Url(kemWrapCek(cek, r.publicKey)),\n    }))\n\n    // 5. Key commitment\n    const kcmp = keyCommitment(cek)\n\n    // 6. Build header\n    const header: VaultHeader = {\n      v: 1,\n      suite: 'P1',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      nonce: toBase64Url(nonce),\n      kcmp: toBase64Url(kcmp),\n      policy: { mode: 'any-of' },\n      recipients: recipientWraps,\n    }\n\n    this.zeroize(cek)\n    return { header, ciphertext }\n  }\n\n  /**\n   * Decrypt any-of vault (spec §9.2)\n   * Try the specified recipient's wrap\n   *\n   * @param vault - Encrypted vault document\n   * @param recipientSecretKey - Recipient's ML-KEM secret key\n   * @param recipientKid - Recipient's key identifier\n   * @returns Decrypted plaintext\n   */\n  public async decryptAnyOf(\n    vault: VaultDocument,\n    recipientSecretKey: Uint8Array,\n    recipientKid: string\n  ): Promise<Uint8Array> {\n    const { header, ciphertext } = vault\n\n    if (header.policy?.mode !== 'any-of' || !header.recipients) {\n      throw new PolicyError('Not an any-of policy vault')\n    }\n\n    // Find matching recipient\n    const recipient = header.recipients.find((r) => r.kid === recipientKid)\n    if (!recipient) {\n      throw new DecryptKemError(`No recipient wrap found for kid: ${recipientKid}`)\n    }\n\n    // Unwrap CEK\n    const wrappedCek = fromBase64Url(recipient.ct)\n    let cek: Uint8Array\n    try {\n      cek = kemUnwrapCek(wrappedCek, recipientSecretKey)\n    } catch (e) {\n      throw new DecryptKemError('Failed to unwrap CEK - invalid key or corrupted wrap')\n    }\n\n    // Verify key commitment\n    if (!verifyKeyCommitment(cek, fromBase64Url(header.kcmp))) {\n      this.zeroize(cek)\n      throw new DecryptAeadError('Key commitment verification failed')\n    }\n\n    // Decrypt\n    const aad = canonicalAad({\n      v: header.v,\n      suite: header.suite,\n      aead: header.aead,\n      docId: header.docId,\n      vaultId: header.vaultId,\n      epoch: header.epoch,\n      policy: header.policy,\n    })\n\n    const nonce = fromBase64Url(header.nonce)\n    try {\n      const plaintext = aesGcmDecrypt(cek, nonce, ciphertext, aad)\n      this.zeroize(cek)\n      return plaintext\n    } catch (e) {\n      this.zeroize(cek)\n      throw new DecryptAeadError('AEAD decryption failed')\n    }\n  }\n\n  /**\n   * Encrypt with all-of policy (spec §6.2)\n   * Requires ALL listed keys to decrypt via HKDF-join\n   *\n   * @param plaintext - Data to encrypt\n   * @param participants - Array of participant public keys\n   * @param options - Encryption options\n   * @returns Encrypted vault document\n   */\n  public async encryptAllOf(\n    plaintext: Uint8Array,\n    participants: RecipientKey[],\n    options: EncryptP1Options = {}\n  ): Promise<VaultDocument> {\n    if (participants.length < 2) {\n      throw new PolicyError('At least 2 participants required for all-of policy')\n    }\n\n    // 1. Generate random CEK\n    const cek = generateCek()\n    const nonce = generateNonceAesGcm()\n    const wrapNonce = generateNonceAesGcm()\n    const docId = options.docId ?? generateUuid()\n    const vaultId = options.vaultId ?? docId\n    const epoch = 1\n\n    // 2. Derive joint wrap key via HKDF-join (spec §6.2)\n    const keyMaterials = participants.map((p) => ({\n      kid: p.kid,\n      key: p.publicKey,\n    }))\n    const context = `wrap:doc:${docId}:epoch:${epoch}`\n    const wrapKey = hkdfJoin(keyMaterials, context)\n\n    // 3. Wrap CEK under joint key\n    const wrappedCekResult = aesGcmEncrypt(wrapKey, wrapNonce, cek, new Uint8Array(0))\n\n    // 4. Build AAD and encrypt plaintext\n    const aad = canonicalAad({\n      v: 1,\n      suite: 'P1',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      policy: { mode: 'all-of' },\n    })\n\n    const encResult = aesGcmEncrypt(cek, nonce, plaintext, aad)\n    const ciphertext = encResult.ciphertext\n\n    // 5. Build header\n    const header: VaultHeader = {\n      v: 1,\n      suite: 'P1',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      nonce: toBase64Url(nonce),\n      kcmp: toBase64Url(keyCommitment(cek)),\n      policy: { mode: 'all-of' },\n      wrap_all: {\n        alg: 'HKDF-join',\n        kids: participants.map((p) => p.kid),\n        ct: toBase64Url(wrappedCekResult.ciphertext),\n      },\n    }\n\n    this.zeroize(cek)\n    this.zeroize(wrapKey)\n    return { header, ciphertext }\n  }\n\n  /**\n   * Encrypt with threshold policy (spec §6.3)\n   * Any t-of-n participants can decrypt\n   *\n   * @param plaintext - Data to encrypt\n   * @param threshold - Minimum shares required (t)\n   * @param participants - Array of participant public keys (n)\n   * @param options - Encryption options\n   * @returns Encrypted vault document\n   */\n  public async encryptThreshold(\n    plaintext: Uint8Array,\n    threshold: number,\n    participants: RecipientKey[],\n    options: EncryptP1Options = {}\n  ): Promise<VaultDocument> {\n    const n = participants.length\n    if (threshold < 1 || threshold > n) {\n      throw new PolicyError(`Invalid threshold: ${threshold} of ${n}`)\n    }\n\n    // 1. Generate CEK\n    const cek = generateCek()\n    const nonce = generateNonceAesGcm()\n    const docId = options.docId ?? generateUuid()\n    const vaultId = options.vaultId ?? docId\n    const epoch = 1\n\n    // 2. Split CEK using Shamir (spec §6.3)\n    const shares = shamirSplit(cek, threshold, n)\n\n    // 3. KEM-wrap each share for its participant\n    // shares[i] is a SecretShare object with .identifier and .value properties\n    const thresholdShares: ThresholdShare[] = participants.map((p, i) => ({\n      kid: p.kid,\n      enc_share: {\n        kem: 'ML-KEM-768',\n        ct: toBase64Url(kemWrapCek(shares[i].value, p.publicKey)),\n      },\n    }))\n\n    // 4. Encrypt plaintext\n    const aad = canonicalAad({\n      v: 1,\n      suite: 'P1',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      policy: { mode: 'threshold', t: threshold, n },\n    })\n\n    const encResult = aesGcmEncrypt(cek, nonce, plaintext, aad)\n    const ciphertext = encResult.ciphertext\n\n    // 5. Build header\n    const header: VaultHeader = {\n      v: 1,\n      suite: 'P1',\n      aead: 'AES-256-GCM',\n      docId,\n      vaultId,\n      epoch,\n      nonce: toBase64Url(nonce),\n      kcmp: toBase64Url(keyCommitment(cek)),\n      policy: { mode: 'threshold', t: threshold, n },\n      shares: thresholdShares,\n    }\n\n    this.zeroize(cek)\n    // Note: shares from shamirSplit are SecretShare objects, not raw Uint8Arrays\n    // Their internal data is already handled by the WASM module\n\n    return { header, ciphertext }\n  }\n\n  /**\n   * Decrypt threshold vault with collected shares\n   *\n   * @param vault - Encrypted vault document\n   * @param decryptedShares - Array of decrypted shares (at least t shares)\n   * @returns Decrypted plaintext\n   */\n  public async decryptThreshold(vault: VaultDocument, decryptedShares: DecryptedShare[]): Promise<Uint8Array> {\n    const { header, ciphertext } = vault\n\n    if (header.policy?.mode !== 'threshold') {\n      throw new PolicyError('Not a threshold policy vault')\n    }\n\n    const threshold = header.policy.t ?? 1\n    if (decryptedShares.length < threshold) {\n      throw new PolicyError(`Need ${threshold} shares, got ${decryptedShares.length}`)\n    }\n\n    // Reconstruct CEK from shares\n    // Convert DecryptedShare to SecretShare objects expected by WASM\n    const shareObjects = decryptedShares.map((s) => {\n      // SecretShare.fromJson expects {identifier, value} format\n      const json = JSON.stringify({\n        identifier: s.index,\n        value: Array.from(s.share),\n      })\n      return SecretShare.fromJson(json)\n    })\n    const cek = shamirReconstruct(shareObjects)\n\n    // Verify key commitment\n    if (!verifyKeyCommitment(cek, fromBase64Url(header.kcmp))) {\n      this.zeroize(cek)\n      throw new DecryptAeadError('Key commitment verification failed')\n    }\n\n    // Decrypt\n    const aad = canonicalAad({\n      v: header.v,\n      suite: header.suite,\n      aead: header.aead,\n      docId: header.docId,\n      vaultId: header.vaultId,\n      epoch: header.epoch,\n      policy: header.policy,\n    })\n\n    const nonce = fromBase64Url(header.nonce)\n    try {\n      const plaintext = aesGcmDecrypt(cek, nonce, ciphertext, aad)\n      this.zeroize(cek)\n      return plaintext\n    } catch (e) {\n      this.zeroize(cek)\n      throw new DecryptAeadError('AEAD decryption failed')\n    }\n  }\n\n  /**\n   * Unwrap a single threshold share for a participant\n   *\n   * @param vault - Encrypted vault document\n   * @param participantSecretKey - Participant's ML-KEM secret key\n   * @param participantKid - Participant's key identifier\n   * @returns Decrypted share with its index\n   */\n  public async unwrapThresholdShare(\n    vault: VaultDocument,\n    participantSecretKey: Uint8Array,\n    participantKid: string\n  ): Promise<DecryptedShare> {\n    const { header } = vault\n\n    if (header.policy?.mode !== 'threshold' || !header.shares) {\n      throw new PolicyError('Not a threshold policy vault')\n    }\n\n    // Find the participant's share\n    const shareIndex = header.shares.findIndex((s) => s.kid === participantKid)\n    if (shareIndex === -1) {\n      throw new DecryptKemError(`No share found for kid: ${participantKid}`)\n    }\n\n    const shareEntry = header.shares[shareIndex]\n    const wrappedShare = fromBase64Url(shareEntry.enc_share.ct)\n\n    // Unwrap the share\n    let share: Uint8Array\n    try {\n      share = kemUnwrapCek(wrappedShare, participantSecretKey)\n    } catch (e) {\n      throw new DecryptKemError('Failed to unwrap share - invalid key')\n    }\n\n    // Return with 1-based index (Shamir convention)\n    return {\n      index: shareIndex + 1,\n      share,\n    }\n  }\n\n  // ═══════════════════════════════════════════════════════════════════════\n  // HELPER METHODS\n  // ═══════════════════════════════════════════════════════════════════════\n\n  /**\n   * Derive key from passphrase using Argon2id\n   * Spec §4.1 S1/S3 suite\n   */\n  private async deriveKeyArgon2(\n    passphrase: string,\n    salt: Uint8Array,\n    params: { memory: number; iterations: number; parallelism: number }\n  ): Promise<Uint8Array> {\n    const hash = await argon2id({\n      password: passphrase,\n      salt,\n      parallelism: params.parallelism,\n      iterations: params.iterations,\n      memorySize: params.memory,\n      hashLength: 32,\n      outputType: 'binary',\n    })\n    return new Uint8Array(hash)\n  }\n\n  /**\n   * Zero out sensitive data from memory\n   * Security best practice to minimize exposure window\n   */\n  private zeroize(data: Uint8Array): void {\n    data.fill(0)\n  }\n}\n"],"mappings":"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"}