From f957877cc5b21caa6c9234ec6758c1d6988f693f Mon Sep 17 00:00:00 2001 From: Alvin See Date: Mon, 26 Feb 2024 16:42:16 -0800 Subject: [PATCH] React SignedData and EnvelopedData toString by default and expose helper methods for unredacted values --- .../main/kotlin/app/cash/trifle/SignedData.kt | 11 +++++++++ .../test/kotlin/app/cash/trifle/TrifleTest.kt | 24 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/common/src/main/kotlin/app/cash/trifle/SignedData.kt b/common/src/main/kotlin/app/cash/trifle/SignedData.kt index 8b430ba..306ae58 100644 --- a/common/src/main/kotlin/app/cash/trifle/SignedData.kt +++ b/common/src/main/kotlin/app/cash/trifle/SignedData.kt @@ -79,6 +79,11 @@ data class SignedData internal constructor( } ).encode() + fun toPlaintextString(): String = + "SignedData(enveloped_data=${envelopedData.toPlaintextString()}, " + + "signature=$signature, " + + "certificates=$certificates)" + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false @@ -131,6 +136,9 @@ data class SignedData internal constructor( data_ = data.toByteString() ).encode() + fun toPlaintextString(): String = + "EnvelopedData(version=$version, signingAlgorithm=$signingAlgorithm, data=$data)" + override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false @@ -151,6 +159,9 @@ data class SignedData internal constructor( return result } + override fun toString(): String = + "EnvelopedData(version=$version, signingAlgorithm=$signingAlgorithm, data=[REDACTED])" + internal companion object { internal const val ENVELOPED_DATA_VERSION: Int = 0 diff --git a/common/src/test/kotlin/app/cash/trifle/TrifleTest.kt b/common/src/test/kotlin/app/cash/trifle/TrifleTest.kt index 200d7a4..2994f39 100644 --- a/common/src/test/kotlin/app/cash/trifle/TrifleTest.kt +++ b/common/src/test/kotlin/app/cash/trifle/TrifleTest.kt @@ -16,6 +16,8 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows import java.time.Duration +import kotlin.test.assertContains +import kotlin.test.assertContentEquals internal class TrifleTest { @Nested @@ -175,6 +177,28 @@ internal class TrifleTest { assertEquals(endEntity.createSignedData(rawData).envelopedData.data, rawData) } + @Test + fun `test createSignedData succeeds with SignedData#toString properly redacted`() { + val signedData = endEntity.createSignedData(rawData) + + assertTrue(signedData.toString().contains("[REDACTED]")) + assertTrue(signedData.envelopedData.toString().contains("[REDACTED]")) + + assertFalse(signedData.toString().contains(rawData.toString())) + assertFalse(signedData.envelopedData.toString().contains(rawData.toString())) + } + + @Test + fun `test createSignedData succeeds with SignedData#toPlaintextString not redacted`() { + val signedData = endEntity.createSignedData(rawData) + + assertTrue(signedData.toPlaintextString().contains(rawData.toString())) + assertTrue(signedData.envelopedData.toPlaintextString().contains(rawData.toString())) + + assertFalse(signedData.toPlaintextString().contains("[REDACTED]")) + assertFalse(signedData.envelopedData.toPlaintextString().contains("[REDACTED]")) + } + @Test fun `test createSignedData fails with InvalidSignature due to signature not matching on verify`() { assertThrows {