support chained partition descriptor (tag=4)
parent
f2c276cc9d
commit
5657d736c2
@ -1,10 +1,68 @@
|
|||||||
package avb.desc
|
package avb.desc
|
||||||
|
|
||||||
class ChainPartitionDescriptor {
|
import cfig.Helper
|
||||||
|
import cfig.io.Struct
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.security.MessageDigest
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class ChainPartitionDescriptor(
|
||||||
|
var rollback_index_location: Long = 0,
|
||||||
|
var partition_name_len: Long = 0,
|
||||||
|
var public_key_len: Long = 0,
|
||||||
|
var partition_name: String = "",
|
||||||
|
var pubkey: ByteArray = byteArrayOf(),
|
||||||
|
var pubkey_sha1: String = ""
|
||||||
|
) : Descriptor(TAG, 0, 0) {
|
||||||
|
override fun encode(): ByteArray {
|
||||||
|
this.partition_name_len = this.partition_name.length.toLong()
|
||||||
|
this.public_key_len = this.pubkey.size.toLong()
|
||||||
|
this.num_bytes_following = SIZE + this.partition_name_len + this.public_key_len - 16
|
||||||
|
val nbf_with_padding = Helper.round_to_multiple(this.num_bytes_following, 8)
|
||||||
|
val padding_size = nbf_with_padding - this.num_bytes_following
|
||||||
|
val desc = Struct(FORMAT_STRING + "${RESERVED}s").pack(
|
||||||
|
TAG,
|
||||||
|
nbf_with_padding,
|
||||||
|
this.rollback_index_location,
|
||||||
|
this.partition_name.length,
|
||||||
|
this.public_key_len,
|
||||||
|
null)
|
||||||
|
val padding = Struct("${padding_size}s").pack(null)
|
||||||
|
return Helper.join(desc, this.partition_name.toByteArray(), this.pubkey, padding)
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = 4L
|
const val TAG = 4L
|
||||||
const val RESERVED = 64
|
const val RESERVED = 64
|
||||||
const val SIZE = 28 + RESERVED
|
const val SIZE = 28L + RESERVED
|
||||||
const val FORMAT_STRING = "!2Q3L"
|
const val FORMAT_STRING = "!2Q3L"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constructor(data: InputStream, seq: Int = 0) : this() {
|
||||||
|
if (SIZE - RESERVED != Struct(FORMAT_STRING).calcSize().toLong()) {
|
||||||
|
throw RuntimeException()
|
||||||
|
}
|
||||||
|
this.sequence = seq
|
||||||
|
val info = Struct(FORMAT_STRING + "${RESERVED}s").unpack(data)
|
||||||
|
this.tag = info[0] as Long
|
||||||
|
this.num_bytes_following = info[1] as Long
|
||||||
|
this.rollback_index_location = info[2] as Long
|
||||||
|
this.partition_name_len = info[3] as Long
|
||||||
|
this.public_key_len = info[4] as Long
|
||||||
|
val expectedSize = Helper.round_to_multiple(
|
||||||
|
SIZE - 16 + this.partition_name_len + this.public_key_len, 8)
|
||||||
|
if (this.tag != TAG || this.num_bytes_following != expectedSize) {
|
||||||
|
throw IllegalArgumentException("Given data does not look like a chain/delegation descriptor")
|
||||||
|
}
|
||||||
|
val info2 = Struct("${this.partition_name_len}s${this.public_key_len}s").unpack(data)
|
||||||
|
this.partition_name = Helper.toCString(info2[0] as ByteArray)
|
||||||
|
this.pubkey = info2[1] as ByteArray
|
||||||
|
val md = MessageDigest.getInstance("SHA1")
|
||||||
|
md.update(this.pubkey)
|
||||||
|
this.pubkey_sha1 = Helper.toHexString(md.digest())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "ChainPartitionDescriptor(partition=${this.partition_name}, pubkey=${Arrays.toString(this.pubkey)}"
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue