From 749cb111e81095581b029648b3c53fe574dd447c Mon Sep 17 00:00:00 2001 From: Marten Rebane Date: Mon, 22 Jun 2026 16:52:36 +0300 Subject: [PATCH] Add more info to CDOC2 addressee details --- .../crypto/recipient/RecipientDetailItem.kt | 33 +++++++- app/src/main/res/values-et/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + .../ee/ria/DigiDoc/cryptolib/Addressee.kt | 4 + .../ria/DigiDoc/cryptolib/CryptoContainer.kt | 77 +++++++++---------- 5 files changed, 75 insertions(+), 45 deletions(-) diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/recipient/RecipientDetailItem.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/recipient/RecipientDetailItem.kt index 6f1e7033f..de566458d 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/recipient/RecipientDetailItem.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/recipient/RecipientDetailItem.kt @@ -47,13 +47,19 @@ data class RecipientDetailItem( recipientFormattedName: String?, recipientIssuerName: String?, recipientConcatKDFAlgorithmURI: String?, - ): List = - listOf( + ): List { + val recipientCertificate = recipient.data.x509Certificate() + return listOf( RecipientDetailItem( - icon = R.drawable.ic_m3_expand_content_48dp_wght400, + icon = + if (recipientCertificate != null) { + R.drawable.ic_m3_expand_content_48dp_wght400 + } else { + 0 + }, label = R.string.recipient_details_name_label, value = recipientFormattedName, - certificate = recipient.data.x509Certificate(), + certificate = recipientCertificate, contentDescription = if (value != null) { "${stringResource( @@ -111,5 +117,24 @@ data class RecipientDetailItem( }, testTag = "recipientCertificateValidTo", ), + RecipientDetailItem( + icon = 0, + label = R.string.recipient_details_key_label, + value = recipient.keyLabel, + testTag = "recipientKeyLabel", + ), + RecipientDetailItem( + icon = 0, + label = R.string.recipient_details_keyserver_label, + value = recipient.serverId, + testTag = "recipientServerId", + ), + RecipientDetailItem( + icon = 0, + label = R.string.recipient_details_transaction_label, + value = recipient.transactionId, + testTag = "recipientTransactionId", + ), ) + } } diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index fe8481bab..b05d1ea57 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -401,6 +401,9 @@ Adressaadi sertifikaadi väljaandja: ConcatKDF referaatmeetod: Adressaadi sertifikaadi aegumiskuupäev: + Adressaadi tehnilised andmed: + Serveri identifikaator: + Transaktsiooni identifikaator: Hoiatused diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 802e6abc5..e1b1d37cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -401,6 +401,9 @@ Recipient\'s Certificate issuer: ConcatKDF reference method: Recipient\'s Certificate expiry date: + Recipient\'s technical details: + Server identifier: + Transaction identifier: Warnings diff --git a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt index 32ce1500c..45a81842b 100644 --- a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt +++ b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/Addressee.kt @@ -45,6 +45,10 @@ class Addressee( var validTo: Date?, var concatKDFAlgorithmURI: String?, ) : Serializable { + var keyLabel: String? = null + var serverId: String? = null + var transactionId: String? = null + constructor(cn: String, sn: String, certType: CertType, validTo: Date?, data: ByteArray) : this( data = data, identifier = "", diff --git a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt index e9e5fdbe1..807cd3dbf 100644 --- a/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt +++ b/crypto-lib/src/main/kotlin/ee/ria/DigiDoc/cryptolib/CryptoContainer.kt @@ -169,65 +169,60 @@ class CryptoContainer context: Context, file: File, ): CryptoContainer { - val dataFiles = ArrayList() - var recipients = ArrayList() - if (file.extension == CDOC1_EXTENSION) { - val cdoc1Container = openCDOC1(context, file) - dataFiles.addAll(cdoc1Container.getDataFiles()) - recipients.addAll(cdoc1Container.getRecipients()) - } + val cdoc1 = if (file.extension == CDOC1_EXTENSION) openCDOC1(context, file) else null - val addressees = ArrayList() val cdocReader = CDocReader.createReader(file.path, null, null, null) debugLog(LOG_TAG, "Reader created: (version ${cdocReader.version})") - - withContext(IO) { - cdocReader.locks.forEach { lock -> - if (lock.isCertificate) { - var concatKDFAlgorithmURI = "" - if (!lock.isRSA) { - concatKDFAlgorithmURI = lock.getString(Lock.Params.CONCAT_DIGEST) - } - addressees.add( - Addressee(lock.label, lock.getBytes(Lock.Params.CERT), concatKDFAlgorithmURI), - ) - } else if (lock.isPKI) { - addressees.add( - Addressee(lock.label, lock.getBytes(Lock.Params.RCPT_KEY), ""), - ) - } else if (lock.isSymmetric) { - addressees.add( - Addressee(lock.label, "", CertType.UnknownType, null, ByteArray(0)), - ) - } else { - addressees.add(Addressee("Unknown capsule", ByteArray(0), "")) + val lockAddressees = + withContext(IO) { + try { + cdocReader.locks.map(::addresseeOf) + } finally { + cdocReader.delete() } } - cdocReader.delete() - } - if (!recipients.isEmpty()) { - addressees.forEach { addressee -> - recipients.forEach { recipient -> - if (addressee.data.contentEquals(recipient.data)) { - recipient.concatKDFAlgorithmURI = addressee.concatKDFAlgorithmURI - } + val cdoc1Recipients = cdoc1?.getRecipients().orEmpty() + val recipients = + if (cdoc1Recipients.isNotEmpty()) { + cdoc1Recipients.onEach { recipient -> + lockAddressees + .firstOrNull { it.data.contentEquals(recipient.data) } + ?.let { recipient.concatKDFAlgorithmURI = it.concatKDFAlgorithmURI } } + } else { + lockAddressees } - } else { - recipients = addressees - } return create( context, file, - dataFiles, + cdoc1?.getDataFiles().orEmpty(), recipients, decrypted = false, encrypted = true, ) } + private fun addresseeOf(lock: Lock): Addressee = + when { + lock.isCDoc1 -> + Addressee(lock.getBytes(Lock.Params.CERT)).apply { + if (!lock.isRSA) { + concatKDFAlgorithmURI = lock.getString(Lock.Params.CONCAT_DIGEST) + } + } + lock.isPKI -> Addressee(lock.label, lock.getBytes(Lock.Params.RCPT_KEY), "") + lock.isSymmetric -> Addressee(lock.label, "", CertType.UnknownType, null, ByteArray(0)) + else -> Addressee("Unknown capsule", ByteArray(0), "") + }.apply { + keyLabel = lock.label.takeIf { it.isNotBlank() } + if (lock.type == Lock.Type.SERVER) { + serverId = lock.getString(Lock.Params.KEYSERVER_ID).takeIf { it.isNotBlank() } + transactionId = lock.getString(Lock.Params.TRANSACTION_ID).takeIf { it.isNotBlank() } + } + } + @Throws(CryptoException::class) suspend fun openCDOC1( context: Context,