diff --git a/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json b/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json index 0c3879814dfc4eb159dcfa3c0fb85f9e900f83d1..54da7b80528062afa11d3f8b44b2f2924b26e032 100644 --- a/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json +++ b/Corona-Warn-App/schemas/de.rki.coronawarnapp.eventregistration.storage.TraceLocationDatabase/1.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "3130771db80d789cd0ef50b8d24e0354", + "identityHash": "58db835392620886de3bb25c22d5190a", "entities": [ { "tableName": "checkin", @@ -116,7 +116,7 @@ }, { "tableName": "traceLocations", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`guid` TEXT NOT NULL, `version` INTEGER NOT NULL, `type` INTEGER NOT NULL, `description` TEXT NOT NULL, `address` TEXT NOT NULL, `startDate` TEXT, `endDate` TEXT, `defaultCheckInLengthInMinutes` INTEGER, `signature` TEXT NOT NULL, PRIMARY KEY(`guid`))", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`guid` TEXT NOT NULL, `version` INTEGER NOT NULL, `type` INTEGER NOT NULL, `description` TEXT NOT NULL, `address` TEXT NOT NULL, `startDate` TEXT, `endDate` TEXT, `defaultCheckInLengthInMinutes` INTEGER, `byteRepresentation` TEXT NOT NULL, `signature` TEXT NOT NULL, PRIMARY KEY(`guid`))", "fields": [ { "fieldPath": "guid", @@ -165,6 +165,11 @@ "columnName": "defaultCheckInLengthInMinutes", "affinity": "INTEGER", "notNull": false + },{ + "fieldPath": "byteRepresentationBase64", + "columnName": "byteRepresentation", + "affinity": "TEXT", + "notNull": true }, { "fieldPath": "signatureBase64", @@ -186,7 +191,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3130771db80d789cd0ef50b8d24e0354')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '58db835392620886de3bb25c22d5190a')" ] } } \ No newline at end of file diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt index 50a7c51e6e961f3b2a6d6c2d2a24861add6df099..ec31032439efba8ec6ccb5feab9b4a8b417240bd 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifierTest.kt @@ -61,6 +61,7 @@ class TraceLocationVerifierTest : BaseTestInstrumentation() { startDate = Instant.ofEpochSecond(2687955), endDate = Instant.ofEpochSecond(2687991), defaultCheckInLengthInMinutes = 0, + byteRepresentation = verifyResult.signedTraceLocation.location.toByteArray().toByteString(), signature = verifyResult.signedTraceLocation.signature.toByteArray().toByteString() ) @@ -193,6 +194,7 @@ class TraceLocationVerifierTest : BaseTestInstrumentation() { startDate = Instant.ofEpochSecond(2687955), endDate = Instant.ofEpochSecond(2687991), defaultCheckInLengthInMinutes = 0, + byteRepresentation = signedTraceLocation.location.toByteArray().toByteString(), signature = signedTraceLocation.signature.toByteArray().toByteString() ) } diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt index fe4fa4ee2f741b715303bd15ad8cb97eea3489d0..f59d0d6dc4696349a70df8e77b3bc44255ed9eb4 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/storage/TraceLocationDatabaseData.kt @@ -16,6 +16,7 @@ object TraceLocationDatabaseData { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = null, + byteRepresentationBase64 = "byteRepresentationBase64", signatureBase64 = "signature1" ) @@ -28,6 +29,7 @@ object TraceLocationDatabaseData { startDate = null, endDate = null, defaultCheckInLengthInMinutes = 15, + byteRepresentationBase64 = "byteRepresentationBase64", signatureBase64 = "signature2" ) } diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt index dcce1bfc50029ece59c210e8694284f1ce62bb37..264bb97c7c25f274b7e3ab1a6cb46668d04035f0 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/createevent/CreateEventTestViewModel.kt @@ -59,6 +59,7 @@ class CreateEventTestViewModel @AssistedInject constructor( startDate?.toInstant(), endDate?.toInstant(), defaultCheckInLengthInMinutes.toInt(), + "ByteRepresentation".toByteArray().toByteString(), "ServerSignature".toByteArray().toByteString() ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt index 2d2f867afe7895125d8b2393d588050d8887c669..2e95213bccddbae985b585fefed43bd0707bf84f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocation.kt @@ -19,6 +19,7 @@ data class TraceLocation( val startDate: Instant?, val endDate: Instant?, val defaultCheckInLengthInMinutes: Int?, + val byteRepresentation: ByteString, val signature: ByteString, val version: Int = TRACE_LOCATION_VERSION, ) : Parcelable @@ -33,6 +34,7 @@ fun TraceLocationEntity.toTraceLocation() = TraceLocation( startDate = startDate, endDate = endDate, defaultCheckInLengthInMinutes = defaultCheckInLengthInMinutes, + byteRepresentation = byteRepresentationBase64.decodeBase64()!!, signature = signatureBase64.decodeBase64()!!, version = version ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt index 164ec045ad3946a783ab26b2752e87ca8a6f87c0..b68af8ee04bcd43b04f2dc03a692863d8de57b60 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/TraceLocationVerifyResult.kt @@ -29,6 +29,7 @@ data class TraceLocationVerifyResult( startDate = traceLocation.startTimestamp.toInstant(), endDate = traceLocation.endTimestamp.toInstant(), defaultCheckInLengthInMinutes = traceLocation.defaultCheckInLengthInMinutes, + byteRepresentation = signedTraceLocation.location.toByteArray().toByteString(), signature = signedTraceLocation.signature.toByteArray().toByteString() ) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt index b6b1e032b0b8d796ee501eca1100f0b0c26cc293..cf295e62bf2d6c00280ca1961b5da3f99ed9ea56 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntity.kt @@ -18,8 +18,8 @@ data class TraceLocationEntity( @ColumnInfo(name = "startDate") val startDate: Instant?, @ColumnInfo(name = "endDate") val endDate: Instant?, @ColumnInfo(name = "defaultCheckInLengthInMinutes") val defaultCheckInLengthInMinutes: Int?, + @ColumnInfo(name = "byteRepresentation") val byteRepresentationBase64: String, @ColumnInfo(name = "signature") val signatureBase64: String - ) fun TraceLocation.toTraceLocationEntity(): TraceLocationEntity = @@ -31,6 +31,7 @@ fun TraceLocation.toTraceLocationEntity(): TraceLocationEntity = startDate = startDate, endDate = endDate, defaultCheckInLengthInMinutes = defaultCheckInLengthInMinutes, + byteRepresentationBase64 = byteRepresentation.base64(), signatureBase64 = signature.base64(), version = version ) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt index b36cfeac9f26cf82d4fc75aa1439fad097549602..88032335e06c03d8d6ccbdc8606b8da673f46b68 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt @@ -25,6 +25,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = 15, + byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(), signatureBase64 = "signature".toByteArray().toByteString().base64() ).toTraceLocation() shouldBe TraceLocation( guid = "TestGuid", @@ -35,6 +36,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = 15, + byteRepresentation = "byteRepresentation".toByteArray().toByteString(), signature = "signature".toByteArray().toByteString() ) } @@ -50,6 +52,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = null, endDate = null, defaultCheckInLengthInMinutes = null, + byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(), signatureBase64 = "signature".toByteArray().toByteString().base64() ).toTraceLocation() shouldBe TraceLocation( guid = "TestGuid", @@ -60,6 +63,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = null, endDate = null, defaultCheckInLengthInMinutes = null, + byteRepresentation = "byteRepresentation".toByteArray().toByteString(), signature = "signature".toByteArray().toByteString() ) } @@ -76,6 +80,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = 15, + byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(), signatureBase64 = "signature".toByteArray().toByteString().base64() ), TraceLocationEntity( @@ -87,6 +92,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = null, endDate = null, defaultCheckInLengthInMinutes = null, + byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(), signatureBase64 = "signature".toByteArray().toByteString().base64() ) ).toTraceLocations() shouldBe listOf( @@ -99,6 +105,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = 15, + byteRepresentation = "byteRepresentation".toByteArray().toByteString(), signature = "signature".toByteArray().toByteString() ), TraceLocation( @@ -110,6 +117,7 @@ internal class DefaultTraceLocationKtTest : BaseTest() { startDate = null, endDate = null, defaultCheckInLengthInMinutes = null, + byteRepresentation = "byteRepresentation".toByteArray().toByteString(), signature = "signature".toByteArray().toByteString() ) ) diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt index 5a0b6ad5231c54a386b6d751d448162e8bbf55cb..40c90f1d0d90ab19093da5d4dc1898c48ad61f03 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt @@ -22,6 +22,7 @@ internal class TraceLocationEntityTest : BaseTest() { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = 15, + byteRepresentation = "byteRepresentation".toByteArray().toByteString(), signature = "signature".toByteArray().toByteString() ).toTraceLocationEntity() shouldBe TraceLocationEntity( guid = "TestGuid", @@ -32,6 +33,7 @@ internal class TraceLocationEntityTest : BaseTest() { startDate = Instant.parse("2021-01-01T12:00:00.000Z"), endDate = Instant.parse("2021-01-01T18:00:00.000Z"), defaultCheckInLengthInMinutes = 15, + byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(), signatureBase64 = "signature".toByteArray().toByteString().base64() ) } @@ -47,6 +49,7 @@ internal class TraceLocationEntityTest : BaseTest() { startDate = null, endDate = null, defaultCheckInLengthInMinutes = null, + byteRepresentation = "byteRepresentation".toByteArray().toByteString(), signature = "signature".toByteArray().toByteString() ).toTraceLocationEntity() shouldBe TraceLocationEntity( guid = "TestGuid", @@ -57,6 +60,7 @@ internal class TraceLocationEntityTest : BaseTest() { startDate = null, endDate = null, defaultCheckInLengthInMinutes = null, + byteRepresentationBase64 = "byteRepresentation".toByteArray().toByteString().base64(), signatureBase64 = "signature".toByteArray().toByteString().base64() ) }