1
0
mirror of https://github.com/corona-warn-app/cwa-documentation synced 2024-12-29 16:12:13 +01:00

docs(evreg): describr QR code structure

This commit is contained in:
Maximilian Lenkeit 2021-03-15 16:52:13 +01:00
parent f72246d830
commit 2520f8eb74
3 changed files with 325 additions and 5 deletions

View File

@ -0,0 +1,241 @@
<mxfile host="65bd71144e" modified="2021-03-15T15:07:44.022Z" agent="5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Code/1.53.2 Chrome/87.0.4280.141 Electron/11.2.1 Safari/537.36" etag="8CnW0Otjv8OAn7Zv3dlT" scale="1" border="10" version="14.2.4" type="embed">
<diagram id="y4RHKREWKgkQFSqtG2Zm" name="Page-1">
<mxGraphModel dx="1286" dy="877" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" background="#FFFFFF" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="80" value="CWA Server&#10;&#10;&#10;&#10;&#10;&#10;" style="shape=agent;offsetSize=8;strokeWidth=2;align=left;verticalAlign=top;spacingLeft=2;" parent="1" vertex="1">
<mxGeometry x="435" y="490" width="405" height="300" as="geometry"/>
</mxCell>
<mxCell id="2" value="CWA Client (host perspective)" style="shape=agent;offsetSize=8;strokeWidth=2;align=left;spacing=2;verticalAlign=top;spacingTop=0;spacingLeft=2;" parent="1" vertex="1">
<mxGeometry x="40" y="160" width="460" height="270" as="geometry"/>
</mxCell>
<mxCell id="4" value="    Host" style="shape=actor;horizontalLabelPosition=right;align=left;labelPosition=right;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="254" y="30" width="25" height="50" as="geometry"/>
</mxCell>
<mxCell id="5" value="TraceLocation&lt;br&gt;{ GUID, Description, Date }" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="300" y="370" width="190" height="50" as="geometry"/>
</mxCell>
<mxCell id="6" value="CWA Client  (attendee perspective)" style="shape=agent;offsetSize=8;strokeWidth=2;spacingTop=0;align=left;verticalAlign=top;spacing=2;spacingLeft=2;" parent="1" vertex="1">
<mxGeometry x="640" y="160" width="740" height="270" as="geometry"/>
</mxCell>
<mxCell id="68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="7" target="66" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="710" y="370"/>
<mxPoint x="710" y="370"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="7" value="&amp;nbsp;Check-In&lt;br&gt;{ TraceLocation, Start, End }" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="660" y="380" width="440" height="40" as="geometry"/>
</mxCell>
<mxCell id="8" value="   Attendee" style="shape=actor;horizontalLabelPosition=right;align=left;labelPosition=right;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="877.5" y="30" width="25" height="50" as="geometry"/>
</mxCell>
<mxCell id="10" value="Create TraceLocation" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;dx=3;dy=50;" parent="1" source="56" target="4" edge="1">
<mxGeometry x="0.5716" y="-1" height="160" relative="1" as="geometry">
<mxPoint x="320" y="320" as="sourcePoint"/>
<mxPoint x="320" y="160" as="targetPoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="11" value="Check in to &#10;TraceLocation" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;dx=4;dy=50;" parent="1" source="48" target="8" edge="1">
<mxGeometry x="0.501" y="1" height="160" relative="1" as="geometry">
<mxPoint x="450" y="320" as="sourcePoint"/>
<mxPoint x="450" y="160" as="targetPoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="13" value="CWA Event Registration" style="shape=agent;offsetSize=8;strokeWidth=2;align=left;verticalAlign=top;spacingLeft=2;" parent="1" vertex="1">
<mxGeometry x="40" y="490" width="380" height="300" as="geometry"/>
</mxCell>
<mxCell id="78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="14" target="52" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1085" y="490"/>
<mxPoint x="1316" y="490"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="14" value="CDN" style="shape=agent;offsetSize=8;strokeWidth=2;spacingLeft=2;align=left;verticalAlign=top;" parent="1" vertex="1">
<mxGeometry x="930" y="630" width="310" height="160" as="geometry"/>
</mxCell>
<mxCell id="15" value="TraceTimeIntervalWarning&lt;br&gt;{ GUID, Start, End, TRL }" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="945" y="720" width="275" height="40" as="geometry"/>
</mxCell>
<mxCell id="90" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="16" target="40" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="16" value="TraceTimeIntervalWarning&lt;br&gt;{ GUID, Start, End, TRL }" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="450" y="720" width="220" height="40" as="geometry"/>
</mxCell>
<mxCell id="18" value="TL GUID &lt;br&gt;Hash" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="70" y="720" width="100" height="40" as="geometry"/>
</mxCell>
<mxCell id="22" value="Upload check-in" style="shape=useedge;vertical=true;edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=none;useSignPosition=up;useSignDirection=east;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" parent="1" source="66" target="38" edge="1">
<mxGeometry x="-0.3671" y="20" width="70" height="160" relative="1" as="geometry">
<mxPoint x="280" y="400" as="sourcePoint"/>
<mxPoint x="460" y="410" as="targetPoint"/>
<mxPoint as="offset"/>
<Array as="points">
<mxPoint x="560" y="300"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" parent="1" source="26" target="45" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="26" value="TraceTimeIntervalWarning&lt;br&gt;{ GUID, Start, End, TRL }" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="1120" y="380" width="190" height="40" as="geometry"/>
</mxCell>
<mxCell id="28" value="TraceLocation Creation Handler" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="70" y="520" width="220" height="60" as="geometry"/>
</mxCell>
<mxCell id="29" value="TraceLocation&#10;GUID Generator" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="70" y="620" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="31" value="TraceLocation&#10;Signing" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="190" y="620" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="34" value="" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="29" target="28" edge="1">
<mxGeometry height="160" relative="1" as="geometry">
<mxPoint x="480" y="640" as="sourcePoint"/>
<mxPoint x="480" y="480" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="35" value="" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="31" target="28" edge="1">
<mxGeometry height="160" relative="1" as="geometry">
<mxPoint x="480" y="640" as="sourcePoint"/>
<mxPoint x="480" y="480" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="89" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" parent="1" source="38" target="16" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="615" y="610"/>
<mxPoint x="615" y="610"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="38" value="Submission Handler" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="450" y="520" width="220" height="60" as="geometry"/>
</mxCell>
<mxCell id="79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="40" target="15" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="40" value="CDN Publisher" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="720" y="710" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="88" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" parent="1" source="7" target="45" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="45" value="Matching &#10;Algorithm" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="1030" y="190" width="140" height="60" as="geometry"/>
</mxCell>
<mxCell id="87" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.523;entryY=0.017;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="48" target="7" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="48" value="QR Code &#10;Scanner" style="shape=agent;offsetSize=8;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="780" y="190" width="220" height="60" as="geometry"/>
</mxCell>
<mxCell id="50" value="" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="60" target="48" edge="1">
<mxGeometry height="160" relative="1" as="geometry">
<mxPoint x="870" y="540" as="sourcePoint"/>
<mxPoint x="870" y="380" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.627;entryY=0.017;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" parent="1" source="52" target="26" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="52" value="Downloader" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="1200" y="190" width="155" height="60" as="geometry"/>
</mxCell>
<mxCell id="56" value="Event Maintenance" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="60" y="190" width="420" height="60" as="geometry"/>
</mxCell>
<mxCell id="58" value="" style="shape=updateedge;endArrow=none;vertical=true;exitX=0.798;exitY=0.994;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitPerimeter=0;" parent="1" source="56" target="5" edge="1">
<mxGeometry width="30" height="80" relative="1" as="geometry">
<mxPoint x="315" y="430" as="sourcePoint"/>
<mxPoint x="315" y="510" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="59" value="" style="shape=updateedge;endArrow=none;vertical=true;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="29" target="18" edge="1">
<mxGeometry width="30" height="80" relative="1" as="geometry">
<mxPoint x="225" y="730" as="sourcePoint"/>
<mxPoint x="225" y="810" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="60" value="Signature&#10;Validator" style="shape=agent;offsetSize=8;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="780" y="290" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="66" value="Submission" style="shape=agent;offsetSize=8;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="660" y="190" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="84" value="Signature&#10;Validator" style="shape=agent;offsetSize=8;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="450" y="620" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="85" value="" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" parent="1" source="84" target="38" edge="1">
<mxGeometry height="160" relative="1" as="geometry">
<mxPoint x="800" y="620" as="sourcePoint"/>
<mxPoint x="800" y="460" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="91" value="QR Code &amp;&#10;Poster&#10;Generator" style="shape=agent;offsetSize=8;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="60" y="300" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="92" value="Create TraceLocation&#10;{ Description, Date, etc. }" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;" parent="1" source="28" target="56" edge="1">
<mxGeometry x="0.2384" y="22" height="160" relative="1" as="geometry">
<mxPoint x="235" y="520" as="sourcePoint"/>
<mxPoint x="270" y="250" as="targetPoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="93" value="" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.1;entryY=1.014;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="91" target="56" edge="1">
<mxGeometry height="160" relative="1" as="geometry">
<mxPoint x="470" y="540" as="sourcePoint"/>
<mxPoint x="470" y="380" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="94" value="" style="shape=useedge;vertical=true;edgeStyle=elbowEdgeStyle;elbow=vertical;endArrow=none;useSignPosition=up;useSignDirection=east;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;dx=350;dy=80;" parent="1" source="91" target="14" edge="1">
<mxGeometry width="70" height="160" relative="1" as="geometry">
<mxPoint x="320" y="665" as="sourcePoint"/>
<mxPoint x="390" y="505" as="targetPoint"/>
<Array as="points">
<mxPoint x="480" y="460"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="95" value="Poster Template" style="rounded=1;whiteSpace=wrap;html=1;arcSize=60;strokeWidth=2;" parent="1" vertex="1">
<mxGeometry x="947.5" y="660" width="275" height="40" as="geometry"/>
</mxCell>
<mxCell id="97" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="96" target="95" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="96" value="Template&#10;Publisher" style="shape=agent;offsetSize=8;strokeWidth=2;align=center;" parent="1" vertex="1">
<mxGeometry x="720" y="630" width="100" height="60" as="geometry"/>
</mxCell>
<mxCell id="98" value="   Attendee" style="shape=actor;horizontalLabelPosition=right;align=left;labelPosition=right;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="697.5" y="30" width="25" height="50" as="geometry"/>
</mxCell>
<mxCell id="100" value="Warn others" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;dx=0;dy=50;" edge="1" parent="1" source="66" target="98">
<mxGeometry x="0.4499" y="5" height="160" relative="1" as="geometry">
<mxPoint x="1010" y="470" as="sourcePoint"/>
<mxPoint x="1010" y="310" as="targetPoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="101" value="   Attendee" style="shape=actor;horizontalLabelPosition=right;align=left;labelPosition=right;strokeWidth=2;" vertex="1" parent="1">
<mxGeometry x="1075" y="30" width="25" height="50" as="geometry"/>
</mxCell>
<mxCell id="102" value="Trigger notification" style="shape=useedge;vertical=true;endArrow=none;useSignPosition=left;useSignDirection=south;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="101" target="45">
<mxGeometry x="-0.4563" y="-2" height="160" relative="1" as="geometry">
<mxPoint x="1300" y="260" as="sourcePoint"/>
<mxPoint x="1300" y="100" as="targetPoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

View File

@ -1,11 +1,90 @@
# Event Registration - Summary
**NB: Draft, supposed to be released on GitHub for an open discussion.**
Presence Tracing - in CWA also referred to as _Event Registration_ - aims at notifying people of a potential SARS-CoV-2 infection if they have been to the same venue at a similar time than a positively tested individual. It addresses the potential of airborne transmission in spaces with poor ventilation despite maintaining physical distance. As such, it complements BLE-based proximity tracing with the Exposure Notification Framework.
CWA proposes a fully-automated decentral solution for Presence Tracing which works independent of local health authorities. It integrates into the existing verification processes of CWA to issue warnings. The solution prioritizes the speed of issuing warnings over their accuracy. A higher degree of accuracy would require manual assessment by local health authorities and the respective resources to do so and is currently not on scope.
CWA proposes a fully-automated decentral solution for Presence Tracing which works independent of local health authorities. It integrates into the existing verification processes of CWA in order to issue warnings. The solution prioritizes the speed of issuing warnings over their accuracy. A higher degree of accuracy would require manual assessment of each warning by local health authorities and the respective resources to do so and is currently not on scope.
In summary, the proposed solution allows a _host_ to create a venue through CWA. All necessary data about the venue is encoded in a QR code which can be presented on a mobile device or printed out, for example to be posted at the entrance of the venue. An _attendee_ can check in to the venue by scanning the QR code. Check-ins are stored locally on the mobile device and deleted automatically after two weeks.
In summary, the proposed solution allows a _host_ to create a venue through CWA. All required attributes about the venue are encoded in a QR code which can be presented on a mobile device or printed out, for example to be posted at the entrance of the venue. An _attendee_ can check in to the venue by scanning the QR code. Check-ins are stored locally on the mobile device and deleted automatically after two weeks.
When an attendee tests positive for SARS-CoV-2, they can upload their check-ins along with their Diagnosis Keys to the CWA Server. The CWA Server publishes the relevant check-ins on CDN as _warnings_. Clients regularly download these warnings and match them against the local check-ins on the mobile device. If there is a match and the time an attendee spent at a venue overlaps with a warning for a sufficiently long time, the attendee receives a warning in CWA similar to how warnings are issued for BLE-based exposures.
When an attendee tests positive for SARS-CoV-2, they can upload their check-ins along with their Diagnosis Keys to the CWA Server. The CWA Server publishes the relevant check-ins on CDN as _warnings_. Clients regularly download these warnings and match them against the local check-ins on the mobile device. If there is a match and the time an attendee spent at a venue overlaps with a warning for a sufficiently long time, the attendee receives a warning in CWA similar to how warnings are issued for BLE-based exposures.
![TAM Diagram for Event Registration](./../../diagrams/png/evreg-tam-block.png)
## QR Code Structure
The QR code of a venue contains all required attributes for Presence Tracing, so that no server communication is necessary when an attendee checks in to a venue
The data structure is described by the following Protocol Buffer message `TraceLocation`:
```protobuf
message TraceLocation {
// uuid
string guid = 1;
uint32 version = 2;
TraceLocationType type = 3;
// max. 150 characters
string description = 4;
// max. 150 characters
string address = 5;
// UNIX timestamp (in seconds)
uint64 startTimestamp = 6;
// UNIX timestamp (in seconds)
uint64 endTimestamp = 7;
uint32 defaultCheckInLengthInMinutes = 8;
}
enum TraceLocationType {
LOCATION_TYPE_UNSPECIFIED = 0;
LOCATION_TYPE_PERMANENT_OTHER = 1;
LOCATION_TYPE_TEMPORARY_OTHER = 2;
LOCATION_TYPE_PERMANENT_RETAIL = 3;
LOCATION_TYPE_PERMANENT_FOOD_SERVICE = 4;
LOCATION_TYPE_PERMANENT_CRAFT = 5;
LOCATION_TYPE_PERMANENT_WORKPLACE = 6;
LOCATION_TYPE_PERMANENT_EDUCATIONAL_INSTITUTION = 7;
LOCATION_TYPE_PERMANENT_PUBLIC_BUILDING = 8;
LOCATION_TYPE_TEMPORARY_CULTURAL_EVENT = 9;
LOCATION_TYPE_TEMPORARY_CLUB_ACTIVITY = 10;
LOCATION_TYPE_TEMPORARY_PRIVATE_EVENT = 11;
LOCATION_TYPE_TEMPORARY_WORSHIP_SERVICE = 12;
}
```
The `guid` attribute is generated by the CWA Server to ensure uniqueness across all CWA QR codes. The data structure is signed by the CWA Server with its private key to prevent tampering of the QR code or identity theft of the GUID of a venue.
The combination of signature and TraceLocation is represented in the following Protocol Buffer message `SignedTraceLocation`:
```protobuf
message SignedTraceLocation {
// byte representation of a TraceLocation
bytes location = 1;
// byte representation of the signature of the TraceLocation
bytes signature = 2;
}
```
A SignedTraceLocation is base32-encoded and included in a URL. The URL is the content of the QR code and structures as follows:
```shell
HTTPS://E.CORONAWARN.APP/C1/<SIGNED_TRACE_LOCATION_BASE32>
# example:
HTTPS://E.CORONAWARN.APP/C1/BIPEY33...
```
The base32 encoding allows to leverage the input mode _alphanumeric_ when generating the QR code and produces a QR code with a lower density compared to base64 encoding.
### Interoperability with Other Contact Tracing Apps
Other contact tracing apps that leverage QR code for Presence Tracing can integrate with CWA by including the necessary attributes in their QR code.
These attributes are:
- SignedTraceLocation - a byte representation of the Protocol Buffer message `SignedTraceLocation`. Note that the data must still be signed by the CWA server. This information may be encoded as `base32` (recommended) or `base64`.
- Version - an integer to allow versioning
A regular expression must be provided to allow matching and validating supported QR codes and extracting the necessary attributes.
Any contact tracing apps that integrate with CWA must ensure that they do not process any information from the CWA part of the QR code.