Zion Boggan
repos/Oversight/docs/OUTLOOK.md
zionboggan.com ↗
125 lines · markdown
History for this file →
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.