Add passkey operations to security diagram

This commit is contained in:
Leendert de Borst committed 2025-11-01 17:52:49 +01:00
1 parent a5025d3262
commit 8c40c786f7
6 files changed
+156 -201

No files matched your search

File diff suppressed because one or more lines are too long.

Before

Width:  |  Height:  |  Size: 1024 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

File diff suppressed because one or more lines are too long.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1014 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 100 KiB

@@ -1,6 +1,6 @@
<mxfile host="65bd71144e">
<diagram name="Page-1" id="ykhTdbPCDOXpVAqZYsCj">
<mxGraphModel dx="1091" dy="716" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
<mxGraphModel dx="1589" dy="716" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
@@ -36,10 +36,10 @@
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-15" value="AliasVault Client (Web / Browser / Mobile)" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="40" y="52" width="1340" height="470" as="geometry"/>
<mxGeometry x="40" y="30" width="1390" height="492" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-63" value="Vault operations" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="526.84" y="82" width="160" height="320" as="geometry"/>
<mxGeometry x="490.00000000000006" y="82" width="160" height="320" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-32" value="AliasVault Server (REST API)" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="40" y="652" width="1340" height="390" as="geometry"/>
@@ -98,33 +98,33 @@
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-27" value="AES256-GCM" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="554" y="222" width="110" height="40" as="geometry"/>
<mxGeometry x="517.16" y="222" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-26" value="SRP client" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="164" y="453" width="110" height="40" as="geometry"/>
<mxGeometry x="137" y="453" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-60" value="Key derivation and server authentication" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="95" y="82" width="250" height="320" as="geometry"/>
<mxGeometry x="70" y="82" width="250" height="320" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-16" value="Master Password &lt;br&gt;(not persisted)" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="145" y="172" width="150" height="50" as="geometry"/>
<mxGeometry x="120" y="172" width="150" height="50" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-20" value="Argon2Id" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="165" y="247" width="110" height="40" as="geometry"/>
<mxGeometry x="140" y="247" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-22" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-16" target="6F2B19X3ZkVbRV3rCgbW-20" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="405" y="282" as="sourcePoint"/>
<mxPoint x="455" y="232" as="targetPoint"/>
<mxPoint x="380" y="282" as="sourcePoint"/>
<mxPoint x="430" y="232" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-23" value="Derived Key &lt;br&gt;(stored in app memory)" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="144" y="320" width="150" height="50" as="geometry"/>
<mxGeometry x="119" y="320" width="150" height="50" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-24" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-20" target="6F2B19X3ZkVbRV3rCgbW-23" edge="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="405" y="282" as="sourcePoint"/>
<mxPoint x="455" y="232" as="targetPoint"/>
<mxPoint x="380" y="282" as="sourcePoint"/>
<mxPoint x="430" y="232" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-28" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;curved=1;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-23" target="6F2B19X3ZkVbRV3rCgbW-26" edge="1">
@@ -142,40 +142,119 @@
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-66" value="SRP salt/verifier" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="144" y="559" width="150" height="48" as="geometry"/>
<mxGeometry x="117" y="568" width="150" height="48" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-68" target="6F2B19X3ZkVbRV3rCgbW-27" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="609" y="392"/>
<mxPoint x="609" y="392"/>
<mxPoint x="572.16" y="330"/>
<mxPoint x="572.16" y="330"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-180" value="Decrypt with&lt;br&gt;derived key" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6F2B19X3ZkVbRV3rCgbW-72" vertex="1" connectable="0">
<mxGeometry x="0.6371" y="-1" relative="1" as="geometry">
<mxPoint as="offset"/>
<mxPoint x="-1" y="18" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-68" value="Retrieve encrypted vault" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#a0522d;fontColor=#ffffff;strokeColor=#6D1F00;" parent="1" vertex="1">
<mxGeometry x="549" y="330" width="120" height="40" as="geometry"/>
<mxGeometry x="512.16" y="330" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-47" value="Server storage" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;container=0;" parent="1" vertex="1">
<mxGeometry x="540" y="682.65" width="140" height="320" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-70" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-56" target="6F2B19X3ZkVbRV3rCgbW-68" edge="1">
<mxGeometry relative="1" as="geometry"/>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-70" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.541;entryY=1.003;entryDx=0;entryDy=0;entryPerimeter=0;edgeStyle=orthogonalEdgeStyle;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-56" target="6F2B19X3ZkVbRV3rCgbW-68" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="611" y="490"/>
<mxPoint x="577" y="490"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-181" value="Retrieve vault &lt;br&gt;from server" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6F2B19X3ZkVbRV3rCgbW-70" vertex="1" connectable="0">
<mxGeometry x="0.2454" y="1" relative="1" as="geometry">
<mxPoint y="-26" as="offset"/>
<mxPoint x="-19" y="-31" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-56" value="Encrypted Vault(s)" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;container=0;" parent="1" vertex="1">
<mxCell id="6F2B19X3ZkVbRV3rCgbW-56" value="Encrypted vault(s)" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;container=0;" parent="1" vertex="1">
<mxGeometry x="556" y="712.65" width="110" height="80" as="geometry"/>
</mxCell>
<mxCell id="16" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeWidth=3;startArrow=none;startFill=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=oval;endFill=1;" edge="1" parent="1" source="passkey-operations-box" target="6F2B19X3ZkVbRV3rCgbW-166">
<mxGeometry relative="1" as="geometry">
<mxPoint x="560" y="82" as="targetPoint"/>
<Array as="points">
<mxPoint x="1285" y="60"/>
<mxPoint x="406" y="60"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="21" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;strokeWidth=3;startArrow=none;startFill=0;endArrow=oval;endFill=1;" edge="1" parent="1" source="passkey-operations-box">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1280" y="60" as="targetPoint"/>
<Array as="points">
<mxPoint x="1285" y="60"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="passkey-operations-box" value="Passkey operations" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="1170" y="82" width="230" height="320" as="geometry"/>
</mxCell>
<mxCell id="passkey-create-style" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="passkey-keygen" target="passkey-private-key" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="passkey-public-style" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="passkey-keygen" target="passkey-public-key" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="passkey-keygen" value="WebAuthn key generation (RSA-2048/ES256)" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="1210" y="112" width="150" height="50" as="geometry"/>
</mxCell>
<mxCell id="11" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="passkey-public-key" target="10">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="12" value="On create" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="11">
<mxGeometry x="0.1385" y="2" relative="1" as="geometry">
<mxPoint x="-10" y="2" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="passkey-public-key" value="Passkey &lt;br&gt;Public Key" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="1285" y="202" width="105" height="40" as="geometry"/>
</mxCell>
<mxCell id="passkey-private-key" value="Passkey &lt;br&gt;Private Key" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="1175" y="202" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="13" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="passkey-sign" target="10">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1450" y="292"/>
<mxPoint x="1450" y="240"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="14" value="On login" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="13">
<mxGeometry x="0.2035" y="2" relative="1" as="geometry">
<mxPoint x="-38" y="18" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="passkey-sign" value="WebAuthn sign challenge" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="1210" y="272" width="150" height="40" as="geometry"/>
</mxCell>
<mxCell id="passkey-retrieve" value="Retrieve passkey from vault" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#a0522d;fontColor=#ffffff;strokeColor=#6D1F00;" parent="1" vertex="1">
<mxGeometry x="1210" y="332" width="150" height="40" as="geometry"/>
</mxCell>
<mxCell id="passkey-auth-edge" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;" parent="1" source="passkey-retrieve" target="passkey-sign" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="passkey-priv-to-sign" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;dashed=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="passkey-private-key" target="passkey-sign" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1235" y="260" as="targetPoint"/>
<Array as="points">
<mxPoint x="1230" y="260"/>
<mxPoint x="1285" y="260"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-76" value="Claiming new email address" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="720" y="82" width="250" height="320" as="geometry"/>
<mxGeometry x="670" y="82" width="250" height="320" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-83" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-77" target="6F2B19X3ZkVbRV3rCgbW-79" edge="1">
<mxGeometry relative="1" as="geometry"/>
@@ -183,14 +262,19 @@
<mxCell id="6F2B19X3ZkVbRV3rCgbW-100" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-77" target="6F2B19X3ZkVbRV3rCgbW-78" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-77" value="RSA/OAEP Key Generation" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="790" y="122" width="110" height="40" as="geometry"/>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-77" value="RSA/OAEP key generation" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="740" y="122" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-78" value="Public key" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="740" y="207" width="100" height="40" as="geometry"/>
<mxGeometry x="680" y="207" width="100" height="40" as="geometry"/>
</mxCell>
<mxCell id="22" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;strokeWidth=3;startArrow=none;startFill=0;endArrow=oval;endFill=1;" edge="1" parent="1" source="6F2B19X3ZkVbRV3rCgbW-79">
<mxGeometry relative="1" as="geometry">
<mxPoint x="882.2592592592591" y="60" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-79" value="Private key" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="850" y="207" width="110" height="40" as="geometry"/>
<mxGeometry x="800" y="207" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-86" value="" style="group;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" parent="1" vertex="1" connectable="0">
<mxGeometry x="870" y="687" width="490" height="320" as="geometry"/>
@@ -248,19 +332,17 @@
<mxCell id="6F2B19X3ZkVbRV3rCgbW-101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-78" target="6F2B19X3ZkVbRV3rCgbW-99" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="790" y="292"/>
<mxPoint x="750" y="292"/>
<mxPoint x="750" y="883"/>
<mxPoint x="730" y="883"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-102" value="Save in server &lt;br&gt;public key store" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6F2B19X3ZkVbRV3rCgbW-101" vertex="1" connectable="0">
<mxGeometry x="0.4464" y="-2" relative="1" as="geometry">
<mxPoint x="-8" y="-286" as="offset"/>
<mxPoint x="2" y="-312" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-103" value="Register new email&lt;br&gt;claim" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#a0522d;fontColor=#ffffff;strokeColor=#6D1F00;" parent="1" vertex="1">
<mxGeometry x="781" y="332" width="120" height="40" as="geometry"/>
<mxGeometry x="750" y="320" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-140" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-99" target="6F2B19X3ZkVbRV3rCgbW-124" edge="1">
<mxGeometry relative="1" as="geometry"/>
@@ -290,19 +372,18 @@
<mxCell id="6F2B19X3ZkVbRV3rCgbW-107" value="External email received from internet" style="shape=message;html=1;html=1;outlineConnect=0;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="1186.3899999999999" y="1058" width="60" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" edge="1">
<mxCell id="6F2B19X3ZkVbRV3rCgbW-106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" edge="1" source="6F2B19X3ZkVbRV3rCgbW-103">
<mxGeometry relative="1" as="geometry">
<mxPoint x="830" y="372" as="sourcePoint"/>
<mxPoint x="1110" y="370" as="sourcePoint"/>
<mxPoint x="665" y="942" as="targetPoint"/>
<Array as="points">
<mxPoint x="830" y="372"/>
<mxPoint x="830" y="942"/>
<mxPoint x="810" y="942"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-152" value="Register email claim&lt;br&gt;on server" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6F2B19X3ZkVbRV3rCgbW-106" vertex="1" connectable="0">
<mxGeometry x="-0.3735" relative="1" as="geometry">
<mxPoint x="20" y="-132" as="offset"/>
<mxPoint x="175" y="-129" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-123" value="Encrypted email(s)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
@@ -322,7 +403,7 @@
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-136" value="Email retrieval and decryption" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="996.3900000000001" y="82" width="250" height="320" as="geometry"/>
<mxGeometry x="940" y="82" width="209" height="320" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-145" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-143" target="6F2B19X3ZkVbRV3rCgbW-144" edge="1">
<mxGeometry relative="1" as="geometry"/>
@@ -333,24 +414,24 @@
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-143" value="Retrieve encrypted email" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#a0522d;fontColor=#ffffff;strokeColor=#6D1F00;" parent="1" vertex="1">
<mxGeometry x="1061.39" y="330" width="120" height="40" as="geometry"/>
<mxGeometry x="984" y="330" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-148" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-144" target="6F2B19X3ZkVbRV3rCgbW-162" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1121.39" y="322" as="targetPoint"/>
<mxPoint x="1044" y="322" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-144" value="AES256-GCM" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#76608a;fontColor=#ffffff;strokeColor=#432D57;" parent="1" vertex="1">
<mxGeometry x="1066.39" y="232" width="110" height="40" as="geometry"/>
<mxGeometry x="989" y="207" width="110" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-150" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-123" edge="1">
<mxCell id="6F2B19X3ZkVbRV3rCgbW-150" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-123" edge="1" target="6F2B19X3ZkVbRV3rCgbW-143">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1121" y="370" as="targetPoint"/>
<mxPoint x="1381" y="370" as="targetPoint"/>
<Array as="points">
<mxPoint x="672" y="823"/>
<mxPoint x="920" y="822"/>
<mxPoint x="920" y="482"/>
<mxPoint x="1120" y="482"/>
<mxPoint x="1070" y="482"/>
</Array>
</mxGeometry>
</mxCell>
@@ -369,87 +450,80 @@
<mxGeometry x="93" y="1088" width="170" height="30" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-162" value="Decrypted email" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="1056.39" y="122" width="130" height="40" as="geometry"/>
<mxGeometry x="979" y="122" width="130" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-58" value="JWT token for &lt;br&gt;authenticating&lt;br&gt;with REST API" style="shape=parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="364" y="559" width="155" height="48" as="geometry"/>
<mxGeometry x="328.5" y="561" width="155" height="48" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-165" value="Client local storage" style="rounded=0;whiteSpace=wrap;html=1;verticalAlign=top;container=0;" parent="1" vertex="1">
<mxGeometry x="370" y="82" width="140" height="320" as="geometry"/>
<mxGeometry x="335" y="200" width="140" height="202" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-166" value="Decrypted vault&lt;br&gt;(app memory)" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;container=0;" parent="1" vertex="1">
<mxGeometry x="380" y="112" width="110" height="80" as="geometry"/>
<mxGeometry x="351" y="94" width="110" height="68" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-167" value="JWT Token&lt;br&gt;(app local storage)" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
<mxGeometry x="383" y="312" width="116" height="50" as="geometry"/>
<mxGeometry x="348" y="312" width="116" height="50" as="geometry"/>
</mxCell>
<mxCell id="4" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="6F2B19X3ZkVbRV3rCgbW-169" target="6F2B19X3ZkVbRV3rCgbW-27">
<mxCell id="4" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-169" target="6F2B19X3ZkVbRV3rCgbW-27" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-169" value="Derived Key&lt;br&gt;(app&lt;span style=&quot;background-color: initial;&quot;&gt;&amp;nbsp;memory)&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
<mxGeometry x="383" y="242" width="116" height="50" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-84" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-79" target="6F2B19X3ZkVbRV3rCgbW-166" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="630" y="222" as="targetPoint"/>
<Array as="points">
<mxPoint x="933" y="110"/>
<mxPoint x="752" y="110"/>
<mxPoint x="752" y="152"/>
</Array>
<mxPoint x="943" y="210" as="sourcePoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-85" value="Stored in vault" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6F2B19X3ZkVbRV3rCgbW-84" vertex="1" connectable="0">
<mxGeometry x="0.3345" y="3" relative="1" as="geometry">
<mxPoint x="7" y="-3" as="offset"/>
</mxGeometry>
<mxGeometry x="348" y="242" width="116" height="50" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-170" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="6F2B19X3ZkVbRV3rCgbW-169" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="280" y="342" as="sourcePoint"/>
<mxPoint x="255" y="342" as="sourcePoint"/>
<Array as="points">
<mxPoint x="320" y="342"/>
<mxPoint x="320" y="267"/>
<mxPoint x="295" y="342"/>
<mxPoint x="295" y="267"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-173" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-58" target="6F2B19X3ZkVbRV3rCgbW-167" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-174" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-39" target="6F2B19X3ZkVbRV3rCgbW-58" edge="1">
<mxCell id="6F2B19X3ZkVbRV3rCgbW-174" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-39" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="500" y="942"/>
<mxPoint x="500" y="632"/>
<mxPoint x="442" y="632"/>
<mxPoint x="406" y="632"/>
</Array>
<mxPoint x="406" y="609" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-176" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-175" target="6F2B19X3ZkVbRV3rCgbW-16" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-175" value="User login" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#a0522d;fontColor=#ffffff;strokeColor=#6D1F00;" parent="1" vertex="1">
<mxGeometry x="162" y="112" width="120" height="40" as="geometry"/>
<mxGeometry x="137" y="112" width="120" height="40" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-178" value="&lt;span style=&quot;&quot;&gt;JWT token protected API endpoints&lt;/span&gt;" style="shape=corner;whiteSpace=wrap;html=1;fontColor=default;fillColor=#e3c800;strokeColor=#B09500;" parent="1" vertex="1">
<mxGeometry x="567" y="552" width="803" height="80" as="geometry"/>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-179" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-27" target="6F2B19X3ZkVbRV3rCgbW-166" edge="1">
<mxCell id="6F2B19X3ZkVbRV3rCgbW-179" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-27" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="609" y="212"/>
<mxPoint x="435" y="212"/>
<mxPoint x="572" y="128"/>
</Array>
<mxPoint x="460" y="128" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="6F2B19X3ZkVbRV3rCgbW-182" value="Open vault &lt;br&gt;in local app memory" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6F2B19X3ZkVbRV3rCgbW-179" vertex="1" connectable="0">
<mxGeometry x="-0.4412" y="1" relative="1" as="geometry">
<mxPoint x="28" y="-21" as="offset"/>
<mxPoint x="1" y="-2" as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="3" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="6F2B19X3ZkVbRV3rCgbW-79" target="6F2B19X3ZkVbRV3rCgbW-144">
<mxGeometry relative="1" as="geometry"/>
<mxCell id="3" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;dashed=1;" parent="1" source="6F2B19X3ZkVbRV3rCgbW-79" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="990" y="227"/>
</Array>
<mxPoint x="990" y="227" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="10" value="Passkey create /&lt;br&gt;login request&lt;br&gt;from remote website" style="shape=mxgraph.signs.tech.computer;html=1;pointerEvents=1;fillColor=none;strokeColor=default;verticalLabelPosition=bottom;verticalAlign=top;align=center;sketch=0;" vertex="1" parent="1">
<mxGeometry x="1490" y="193" width="60" height="58" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
File diff suppressed because one or more lines are too long.
@@ -1,118 +0,0 @@
%%{ init: { 'flowchart': { 'curve': 'basis' } } }%%
graph TB
%% Legend
subgraph Legend["Legend"]
L_CRYPTO["Cryptographic Operations"]
L_STORAGE["Storage Elements"]
L_KEY["Keys and Sensitive Data"]
L_PROCESS["Process Steps"]
L_AUTH["Authentication Steps"]
L_FLOW["Email Processing Flow"]
end
subgraph Client["Client (Local Only Operations)"]
direction TB
MP[/"Master Password\n(never leaves client)"/]
subgraph KD["1. Key Derivation"]
A2["Argon2id"]
DK[/"Derived Key"/]
MP --> A2
A2 --> DK
DK --> |"used for vault\nencryption/decryption"| AES
DK --> |"used for authentication"| SRP_C
end
subgraph VE["3. Vault Operations"]
AES["AES256-GCM"]
VAULT["Encrypted Vault Contents"]
AES --> |"encrypt/decrypt"| VAULT
end
subgraph KP["4. Email Key Management"]
RSA["RSA/OAEP Key Generation"]
PRK[/"Private Key\n(stored in vault)"/]
PBK[/"Public Key"/]
RSA --> |"generates pair"| PRK
RSA --> |"generates pair"| PBK
end
subgraph ED["5. Email Decryption"]
PRK --> |"decrypt symmetric key"| SK[/"Symmetric Key\n(AES256)"/]
SK --> |"decrypt email"| DC["Decrypted Email"]
end
end
subgraph Server["Server"]
direction TB
subgraph AUTH["Authentication Flow"]
SRP_S["SRP Verification"]
subgraph FA["2FA (Optional)"]
TOTP["Time-based OTP"]
GA["Google Authenticator\nor Compatible App"]
VERIFY["Verify OTP Code"]
GA --> |"generate code"| TOTP
TOTP --> |"user enters"| VERIFY
end
JWT["Issue JWT Token"]
SRP_S --> FA
FA --> |"if 2FA enabled"| JWT
SRP_S --> |"if 2FA disabled"| JWT
end
subgraph VS["Vault Storage"]
EV["Encrypted Vault Data"]
end
subgraph ES["Email System"]
EC["Email Claims"]
PKS["Public Key Store"]
subgraph EP["Email Processing"]
CHECK{"Valid\nEmail Claim?"}
REJECT["Reject Email"]
ESK[/"Generate Random\nSymmetric Key"/]
EE["Encrypt Email\nContent"]
ESP["Encrypt Symmetric Key\nwith Public Key"]
EST["Store Encrypted Email\n& Encrypted Sym Key"]
CHECK --> |"No"| REJECT
CHECK --> |"Yes"| ESK
ESK --> EE
ESK --> ESP
EE --> EST
ESP --> EST
end
end
end
%% Client-Server Interactions
SRP_C["SRP Client"] <--> |"SRP Authentication"| SRP_S
AES <--> |"encrypted vault transfer"| EV
PBK --> |"register"| PKS
EST --> |"retrieve encrypted\nemail & sym key"| ED
%% Styling
classDef process fill:#ddd,stroke:#333,stroke-width:2px
classDef storage fill:#b7e3fc,stroke:#333,stroke-width:2px
classDef key fill:#fef08a,stroke:#333,stroke-width:2px
classDef crypto fill:#e9d5ff,stroke:#333,stroke-width:2px
classDef auth fill:#86efac,stroke:#333,stroke-width:2px
classDef flow fill:#fca5a5,stroke:#333,stroke-width:2px
%% Apply styles to legend
class L_CRYPTO crypto
class L_STORAGE storage
class L_KEY key
class L_PROCESS process
class L_AUTH auth
class L_FLOW flow
%% Apply styles to elements
class A2,SRP_C,SRP_S,RSA,AES crypto
class EV,EST storage
class MP,DK,PRK,PBK,SK,ESK key
class KD,VE,KP,ED process
class SRP_S,FA,JWT,TOTP,VERIFY auth
class CHECK,EP flow