{
  "version": 2,
  "about": "Test vectors for Mailcycle's encryption. Every implementation of the scheme must produce these values and open these boxes. Generated by generate.ts from the app's own crypto; see README.md.",
  "parameters": {
    "seed": {
      "kdf": "PBKDF2-HMAC-SHA256",
      "iterations": 120000,
      "saltPrefix": "mailcycle-seed",
      "outputBytes": 64
    },
    "subkey": {
      "mac": "HMAC-SHA256",
      "labelPrefix": "mailcycle/v1/",
      "secondBlockSuffix": "/2"
    },
    "subkeyV2": {
      "kdf": "HKDF-Expand-SHA256 (RFC 5869), the key as the PRK",
      "infoPrefix": "mailcycle/v2/"
    },
    "epochs": {
      "0": "inbox/<id> and inbox-sealing/<id> under subkey",
      "n": "inbox/<id>/<n> and inbox-sealing/<id>/<n> under subkeyV2"
    },
    "symmetric": {
      "cipher": "ChaCha20",
      "mac": "HMAC-SHA256",
      "order": "encrypt-then-MAC",
      "nonceBytes": 12,
      "macInput": {
        "1": "nonce | ciphertext | additional data",
        "2": "nonce | ciphertext | additional data | length of the additional data (8 bytes, big-endian)"
      },
      "writtenVersion": 2
    },
    "sealed": {
      "exchange": "X25519",
      "kdf": "HMAC-SHA256 over the shared secret and both public keys"
    },
    "attachment": {
      "magic": {
        "1": "MCA1",
        "2": "MCA2"
      },
      "layout": "magic(4) | ephemeral public key(32) | nonce(12) | tag(32) | ciphertext"
    },
    "webhook": {
      "signature": "HMAC-SHA256 hex over \"<unix seconds>.<body>\"",
      "header": "Mailcycle-Signature"
    },
    "encoding": "base64url without padding, everywhere"
  },
  "accounts": [
    {
      "phrase": "pumpkin foster between doctor orient spider cloth evil host drink popular diamond",
      "seed": "i8uP_RHpr9jszd0xaZyT3vnaDVvGxRNzMfwNnEIWqzps170UarGhzFQfdyy5CWkqfJXYcbTuNmo48LFdtW6BVg",
      "accountId": "acct_850e7d729611c5c196bea1bbf07b3bf2",
      "authSecret": "jjDPo7m0br_DEMDiriCt5qL-D2mZlOO-KmkKdTwhmTQ",
      "authVerifier": "_Q5kmmrXpFdvheMPtPElmBt6UpCto1LflGturCOKR68",
      "authPrivateKey": "oBfyAccWP5PqJ4tuzRnJD_ZPWbQNcfzgFciq5QrExgU",
      "authPublicKey": "xaovxksgXOfF2NNHKafDFwjPJEEizTB70ymgQ05Laiw",
      "vaultKey": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g"
    },
    {
      "phrase": "elbow frame nose horn mercy canoe decide exact blush hedgehog night loop",
      "seed": "shJgCihnPcx28oyNedp8VtpdZk90XhX0lQQ8_chRkdmLvptkl1JcxnSjk4e-hD0UBJphSoTRutl60vZkDzEttQ",
      "accountId": "acct_aac53a49fa7ba669451f684e86af731d",
      "authSecret": "_67MA9_LLY2EkzJ9CXpWur5Q8rnPQpK6LhgHccgERYI",
      "authVerifier": "5nOnX0ZUPhwgwYvtGjZmRMyl_1Elu1puiEseRid1X04",
      "authPrivateKey": "AIAs05Tddk-kPcWgO81NB0Kf6ovMc9ye674jzrIQfZU",
      "authPublicKey": "mGpybmWhNQJjz9i6p4i38C29ucvYgCVrUs4EjQsqZDg",
      "vaultKey": "Igjhtj78XBr437tURAmv633mEivKFKFfXksGRC3ITqbwbEraYSG7a6AeUElz9ECH9svMPhfJ-G8o9xwnyWer8w"
    },
    {
      "phrase": "beyond end scatter first girl young myth window visual toe grace gate",
      "seed": "GX5jmBMSY16wjhK1bEVLjJrxDG2x_lCwzqIcW-9DTaG5ryihS8arJ9hHtuqtcX3ggeMPxw4Dl5MIsbPim1qioA",
      "accountId": "acct_263a562fbbedcf61ec24cba3b95e8b92",
      "authSecret": "tnXAUxibUImlbF5ifV7mkY6QjY8esR6uKJXbaqXZZOo",
      "authVerifier": "lHU6u-l_A2DLWfTjbdY68aHMDIaNkN3rONNrFJuoCN0",
      "authPrivateKey": "h2_0IqHudwrxDEWYa-nIHZPuLV91Q8aNedfahn00X6E",
      "authPublicKey": "vkCsAA7Q-X3aYemaSc8wjFjFIIaBCjl35W8iw5hcIRQ",
      "vaultKey": "i2EBWIBpUOBf6uxD4U0QcrdedPQPDwS___UYhPx00n3l5gQ78Bl1VgzRNQ8IU63oo-Hc52b0o9CETowu-gh65g"
    }
  ],
  "subkeys": [
    {
      "seed": "i8uP_RHpr9jszd0xaZyT3vnaDVvGxRNzMfwNnEIWqzps170UarGhzFQfdyy5CWkqfJXYcbTuNmo48LFdtW6BVg",
      "label": "account-id",
      "length": 16,
      "out": "hQ59cpYRxcGWvqG78Hs78g"
    },
    {
      "seed": "i8uP_RHpr9jszd0xaZyT3vnaDVvGxRNzMfwNnEIWqzps170UarGhzFQfdyy5CWkqfJXYcbTuNmo48LFdtW6BVg",
      "label": "vault",
      "length": 64,
      "out": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g"
    },
    {
      "seed": "i8uP_RHpr9jszd0xaZyT3vnaDVvGxRNzMfwNnEIWqzps170UarGhzFQfdyy5CWkqfJXYcbTuNmo48LFdtW6BVg",
      "label": "inbox/ibx_k3v9x2mq7a",
      "length": 64,
      "out": "-topZJdrK9HifdnW0QHutL0n1Un-Cl68A-Jbdnm_hbpoZzo6WgXppX7V9zaUHl-Xk5WOUQMzZppee18sy9gwXg"
    }
  ],
  "subkeysV2": [
    {
      "key": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g",
      "label": "inbox/ibx_k3v9x2mq7a/1",
      "length": 64,
      "out": "dvlGheQ9XSPNTiNLPO_hBuWqq7toxgizWNuSGPD6c-LxQ87ofMZyfLSFxm5Q5ThJcv25chMHhim7vsDo3tBOuQ"
    },
    {
      "key": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g",
      "label": "inbox/ibx_k3v9x2mq7a/2",
      "length": 64,
      "out": "Gt-jxAODZfak6HfSkVUhMOQjlolZq3AFaIBpdpCCxJ_3bIEjdphmrXQ8AkkiFJb0cdzDQfTChDuWsFiTF-pRSw"
    },
    {
      "key": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g",
      "label": "inbox-sealing/ibx_k3v9x2mq7a/1",
      "length": 32,
      "out": "xnnItzs5AAJTQwnwXMXJZ78C3s6YEdhDLzWu6y4127k"
    },
    {
      "key": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g",
      "label": "three-blocks",
      "length": 80,
      "out": "QEambfeBHcXiFszUjMYLpHUjq2NGmegkoa40xfwUWU9gUnoNExWZs49rBtarEtzBYhuoSl1E8xmWWT7ZMzirH3vtP-ah9fosMwgdZJcpEDg"
    }
  ],
  "addresses": [
    {
      "inboxId": "ibx_k3v9x2mq7a",
      "inboxKey": "IEXXrre6n-mxeNYKtlo8iPV6-HjTctgjGJzK4oFzUbd9O7Lq0nibJu64iwoOrRxfDlz4EAgIKotGiekKUpOmig",
      "sealingPrivateKey": "CdFWhemQoTdUTAcfEQK_P-b8OHYfAcL6gJKXriz_DM8",
      "sealingPublicKey": "S3sOyhmEkXzgl4H-S9uEtIMDe2v4adWW0fcE34JfU2c"
    },
    {
      "inboxId": "ibx_0000000001",
      "inboxKey": "VGgmZNYYjEncGStipJbwP10aYgfdh8hElqdg0jeOaqX3lyYfVdMwqn53byQEA8Yu1XtEzO_qoGMl9jR4t34k0A",
      "sealingPrivateKey": "C_FQdMJm-mI49ZiK93ZmUduic_f0tZSVbCIrX5egSCQ",
      "sealingPublicKey": "_cPe89HVYv6RFc33nQ8613m_WrK1yToM9uo0grl2U30"
    }
  ],
  "epochs": [
    {
      "inboxId": "ibx_k3v9x2mq7a",
      "epoch": 0,
      "inboxKey": "IEXXrre6n-mxeNYKtlo8iPV6-HjTctgjGJzK4oFzUbd9O7Lq0nibJu64iwoOrRxfDlz4EAgIKotGiekKUpOmig",
      "sealingPrivateKey": "CdFWhemQoTdUTAcfEQK_P-b8OHYfAcL6gJKXriz_DM8",
      "sealingPublicKey": "S3sOyhmEkXzgl4H-S9uEtIMDe2v4adWW0fcE34JfU2c"
    },
    {
      "inboxId": "ibx_k3v9x2mq7a",
      "epoch": 1,
      "inboxKey": "dvlGheQ9XSPNTiNLPO_hBuWqq7toxgizWNuSGPD6c-LxQ87ofMZyfLSFxm5Q5ThJcv25chMHhim7vsDo3tBOuQ",
      "sealingPrivateKey": "xnnItzs5AAJTQwnwXMXJZ78C3s6YEdhDLzWu6y4127k",
      "sealingPublicKey": "Ht5R-VvI0Kyhj4J3z9sSUjYc5O1v0Ksf0T75lvDPU1E"
    },
    {
      "inboxId": "ibx_k3v9x2mq7a",
      "epoch": 2,
      "inboxKey": "Gt-jxAODZfak6HfSkVUhMOQjlolZq3AFaIBpdpCCxJ_3bIEjdphmrXQ8AkkiFJb0cdzDQfTChDuWsFiTF-pRSw",
      "sealingPrivateKey": "5-hK8fg_XnS-DBrVOX-rEFpIxoHEwuT_hlKidviUdVQ",
      "sealingPublicKey": "rGhcTC2NRdOvvhBaYMoveg-fPDPp5d5kWHWwi-B8OW8"
    }
  ],
  "symmetricBoxes": [
    {
      "what": "an address label, bound to the address id",
      "key": "IEXXrre6n-mxeNYKtlo8iPV6-HjTctgjGJzK4oFzUbd9O7Lq0nibJu64iwoOrRxfDlz4EAgIKotGiekKUpOmig",
      "aad": "ibx_k3v9x2mq7a",
      "plaintextJson": {
        "label": "Sign-in codes"
      },
      "box": {
        "v": 1,
        "n": "4DuxtqjPvoNHIoX2",
        "c": "KiflPuc92rYzdanEYUopajWq0_1KlPu20Q",
        "t": "4p2CG8Mwio6BEJqFqgVVXeEM-rAytLCKKqs1nG589wQ"
      }
    },
    {
      "what": "raw bytes under a vault key, with no additional data",
      "key": "-FapPyEAVTEaybzCvkWMiTiph1GpYF1yfp94-80oyZ0XgwOrCmRJpONpucbAw1F4k6Ju3SO4G4RC3Z4J27rH6g",
      "aad": "",
      "plaintextUtf8": "the quick brown fox",
      "box": {
        "v": 1,
        "n": "exDO3HfbAPr3CEHl",
        "c": "bihwwxlm0VUuT851PXFfFhN1pg",
        "t": "NpjGd0M3U5ujOGGq-O4nDcsISfRvLsAUrhsEI81RT9U"
      }
    },
    {
      "what": "an address label, bound to the address id, version 2",
      "key": "IEXXrre6n-mxeNYKtlo8iPV6-HjTctgjGJzK4oFzUbd9O7Lq0nibJu64iwoOrRxfDlz4EAgIKotGiekKUpOmig",
      "aad": "ibx_k3v9x2mq7a",
      "plaintextJson": {
        "label": "Sign-in codes"
      },
      "box": {
        "v": 2,
        "n": "rDQhVjdAUAonAVZ8",
        "c": "gMvcQk2BMlyuP9eEwLEtgu5uRi_9vcg19w",
        "t": "svw6P1epVIrkJ0_F4tEC7m9P1mcZcVdcmJGeoxzPWs4"
      }
    }
  ],
  "sealedBoxes": [
    {
      "what": "mail sealed to an address, bound to the address and message ids",
      "recipientPublicKey": "S3sOyhmEkXzgl4H-S9uEtIMDe2v4adWW0fcE34JfU2c",
      "recipientPrivateKey": "CdFWhemQoTdUTAcfEQK_P-b8OHYfAcL6gJKXriz_DM8",
      "aad": "ibx_k3v9x2mq7a:msg_91be02c4a7d1",
      "plaintextUtf8": "{\"subject\":\"Hello\",\"from\":\"sender@example.com\",\"text\":\"Hi\"}",
      "box": {
        "v": 1,
        "epk": "cZ_NM7BZlmRD3OGQTGicbuHrstoE3sZ33a54a7e1PGA",
        "n": "FKER2HuBOfCk_Tt2",
        "c": "LSpwCX2Rb2C35C3UWufOzxp_bYYUBzqwJmG1K7ZVroSk2OftYdLhPC54Be4sP4z9yWd4LSLs39tlwco",
        "t": "x2YtX1AhbZQESyLfFYXYJhzRHL8revB0fBLlhr1WxGY"
      }
    },
    {
      "what": "mail sealed to an address, version 2",
      "recipientPublicKey": "S3sOyhmEkXzgl4H-S9uEtIMDe2v4adWW0fcE34JfU2c",
      "recipientPrivateKey": "CdFWhemQoTdUTAcfEQK_P-b8OHYfAcL6gJKXriz_DM8",
      "aad": "ibx_k3v9x2mq7a:msg_91be02c4a7d1",
      "plaintextUtf8": "{\"subject\":\"Hello\",\"from\":\"sender@example.com\",\"text\":\"Hi\"}",
      "box": {
        "v": 2,
        "epk": "cZ_NM7BZlmRD3OGQTGicbuHrstoE3sZ33a54a7e1PGA",
        "n": "FKER2HuBOfCk_Tt2",
        "c": "LSpwCX2Rb2C35C3UWufOzxp_bYYUBzqwJmG1K7ZVroSk2OftYdLhPC54Be4sP4z9yWd4LSLs39tlwco",
        "t": "t7tFAzXaxP_OMzUXysshdYMRyFigMjstHmPJWqjG_UY"
      }
    }
  ],
  "attachments": [
    {
      "what": "an attachment body, bound to the address id and the object key",
      "inboxId": "ibx_k3v9x2mq7a",
      "objectKey": "ibx_k3v9x2mq7a/msg_91be02c4a7d1/0",
      "recipientPublicKey": "S3sOyhmEkXzgl4H-S9uEtIMDe2v4adWW0fcE34JfU2c",
      "recipientPrivateKey": "CdFWhemQoTdUTAcfEQK_P-b8OHYfAcL6gJKXriz_DM8",
      "plaintextUtf8": "attachment bytes, sealed",
      "bytes": "TUNBMZr19iPWuEX-VWt0OgWtjlYqMLXw5jQcn7CkdHZ6cHxdeufoG5TtTlb-xtqpk1TXRwCE4p0xOID_DUqsd4AHa4KgUItBbXCCL_k2h0MF8ddY3x4CSN-_gplpOkoYT3fnWUij5Cc"
    },
    {
      "what": "an attachment body, version 2, in the MCA2 layout",
      "inboxId": "ibx_k3v9x2mq7a",
      "objectKey": "ibx_k3v9x2mq7a/msg_91be02c4a7d1/0",
      "recipientPublicKey": "S3sOyhmEkXzgl4H-S9uEtIMDe2v4adWW0fcE34JfU2c",
      "recipientPrivateKey": "CdFWhemQoTdUTAcfEQK_P-b8OHYfAcL6gJKXriz_DM8",
      "plaintextUtf8": "attachment bytes, sealed",
      "bytes": "TUNBMpr19iPWuEX-VWt0OgWtjlYqMLXw5jQcn7CkdHZ6cHxdeufoG5TtTlb-xtqpsIRPgeXFre_8hKcLkfKmJZDYjvKroNKVITwuLYHVywAF8ddY3x4CSN-_gplpOkoYT3fnWUij5Cc"
    }
  ],
  "authProofs": [
    {
      "what": "the proof an account returns for one challenge",
      "accountPrivateKey": "oBfyAccWP5PqJ4tuzRnJD_ZPWbQNcfzgFciq5QrExgU",
      "accountId": "acct_850e7d729611c5c196bea1bbf07b3bf2",
      "challengePublicKey": "JleqBhlahXGY0Qk9bjaJnzpheNT4--uNxv-892gckzw",
      "nonce": "nonce-for-the-vectors",
      "proof": "nQved1O5ol-TnzsQh-iaBew-Q8tWVX4xEE5vrCz_an4"
    }
  ],
  "webhookSignatures": [
    {
      "what": "a webhook delivery signature",
      "secret": "whsec_vectors0000000000000000000000000000",
      "timestamp": 1789700000,
      "body": "{\"id\":\"evt_4k2m9x7q1b8c3v6n0z5a\",\"type\":\"message.received\",\"createdAt\":\"2026-09-19T09:14:03.000Z\",\"payload\":{\"messageId\":\"msg_91be02c4a7d1\",\"inboxId\":\"ibx_k3v9x2mq7a\"}}",
      "header": "t=1789700000,v1=1a686e9b45e338d31e341cdf573b9c1f260cadeeebf28139bd153c100cb007e7"
    }
  ],
  "phrases": {
    "valid": [
      {
        "phrase": "pumpkin foster between doctor orient spider cloth evil host drink popular diamond",
        "problem": null
      },
      {
        "phrase": "elbow frame nose horn mercy canoe decide exact blush hedgehog night loop",
        "problem": null
      },
      {
        "phrase": "beyond end scatter first girl young myth window visual toe grace gate",
        "problem": null
      }
    ],
    "invalid": [
      {
        "phrase": "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon",
        "problem": {
          "kind": "unknown_word",
          "word": "abandon",
          "index": 0
        }
      },
      {
        "phrase": "pumpkin foster between doctor orient spider cloth evil host drink popular",
        "problem": {
          "kind": "length",
          "count": 11
        }
      },
      {
        "phrase": "not even words here",
        "problem": {
          "kind": "length",
          "count": 4
        }
      }
    ]
  }
}
