clean up warnings

pull/31/head
cfig 6 years ago
parent f03315b08a
commit c6db6eaf11

@ -23,6 +23,7 @@ import java.util.zip.GZIPOutputStream
import javax.crypto.Cipher import javax.crypto.Cipher
class Helper { class Helper {
@ExperimentalUnsignedTypes
companion object { companion object {
fun joinWithNulls(vararg source: ByteArray?): ByteArray { fun joinWithNulls(vararg source: ByteArray?): ByteArray {
val baos = ByteArrayOutputStream() val baos = ByteArrayOutputStream()
@ -131,6 +132,7 @@ class Helper {
This MAY not be a problem, at least we didn't find it till now. This MAY not be a problem, at least we didn't find it till now.
*/ */
@Throws(IOException::class) @Throws(IOException::class)
@Deprecated("this function misses features")
fun gnuZipFile(compressedFile: String, fis: InputStream) { fun gnuZipFile(compressedFile: String, fis: InputStream) {
val buffer = ByteArray(1024) val buffer = ByteArray(1024)
FileOutputStream(compressedFile).use { fos -> FileOutputStream(compressedFile).use { fos ->

@ -24,7 +24,7 @@ class KeyUtil {
} }
fun parsePemPrivateKey2(inputStream: InputStream): PrivateKey { fun parsePemPrivateKey2(inputStream: InputStream): PrivateKey {
val rsa = KeyUtil.parsePemPrivateKey(inputStream) val rsa = parsePemPrivateKey(inputStream)
return generateRsaPrivateKey(rsa.modulus, rsa.privateExponent) return generateRsaPrivateKey(rsa.modulus, rsa.privateExponent)
} }

@ -1,5 +1,6 @@
package cfig package cfig
@ExperimentalUnsignedTypes
data class ParamConfig( data class ParamConfig(
//file input //file input
var kernel: String = UnifiedConfig.workDir + "kernel", var kernel: String = UnifiedConfig.workDir + "kernel",

@ -4,7 +4,9 @@ import cfig.bootimg.BootImgInfo
import de.vandermeer.asciitable.AsciiTable import de.vandermeer.asciitable.AsciiTable
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.File import java.io.File
import kotlin.system.exitProcess
@ExperimentalUnsignedTypes
fun main(args: Array<String>) { fun main(args: Array<String>) {
val log = LoggerFactory.getLogger("Launcher") val log = LoggerFactory.getLogger("Launcher")
if ((args.size == 6) && args[0] in setOf("pack", "unpack", "sign")) { if ((args.size == 6) && args[0] in setOf("pack", "unpack", "sign")) {
@ -84,7 +86,7 @@ fun main(args: Array<String>) {
println("Usage: unpack <boot_image_path> <mkbootimg_bin_path> <avbtool_path> <boot_signer_path> <mkbootfs_bin_path>") println("Usage: unpack <boot_image_path> <mkbootimg_bin_path> <avbtool_path> <boot_signer_path> <mkbootfs_bin_path>")
println("Usage: pack <boot_image_path> <mkbootimg_bin_path> <avbtool_path> <boot_signer_path> <mkbootfs_bin_path>") println("Usage: pack <boot_image_path> <mkbootimg_bin_path> <avbtool_path> <boot_signer_path> <mkbootfs_bin_path>")
println("Usage: sign <boot_image_path> <mkbootimg_bin_path> <avbtool_path> <boot_signer_path> <mkbootfs_bin_path>") println("Usage: sign <boot_image_path> <mkbootimg_bin_path> <avbtool_path> <boot_signer_path> <mkbootfs_bin_path>")
System.exit(1) exitProcess(1)
} }
} }

@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory
import java.io.File import java.io.File
class Signer { class Signer {
@ExperimentalUnsignedTypes
companion object { companion object {
private val log = LoggerFactory.getLogger(Signer::class.java) private val log = LoggerFactory.getLogger(Signer::class.java)
@ -38,9 +39,9 @@ class Signer {
//our signer //our signer
File(cfg.info.output + ".clear").copyTo(File(cfg.info.output + ".signed")) File(cfg.info.output + ".clear").copyTo(File(cfg.info.output + ".signed"))
Avb().add_hash_footer(cfg.info.output + ".signed", Avb().add_hash_footer(cfg.info.output + ".signed",
info2.imageSize.toLong(), info2.imageSize,
false, use_persistent_digest = false,
false, do_not_use_ab = false,
salt = Helper.toHexString(bootDesc.salt), salt = Helper.toHexString(bootDesc.salt),
hash_algorithm = bootDesc.hash_algorithm_str, hash_algorithm = bootDesc.hash_algorithm_str,
partition_name = bootDesc.partition_name, partition_name = bootDesc.partition_name,

@ -3,9 +3,9 @@ package cfig
import cfig.bootimg.BootImgInfo import cfig.bootimg.BootImgInfo
import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import org.slf4j.LoggerFactory
import java.io.File import java.io.File
@ExperimentalUnsignedTypes
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
data class UnifiedConfig( data class UnifiedConfig(
var info: MiscInfo = MiscInfo(), var info: MiscInfo = MiscInfo(),
@ -22,6 +22,7 @@ data class UnifiedConfig(
var size: String = "0", var size: String = "0",
var loadOffset: String = "0") var loadOffset: String = "0")
@ExperimentalUnsignedTypes
data class MiscInfo( data class MiscInfo(
var output: String = "", var output: String = "",
var headerVersion: UInt = 0U, var headerVersion: UInt = 0U,
@ -82,7 +83,6 @@ data class UnifiedConfig(
companion object { companion object {
const val workDir = "build/unzip_boot/" const val workDir = "build/unzip_boot/"
private val log = LoggerFactory.getLogger(UnifiedConfig::class.java)
fun fromBootImgInfo(info: BootImgInfo): UnifiedConfig { fun fromBootImgInfo(info: BootImgInfo): UnifiedConfig {
val ret = UnifiedConfig() val ret = UnifiedConfig()
@ -123,7 +123,7 @@ data class UnifiedConfig(
if (info.dtbLength > 0U) { if (info.dtbLength > 0U) {
ret.dtb!!.file = param.dtb ret.dtb!!.file = param.dtb
} }
ret.dtb!!.loadOffset = "0x${java.lang.Integer.toHexString(info.dtbOffset.toInt())}" ret.dtb!!.loadOffset = "0x${Integer.toHexString(info.dtbOffset.toInt())}"
ret.dtb!!.size = "0x${Integer.toHexString(info.dtbLength.toInt())}" ret.dtb!!.size = "0x${Integer.toHexString(info.dtbLength.toInt())}"
ret.dtb!!.position = "0x${java.lang.Long.toHexString(info.dtbPosition.toLong())}" ret.dtb!!.position = "0x${java.lang.Long.toHexString(info.dtbPosition.toLong())}"
} }

@ -3,6 +3,7 @@ package avb
/* /*
a wonderfaul base64 encoder/decoder: https://cryptii.com/base64-to-hex a wonderfaul base64 encoder/decoder: https://cryptii.com/base64-to-hex
*/ */
@ExperimentalUnsignedTypes
class AVBInfo(var header: Header? = null, class AVBInfo(var header: Header? = null,
var authBlob: AuthBlob? = null, var authBlob: AuthBlob? = null,
var auxBlob: AuxBlob? = null, var auxBlob: AuxBlob? = null,

@ -1,5 +1,6 @@
package avb package avb
@ExperimentalUnsignedTypes
data class AuthBlob( data class AuthBlob(
var offset: ULong = 0U, var offset: ULong = 0U,
var size: ULong = 0U, var size: ULong = 0U,

@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Paths import java.nio.file.Paths
@ExperimentalUnsignedTypes
data class AuxBlob( data class AuxBlob(
var pubkey: PubKeyInfo? = null, var pubkey: PubKeyInfo? = null,
var pubkeyMeta: PubKeyMetadataInfo? = null, var pubkeyMeta: PubKeyMetadataInfo? = null,

@ -16,6 +16,7 @@ import java.nio.file.Paths
import java.nio.file.StandardOpenOption import java.nio.file.StandardOpenOption
import java.security.MessageDigest import java.security.MessageDigest
@ExperimentalUnsignedTypes
class Avb { class Avb {
private val MAX_VBMETA_SIZE = 64 * 1024 private val MAX_VBMETA_SIZE = 64 * 1024
private val MAX_FOOTER_SIZE = 4096 private val MAX_FOOTER_SIZE = 4096
@ -173,7 +174,7 @@ class Avb {
} }
//avbtool::Avb::_generate_vbmeta_blob() //avbtool::Avb::_generate_vbmeta_blob()
fun generateVbMetaBlob(algorithm_name: String, private fun generateVbMetaBlob(algorithm_name: String,
public_key_metadata_path: String?, public_key_metadata_path: String?,
descriptors: Array<Descriptor>, descriptors: Array<Descriptor>,
chain_partitions: String?, chain_partitions: String?,
@ -373,7 +374,7 @@ class Avb {
return ai return ai
} }
fun packVbMeta(info: AVBInfo? = null): ByteArray { private fun packVbMeta(info: AVBInfo? = null): ByteArray {
val ai = info ?: ObjectMapper().readValue(File(getJsonFileName("vbmeta.img")), AVBInfo::class.java) val ai = info ?: ObjectMapper().readValue(File(getJsonFileName("vbmeta.img")), AVBInfo::class.java)
val alg = Algorithms.get(ai.header!!.algorithm_type.toInt())!! val alg = Algorithms.get(ai.header!!.algorithm_type.toInt())!!
val encodedDesc = ai.auxBlob!!.encodeDescriptors() val encodedDesc = ai.auxBlob!!.encodeDescriptors()

@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory
import java.security.MessageDigest import java.security.MessageDigest
class Blob { class Blob {
@ExperimentalUnsignedTypes
companion object { companion object {
private val log = LoggerFactory.getLogger(Blob::class.java) private val log = LoggerFactory.getLogger(Blob::class.java)

@ -24,6 +24,7 @@ https://github.com/cfig/Android_boot_image_editor/blob/master/doc/layout.md#32-a
+---------------------------------------+-------------------------+ --> partition_size +---------------------------------------+-------------------------+ --> partition_size
*/ */
@ExperimentalUnsignedTypes
data class Footer constructor( data class Footer constructor(
var versionMajor: UInt = FOOTER_VERSION_MAJOR, var versionMajor: UInt = FOOTER_VERSION_MAJOR,
var versionMinor: UInt = FOOTER_VERSION_MINOR, var versionMinor: UInt = FOOTER_VERSION_MINOR,

@ -1,12 +1,12 @@
package avb package avb
import cfig.Avb import cfig.Avb
import cfig.Helper
import cfig.io.Struct3 import cfig.io.Struct3
import org.junit.Assert import org.junit.Assert
import java.io.InputStream import java.io.InputStream
//avbtool::AvbVBMetaHeader //avbtool::AvbVBMetaHeader
@ExperimentalUnsignedTypes
data class Header( data class Header(
var required_libavb_version_major: UInt = Avb.AVB_VERSION_MAJOR, var required_libavb_version_major: UInt = Avb.AVB_VERSION_MAJOR,
var required_libavb_version_minor: UInt = 0U, var required_libavb_version_minor: UInt = 0U,

@ -1,5 +1,6 @@
package avb package avb
@ExperimentalUnsignedTypes
class VBMeta(var header: Header? = null, class VBMeta(var header: Header? = null,
var authBlob: AuthBlob? = null, var authBlob: AuthBlob? = null,
var auxBlob: AuxBlob? = null) { var auxBlob: AuxBlob? = null) {

@ -3,6 +3,7 @@ package avb.alg
import cfig.io.Struct3 import cfig.io.Struct3
class Algorithms { class Algorithms {
@ExperimentalUnsignedTypes
companion object { companion object {
private val algMap = mutableMapOf<String, Algorithm>() private val algMap = mutableMapOf<String, Algorithm>()
fun get(name: String): Algorithm? { fun get(name: String): Algorithm? {

@ -6,6 +6,7 @@ import java.io.InputStream
import java.security.MessageDigest import java.security.MessageDigest
import java.util.* import java.util.*
@ExperimentalUnsignedTypes
class ChainPartitionDescriptor( class ChainPartitionDescriptor(
var rollback_index_location: UInt = 0U, var rollback_index_location: UInt = 0U,
var partition_name_len: UInt = 0U, var partition_name_len: UInt = 0U,

@ -1,5 +1,6 @@
package avb.desc package avb.desc
@ExperimentalUnsignedTypes
abstract class Descriptor(var tag: ULong, var num_bytes_following: ULong, var sequence: Int = 0) { abstract class Descriptor(var tag: ULong, var num_bytes_following: ULong, var sequence: Int = 0) {
abstract fun encode(): ByteArray abstract fun encode(): ByteArray
} }

@ -7,6 +7,7 @@ import java.io.File
import java.io.InputStream import java.io.InputStream
import java.security.MessageDigest import java.security.MessageDigest
@ExperimentalUnsignedTypes
class HashDescriptor(var image_size: ULong = 0U, class HashDescriptor(var image_size: ULong = 0U,
var hash_algorithm: String = "", var hash_algorithm: String = "",
var hash_algorithm_str: String = "", var hash_algorithm_str: String = "",
@ -60,7 +61,7 @@ class HashDescriptor(var image_size: ULong = 0U,
} }
fun verify(image_file: String) { fun verify(image_file: String) {
val hasher = MessageDigest.getInstance(Helper.pyAlg2java(hash_algorithm.toString())) val hasher = MessageDigest.getInstance(Helper.pyAlg2java(hash_algorithm))
hasher.update(this.salt) hasher.update(this.salt)
hasher.update(File(image_file).readBytes()) hasher.update(File(image_file).readBytes())
val digest = hasher.digest() val digest = hasher.digest()

@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory
import java.io.InputStream import java.io.InputStream
import java.util.* import java.util.*
@ExperimentalUnsignedTypes
class HashTreeDescriptor( class HashTreeDescriptor(
var dm_verity_version: UInt = 0u, var dm_verity_version: UInt = 0u,
var image_size: ULong = 0UL, var image_size: ULong = 0UL,
@ -86,6 +87,5 @@ class HashTreeDescriptor(
private const val RESERVED = 60L private const val RESERVED = 60L
private const val SIZE = 120 + RESERVED private const val SIZE = 120 + RESERVED
private const val FORMAT_STRING = "!2QL3Q3L2Q32s4L${RESERVED}x" private const val FORMAT_STRING = "!2QL3Q3L2Q32s4L${RESERVED}x"
private val log = LoggerFactory.getLogger(HashTreeDescriptor::class.java)
} }
} }

@ -5,6 +5,7 @@ import cfig.io.Struct3
import org.junit.Assert import org.junit.Assert
import java.io.InputStream import java.io.InputStream
@ExperimentalUnsignedTypes
class KernelCmdlineDescriptor( class KernelCmdlineDescriptor(
var flags: UInt = 0U, var flags: UInt = 0U,
var cmdlineLength: UInt = 0U, var cmdlineLength: UInt = 0U,

@ -4,6 +4,7 @@ import cfig.Helper
import cfig.io.Struct3 import cfig.io.Struct3
import java.io.InputStream import java.io.InputStream
@ExperimentalUnsignedTypes
class PropertyDescriptor( class PropertyDescriptor(
var key: String = "", var key: String = "",
var value: String = "") : Descriptor(TAG, 0U, 0) { var value: String = "") : Descriptor(TAG, 0U, 0) {

@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.InputStream import java.io.InputStream
@ExperimentalUnsignedTypes
class UnknownDescriptor(var data: ByteArray = byteArrayOf()) : Descriptor(0U, 0U, 0) { class UnknownDescriptor(var data: ByteArray = byteArrayOf()) : Descriptor(0U, 0U, 0) {
@Throws(IllegalArgumentException::class) @Throws(IllegalArgumentException::class)
constructor(stream: InputStream, seq: Int = 0) : this() { constructor(stream: InputStream, seq: Int = 0) : this() {

@ -13,6 +13,7 @@ import java.nio.ByteOrder
import java.security.MessageDigest import java.security.MessageDigest
import java.util.regex.Pattern import java.util.regex.Pattern
@ExperimentalUnsignedTypes
open class BootImgHeader( open class BootImgHeader(
var kernelLength: UInt = 0U, var kernelLength: UInt = 0U,
var kernelOffset: UInt = 0U, var kernelOffset: UInt = 0U,
@ -157,7 +158,7 @@ open class BootImgHeader(
val currentFile = File(item) val currentFile = File(item)
FileInputStream(currentFile).use { iS -> FileInputStream(currentFile).use { iS ->
var byteRead: Int var byteRead: Int
var dataRead = ByteArray(1024) val dataRead = ByteArray(1024)
while (true) { while (true) {
byteRead = iS.read(dataRead) byteRead = iS.read(dataRead)
if (-1 == byteRead) { if (-1 == byteRead) {
@ -189,25 +190,25 @@ open class BootImgHeader(
if (0U == this.ramdiskLength) { if (0U == this.ramdiskLength) {
param.ramdisk = null param.ramdisk = null
} else { } else {
this.ramdiskLength = File(param.ramdisk).length().toUInt() this.ramdiskLength = File(param.ramdisk!!).length().toUInt()
} }
//refresh second bootloader size //refresh second bootloader size
if (0U == this.secondBootloaderLength) { if (0U == this.secondBootloaderLength) {
param.second = null param.second = null
} else { } else {
this.secondBootloaderLength = File(param.second).length().toUInt() this.secondBootloaderLength = File(param.second!!).length().toUInt()
} }
//refresh recovery dtbo size //refresh recovery dtbo size
if (0U == this.recoveryDtboLength) { if (0U == this.recoveryDtboLength) {
param.dtbo = null param.dtbo = null
} else { } else {
this.recoveryDtboLength = File(param.dtbo).length().toUInt() this.recoveryDtboLength = File(param.dtbo!!).length().toUInt()
} }
//refresh recovery dtbo size //refresh recovery dtbo size
if (0U == this.dtbLength) { if (0U == this.dtbLength) {
param.dtb = null param.dtb = null
} else { } else {
this.dtbLength = File(param.dtb).length().toUInt() this.dtbLength = File(param.dtb!!).length().toUInt()
} }
//refresh image hash //refresh image hash
@ -230,44 +231,43 @@ open class BootImgHeader(
fun encode(): ByteArray { fun encode(): ByteArray {
this.refresh() this.refresh()
val ret = Struct3(FORMAT_STRING).pack( return Struct3(FORMAT_STRING).pack(
"ANDROID!", "ANDROID!",
//10I //10I
this.kernelLength, kernelLength,
this.kernelOffset, kernelOffset,
this.ramdiskLength, ramdiskLength,
this.ramdiskOffset, ramdiskOffset,
this.secondBootloaderLength, secondBootloaderLength,
this.secondBootloaderOffset, secondBootloaderOffset,
this.tagsOffset, tagsOffset,
this.pageSize, pageSize,
this.headerVersion, headerVersion,
(packOsVersion(this.osVersion) shl 11) or packOsPatchLevel(this.osPatchLevel), (packOsVersion(osVersion) shl 11) or packOsPatchLevel(osPatchLevel),
//16s //16s
this.board, board,
//512s //512s
this.cmdline.substring(0, minOf(512, this.cmdline.length)), cmdline.substring(0, minOf(512, cmdline.length)),
//32b //32b
this.hash!!, hash!!,
//1024s //1024s
if (this.cmdline.length > 512) this.cmdline.substring(512) else "", if (cmdline.length > 512) cmdline.substring(512) else "",
//I //I
this.recoveryDtboLength, recoveryDtboLength,
//Q //Q
if (this.headerVersion > 0U) this.recoveryDtboOffset else 0, if (headerVersion > 0U) recoveryDtboOffset else 0,
//I //I
when (this.headerVersion) { when (headerVersion) {
0U -> 0 0U -> 0
1U -> BOOT_IMAGE_HEADER_V1_SIZE 1U -> BOOT_IMAGE_HEADER_V1_SIZE
2U -> BOOT_IMAGE_HEADER_V2_SIZE 2U -> BOOT_IMAGE_HEADER_V2_SIZE
else -> java.lang.IllegalArgumentException("headerVersion ${this.headerVersion} illegal") else -> java.lang.IllegalArgumentException("headerVersion $headerVersion illegal")
}, },
//I //I
this.dtbLength, dtbLength,
//Q //Q
if (this.headerVersion > 1U) this.dtbOffset else 0 if (headerVersion > 1U) dtbOffset else 0
) )
return ret
} }
companion object { companion object {

@ -4,6 +4,7 @@ import cfig.ParamConfig
import org.apache.commons.exec.CommandLine import org.apache.commons.exec.CommandLine
import java.io.InputStream import java.io.InputStream
@ExperimentalUnsignedTypes
class BootImgInfo(iS: InputStream?) : BootImgHeader(iS) { class BootImgInfo(iS: InputStream?) : BootImgHeader(iS) {
constructor() : this(null) constructor() : this(null)

@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.ObjectMapper
import org.apache.commons.exec.CommandLine import org.apache.commons.exec.CommandLine
import org.apache.commons.exec.DefaultExecutor import org.apache.commons.exec.DefaultExecutor
import org.apache.commons.exec.PumpStreamHandler import org.apache.commons.exec.PumpStreamHandler
import org.junit.Assert
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.* import java.io.*
@ -13,9 +12,9 @@ import java.nio.ByteBuffer
import java.nio.ByteOrder import java.nio.ByteOrder
import java.security.MessageDigest import java.security.MessageDigest
@ExperimentalUnsignedTypes
class Packer { class Packer {
private val log = LoggerFactory.getLogger("Packer") private val log = LoggerFactory.getLogger("Packer")
private val workDir = UnifiedConfig.workDir
@Throws(CloneNotSupportedException::class) @Throws(CloneNotSupportedException::class)
private fun hashFileAndSize(vararg inFiles: String?): ByteArray { private fun hashFileAndSize(vararg inFiles: String?): ByteArray {
@ -30,7 +29,7 @@ class Packer {
val currentFile = File(item) val currentFile = File(item)
FileInputStream(currentFile).use { iS -> FileInputStream(currentFile).use { iS ->
var byteRead: Int var byteRead: Int
var dataRead = ByteArray(1024) val dataRead = ByteArray(1024)
while (true) { while (true) {
byteRead = iS.read(dataRead) byteRead = iS.read(dataRead)
if (-1 == byteRead) { if (-1 == byteRead) {
@ -51,7 +50,7 @@ class Packer {
} }
private fun writePaddedFile(inBF: ByteBuffer, srcFile: String, padding: UInt) { private fun writePaddedFile(inBF: ByteBuffer, srcFile: String, padding: UInt) {
Assert.assertTrue(padding < Int.MAX_VALUE.toUInt()) assertTrue(padding < Int.MAX_VALUE.toUInt())
writePaddedFile(inBF, srcFile, padding.toInt()) writePaddedFile(inBF, srcFile, padding.toInt())
} }
@ -70,11 +69,6 @@ class Packer {
} }
} }
private fun padFile(inBF: ByteBuffer, padding: UInt) {
Assert.assertTrue(padding < Int.MAX_VALUE.toUInt())
padFile(inBF, padding.toInt())
}
private fun padFile(inBF: ByteBuffer, padding: Int) { private fun padFile(inBF: ByteBuffer, padding: Int) {
val pad = padding - (inBF.position() and padding - 1) and padding - 1 val pad = padding - (inBF.position() and padding - 1) and padding - 1
inBF.put(ByteArray(pad)) inBF.put(ByteArray(pad))
@ -101,12 +95,12 @@ class Packer {
writePaddedFile(bf, param.dtb!!, info2.pageSize) writePaddedFile(bf, param.dtb!!, info2.pageSize)
} }
//write //write
FileOutputStream(outputFile + ".clear", true).use { fos -> FileOutputStream("$outputFile.clear", true).use { fos ->
fos.write(bf.array(), 0, bf.position()) fos.write(bf.array(), 0, bf.position())
} }
} }
fun packRootfs(mkbootfs: String) { private fun packRootfs(mkbootfs: String) {
val param = ParamConfig() val param = ParamConfig()
log.info("Packing rootfs ${UnifiedConfig.workDir}root ...") log.info("Packing rootfs ${UnifiedConfig.workDir}root ...")
val outputStream = ByteArrayOutputStream() val outputStream = ByteArrayOutputStream()
@ -143,11 +137,11 @@ class Packer {
File("${UnifiedConfig.workDir}ramdisk.img").deleleIfExists() File("${UnifiedConfig.workDir}ramdisk.img").deleleIfExists()
if (info2.ramdiskLength > 0U) { if (info2.ramdiskLength > 0U) {
if (File(param.ramdisk).exists() && !File(UnifiedConfig.workDir + "root").exists()) { if (File(param.ramdisk!!).exists() && !File(UnifiedConfig.workDir + "root").exists()) {
//do nothing if we have ramdisk.img.gz but no /root //do nothing if we have ramdisk.img.gz but no /root
log.warn("Use prebuilt ramdisk file: ${param.ramdisk}") log.warn("Use prebuilt ramdisk file: ${param.ramdisk}")
} else { } else {
File(param.ramdisk).deleleIfExists() File(param.ramdisk!!).deleleIfExists()
packRootfs(mkbootfsBin) packRootfs(mkbootfsBin)
} }
} }
@ -175,18 +169,4 @@ class Packer {
throw UnknownError("Do not know why hash verification fails, maybe a bug") throw UnknownError("Do not know why hash verification fails, maybe a bug")
} }
} }
private fun runCmdList(inCmd: List<String>, inWorkdir: String? = null) {
log.info("CMD:$inCmd")
val pb = ProcessBuilder(inCmd)
.directory(File(inWorkdir ?: "."))
.redirectErrorStream(true)
val p: Process = pb.start()
val br = BufferedReader(InputStreamReader(p.inputStream))
while (br.ready()) {
log.info(br.readLine())
}
p.waitFor()
assertTrue(0 == p.exitValue())
}
} }

@ -4,18 +4,13 @@ import cfig.bootimg.BootImgInfo
import cfig.dtb_util.DTC import cfig.dtb_util.DTC
import cfig.kernel_util.KernelExtractor import cfig.kernel_util.KernelExtractor
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import de.vandermeer.asciitable.AsciiTable
import org.apache.commons.exec.CommandLine import org.apache.commons.exec.CommandLine
import org.apache.commons.exec.DefaultExecutor import org.apache.commons.exec.DefaultExecutor
import org.junit.Assert.assertTrue
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.InputStream
import java.lang.IllegalArgumentException
import java.nio.ByteBuffer
import java.nio.ByteOrder
@ExperimentalUnsignedTypes
class Parser { class Parser {
private fun verifiedWithAVB(fileName: String): Boolean { private fun verifiedWithAVB(fileName: String): Boolean {
val expectedBf = "AVBf".toByteArray() val expectedBf = "AVBf".toByteArray()
@ -58,7 +53,7 @@ class Parser {
return info2 return info2
} }
fun parseKernelInfo(kernelFile: String) { private fun parseKernelInfo(kernelFile: String) {
val ke = KernelExtractor() val ke = KernelExtractor()
if (ke.envCheck()) { if (ke.envCheck()) {
ke.run(kernelFile, File(".")) ke.run(kernelFile, File("."))
@ -164,56 +159,5 @@ class Parser {
throw IllegalArgumentException("$fileName failed integrity check by \"$cmdline\"") throw IllegalArgumentException("$fileName failed integrity check by \"$cmdline\"")
} }
} }
fun readShort(iS: InputStream): Short {
val bf = ByteBuffer.allocate(128)
bf.order(ByteOrder.LITTLE_ENDIAN)
val data2 = ByteArray(2)
assertTrue(2 == iS.read(data2))
bf.clear()
bf.put(data2)
bf.flip()
return bf.short
}
fun readInt(iS: InputStream): Int {
val bf = ByteBuffer.allocate(128)
bf.order(ByteOrder.LITTLE_ENDIAN)
val data4 = ByteArray(4)
assertTrue(4 == iS.read(data4))
bf.clear()
bf.put(data4)
bf.flip()
return bf.int
}
fun readUnsignedAsLong(iS: InputStream): Long {
val bf = ByteBuffer.allocate(128)
bf.order(ByteOrder.LITTLE_ENDIAN)
val data4 = ByteArray(4)
assertTrue(4 == iS.read(data4))
bf.clear()
bf.put(data4)
bf.put(ByteArray(4)) //complete high bits with 0
bf.flip()
return bf.long
}
fun readLong(iS: InputStream): Long {
val bf = ByteBuffer.allocate(128)
bf.order(ByteOrder.LITTLE_ENDIAN)
val data4 = ByteArray(8)
assertTrue(8 == iS.read(data4))
bf.clear()
bf.put(data4)
bf.flip()
return bf.long
}
fun readBytes(iS: InputStream, len: Int): ByteArray {
val data4 = ByteArray(len)
assertTrue(len == iS.read(data4))
return data4
}
} }
} }

@ -8,6 +8,7 @@ import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
import java.lang.IllegalStateException import java.lang.IllegalStateException
@ExperimentalUnsignedTypes
data class BootloaderMsg( data class BootloaderMsg(
var command: String = "", var command: String = "",
var status: String = "", var status: String = "",

@ -5,12 +5,12 @@ import org.junit.Assert
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
import java.net.URLStreamHandler
import java.nio.ByteBuffer import java.nio.ByteBuffer
import java.nio.ByteOrder import java.nio.ByteOrder
import java.util.* import java.util.*
import java.util.regex.Pattern import java.util.regex.Pattern
@ExperimentalUnsignedTypes
class Struct3 { class Struct3 {
private val log = LoggerFactory.getLogger(Struct3::class.java) private val log = LoggerFactory.getLogger(Struct3::class.java)
private val formatString: String private val formatString: String
@ -207,7 +207,7 @@ class Struct3 {
Assert.assertTrue("[$arg](${arg!!::class.java}) is NOT instance of ByteArray/IntArray", Assert.assertTrue("[$arg](${arg!!::class.java}) is NOT instance of ByteArray/IntArray",
arg is ByteArray || arg is IntArray || arg is UByteArray) arg is ByteArray || arg is IntArray || arg is UByteArray)
val argInternal = if (arg is IntArray) { val argInternal = if (arg is IntArray) {
var arg2: MutableList<Byte> = mutableListOf() val arg2: MutableList<Byte> = mutableListOf()
for (item in arg) { for (item in arg) {
Assert.assertTrue("$item is not valid UByte", Assert.assertTrue("$item is not valid UByte",
item in UByte.MIN_VALUE.toInt()..UByte.MAX_VALUE.toInt()) item in UByte.MIN_VALUE.toInt()..UByte.MAX_VALUE.toInt())

@ -12,6 +12,7 @@ class Reboot {
ANDROID_RB_THERMOFF ANDROID_RB_THERMOFF
} }
@ExperimentalUnsignedTypes
companion object { companion object {
private val log = LoggerFactory.getLogger(Reboot::class.java) private val log = LoggerFactory.getLogger(Reboot::class.java)
const val dynamicPartitionKey = "ro.boot.dynamic_partitions" const val dynamicPartitionKey = "ro.boot.dynamic_partitions"

@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory
import java.io.File import java.io.File
import java.lang.IllegalArgumentException import java.lang.IllegalArgumentException
@ExperimentalUnsignedTypes
class BootImgParser : IPackable { class BootImgParser : IPackable {
private val log = LoggerFactory.getLogger(BootImgParser::class.java) private val log = LoggerFactory.getLogger(BootImgParser::class.java)

@ -10,6 +10,7 @@ import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.util.* import java.util.*
@ExperimentalUnsignedTypes
class DtboParser(val workDir: File) : IPackable { class DtboParser(val workDir: File) : IPackable {
constructor() : this(File(".")) constructor() : this(File("."))
@ -59,14 +60,14 @@ class DtboParser(val workDir: File) : IPackable {
return return
} }
val headerPath = File("${UnifiedConfig.workDir}/dtbo.header").path!! val headerPath = File("${UnifiedConfig.workDir}/dtbo.header").path
val props = Properties() val props = Properties()
props.load(FileInputStream(File(headerPath))) props.load(FileInputStream(File(headerPath)))
val cmd = CommandLine.parse("external/mkdtboimg.py create $fileName.clear").let { val cmd = CommandLine.parse("external/mkdtboimg.py create $fileName.clear").let {
it.addArguments("--version=1") it.addArguments("--version=1")
for (i in 0 until Integer.parseInt(props.getProperty("dt_entry_count"))) { for (i in 0 until Integer.parseInt(props.getProperty("dt_entry_count"))) {
val dtsName = File(UnifiedConfig.workDir + "/dtb.$i").path val dtsName = File(UnifiedConfig.workDir + "/dtb.$i").path
it.addArguments("$dtsName") it.addArguments(dtsName)
} }
it it
} }

@ -9,10 +9,12 @@ import kotlin.reflect.full.createInstance
class PackableLauncher class PackableLauncher
@ExperimentalUnsignedTypes
fun main(args: Array<String>) { fun main(args: Array<String>) {
val log = LoggerFactory.getLogger(PackableLauncher::class.java) val log = LoggerFactory.getLogger(PackableLauncher::class.java)
val packablePool = mutableMapOf<List<String>, KClass<IPackable>>() val packablePool = mutableMapOf<List<String>, KClass<IPackable>>()
listOf(DtboParser(), VBMetaParser(), BootImgParser()).forEach { listOf(DtboParser(), VBMetaParser(), BootImgParser()).forEach {
@Suppress("UNCHECKED_CAST")
packablePool.put(it.capabilities(), it::class as KClass<IPackable>) packablePool.put(it.capabilities(), it::class as KClass<IPackable>)
} }
packablePool.forEach { packablePool.forEach {

@ -2,6 +2,7 @@ package cfig.packable
import cfig.Avb import cfig.Avb
@ExperimentalUnsignedTypes
class VBMetaParser: IPackable { class VBMetaParser: IPackable {
override fun capabilities(): List<String> { override fun capabilities(): List<String> {
return listOf("^vbmeta\\.img$") return listOf("^vbmeta\\.img$")

@ -7,6 +7,7 @@ import org.junit.Assert.*
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class AvbTest { class AvbTest {
private val log = LoggerFactory.getLogger(AvbTest::class.java) private val log = LoggerFactory.getLogger(AvbTest::class.java)

@ -23,6 +23,7 @@ import java.security.spec.RSAPrivateKeySpec
import java.security.PrivateKey import java.security.PrivateKey
@ExperimentalUnsignedTypes
class HelperTest { class HelperTest {
@Test @Test
fun rawSignTest() { fun rawSignTest() {
@ -53,7 +54,7 @@ class HelperTest {
println("data size " + data.size) println("data size " + data.size)
println(signature.provider) println(signature.provider)
val sig = signature.sign() val sig = signature.sign()
// assertEquals(expectedSig, Hex.encodeHexString(sig)) println(sig)
} }
@Test @Test
@ -79,6 +80,7 @@ class HelperTest {
val kf = KeyFactory.getInstance("rsa") val kf = KeyFactory.getInstance("rsa")
val privk = kf.generatePrivate(pk8Spec) val privk = kf.generatePrivate(pk8Spec)
val pubk = kf.generatePublic(x509Spec) val pubk = kf.generatePublic(x509Spec)
println(pubk)
val cipher = Cipher.getInstance("RSA").apply { val cipher = Cipher.getInstance("RSA").apply {
this.init(Cipher.ENCRYPT_MODE, privk) this.init(Cipher.ENCRYPT_MODE, privk)
@ -121,12 +123,5 @@ class HelperTest {
val clearMsg = BigInteger.valueOf(10) val clearMsg = BigInteger.valueOf(10)
val encMsg = clearMsg.pow(e.toInt()).mod(modulus) val encMsg = clearMsg.pow(e.toInt()).mod(modulus)
println("clear: $clearMsg, enc: $encMsg") println("clear: $clearMsg, enc: $encMsg")
val decMsg = clearMsg
}
fun gcd(a: BigInteger, b: BigInteger): BigInteger {
return if (b == BigInteger.ZERO) {
a
} else gcd(b, a.mod(b))
} }
} }

@ -7,6 +7,7 @@ import java.io.FileInputStream
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Paths import java.nio.file.Paths
@ExperimentalUnsignedTypes
class KeyUtilTest { class KeyUtilTest {
@Test @Test
fun parseKeys() { fun parseKeys() {

@ -58,7 +58,7 @@ class ReadTest {
triggers: MutableList<Trigger>, triggers: MutableList<Trigger>,
services: MutableList<Service>) { services: MutableList<Service>) {
if (!File(inRootDir + inPath).exists()) { if (!File(inRootDir + inPath).exists()) {
println("Parsing $inPath fail: 404"); println("Parsing $inPath fail: 404")
return return
} }
println("Parsing file $inPath ...") println("Parsing file $inPath ...")
@ -242,7 +242,7 @@ class ReadTest {
imports.forEach { println(it) } imports.forEach { println(it) }
//parse imports again //parse imports again
var iteratorImport: Iterator<Import> = imports.iterator() val iteratorImport: Iterator<Import> = imports.iterator()
while (iteratorImport.hasNext()) { while (iteratorImport.hasNext()) {
val item: Import = iteratorImport.next() val item: Import = iteratorImport.next()
parseConfigFile(inRootDir, item.initrc, triggers, services) parseConfigFile(inRootDir, item.initrc, triggers, services)
@ -278,8 +278,7 @@ class ReadTest {
if (m.find()) { if (m.find()) {
inServices inServices
.filter { .filter {
it.theClass != null it.theClass.split(" ").contains(m.group(1))
&& it.theClass!!.split(" ").contains(m.group(1))
} }
.forEach { .forEach {
println(aPre + "| \\-- Starting " + it.name + "...") println(aPre + "| \\-- Starting " + it.name + "...")
@ -288,8 +287,8 @@ class ReadTest {
println("error") println("error")
} }
} else if (this.startsWith("start")) { } else if (this.startsWith("start")) {
println(aPre + "|-- " + this) println("$aPre|-- $this")
println(aPre + "| \\-- Starting " + this.substring(5).trim() + "...") println("""$aPre| \-- Starting ${this.substring(5).trim()}...""")
} else { } else {
println(aPre + "|-- " + this) println(aPre + "|-- " + this)
} }

@ -5,6 +5,7 @@ import org.apache.commons.codec.binary.Hex
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
@ExperimentalUnsignedTypes
class BlobTest { class BlobTest {
@Test @Test
fun testEncodedKey2048() { fun testEncodedKey2048() {

@ -6,6 +6,7 @@ import org.junit.Test
import org.junit.Assert.* import org.junit.Assert.*
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class FooterTest { class FooterTest {
@Test @Test

@ -4,6 +4,7 @@ import org.apache.commons.codec.binary.Hex
import org.junit.Test import org.junit.Test
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class HeaderTest { class HeaderTest {
@Test @Test

@ -5,6 +5,7 @@ import cfig.Helper
import org.junit.Assert import org.junit.Assert
import org.junit.Test import org.junit.Test
@ExperimentalUnsignedTypes
class AlgorithmsTest { class AlgorithmsTest {
@Test @Test
fun test1() { fun test1() {
@ -12,5 +13,6 @@ class AlgorithmsTest {
Assert.assertEquals(Helper.toHexString(Algorithms.get("SHA256_RSA4096")!!.padding), Assert.assertEquals(Helper.toHexString(Algorithms.get("SHA256_RSA4096")!!.padding),
"0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d060960864801650304020105000420") "0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d060960864801650304020105000420")
println(alg)
} }
} }

@ -6,6 +6,7 @@ import org.junit.Test
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class HashDescriptorTest { class HashDescriptorTest {
private val log = LoggerFactory.getLogger(HashDescriptorTest::class.java) private val log = LoggerFactory.getLogger(HashDescriptorTest::class.java)

@ -7,6 +7,7 @@ import org.junit.Test
import org.junit.Assert.* import org.junit.Assert.*
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class HashTreeDescriptorTest { class HashTreeDescriptorTest {
@Test @Test

@ -5,6 +5,7 @@ import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class KernelCmdlineDescriptorTest { class KernelCmdlineDescriptorTest {
@Test @Test
fun encode() { fun encode() {

@ -6,6 +6,7 @@ import org.junit.Test
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class UnknownDescriptorTest { class UnknownDescriptorTest {
private val log = LoggerFactory.getLogger(UnknownDescriptorTest::class.java) private val log = LoggerFactory.getLogger(UnknownDescriptorTest::class.java)

@ -6,6 +6,7 @@ import org.junit.Test
import org.junit.Assert.* import org.junit.Assert.*
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
@ExperimentalUnsignedTypes
class BootloaderMsgTest { class BootloaderMsgTest {
private val log = LoggerFactory.getLogger(BootloaderMsgTest::class.java) private val log = LoggerFactory.getLogger(BootloaderMsgTest::class.java)

@ -2,10 +2,10 @@ import cfig.Helper
import cfig.io.Struct3 import cfig.io.Struct3
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import org.junit.Assert import org.junit.Assert
import org.junit.Assert.*
import org.junit.Test import org.junit.Test
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ExperimentalUnsignedTypes
class Struct3Test { class Struct3Test {
private fun getConvertedFormats(inStruct: Struct3): ArrayList<Map<String, Int>> { private fun getConvertedFormats(inStruct: Struct3): ArrayList<Map<String, Int>> {
val f = inStruct.javaClass.getDeclaredField("formats") val f = inStruct.javaClass.getDeclaredField("formats")
@ -13,7 +13,8 @@ class Struct3Test {
val formatDumps = arrayListOf<Map<String, Int>>() val formatDumps = arrayListOf<Map<String, Int>>()
(f.get(inStruct) as ArrayList<*>).apply { (f.get(inStruct) as ArrayList<*>).apply {
this.forEach { this.forEach {
val format = it as Array<Object> @Suppress("UNCHECKED_CAST")
val format = it as Array<Any>
val k = if (format[0].toString().indexOf(" ") > 0) { val k = if (format[0].toString().indexOf(" ") > 0) {
format[0].toString().split(" ")[1] format[0].toString().split(" ")[1]
} else { } else {
@ -373,10 +374,10 @@ class Struct3Test {
@Test @Test
fun legacyTest() { fun legacyTest() {
Assert.assertTrue(Struct3("<2i4b4b").pack( Assert.assertTrue(Struct3("<2i4b4b").pack(
1, 7321, byteArrayOf(1, 2, 3, 4), byteArrayOf(200.toByte(), 201.toByte(), 202.toByte(), 203.toByte()))!! 1, 7321, byteArrayOf(1, 2, 3, 4), byteArrayOf(200.toByte(), 201.toByte(), 202.toByte(), 203.toByte()))
.contentEquals(Helper.fromHexString("01000000991c000001020304c8c9cacb"))) .contentEquals(Helper.fromHexString("01000000991c000001020304c8c9cacb")))
Assert.assertTrue(Struct3("<2i4b4B").pack( Assert.assertTrue(Struct3("<2i4b4B").pack(
1, 7321, byteArrayOf(1, 2, 3, 4), intArrayOf(200, 201, 202, 203))!! 1, 7321, byteArrayOf(1, 2, 3, 4), intArrayOf(200, 201, 202, 203))
.contentEquals(Helper.fromHexString("01000000991c000001020304c8c9cacb"))) .contentEquals(Helper.fromHexString("01000000991c000001020304c8c9cacb")))
Assert.assertTrue(Struct3("b2x").pack(byteArrayOf(0x13), null).contentEquals(Helper.fromHexString("130000"))) Assert.assertTrue(Struct3("b2x").pack(byteArrayOf(0x13), null).contentEquals(Helper.fromHexString("130000")))
@ -390,20 +391,20 @@ class Struct3Test {
@Test @Test
fun legacyIntegerLE() { fun legacyIntegerLE() {
//int (4B) //int (4B)
assertTrue(Struct3("<2i").pack(1, 7321).contentEquals(Helper.fromHexString("01000000991c0000"))) Assert.assertTrue(Struct3("<2i").pack(1, 7321).contentEquals(Helper.fromHexString("01000000991c0000")))
val ret = Struct3("<2i").unpack(ByteArrayInputStream(Helper.fromHexString("01000000991c0000"))) val ret = Struct3("<2i").unpack(ByteArrayInputStream(Helper.fromHexString("01000000991c0000")))
assertEquals(2, ret.size) Assert.assertEquals(2, ret.size)
assertTrue(ret[0] is Int) Assert.assertTrue(ret[0] is Int)
assertTrue(ret[1] is Int) Assert.assertTrue(ret[1] is Int)
assertEquals(1, ret[0] as Int) Assert.assertEquals(1, ret[0] as Int)
assertEquals(7321, ret[1] as Int) Assert.assertEquals(7321, ret[1] as Int)
//unsigned int (4B) //unsigned int (4B)
assertTrue(Struct3("<I").pack(2L).contentEquals(Helper.fromHexString("02000000"))) Assert.assertTrue(Struct3("<I").pack(2L).contentEquals(Helper.fromHexString("02000000")))
assertTrue(Struct3("<I").pack(2).contentEquals(Helper.fromHexString("02000000"))) Assert.assertTrue(Struct3("<I").pack(2).contentEquals(Helper.fromHexString("02000000")))
//greater than Int.MAX_VALUE //greater than Int.MAX_VALUE
assertTrue(Struct3("<I").pack(2147483748L).contentEquals(Helper.fromHexString("64000080"))) Assert.assertTrue(Struct3("<I").pack(2147483748L).contentEquals(Helper.fromHexString("64000080")))
assertTrue(Struct3("<I").pack(2147483748).contentEquals(Helper.fromHexString("64000080"))) Assert.assertTrue(Struct3("<I").pack(2147483748).contentEquals(Helper.fromHexString("64000080")))
try { try {
Struct3("<I").pack(-12) Struct3("<I").pack(-12)
throw Exception("should not reach here") throw Exception("should not reach here")
@ -412,22 +413,22 @@ class Struct3Test {
} }
//negative int //negative int
assertTrue(Struct3("<i").pack(-333).contentEquals(Helper.fromHexString("b3feffff"))) Assert.assertTrue(Struct3("<i").pack(-333).contentEquals(Helper.fromHexString("b3feffff")))
} }
@Test @Test
fun legacyIntegerBE() { fun legacyIntegerBE() {
run { run {
assertTrue(Struct3(">2i").pack(1, 7321).contentEquals(Helper.fromHexString("0000000100001c99"))) Assert.assertTrue(Struct3(">2i").pack(1, 7321).contentEquals(Helper.fromHexString("0000000100001c99")))
val ret = Struct3(">2i").unpack(ByteArrayInputStream(Helper.fromHexString("0000000100001c99"))) val ret = Struct3(">2i").unpack(ByteArrayInputStream(Helper.fromHexString("0000000100001c99")))
assertEquals(1, ret[0] as Int) Assert.assertEquals(1, ret[0] as Int)
assertEquals(7321, ret[1] as Int) Assert.assertEquals(7321, ret[1] as Int)
} }
run { run {
assertTrue(Struct3("!i").pack(-333).contentEquals(Helper.fromHexString("fffffeb3"))) Assert.assertTrue(Struct3("!i").pack(-333).contentEquals(Helper.fromHexString("fffffeb3")))
val ret2 = Struct3("!i").unpack(ByteArrayInputStream(Helper.fromHexString("fffffeb3"))) val ret2 = Struct3("!i").unpack(ByteArrayInputStream(Helper.fromHexString("fffffeb3")))
assertEquals(-333, ret2[0] as Int) Assert.assertEquals(-333, ret2[0] as Int)
} }
} }
} }

@ -7,6 +7,7 @@ import org.junit.Assert.*
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import kotlin.reflect.jvm.jvmName import kotlin.reflect.jvm.jvmName
@ExperimentalUnsignedTypes
class StructTest { class StructTest {
private fun getConvertedFormats(inStruct: Struct): ArrayList<Map<String, Int>> { private fun getConvertedFormats(inStruct: Struct): ArrayList<Map<String, Int>> {
val f = inStruct.javaClass.getDeclaredField("formats") val f = inStruct.javaClass.getDeclaredField("formats")
@ -14,7 +15,8 @@ class StructTest {
val formatDumps = arrayListOf<Map<String, Int>>() val formatDumps = arrayListOf<Map<String, Int>>()
(f.get(inStruct) as ArrayList<*>).apply { (f.get(inStruct) as ArrayList<*>).apply {
this.forEach { this.forEach {
val format = it as Array<Object> @Suppress("UNCHECKED_CAST")
val format = it as Array<Any>
formatDumps.add(mapOf(format[0].toString().split(" ")[1] to (format[1] as Int))) formatDumps.add(mapOf(format[0].toString().split(" ")[1] to (format[1] as Int)))
} }
} }
@ -52,7 +54,7 @@ class StructTest {
@Test @Test
fun integerLE() { fun integerLE() {
//int (4B) //int (4B)
assertTrue(Struct("<2i").pack(1, 7321).contentEquals(Helper.fromHexString("01000000991c0000"))) assertTrue(Struct("<2i").pack(1, 7321)!!.contentEquals(Helper.fromHexString("01000000991c0000")))
val ret = Struct("<2i").unpack(ByteArrayInputStream(Helper.fromHexString("01000000991c0000"))) val ret = Struct("<2i").unpack(ByteArrayInputStream(Helper.fromHexString("01000000991c0000")))
assertEquals(2, ret.size) assertEquals(2, ret.size)
assertTrue(ret[0] is Int) assertTrue(ret[0] is Int)
@ -61,11 +63,11 @@ class StructTest {
assertEquals(7321, ret[1] as Int) assertEquals(7321, ret[1] as Int)
//unsigned int (4B) //unsigned int (4B)
assertTrue(Struct("<I").pack(2L).contentEquals(Helper.fromHexString("02000000"))) assertTrue(Struct("<I").pack(2L)!!.contentEquals(Helper.fromHexString("02000000")))
assertTrue(Struct("<I").pack(2).contentEquals(Helper.fromHexString("02000000"))) assertTrue(Struct("<I").pack(2)!!.contentEquals(Helper.fromHexString("02000000")))
//greater than Int.MAX_VALUE //greater than Int.MAX_VALUE
assertTrue(Struct("<I").pack(2147483748L).contentEquals(Helper.fromHexString("64000080"))) assertTrue(Struct("<I").pack(2147483748L)!!.contentEquals(Helper.fromHexString("64000080")))
assertTrue(Struct("<I").pack(2147483748).contentEquals(Helper.fromHexString("64000080"))) assertTrue(Struct("<I").pack(2147483748)!!.contentEquals(Helper.fromHexString("64000080")))
try { try {
Struct("<I").pack(-12) Struct("<I").pack(-12)
throw Exception("should not reach here") throw Exception("should not reach here")
@ -73,20 +75,20 @@ class StructTest {
} }
//negative int //negative int
assertTrue(Struct("<i").pack(-333).contentEquals(Helper.fromHexString("b3feffff"))) assertTrue(Struct("<i").pack(-333)!!.contentEquals(Helper.fromHexString("b3feffff")))
} }
@Test @Test
fun integerBE() { fun integerBE() {
run { run {
assertTrue(Struct(">2i").pack(1, 7321).contentEquals(Helper.fromHexString("0000000100001c99"))) assertTrue(Struct(">2i").pack(1, 7321)!!.contentEquals(Helper.fromHexString("0000000100001c99")))
val ret = Struct(">2i").unpack(ByteArrayInputStream(Helper.fromHexString("0000000100001c99"))) val ret = Struct(">2i").unpack(ByteArrayInputStream(Helper.fromHexString("0000000100001c99")))
assertEquals(1, ret[0] as Int) assertEquals(1, ret[0] as Int)
assertEquals(7321, ret[1] as Int) assertEquals(7321, ret[1] as Int)
} }
run { run {
assertTrue(Struct("!i").pack(-333).contentEquals(Helper.fromHexString("fffffeb3"))) assertTrue(Struct("!i").pack(-333)!!.contentEquals(Helper.fromHexString("fffffeb3")))
val ret2 = Struct("!i").unpack(ByteArrayInputStream(Helper.fromHexString("fffffeb3"))) val ret2 = Struct("!i").unpack(ByteArrayInputStream(Helper.fromHexString("fffffeb3")))
assertEquals(-333, ret2[0] as Int) assertEquals(-333, ret2[0] as Int)
} }
@ -95,8 +97,8 @@ class StructTest {
@Test @Test
fun byteArrayTest() { fun byteArrayTest() {
//byte array //byte array
assertTrue(Struct("<4b").pack(byteArrayOf(-128, 2, 55, 127)).contentEquals(Helper.fromHexString("8002377f"))) assertTrue(Struct("<4b").pack(byteArrayOf(-128, 2, 55, 127))!!.contentEquals(Helper.fromHexString("8002377f")))
assertTrue(Struct("<4b").pack(intArrayOf(0, 55, 202, 0xff)).contentEquals(Helper.fromHexString("0037caff"))) assertTrue(Struct("<4b").pack(intArrayOf(0, 55, 202, 0xff))!!.contentEquals(Helper.fromHexString("0037caff")))
try { try {
Struct("b").pack(intArrayOf(256)) Struct("b").pack(intArrayOf(256))
throw Exception("should not reach here") throw Exception("should not reach here")
@ -121,13 +123,13 @@ class StructTest {
@Test @Test
fun paddingTest() { fun paddingTest() {
assertTrue(Struct("b2x").pack(byteArrayOf(0x13), null).contentEquals(Helper.fromHexString("130000"))) assertTrue(Struct("b2x").pack(byteArrayOf(0x13), null)!!.contentEquals(Helper.fromHexString("130000")))
assertTrue(Struct("b2xi").pack(byteArrayOf(0x13), null, 55).contentEquals(Helper.fromHexString("13000037000000"))) assertTrue(Struct("b2xi").pack(byteArrayOf(0x13), null, 55)!!.contentEquals(Helper.fromHexString("13000037000000")))
} }
@Test @Test
fun stringTest() { fun stringTest() {
Struct("5s").pack("Good".toByteArray()).contentEquals(Helper.fromHexString("476f6f6400")) Struct("5s").pack("Good".toByteArray())!!.contentEquals(Helper.fromHexString("476f6f6400"))
Struct("5s1b").pack("Good".toByteArray(), byteArrayOf(13)).contentEquals(Helper.fromHexString("476f6f64000d")) Struct("5s1b").pack("Good".toByteArray(), byteArrayOf(13))!!.contentEquals(Helper.fromHexString("476f6f64000d"))
} }
} }

@ -1,10 +1,10 @@
package init package init
import cfig.init.Reboot import cfig.init.Reboot
import org.junit.Assert.*
import org.junit.Test import org.junit.Test
import java.util.* import java.util.*
@ExperimentalUnsignedTypes
class RebootTest { class RebootTest {
@Test @Test
fun testDifferentModes() { fun testDifferentModes() {

Loading…
Cancel
Save