diff --git a/identity-mdoc/src/main/java/com/android/identity/mdoc/response/DeviceResponseGenerator.kt b/identity-mdoc/src/main/java/com/android/identity/mdoc/response/DeviceResponseGenerator.kt index 3d5901d2e..179e563ed 100644 --- a/identity-mdoc/src/main/java/com/android/identity/mdoc/response/DeviceResponseGenerator.kt +++ b/identity-mdoc/src/main/java/com/android/identity/mdoc/response/DeviceResponseGenerator.kt @@ -34,6 +34,7 @@ import com.android.identity.cbor.Tagged */ class DeviceResponseGenerator(private val mStatusCode: Long) { private val mDocumentsBuilder = CborArray.builder() + private var mDocumentAdded = false /** * Adds a new document to the device response. @@ -87,6 +88,8 @@ class DeviceResponseGenerator(private val mStatusCode: Long) { errors: Map>?, encodedIssuerAuth: ByteArray ) = apply { + mDocumentAdded = true + val insOuter = CborMap.builder() for ((ns, encodedIssuerSignedItemBytesList) in issuerNameSpaces) { insOuter.putArray(ns!!).let { insInner -> @@ -150,6 +153,8 @@ class DeviceResponseGenerator(private val mStatusCode: Long) { * @return the generator. */ fun addDocument(encodedDocument: ByteArray) = apply { + mDocumentAdded = true + mDocumentsBuilder.add(Cbor.decode(encodedDocument)) } @@ -161,7 +166,9 @@ class DeviceResponseGenerator(private val mStatusCode: Long) { fun generate(): ByteArray = CborMap.builder().run { put("version", "1.0") - put("documents", mDocumentsBuilder.end().build()) + if (mDocumentAdded) { + put("documents", mDocumentsBuilder.end().build()) + } // TODO: The documentErrors map entry should only be present if there is a non-zero // number of elements in the array. Right now we don't have a way for the application // to convey document errors but when we add that API we'll need to do something so diff --git a/identity-mdoc/src/test/java/com/android/identity/mdoc/response/DeviceResponseGeneratorTest.kt b/identity-mdoc/src/test/java/com/android/identity/mdoc/response/DeviceResponseGeneratorTest.kt index 376350f16..c99dfb8be 100644 --- a/identity-mdoc/src/test/java/com/android/identity/mdoc/response/DeviceResponseGeneratorTest.kt +++ b/identity-mdoc/src/test/java/com/android/identity/mdoc/response/DeviceResponseGeneratorTest.kt @@ -48,6 +48,7 @@ import com.android.identity.securearea.software.SoftwareSecureArea import com.android.identity.storage.EphemeralStorageEngine import com.android.identity.storage.StorageEngine import com.android.identity.util.Timestamp +import com.android.identity.util.fromHex import kotlinx.datetime.Clock import kotlinx.datetime.Instant import org.bouncycastle.jce.provider.BouncyCastleProvider @@ -544,6 +545,17 @@ class DeviceResponseGeneratorTest { Assert.assertEquals("foo1", doc.getIssuerEntryString("ns2", "bar1")) } + @Test + @Throws(Exception::class) + fun testDocumentGeneratorNoDocuments() { + val deviceResponseGenerator = DeviceResponseGenerator(20) + val encodedDeviceResponse = deviceResponseGenerator.generate() + + // cbor of a DeviceResponse with no documents key: {"version": "1.0", "status": 20} + Assert.assertArrayEquals("A26776657273696F6E63312E306673746174757314".fromHex, encodedDeviceResponse) + } + + companion object { const val DOC_TYPE = "com.example.document_xyz" }