From de69dbf01c14c9ab724ef0333ac6356440f5629c Mon Sep 17 00:00:00 2001 From: cfig Date: Mon, 16 Jan 2023 00:28:20 +0800 Subject: [PATCH] Issue #109: support vendor_boot.img w/o dtb Now for boot V4, dtb may be in vendor_boot or vendor_kernel_boot. Google Change: https://android.googlesource.com/platform/system/tools/mkbootimg/+/053c389f03f3c14f86b808608ccb5669ff8b887a --- bbootimg/src/main/kotlin/avb/Avb.kt | 3 ++ .../src/main/kotlin/bootimg/v3/VendorBoot.kt | 34 +++++++++++++------ bbootimg/src/main/resources/known_keys.json | 13 +++++++ doc/layout.md | 30 ++++++++-------- .../src/main/kotlin/cfig/helper/Dumpling.kt | 6 ++++ 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/bbootimg/src/main/kotlin/avb/Avb.kt b/bbootimg/src/main/kotlin/avb/Avb.kt index dad1de3..5f6a823 100644 --- a/bbootimg/src/main/kotlin/avb/Avb.kt +++ b/bbootimg/src/main/kotlin/avb/Avb.kt @@ -237,6 +237,9 @@ class Avb { } } + /** + * verify the AVBInfo of [ai], the raw data is boxed into [dp]. + */ fun verify(ai: AVBInfo, dp: Dumpling<*>, parent: String = ""): Array { val ret: Array = arrayOf(true, "") val localParent = parent.ifEmpty { dp.getLabel() } diff --git a/bbootimg/src/main/kotlin/bootimg/v3/VendorBoot.kt b/bbootimg/src/main/kotlin/bootimg/v3/VendorBoot.kt index 64e39c1..32bcf80 100644 --- a/bbootimg/src/main/kotlin/bootimg/v3/VendorBoot.kt +++ b/bbootimg/src/main/kotlin/bootimg/v3/VendorBoot.kt @@ -266,12 +266,15 @@ data class VendorBoot( else -> { ByteBuffer.allocate(1024 * 1024 * 128).let { it.order(ByteOrder.LITTLE_ENDIAN) - //1. vendor ramdisks and dtb + //1. vendor ramdisks C.writePaddedFiles(it, this.ramdisk_table.ramdidks.map { rd -> rd.file }, this.info.pageSize) - C.writePaddedFile(it, this.dtb.file, this.info.pageSize) - //2. vrt + //2. dtb + if (this.dtb.size > 0) { + C.writePaddedFile(it, this.dtb.file, this.info.pageSize) + } + //3. vrt it.put(this.ramdisk_table.update().encode(this.info.pageSize)) - //3. bootconfig + //4. bootconfig if (this.bootconfig.file.isNotBlank()) { C.writePaddedFile(it, this.bootconfig.file, this.info.pageSize) } @@ -394,7 +397,9 @@ data class VendorBoot( it.addRow("-- ${entry.type} ramdisk[${index + 1}/${this.ramdisk_table.ramdidks.size}]", entry.file) it.addRow("------- extracted rootfs", "${workDir}root.${index + 1}") //basic ascii + //@formatter:off prints.add(Pair(" -- ${entry.type} ramdisk[${index + 1}/${this.ramdisk_table.ramdidks.size}]", entry.file)) + //@formatter:on prints.add(Pair(" ------- extracted rootfs", "${workDir}root.${index + 1}")) } } else { @@ -402,11 +407,16 @@ data class VendorBoot( prints.add(Pair("\\-- extracted ramdisk rootfs", "${workDir}root")) } it.addRule() - it.addRow("dtb", this.dtb.file) - prints.add(Pair("dtb", this.dtb.file)) - if (File(this.dtb.file + ".${dtsSuffix}").exists()) { - it.addRow("\\-- decompiled dts", dtb.file + ".${dtsSuffix}") - prints.add(Pair("\\-- decompiled dts", dtb.file + ".${dtsSuffix}")) + if (this.dtb.size > 0) { + it.addRow("dtb", this.dtb.file) + prints.add(Pair("dtb", this.dtb.file)) + if (File(this.dtb.file + ".${dtsSuffix}").exists()) { + it.addRow("\\-- decompiled dts", dtb.file + ".${dtsSuffix}") + prints.add(Pair("\\-- decompiled dts", dtb.file + ".${dtsSuffix}")) + } + } else { + it.addRow("dtb", "-") + prints.add(Pair("dtb", "-")) } if (this.bootconfig.size > 0) { it.addRule() @@ -444,7 +454,9 @@ data class VendorBoot( if (EnvironmentVerifier().isWindows) { log.info("\n" + Common.table2String(prints)) } else { + //@formatter:off log.info("\n\t\t\tUnpack Summary of ${info.output}\n{}\n{}{}", tableHeader.render(), tab.render(), tabVBMeta) + //@formatter:on } return this } @@ -485,7 +497,9 @@ data class VendorBoot( if (info.product.isNotBlank()) { addArgument("--board").addArgument(info.product) } - addArgument("--dtb").addArgument(dtb.file) + if (dtb.size > 0) { + addArgument("--dtb").addArgument(dtb.file) + } addArgument("--vendor_cmdline").addArgument(info.cmdline, false) addArgument("--header_version").addArgument(info.headerVersion.toString()) addArgument("--base").addArgument("0") diff --git a/bbootimg/src/main/resources/known_keys.json b/bbootimg/src/main/resources/known_keys.json index 69041d4..6cfddf9 100644 --- a/bbootimg/src/main/resources/known_keys.json +++ b/bbootimg/src/main/resources/known_keys.json @@ -60,5 +60,18 @@ "algorithm" : "SHA256_RSA2048", "pubk" : "AAAIAN3C1onuaVOoEOIIpxRB4slj0xuKT7t2yrvDzvHQhOAlM8vz+rnR//6imJ+ET07/dMvAE893FM5LnFQLNcUJ+FYIGjbYdzFCVSYErfVTq96e37/sxVT86Zuz392q8OBkY4UFzpNdwwzWq6J+0tAsEyu778ECITiPceTJgol7IxzjIljHccK3ffP9dQf1FziB6BBTOQBKj26J2KCqtSmXM3Kk4GeV0wdCMZUUcuWXGrt0UjmrD+xHa8jSj9+YRb7BWe+RfYCXtqrAaree/Q24GAm4nSznDjfSH4T50JiNBkaeOf9YZwQlh67JtFZbueUP5prlQ3eXmubddodnA0LdDkOJooBHvMZAM/73+AWtsf145vMRUdtuvj5Dp9shR+kHaBoB78kQ2vUcrT7eetQynrH1TtwpXzXqAfzHRfv1tw2icvPnjFYV7m3njNcrb05Bx/oMvqKzrx99kCZEWuVm8un3gC/ucW9cXkAB+onTQnfJbeS5XcbEPcZkuQ0b7BepCScYnMrlOMSClYYl8OPNK576YRa2KQxdWEbdukihNIhaZhBN/tqdszA2w2960rO70ektljBVPP6m2jcT5iV0spMiers5KtqZ8cy++Urhvg0mWiuPcnue4L7W59lf9bJVlkaFrBfOHvxMdgmmrHCgZd9278zJrYDgFK17kojwSqqqwCkoFQ==", "sha1" : "b2a02f1e56e366d727a1a8e089762fe0b91bbc84" +}, +{ + "device" : "Pixel 7 Pro", + "manufacturer" : "Google", + "algorithm" : "SHA256_RSA4096", + "pubk" : "AAAQAEnai4emBts8xKHH5hbkA/kKbIf+BAdgbGeWPJGs/c9M/q7jBvp0iN2yER93RWPM3sgCb0NVpwgAhB0kaKRNm9TtbA0CdzB/k+wCO38/sr24t+eBTCka0bwgxwUD0TGYNS5tZLB595jnRsM/zMxp6J5aus+pyqF8wDejJH3WCjIy2aQ3yM6xn+8qJGL+mRrpgtTG6q3rjWupuldAsS5X1ACPnekK7glTL3rOXE32wqCeDH3fVpUSZDoZB9vo/qoj29nU3EwCnGWybRfYo1KPua4IaKDcUnOhxe4APHKzwzN8dwWzu5aN3TWL9kvQ8UXLMghL+CsXmdZAHjhfCJqquuwilFNpbMGDlyq0xkZ3zlw5LOLzJMaPiW8KiYfJFts6bsazYlVCOzsd9VyrDBLzmpgob3QXzqanwZTWGLJuyksTVUwDr6aUIJRqf2Ly/jEePoYZSElV9y90j+SEUabLO63VJD1Me1APW4D7UNUOa9LH6sNf/ZkLlHVk+bfFh1ChtgypeVQzgxsuqgZELKE0rreQ6v+MPIyJRFohG43fCz174SDZMJHIx8CBcae6yZSDPJlxWvqwB0DP5TGPps6XcRyIASAs2WcDesQ+ZTzvc1UMGCkESfs0/H7ytiFwd3jC3m566y5zkS/rKNtM8Ya2zh+emg8YwcENOpZT2VlKobejT661ySunWX+3Saf8CX+apSYm5WuTaWHu1BwY6r4hX+AWej8aGjFjtscDr1ZYb/l5jPQmcaMUzHpSfTvq5dCOrrShhvvRZw/2di1HRR76YexlshR3ikehhlGHGFAQs/vuZ84bJn3x5RtPCZ92vxTsMpnj4vqyZD8OSqdcxZoG3ZFLtfWBcduOIBg1mN1AGSNQdwlDbtL+X9FhI6tHZ3to/UMZy4jYxJ8tIePCqPEqQnmlg+Dlt7KeChU9BpMH4CkqBKZIN9DFk4mLk9NS6heabR1GW0u15G/oKBcmxcUYgtIpXmHtfzL7avwqS5F086vBmkcp6AX903GZsabZaIET/2AcWgLUAW+SJxq+IlP+3YGAWJC4pPZZRyBcmsvC8aslnrn+oZYttfNTZcOxdaSBgybG5TR9oITQYKyChlmJXVIkeDYneQkQP/dYwWgKK5HVF/mc4rpq6tQIU9ePOp/jWh6jOHlRpzjHaQwJnKnVyJ+FOyvgY8KjK3U4LfZu4XPpVJk2pY76xzjE/YbqDE5znb/4XyaEpuC4TmTVeswl97rCn+wlYTXWn3cllKkSne2KhKidW9XKG1BssoFiqNgM2CoW25+HHxhgEwoXcY41Bim7PhG6E7ByxjYtTr26M+PBDn4ONDACAQBqhPDPalud3ljHmQZV4SSO7PG/TB2naAONav3q" +}, +{ + "device" : "GKI 2.0", + "manufacturer" : "Google", + "algorithm" : "SHA256_RSA4096", + "pubk" : "AAAQAB696fOqmcvPXp24WvrWaiOAGtKfhdEcA1qb8i/z1aNA7pMnUaJrP+eWn22VfnViO9+OhvdM6c7+9f6BtThWfyMgtYhGC1iLwBdy9ywNOqY+/AxLKv5IpCCAVL4AyRPf+22ETAjyIqdDykGCRC6LWIGXoWT+fBuZaGGQ635A5lqp1ZhMvaCaCd+fJpZ2NvymO3RRISZyhMaVSMJbGi3p6aLT8NuAzk7VxMIooBV5U5FQ3ExhWSakrjR/zoyFVazzhBtywAv/dXSxivaN/2BpoEXUWlZShk2A1hNkvxT2vIslxXhKUyo38D3f328bDDl9j6hdrZPRwd/iZFH2sWsnzQNZ1Uq/CWIqJxr73sZCx0+EC+h2nYGrhUxPeY1M9ST/bhRroLb67JjGwidKo3LlX5BAysTiUj0jevYmEMRgzCQERxWmknNI/FpySAkAvxO2h9eaJtdcU34MfI62xck3p3rpp+jv88OTV2xUsmaPU2WCVuECkZALzKwGkVpc9uuTRBtviXOpqZcmRjKAcVg1bWFqEsgAONzwyLSUMNkZQbidz+MAObmE5I4NpqDXFU6nz7XWXfKbKQzaG5Mg9TGacBSQY4+dubeUJrO41FxtjHHzImvaLfXD+/EGbaaeqGAjB2Vo02v6dBCXd8bOyOL0rq9kzfTmfQQHjUaEvfGxE1mVJb8oxZ/EwsMVoCj0oz8cgGVVJg65JfvHjHnUKGwWHg9jQIedAZawHvRcYlSulh4BvfiDsHY9zIT5NkZ5gNXP8BFVsXMhX/xWYXa39Tlls2eq6n0s3B/YU+myyYiOL6QFsoNB1QX1fNkZKAgEQpcwRapXHHlvRwdKP8FscyLKmwdBfKg8RZeIZ/9TXL49mq3ocbfrX8se/DdPT61V2nGbApmPErcCrgtbUrxwV1a4LI3C5aMP+52brzOrUYLMeotd8xFgZj1DVgP0nKmuYeq2kzgeTOBWud53KQ+qBcegk942LGGNr1BSuBynkBywTm7iZHidjONcJUgiaB+NnCYewbLDwF21bRphkXthvak/Di2KcVugDUOGblb6X4XNR++ZTnZiBw6IbY85eL2YddPJg4ZH1zNIWa9rRuv9q6VWX1XD5+J92bd34EPuMLrmGvXgYpbfzfuqqLGpPBvbqoRfdgHe7CSe0xa3lDePOTll8sDsKKnr8jOW9CvsbS1s6+x8Nie2UFPwsb/LvfmhhsRTmlZaESRltCOjdZ+XbnSaCw7of/4oQfjk3gLiFNlH6uHDOTdi/QuFsGselWCi8I3NsMf57+1FXiQZsXbR59D+uooDC+J75IDlp2/fkBOVsyTEXe3C4gznsbvoN9GjzkAEo7uti2hjTwhaXHTQ2o3T6XpEBQzj" } ] + diff --git a/doc/layout.md b/doc/layout.md index f7f23e4..091299a 100644 --- a/doc/layout.md +++ b/doc/layout.md @@ -99,29 +99,29 @@ Value at 0x28 is one of {0x00,0x01,0x02,0x03,0x04}, this filed should be read fi ## 2. boot.img v3-v4 -For partitions: `/boot` and `/init_boot`. +For partitions: `/boot`, `/init_boot` or `/recovery`. ### header item size in bytes position +-----------------------------------------------------------+ --> 0 - | | 8 (value=ANDROID!) | + | | 8 (value=ANDROID!) | |--------------------------------+--------------------------| --> 8 - | | 4 | + | | 4 | |--------------------------------+--------------------------| --> 12 - | | 4 | + | | 4 | |--------------------------------+--------------------------| --> 16 - | | 4 | + | | 4 | |--------------------------------+--------------------------| --> 20 - |
| 4 | + |
| 4 | |--------------------------------+--------------------------| --> 24 - | | 4 * 4 | + | | 4 * 4 | |--------------------------------+--------------------------| --> 40 (0x28) - |
| 4 (value in [3|4]) | + |
| 4 (value in [3|4]) | |--------------------------------+--------------------------| --> 44 - | | 1024+512=1536 | + | | 1024+512=1536 | |--------------------------------+--------------------------| --> 1580 - | (v4 only) | 4 | + | (v4 only) | 4 (values in [4096|0]) | |--------------------------------+--------------------------| --> 1584 | | min(n * page_size | | | - header_size) | @@ -131,17 +131,19 @@ For partitions: `/boot` and `/init_boot`. +-----------------------------------------------------------+ --> pagesize | | kernel length | - +-----------------------------------------------------------+ + +-----------------------------------------------------------+ --> + kernel len | | ramdisk length | - +-----------------------------------------------------------+ + +-----------------------------------------------------------+ --> + ramdisk len | (v4 only) | boot signature length | - +--------------------------------+--------------------------+ + | | GKI 1.0 : 4K | + | | GKI 2.0 : 16K | + +--------------------------------+--------------------------+ --> + boot sig len | | min(n * page_size - len) | +-----------------------------------------------------------+ ## 3. vendor\_boot.img v3-v4 -For partitions: `/vendor_boot`. +For partitions: `/vendor_boot` or `/vendor_kernel_boot`. ### header diff --git a/helper/src/main/kotlin/cfig/helper/Dumpling.kt b/helper/src/main/kotlin/cfig/helper/Dumpling.kt index e7cefbe..9bad00b 100644 --- a/helper/src/main/kotlin/cfig/helper/Dumpling.kt +++ b/helper/src/main/kotlin/cfig/helper/Dumpling.kt @@ -5,6 +5,12 @@ import java.io.File import java.io.FileInputStream import java.io.InputStream +/** + * Dumpling: Boxed type of data sources, which is the [filling] of the dumpling. + * Constructor: + * [filling] can be of type String (file name) or ByteArray + * [label] optional name of the Dumpling + */ class Dumpling(private val filling: T, private val label: String? = null) { fun getLabel(): String { return label ?: getName()