blob: ef732a83906bb0315a2aa80a3715575b3fd967b5 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1479px" preserveAspectRatio="none" style="width:1042px;height:1479px;background:#FFFFFF;" version="1.1" viewBox="0 0 1042 1479" width="1042px" zoomAndPan="magnify"><defs/><g><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="93" x2="93" y1="36.2969" y2="1443.7344"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="238" x2="238" y1="36.2969" y2="1443.7344"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="430" x2="430" y1="36.2969" y2="1443.7344"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="534" x2="534" y1="36.2969" y2="1443.7344"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="635" x2="635" y1="36.2969" y2="1443.7344"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="801" x2="801" y1="36.2969" y2="1443.7344"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="928" x2="928" y1="36.2969" y2="1443.7344"/><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="89" x="49" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="56" y="24.9951">Application</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="89" x="49" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="75" x="56" y="1462.7295">Application</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="167" x="155" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="153" x="162" y="24.9951">Delegated_attestation</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="167" x="155" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="153" x="162" y="1462.7295">Delegated_attestation</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="366" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="115" x="373" y="24.9951">Initial_attestation</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="129" x="366" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="115" x="373" y="1462.7295">Initial_attestation</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="59" x="505" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="45" x="512" y="24.9951">Crypto</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="59" x="505" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="45" x="512" y="1462.7295">Crypto</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="574" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="581" y="24.9951">Measured_boot</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="574" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="581" y="1462.7295">Measured_boot</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="136" x="733" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="122" x="740" y="24.9951">Other_subsystem</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="136" x="733" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="122" x="740" y="1462.7295">Other_subsystem</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="98" x="879" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="84" x="886" y="24.9951">Bootloaders</text><rect fill="#E2E2F0" height="30.2969" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="98" x="879" y="1442.7344"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="84" x="886" y="1462.7295">Bootloaders</text><rect fill="#EEEEEE" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="1035" x="0" y="66.8633"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1035" y1="66.8633" y2="66.8633"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1035" y1="69.8633" y2="69.8633"/><rect fill="#EEEEEE" height="23.1328" style="stroke:#000000;stroke-width:2.0;" width="143" x="446" y="56.2969"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="124" x="452" y="72.3638">TF-M Boot phase</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="201" x="827" y="94.4297"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="193" x="831" y="110.4966">Get the IAK from the platform.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="138" x="831" y="125.6294">IAK might derive from</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="155" x="831" y="140.7622">seed or pre-provisioned.</text><polygon fill="#181818" points="545.5,169.9609,535.5,173.9609,545.5,177.9609,541.5,173.9609" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="539.5" x2="927" y1="173.9609" y2="173.9609"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="232" x="551.5" y="168.895">Pass Initial Attestation Key to Crypto</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="164" x="846" y="186.9609"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="99" x="850" y="203.0278">Get the seed of</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="156" x="850" y="218.1606">Platform Attestation Key</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="117" x="850" y="233.2935">from the platform.</text><polygon fill="#181818" points="545.5,262.4922,535.5,266.4922,545.5,270.4922,541.5,266.4922" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="539.5" x2="927" y1="266.4922" y2="266.4922"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="253" x="551.5" y="261.4263">Pass Platform Attestation Key to Crypto</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="204" x="826" y="279.4922"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="196" x="830" y="295.5591">Store firmware measurements</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="149" x="830" y="310.6919">and metadata to buffer</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="174" x="548" y="327.7578"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="127" x="552" y="343.8247">Read measurement</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="166" x="552" y="358.9575">and metadata from buffer</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="89" x="552" y="374.0903">at service init.</text><rect fill="#EEEEEE" height="3" style="stroke:#EEEEEE;stroke-width:1.0;" width="1035" x="0" y="406.7227"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1035" y1="406.7227" y2="406.7227"/><line style="stroke:#000000;stroke-width:1.0;" x1="0" x2="1035" y1="409.7227" y2="409.7227"/><rect fill="#EEEEEE" height="23.1328" style="stroke:#000000;stroke-width:2.0;" width="120" x="457.5" y="396.1563"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="101" x="463.5" y="412.2231">TF-M Runtime</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="149" x="726" y="434.2891"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="141" x="730" y="450.356">Firmware is measured</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="50" x="730" y="465.4888">at boot.</text><polygon fill="#181818" points="646,494.6875,636,498.6875,646,502.6875,642,498.6875" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="640" x2="800" y1="498.6875" y2="498.6875"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="142" x="652" y="493.6216">extend_measurement</text><polygon fill="#181818" points="646,523.8203,636,527.8203,646,531.8203,642,527.8203" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="640" x2="800" y1="527.8203" y2="527.8203"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="142" x="652" y="522.7544">extend_measurement</text><polygon fill="#181818" points="226.5,552.9531,236.5,556.9531,226.5,560.9531,230.5,556.9531" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="232.5" y1="556.9531" y2="556.9531"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="121" x="100.5" y="551.8872">get_delegated_key</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="193" x="142" y="569.9531"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="117" x="146" y="586.02">Preparation to key</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="185" x="146" y="601.1528">derivation. Query all platform</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="161" x="146" y="616.2856">firmware measurements.</text><polygon fill="#181818" points="623,645.4844,633,649.4844,623,653.4844,627,649.4844" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="238.5" x2="629" y1="649.4844" y2="649.4844"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="127" x="245.5" y="644.4185">read_measurement</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="187" x="145" y="662.4844"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="179" x="149" y="678.5513">Hashing the measurements</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="168" x="149" y="693.6841">and associated metadata.</text><polygon fill="#181818" points="522.5,722.8828,532.5,726.8828,522.5,730.8828,526.5,726.8828" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="238.5" x2="528.5" y1="726.8828" y2="726.8828"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="125" x="245.5" y="721.8169">psa_hash_compute</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="161" x="158" y="739.8828"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="135" x="162" y="755.9497">Derive delegated key</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="144" x="162" y="771.0825">from seed. Input is the</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="153" x="162" y="786.2153">hash of measurements.</text><polygon fill="#181818" points="522.5,815.4141,532.5,819.4141,522.5,823.4141,526.5,819.4141" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="238.5" x2="528.5" y1="819.4141" y2="819.4141"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="98" x="245.5" y="814.3481">psa_derive_key</text><polygon fill="#181818" points="104.5,844.5469,94.5,848.5469,104.5,852.5469,100.5,848.5469" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="98.5" x2="237.5" y1="848.5469" y2="848.5469"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="121" x="110.5" y="843.481">get_delegated_key</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="158" x="14" y="861.5469"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="147" x="18" y="877.6138">Private key is returned.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="150" x="18" y="892.7466">Public part is computed</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="82" x="18" y="907.8794">by the caller.</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="124" x="31" y="924.9453"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="116" x="35" y="941.0122">Hash of public key</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="35" y="956.145">is computed.</text><polygon fill="#181818" points="226.5,985.3438,236.5,989.3438,226.5,993.3438,230.5,989.3438" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="232.5" y1="989.3438" y2="989.3438"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="64" x="100.5" y="984.2778">get_token</text><rect fill="#FEFFDD" height="68" style="stroke:#181818;stroke-width:0.5;" width="186" x="145" y="1002.3438"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="116" x="149" y="1018.4106">Hash of public key</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="127" x="149" y="1033.5435">is received as input.</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="178" x="149" y="1048.6763">Compare against previously</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="77" x="149" y="1063.8091">derived key.</text><polygon fill="#181818" points="418.5,1093.0078,428.5,1097.0078,418.5,1101.0078,422.5,1097.0078" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="238.5" x2="424.5" y1="1097.0078" y2="1097.0078"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="168" x="245.5" y="1091.9419">get_initial_attestion_token</text><rect fill="#FEFFDD" height="53" style="stroke:#181818;stroke-width:0.5;" width="191" x="335" y="1110.0078"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="177" x="339" y="1126.0747">Produce the token including</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="183" x="339" y="1141.2075">the hash of public key as the</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="101" x="339" y="1156.3403">Challenge claim</text><polygon fill="#181818" points="623,1185.5391,633,1189.5391,623,1193.5391,627,1189.5391" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="430.5" x2="629" y1="1189.5391" y2="1189.5391"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="127" x="437.5" y="1184.4731">read_measurement</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="214" x="323" y="1202.5391"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="206" x="327" y="1218.606">Include firmware measurements</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="168" x="327" y="1233.7388">and associated metadata.</text><rect fill="#FEFFDD" height="23" style="stroke:#181818;stroke-width:0.5;" width="148" x="356" y="1250.8047"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="360" y="1266.8716">Sign the token by IAK.</text><polygon fill="#181818" points="249.5,1296.0703,239.5,1300.0703,249.5,1304.0703,245.5,1300.0703" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="243.5" x2="429.5" y1="1300.0703" y2="1300.0703"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="168" x="255.5" y="1295.0044">get_initial_attestion_token</text><polygon fill="#181818" points="104.5,1325.2031,94.5,1329.2031,104.5,1333.2031,100.5,1329.2031" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="98.5" x2="237.5" y1="1329.2031" y2="1329.2031"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="64" x="110.5" y="1324.1372">get_token</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="177" x="5" y="1342.2031"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="169" x="9" y="1358.27">Create and sign sub-token</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="113" x="9" y="1373.4028">by delegated key.</text><rect fill="#FEFFDD" height="38" style="stroke:#181818;stroke-width:0.5;" width="161" x="13" y="1390.4688"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="113" x="17" y="1406.5356">Create final token</text><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="153" x="17" y="1421.6685">including all sub-tokens.</text><!--MD5=[ae5a7bee97e920dfe78c75c7082bfd3c]
@startuml
participant Application
participant Delegated_attestation
participant Initial_attestation
participant Crypto
participant Measured_boot
participant Other_subsystem
participant Bootloaders
== TF-M Boot phase ==
Rnote over Bootloaders: Get the IAK from the platform.\n\ IAK might derive from\n\ seed or pre-provisioned.
Bootloaders -> Crypto: Pass Initial Attestation Key to Crypto
Rnote over Bootloaders: Get the seed of\n\ Platform Attestation Key\n\ from the platform.
Bootloaders -> Crypto: Pass Platform Attestation Key to Crypto
Rnote over Bootloaders: Store firmware measurements\n\ and metadata to buffer
Rnote over Measured_boot: Read measurement\n\ and metadata from buffer\n\ at service init.
== TF-M Runtime ==
Rnote over Other_subsystem: Firmware is measured\n\ at boot.
Other_subsystem -> Measured_boot: extend_measurement
Other_subsystem -> Measured_boot: extend_measurement
Application -> Delegated_attestation: get_delegated_key
Rnote over Delegated_attestation: Preparation to key\n\ derivation. Query all platform\n\ firmware measurements.
Delegated_attestation -> Measured_boot: read_measurement
Rnote over Delegated_attestation: Hashing the measurements\n\ and associated metadata.
Delegated_attestation -> Crypto: psa_hash_compute
Rnote over Delegated_attestation: Derive delegated key\n\ from seed. Input is the\n\ hash of measurements.
Delegated_attestation -> Crypto: psa_derive_key
Delegated_attestation -> Application: get_delegated_key
Rnote over Application: Private key is returned.\n\ Public part is computed\n\ by the caller.
Rnote over Application: Hash of public key\n\ is computed.
Application -> Delegated_attestation: get_token
Rnote over Delegated_attestation: Hash of public key\n\ is received as input.\n\ Compare against previously\n\ derived key.
Delegated_attestation-> Initial_attestation: get_initial_attestion_token
Rnote over Initial_attestation: Produce the token including\n\ the hash of public key as the\n\ Challenge claim
Initial_attestation -> Measured_boot: read_measurement
Rnote over Initial_attestation: Include firmware measurements\n\ and associated metadata.
Rnote over Initial_attestation: Sign the token by IAK.
Initial_attestation -> Delegated_attestation: get_initial_attestion_token
Delegated_attestation -> Application: get_token
Rnote over Application: Create and sign sub-token\n\ by delegated key.
Rnote over Application: Create final token\n\ including all sub-tokens.
@enduml
PlantUML version 1.2022.7(Mon Aug 22 19:01:30 CEST 2022)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: UTF-8
Language: hu
Country: HU
--></g></svg>