summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał M. Sapka <michal@sapka.me>2023-05-17 12:37:47 +0200
committerMichał M. Sapka <michal@sapka.me>2023-05-17 12:37:47 +0200
commit4e670c556a6d8da5f935bba5948c39af9e6541be (patch)
treec68216f5c118fd69d67bba265d8a93a4dd01d442
parent260cd719083d6a12958a8ee57af04aeea8a74ad0 (diff)
feat: article for 2023-05-17
-rw-r--r--assets/content_images/webauthn-auth.svg281
-rw-r--r--assets/content_images/webauthn-register.svg264
-rw-r--r--content/2023/undestanding-passkeys.md105
-rw-r--r--layouts/shortcodes/svg-full-width.html20
-rw-r--r--raw-svgs/rect9107-8.svg278
-rw-r--r--raw-svgs/webauthn.svg504
6 files changed, 1452 insertions, 0 deletions
diff --git a/assets/content_images/webauthn-auth.svg b/assets/content_images/webauthn-auth.svg
new file mode 100644
index 0000000..b557e25
--- /dev/null
+++ b/assets/content_images/webauthn-auth.svg
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="842.24146"
+ height="357.15649"
+ viewBox="0 0 501.47537 212.65301"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a84865, 2022-12-01)"
+ sodipodi:docname="webauthn.svg"
+ inkscape:export-filename="webauth1.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="1.1098265"
+ inkscape:cx="514.49485"
+ inkscape:cy="218.05211"
+ inkscape:window-width="1481"
+ inkscape:window-height="788"
+ inkscape:window-x="14"
+ inkscape:window-y="862"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ inkscape:lockguides="true"
+ guidecolor="#00e51f"
+ guideopacity="0.6"
+ inkscape:connector-spacing="100"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid297"
+ spacingx="13.229166"
+ spacingy="6.6145832"
+ dotted="false"
+ originx="-12.915683"
+ originy="225.30132" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker12192-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker12192-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0-3" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-12.928819,-12.663268)">
+ <rect
+ style="fill:#e3dedb;fill-opacity:1;stroke:#000000;stroke-width:0.782735;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8"
+ width="158.35547"
+ height="211.69456"
+ x="355.65738"
+ y="13.230375"
+ inkscape:export-filename="./rect9107-8.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.814774;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3"
+ width="171.59639"
+ height="211.67917"
+ x="185.19704"
+ y="13.217866" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595313;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 343.95831,92.605373 h 79.375 v 19.843777"
+ id="path18625-2"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="211.50543"
+ y="211.47563"
+ id="text6393-2-4-1-9-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="211.47563">Authenticate user</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="227.35063"
+ id="tspan18510-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="243.22563"
+ id="tspan18516-7" /></text>
+ <rect
+ style="fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.815709;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107"
+ width="171.87164"
+ height="211.8259"
+ x="13.336674"
+ y="13.071134" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="15.745811"
+ y="29.53179"
+ id="text6393"><tspan
+ sodipodi:role="line"
+ id="tspan6391"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="15.745811"
+ y="29.53179">User</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="189.24944"
+ y="29.245935"
+ id="text6397"><tspan
+ sodipodi:role="line"
+ id="tspan6395"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="189.24944"
+ y="29.245935">Service</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;word-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="362.56305"
+ y="29.018572"
+ id="text6401"><tspan
+ sodipodi:role="line"
+ id="tspan6399"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="362.56305"
+ y="29.018572">Authenticator</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect9105"
+ width="92.604156"
+ height="145.52083"
+ x="26.45833"
+ y="13.229165" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="39.687496"
+ y="66.145828"
+ id="text6393-2"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="39.687496"
+ y="66.145828">Provide username</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="210.95352"
+ y="95.639816"
+ id="text6393-2-4"><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="210.95352"
+ y="95.639816"
+ id="tspan18458">Generate challenge</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="383.64581"
+ y="125.67829"
+ id="text6393-2-4-1"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="383.64581"
+ y="125.67829">Sign challenge</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="211.50543"
+ y="168.46223"
+ id="text6393-2-4-1-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="168.46223">Verify signature</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="184.33723"
+ id="tspan18510" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="200.21223"
+ id="tspan18516" /></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.687408;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="M 158.74999,59.532426 H 264.58332 V 79.376207"
+ id="path18625"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.570628;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 423.97337,129.08035 v 9.82711 H 251.35415"
+ id="path18625-2-6"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 251.35415,138.90744 v 13.22917"
+ id="path18962"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18964"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18966"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 251.35415,178.59494 v 13.22917"
+ id="path19110"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/assets/content_images/webauthn-register.svg b/assets/content_images/webauthn-register.svg
new file mode 100644
index 0000000..5d9058e
--- /dev/null
+++ b/assets/content_images/webauthn-register.svg
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="844.83875"
+ height="334.62488"
+ viewBox="0 0 503.02182 199.23756"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a84865, 2022-12-01)"
+ sodipodi:docname="webauthn.svg"
+ inkscape:export-filename="webauth1.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="1.1098265"
+ inkscape:cx="514.49485"
+ inkscape:cy="218.05211"
+ inkscape:window-width="1481"
+ inkscape:window-height="788"
+ inkscape:window-x="14"
+ inkscape:window-y="862"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ inkscape:lockguides="true"
+ guidecolor="#00e51f"
+ guideopacity="0.6"
+ inkscape:connector-spacing="100"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid297"
+ spacingx="13.229166"
+ spacingy="6.6145832"
+ dotted="false"
+ originx="-12.915683"
+ originy="225.30132" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker12192"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker12192-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-12.915683,225.29999)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192)"
+ d="m 171.66566,-145.65312 h 105.83333 v 26.45833"
+ id="path12122"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192)"
+ d="m 356.87397,-105.96563 h 92.60418 v 19.843756"
+ id="path12266"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 436.24898,-66.278124 v 13.229166 H 277.49899"
+ id="path12316"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#e3dedb;fill-opacity:1;stroke:#000000;stroke-width:0.757183;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8-8"
+ width="158.38029"
+ height="198.06779"
+ x="357.17862"
+ y="-224.9035" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.788117;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3-5"
+ width="171.59639"
+ height="198.05473"
+ x="185.19705"
+ y="-224.90593" />
+ <rect
+ style="fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.789409;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-37"
+ width="171.89795"
+ height="198.35628"
+ x="13.310388"
+ y="-224.81342" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="15.745828"
+ y="-208.592"
+ id="text6393-3"><tspan
+ sodipodi:role="line"
+ id="tspan6391-1"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="15.745828"
+ y="-208.592">User</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="189.24945"
+ y="-208.87785"
+ id="text6397-5"><tspan
+ sodipodi:role="line"
+ id="tspan6395-8"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="189.24945"
+ y="-208.87785">Service</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;word-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="362.56308"
+ y="-209.10522"
+ id="text6401-0"><tspan
+ sodipodi:role="line"
+ id="tspan6399-9"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="362.56308"
+ y="-209.10522">Authenticator</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect9105-2"
+ width="92.604156"
+ height="145.52083"
+ x="26.458338"
+ y="-224.89462" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="39.687508"
+ y="-171.97797"
+ id="text6393-2-43"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="39.687508"
+ y="-171.97797">Provide username</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="207.00458"
+ y="-134.84534"
+ id="text6393-2-4-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-05"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="207.00458"
+ y="-134.84534">Request public key</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="382.93271"
+ y="-102.79768"
+ id="text6393-2-4-1-5"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-4"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="382.93271"
+ y="-102.79768">Generate key pair</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="221.04285"
+ y="-48.855751"
+ id="text6393-2-4-1-9-4"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="221.04285"
+ y="-48.855751">Store private key</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="369.58572"
+ y="-49.88102"
+ id="text6393-2-4-1-5-1-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-3-3-2"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="369.58572"
+ y="-49.88102">Store public key</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 158.75,-178.59254 h 105.83333 v 26.45833"
+ id="path12122-2"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 343.95831,-138.90504 h 92.60418 v 19.84375"
+ id="path12266-6"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.83042;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 436.56248,-99.217536 v 28.95944"
+ id="path12288-4"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 423.33332,-99.217536 v 13.22916 H 264.58333"
+ id="path12316-0"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 264.58333,-85.988376 v 19.84375"
+ id="path12318-0"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/content/2023/undestanding-passkeys.md b/content/2023/undestanding-passkeys.md
new file mode 100644
index 0000000..1abdf7c
--- /dev/null
+++ b/content/2023/undestanding-passkeys.md
@@ -0,0 +1,105 @@
+---
+title: "Understanding Passkeys"
+category: "engineering"
+abstract: I tried to understand Passkeys before they replace passwords
+date: 2023-05-17T12:04:23+02:00
+year:
+draft: false
+tags:
+- Passkeys
+- Security
+- Passwords
+- BitWarden
+- Password-store
+- WebAuthn
+---
+With all the buzz about Passkeys recently, I found myself pushed toward something I know nothing about. Is it some magical thingy that will secure my accounts on the Web? Unfortunately, marketing buzz and lack of factual information made it even harder to know anything.
+
+I hope this guide will help someone to make heads and tails from all this madness.
+
+### FIDO
+
+First, let's introduce the main hero: Fast Identity Online (FIDO)[^fido-webpage] introduces itself via:
+[^fido-webpage]: [FIDO website](https://fidoalliance.org/)
+
+> The FIDO Alliance is an open industry association with a focused mission: authentication standards to help reduce the world's over-reliance on passwords. The FIDO Alliance promotes the development of, use of, and compliance with standards for authentication and device attestation.
+
+Amongst the members of the alliance, we can find each of the FANG companies, many banks, password-manger companies, and a few different government organizations. The list consists of different bodies that should be interested in internet security.
+
+However, I failed to find any NGOs on the list.
+
+### WebAuthn
+
+Web Authentication (aka WebAuthn)[^webauthn-rfc] is a standard for passwordless authentication using asymmetric cryptography. The standard proposes replacing standard password-based authentication with exchanging public cryptographic keys. The user maintains ownership of the private key he generates on the Client Device (phone, hardware keys, etc.). The service provider (known here as Relying Party) receives a public key during registration. When the user wants to authenticate, the server sends a challenge encrypted with the public key.
+
+[^webauthn-rfc]: [Web Authentication: An API for accessing Public Key Credentials Level 2 RFC](https://www.w3.org/TR/webauthn-2)
+
+It's the same mechanism we've used for years with SSH keys. The server doesn't need to bother with keeping and securing secrets (like passwords), as the public key is both the public part (think of username) and the secret part.
+
+### Passkey
+The term Passkey was first introduced by Apple just a few years ago[^apple-introduction]. The idea was to reuse WebAuthn and replace the Client Device with an Apple Device. The secret key is stored in iCloud and available on all other devices signed in the same Apple ID. But it was a relatively silent feature until recently when Google added it natively to Chrome and Android[^google-doc].
+[^apple-introduction]: [WWDC 2021 talk](https://developer.apple.com/videos/play/wwdc2021/10106/)
+[^google-doc]: [Google developer introduction](https://developers.google.com/identity/passkeys?hl=pl)
+
+So, Passkeys are an implementation of WebAuthn.
+
+### End-user experience
+
+Finding user-experience videos was the easiest part here. Everyone seems so proud of how seamlessly it works in their ecosystem:
+- [Apple](https://support.apple.com/guide/iphone/sign-in-with-passkeys-iphf538ea8d0/ios)
+- [Google](https://support.google.com/accounts/answer/13548313?hl=en)
+
+You can also see a live demo [on the Web](https://www.passkeys.io/).
+
+### Technical exploration
+
+Let's go to the details since we've got the basics out of the way. In this chapter, I'll use the term WebAuthn instead of Passkey since it's the technology underneath. One thing to keep in mind: I'll use "client device" and "authenticator" interchangeably. The RFC allows for dedicated devices (connected via USB or Bluetooth) and for software to be used as authenticators.
+
+The following descriptions will also be very high level. I don't aim them at developers of WebAuthn solutions, as they should go straight to the RFC.
+
+#### Registration
+
+Registration under WebAuthn consists of generating a unique key pair and sending the public one to the server.
+
+{{<svg-full-width "webauthn-register.svg" "WebAuthn registration high level overwiew">}}
+
+Some additional notes here:
+- The Client Device should sign the sent public key with its own Attestation Certificate[^att-cert]. The certificate is used to attest to the manufacturer and its capabilities. The device can also self-attest using the private key.
+- The RFC allows for generating keys using the most popular algorithms].
+- The unique key pair is not shared between services. The device can generate many certificates for each service, so you can still have multiple accounts for shitposting on Twitter.
+[^att-cert]: An X.509 Certificate.
+
+As we see, the private key stays with the user, and it's his job to backup and sync it. The service with which the user creates an account knows only about the public key - and that one can be shared unencrypted anywhere. To the best of my knowledge[^not-sec], it's still impossible to generate the private key with the public one alone.
+[^not-sec]: but I am not a security expert. It may also be that such methods exist but are not known to the public. Governments hate encryption in citizens hands.
+
+The RFC defines the entire registration ceremony but doesn't limit how it should be presented to the user. One important thing to remember is that the exchange happens with the browser/OS as a middleman. The UI is not to the webmaster's[^webmaster] liking - the site just requests the exchange from the browser and then receives the public key. Think of getting access to the user's location - it's an API, but the consent happens in the browser.
+
+[^webmaster]: Or application designer. I'll use only Web as an example in the future to simplify it, but the same applies to any other application using WebAuthn.
+
+#### Authentication
+
+{{<svg-full-width "webauthn-auth.svg" "WebAuthn authentication high level overwiew">}}
+
+First, the server generates a challenge - most likely a big random number. The client device then signs it with the private key. Then the server validates the signature - as possible only with the public key.
+
+
+
+### The cost of Passkeys
+
+WebAuthn is a questionable standard. It removes almost all risks from the service provider and puts all responsibility on the user. Since the keys are just strings, nothing stops us from keeping them anywhere. We already do this - maintaining our SSH or GPG keys is something we do every day. However, this does not apply to the mass public. I can't imagine a grandma being tasked with ensuring she will never lose this file. This is where companies came in.
+
+As mentioned above, Apple and Google are trying to become the guardians of public keys. At first, though, it sounds great - if it's in Google Account or Apple iCloud, it will be stored and synced automatically. But after some thinking, it's not a good idea for the majority of people.
+
+First of all, it's not safe. Reddit is flooded with worried users after iCloud lost their files or photos. Google is known to block accounts out of the blue. Losing access to an image of a dog may be sad, but it's not the end of the world. But what will happen when your internet identity becomes locked instantly? You break your phone and suddenly discover all those keys are gone. You just need to forget your iCloud password, and if the backup email is secured with a passkey, you are out of luck[^apple-recovery]. No food delivery, no bank - not even Twitter to cry about it.
+[^apple-recovery]: [Apple assumes](https://support.apple.com/en-us/HT201487) that you need an Apple device for a quick and painless Apple password reset. Good luck if you don't have one next to you.
+
+And what if you want to use different ecosystems at the same time? iPhone with Safari and Chrome on the desktop? That's what the majority of people are doing. Technically nothing is stopping all providers from creating some data exchange protocol. However, the data should be end-to-end encrypted, so any automatic job between the servers is out of the question. Moreover, the thought of your confidential data flowing randomly on the internet should worry you.
+
+And what if you want to use an alternative Operating System? You would be at the mercy of your browser. But let's say you are a total neckbeard and don't use any of those major browsers - then you have no chance to log in to a passkey-authenticated service.
+
+Those risks may be removed in the future as all significant password managers are either working on or already supporting passkeys.
+
+### Personally...
+
+I am waiting for an open solution that will give me the authority to manage and sync passkeys. BitWarden may be one, but I'd much prefer GNU Pass to support it.[^gnu-pass]
+[^gnu-pass]: I am slowly migrating from BitWarden to [Password store](https://www.passwordstore.org/)
diff --git a/layouts/shortcodes/svg-full-width.html b/layouts/shortcodes/svg-full-width.html
new file mode 100644
index 0000000..4c604ab
--- /dev/null
+++ b/layouts/shortcodes/svg-full-width.html
@@ -0,0 +1,20 @@
+{{- $file := .Get 0 }}
+{{- $path := printf "content_images/%s" $file}}
+{{- $img := resources.Get $path }}
+{{- $caption := .Get 1 }}
+{{- $source := .Get 2 }}
+<figure class="graph">
+ <img
+ class="center"
+ alt="{{ $caption }}"
+ src="{{ $img.RelPermalink }}"
+
+ >
+ <figcaption>
+ {{ $caption }}
+
+ {{- if $source }}
+ <a href="{{ $source }}" target="_blank" title="source">[source]</a>
+ {{ end }}
+ </figcaption>
+</figure>
diff --git a/raw-svgs/rect9107-8.svg b/raw-svgs/rect9107-8.svg
new file mode 100644
index 0000000..275ceb4
--- /dev/null
+++ b/raw-svgs/rect9107-8.svg
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="842.24146"
+ height="357.15649"
+ viewBox="0 0 501.47537 212.65301"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a84865, 2022-12-01)"
+ sodipodi:docname="webauthn.svg"
+ inkscape:export-filename="webauth1.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="1.1098265"
+ inkscape:cx="514.49485"
+ inkscape:cy="218.05211"
+ inkscape:window-width="1481"
+ inkscape:window-height="788"
+ inkscape:window-x="14"
+ inkscape:window-y="862"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ inkscape:lockguides="true"
+ guidecolor="#00e51f"
+ guideopacity="0.6"
+ inkscape:connector-spacing="100"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid297"
+ spacingx="13.229166"
+ spacingy="6.6145832"
+ dotted="false"
+ originx="-12.915683"
+ originy="225.30132" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker12192-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker12192-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0-3" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-12.928819,-12.663268)">
+ <rect
+ style="fill:#e3dedb;fill-opacity:1;stroke:#000000;stroke-width:0.782735;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8"
+ width="158.35547"
+ height="211.69456"
+ x="355.65738"
+ y="13.230375" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.814774;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3"
+ width="171.59639"
+ height="211.67917"
+ x="185.19704"
+ y="13.217866" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595313;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 343.95831,92.605373 h 79.375 v 19.843777"
+ id="path18625-2"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="211.50543"
+ y="211.47563"
+ id="text6393-2-4-1-9-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="211.47563">Authenticate user</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="227.35063"
+ id="tspan18510-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="243.22563"
+ id="tspan18516-7" /></text>
+ <rect
+ style="fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.815709;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107"
+ width="171.87164"
+ height="211.8259"
+ x="13.336674"
+ y="13.071134" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="15.745811"
+ y="29.53179"
+ id="text6393"><tspan
+ sodipodi:role="line"
+ id="tspan6391"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="15.745811"
+ y="29.53179">User</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="189.24944"
+ y="29.245935"
+ id="text6397"><tspan
+ sodipodi:role="line"
+ id="tspan6395"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="189.24944"
+ y="29.245935">Service</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;word-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="362.56305"
+ y="29.018572"
+ id="text6401"><tspan
+ sodipodi:role="line"
+ id="tspan6399"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="362.56305"
+ y="29.018572">Authenticator</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect9105"
+ width="92.604156"
+ height="145.52083"
+ x="26.45833"
+ y="13.229165" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="39.687496"
+ y="66.145828"
+ id="text6393-2"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="39.687496"
+ y="66.145828">Provide username</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="210.95352"
+ y="95.639816"
+ id="text6393-2-4"><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="210.95352"
+ y="95.639816"
+ id="tspan18458">Generate challenge</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="383.64581"
+ y="125.67829"
+ id="text6393-2-4-1"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="383.64581"
+ y="125.67829">Sign challenge</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="211.50543"
+ y="168.46223"
+ id="text6393-2-4-1-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="168.46223">Verify signature</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="184.33723"
+ id="tspan18510" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="200.21223"
+ id="tspan18516" /></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.687408;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="M 158.74999,59.532426 H 264.58332 V 79.376207"
+ id="path18625"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.570628;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 423.97337,129.08035 v 9.82711 H 251.35415"
+ id="path18625-2-6"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 251.35415,138.90744 v 13.22917"
+ id="path18962"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18964"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18966"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 251.35415,178.59494 v 13.22917"
+ id="path19110"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/raw-svgs/webauthn.svg b/raw-svgs/webauthn.svg
new file mode 100644
index 0000000..b749228
--- /dev/null
+++ b/raw-svgs/webauthn.svg
@@ -0,0 +1,504 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1901.1848"
+ height="1703.1167"
+ viewBox="0 0 1131.9763 1014.0454"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a84865, 2022-12-01)"
+ sodipodi:docname="webauthn.svg"
+ inkscape:export-filename="webauth1.svg"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="1.1098265"
+ inkscape:cx="514.49485"
+ inkscape:cy="218.05211"
+ inkscape:window-width="1481"
+ inkscape:window-height="788"
+ inkscape:window-x="14"
+ inkscape:window-y="862"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="layer1"
+ inkscape:lockguides="true"
+ guidecolor="#00e51f"
+ guideopacity="0.6"
+ inkscape:connector-spacing="100"
+ showguides="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid297"
+ spacingx="13.229166"
+ spacingy="6.6145832"
+ dotted="false"
+ originx="-12.915683"
+ originy="225.30132" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker12192"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="357.2434 : 50.683938 : 1"
+ inkscape:vp_y="0 : 2250.3535 : 0"
+ inkscape:vp_z="1190.8113 : 348.38694 : 1"
+ inkscape:persp3d-origin="595.40573 : 249.15248 : 1"
+ id="perspective8831" />
+ <symbol
+ id="AuxillaryOp">
+ <title
+ id="title381">Auxiliary Operation</title>
+ <desc
+ id="desc383">Offline operation.</desc>
+ <rect
+ x="35"
+ y="35"
+ width="80"
+ height="80"
+ style="stroke-width:2"
+ id="rect385" />
+ </symbol>
+ <marker
+ style="overflow:visible"
+ id="marker12192-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker12192-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="RoundedArrow"
+ markerWidth="6.1347523"
+ markerHeight="5.9304948"
+ viewBox="0 0 6.1347524 5.9304951"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="m -0.21114562,-4.1055728 6.42229122,3.21114561 a 1,1 90 0 1 0,1.78885438 L -0.21114562,4.1055728 A 1.236068,1.236068 31.717474 0 1 -2,3 v -6 a 1.236068,1.236068 148.28253 0 1 1.78885438,-1.1055728 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="path12190-0-3" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-12.915683,225.29999)">
+ <rect
+ style="fill:#e3dedb;fill-opacity:1;stroke:#000000;stroke-width:0.782735;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8"
+ width="158.35547"
+ height="211.69456"
+ x="355.65738"
+ y="13.230375" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.814774;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3"
+ width="171.59639"
+ height="211.67917"
+ x="185.19704"
+ y="13.217866" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.595313;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 343.95831,92.605373 h 79.375 v 19.843777"
+ id="path18625-2"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="211.50543"
+ y="211.47563"
+ id="text6393-2-4-1-9-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-8"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="211.47563">Authenticate user</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="227.35063"
+ id="tspan18510-0" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="243.22563"
+ id="tspan18516-7" /></text>
+ <rect
+ style="fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.815709;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107"
+ width="171.87164"
+ height="211.8259"
+ x="13.336674"
+ y="13.071134" />
+ <text
+ xml:space="preserve"
+ style="font-size:22.5778px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="62.343304"
+ y="34.780998"
+ id="text6389"><tspan
+ sodipodi:role="line"
+ id="tspan6387"
+ style="font-size:22.5778px;stroke-width:3.565"
+ x="62.343304"
+ y="34.780998" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="15.745811"
+ y="29.53179"
+ id="text6393"><tspan
+ sodipodi:role="line"
+ id="tspan6391"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="15.745811"
+ y="29.53179">User</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="189.24944"
+ y="29.245935"
+ id="text6397"><tspan
+ sodipodi:role="line"
+ id="tspan6395"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="189.24944"
+ y="29.245935">Service</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;word-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="362.56305"
+ y="29.018572"
+ id="text6401"><tspan
+ sodipodi:role="line"
+ id="tspan6399"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="362.56305"
+ y="29.018572">Authenticator</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect9105"
+ width="92.604156"
+ height="145.52083"
+ x="26.45833"
+ y="13.229165" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="39.687496"
+ y="66.145828"
+ id="text6393-2"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="39.687496"
+ y="66.145828">Provide username</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="210.95352"
+ y="95.639816"
+ id="text6393-2-4"><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="210.95352"
+ y="95.639816"
+ id="tspan18458">Generate challenge</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="383.64581"
+ y="125.67829"
+ id="text6393-2-4-1"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="383.64581"
+ y="125.67829">Sign challenge</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="211.50543"
+ y="168.46223"
+ id="text6393-2-4-1-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="168.46223">Verify signature</tspan><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="184.33723"
+ id="tspan18510" /><tspan
+ sodipodi:role="line"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="211.50543"
+ y="200.21223"
+ id="tspan18516" /></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192)"
+ d="m 171.66566,-145.65312 h 105.83333 v 26.45833"
+ id="path12122"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192)"
+ d="m 356.87397,-105.96563 h 92.60418 v 19.843756"
+ id="path12266"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 436.24898,-66.278124 v 13.229166 H 277.49899"
+ id="path12316"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="fill:#e3dedb;fill-opacity:1;stroke:#000000;stroke-width:0.757183;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-8-8"
+ width="158.38029"
+ height="198.06779"
+ x="357.17862"
+ y="-224.9035" />
+ <rect
+ style="fill:#ffd5d5;fill-opacity:1;stroke:#000000;stroke-width:0.788117;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-3-5"
+ width="171.59639"
+ height="198.05473"
+ x="185.19705"
+ y="-224.90593" />
+ <rect
+ style="fill:#e9c6af;fill-opacity:1;stroke:#000000;stroke-width:0.789409;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ id="rect9107-37"
+ width="171.89795"
+ height="198.35628"
+ x="13.310388"
+ y="-224.81342" />
+ <text
+ xml:space="preserve"
+ style="font-size:22.5778px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="62.343315"
+ y="-203.34279"
+ id="text6389-9"><tspan
+ sodipodi:role="line"
+ id="tspan6387-6"
+ style="font-size:22.5778px;stroke-width:3.565"
+ x="62.343315"
+ y="-203.34279" /></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="15.745828"
+ y="-208.592"
+ id="text6393-3"><tspan
+ sodipodi:role="line"
+ id="tspan6391-1"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="15.745828"
+ y="-208.592">User</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="189.24945"
+ y="-208.87785"
+ id="text6397-5"><tspan
+ sodipodi:role="line"
+ id="tspan6395-8"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="189.24945"
+ y="-208.87785">Service</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:2.64583px;word-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="362.56308"
+ y="-209.10522"
+ id="text6401-0"><tspan
+ sodipodi:role="line"
+ id="tspan6399-9"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="362.56308"
+ y="-209.10522">Authenticator</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:1;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ id="rect9105-2"
+ width="92.604156"
+ height="145.52083"
+ x="26.458338"
+ y="-224.89462" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="39.687508"
+ y="-171.97797"
+ id="text6393-2-43"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="39.687508"
+ y="-171.97797">Provide username</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="207.00458"
+ y="-134.84534"
+ id="text6393-2-4-9"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-05"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="207.00458"
+ y="-134.84534">Request public key</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="382.93271"
+ y="-102.79768"
+ id="text6393-2-4-1-5"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-4"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="382.93271"
+ y="-102.79768">Generate key pair</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="221.04285"
+ y="-48.855751"
+ id="text6393-2-4-1-9-4"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-9-3"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="221.04285"
+ y="-48.855751">Store private key</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.7px;letter-spacing:0px;fill:#d35f5f;stroke-width:3.565;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none"
+ x="369.58572"
+ y="-49.88102"
+ id="text6393-2-4-1-5-1-8"><tspan
+ sodipodi:role="line"
+ id="tspan6391-3-5-0-3-3-2"
+ style="font-size:12.7px;fill:#000000;stroke-width:3.565"
+ x="369.58572"
+ y="-49.88102">Store public key</tspan></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 158.75,-178.59254 h 105.83333 v 26.45833"
+ id="path12122-2"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 343.95831,-138.90504 h 92.60418 v 19.84375"
+ id="path12266-6"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.83042;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 436.56248,-99.217536 v 28.95944"
+ id="path12288-4"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 423.33332,-99.217536 v 13.22916 H 264.58333"
+ id="path12316-0"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="m 264.58333,-85.988376 v 19.84375"
+ id="path12318-0"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.687408;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7)"
+ d="M 158.74999,59.532426 H 264.58332 V 79.376207"
+ id="path18625"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.570628;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 423.97337,129.08035 v 9.82711 H 251.35415"
+ id="path18625-2-6"
+ inkscape:connector-type="orthogonal"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 251.35415,138.90744 v 13.22917"
+ id="path18962"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18964"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 251.35415,138.90744 v 0"
+ id="path18966"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79375;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12192-7-1)"
+ d="m 251.35415,178.59494 v 13.22917"
+ id="path19110"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>