| 1 | # Outlook add-in design |
| 2 | |
| 3 | ## Scope |
| 4 | |
| 5 | The Outlook add-in is a thin wrapper around the same parse / verify / decrypt |
| 6 | pipeline that runs in the public browser inspector. It does not introduce a |
| 7 | second crypto stack, a second container parser, or a second canonicalization. |
| 8 | Where the inspector handles a `.sealed` file dropped onto a web page, the |
| 9 | add-in handles a `.sealed` attachment on an open Outlook message. |
| 10 | |
| 11 | The MVP is read-only: a recipient who receives a sealed attachment by email |
| 12 | can verify the issuer signature, read the manifest, and (optionally) decrypt |
| 13 | the payload using their identity, all inside the Outlook task pane. Sealing |
| 14 | new files from inside Outlook is a follow-up milestone, gated on a separate |
| 15 | identity-key flow. |
| 16 | |
| 17 | ## Architecture |
| 18 | |
| 19 | ``` |
| 20 | Outlook task pane (HTML/JS) |
| 21 | | |
| 22 | +-- Office.js: get current message, enumerate attachments, |
| 23 | | fetch the .sealed attachment as base64. |
| 24 | | |
| 25 | +-- import { parseSealed, verifyManifestSignature, decryptSealed } |
| 26 | | from '/viewer/viewer.js' |
| 27 | +-- import { xchacha20poly1305 } from '/viewer/vendor/...' |
| 28 | +-- import { ml_kem768 } from '/viewer/vendor/...' |
| 29 | | |
| 30 | +-- Render the same kind of summary the inspector shows: |
| 31 | suite, signature status, recipient id, content hash, |
| 32 | decrypt panel for both classic and hybrid suites. |
| 33 | ``` |
| 34 | |
| 35 | The task pane is a static HTML page hosted under the same origin as the |
| 36 | public inspector, so the imports above are relative-path imports against the |
| 37 | already-vendored modules. Nothing is duplicated. |
| 38 | |
| 39 | ## Manifest |
| 40 | |
| 41 | `integrations/outlook/manifest.xml` is an Office add-in 1.1 manifest of type |
| 42 | `MailApp`. It declares: |
| 43 | |
| 44 | - `Hosts`: `Mailbox` |
| 45 | - `Requirements`: `Mailbox >= 1.5` (modern enough for `getAttachmentContentAsync`) |
| 46 | - `Permissions`: `ReadItem` |
| 47 | - A read-mode form with `SourceLocation` pointing to the hosted task pane |
| 48 | URL, currently `https://oversightprotocol.dev/integrations/outlook/taskpane.html` |
| 49 | - A `Rule` that activates the add-in on items that have any attachment |
| 50 | |
| 51 | The `<Id>` GUID is `ee9beb3a-64a6-4656-b3f9-a8d0ad8c409c`. This is the |
| 52 | stable identity of the add-in across versions; do not change it without |
| 53 | also coordinating an AppSource update if the add-in ever ships there. |
| 54 | |
| 55 | ## Hosting |
| 56 | |
| 57 | The task pane HTML, JS, and the existing viewer modules all live on |
| 58 | `gh-pages`, served at `oversightprotocol.dev`. The path layout is: |
| 59 | |
| 60 | - `oversightprotocol.dev/integrations/outlook/` |
| 61 | - `oversightprotocol.dev/integrations/outlook/taskpane.html` |
| 62 | - `oversightprotocol.dev/integrations/outlook/taskpane.js` |
| 63 | - `oversightprotocol.dev/integrations/outlook/manifest.xml` |
| 64 | - `oversightprotocol.dev/viewer/viewer.js` (already deployed) |
| 65 | - `oversightprotocol.dev/viewer/vendor/...` (already deployed) |
| 66 | |
| 67 | Same-origin imports keep the security model simple: the task pane is treated |
| 68 | as one site by the browser, and Office's add-in sandbox enforces the rest. |
| 69 | As of 2026-05-26, the hosted pilot page and manifest URL are live. The next |
| 70 | gate is a real Outlook tenant load-test, not more static hosting work. |
| 71 | |
| 72 | ## Distribution |
| 73 | |
| 74 | For a pilot the manifest is sideloaded: |
| 75 | |
| 76 | - **Hosted pilot page**: |
| 77 | `https://oversightprotocol.dev/integrations/outlook/` |
| 78 | - **Outlook on the web**: `Get Add-ins > My add-ins > Add a custom add-in |
| 79 | from URL/file`, point at the hosted manifest. |
| 80 | - **Outlook desktop**: same dialog from the ribbon. |
| 81 | - **Tenant-wide**: an admin uploads the manifest in the Microsoft 365 admin |
| 82 | centre and assigns it to a user group. |
| 83 | |
| 84 | AppSource publication is out of scope for the MVP. It requires a Partner |
| 85 | Center account, validation submission, and review, none of which is on the |
| 86 | critical path for the first regulated-industry deployment. |
| 87 | |
| 88 | ## Identity model |
| 89 | |
| 90 | The recipient pastes or uploads their `identity.json` into the task pane, |
| 91 | exactly the same shape the public inspector accepts. Hybrid identities |
| 92 | include `mlkem_priv` and `mlkem_pub` alongside `x25519_priv` and |
| 93 | `x25519_pub`. The identity stays in task-pane memory only; nothing is |
| 94 | persisted to Outlook storage and nothing is sent to a server. |
| 95 | |
| 96 | This is deliberately the same UX as the public inspector. Recipients who |
| 97 | have already used the inspector will recognize the flow. |
| 98 | |
| 99 | ## What is intentionally not in the MVP |
| 100 | |
| 101 | - **Sealing from Outlook**: requires an issuer key on the user's machine |
| 102 | and a separate key-management story. Treat as v2. |
| 103 | - **Auto-attribution on leak**: the attribute pipeline runs server-side |
| 104 | against the registry; not appropriate for an end-user task pane. |
| 105 | - **Compose-mode rules**: would let the add-in inject metadata into |
| 106 | outgoing mail. Out of scope until a customer asks. |
| 107 | - **Persistent identity storage**: until a hardware-key path is wired up |
| 108 | (see `docs/HARDWARE_KEYS.md`), persisting private keys in Office storage |
| 109 | is a regression versus the inspector's "memory only" guarantee. |
| 110 | |
| 111 | ## Security caveats |
| 112 | |
| 113 | The add-in inherits the inspector's caveats. In particular: |
| 114 | |
| 115 | - The browser's WebCrypto + the vendored noble libraries are the only |
| 116 | crypto. Office.js is not used for any cryptographic operation. |
| 117 | - The add-in trusts the page's same-origin scripts. Anyone who can ship |
| 118 | a malicious update to the task pane HTML/JS can subvert decryption. |
| 119 | The mitigation is the same as for the public inspector: vendor pinning |
| 120 | with SHA-256 fingerprints in `viewer/vendor/README.md`. |
| 121 | - Outlook's message body and attachment metadata pass through Microsoft's |
| 122 | servers as a normal part of email transport. The sealed bundle is |
| 123 | end-to-end encrypted to the recipient's keys, but envelope metadata |
| 124 | (sender, subject line, attachment filenames) is visible to the email |
| 125 | provider as for any other message. |