summaryrefslogtreecommitdiff
path: root/firmware/lib20/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib20/kernel.c')
-rw-r--r--firmware/lib20/kernel.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/firmware/lib20/kernel.c b/firmware/lib20/kernel.c
index 609f2461..4ded5d55 100644
--- a/firmware/lib20/kernel.c
+++ b/firmware/lib20/kernel.c
@@ -249,11 +249,12 @@ int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble,
const struct vb2_workbuf *wb)
{
struct vb2_signature *sig = &preamble->preamble_signature;
+ uint32_t min_size = EXPECTED_VB2_KERNEL_PREAMBLE_2_0_SIZE;
VB2_DEBUG("Verifying kernel preamble.\n");
- /* Sanity checks before attempting signature of data */
- if(size < sizeof(*preamble)) {
+ /* Make sure it's even safe to look at the struct */
+ if(size < min_size) {
VB2_DEBUG("Not enough data for preamble header.\n");
return VB2_ERROR_PREAMBLE_TOO_SMALL_FOR_HEADER;
}
@@ -262,9 +263,14 @@ int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble,
VB2_DEBUG("Incompatible kernel preamble header version.\n");
return VB2_ERROR_PREAMBLE_HEADER_VERSION;
}
- if (preamble->header_version_minor < 2) {
- VB2_DEBUG("Old preamble header format not supported\n");
- return VB2_ERROR_PREAMBLE_HEADER_OLD;
+
+ if (preamble->header_version_minor >= 2)
+ min_size = EXPECTED_VB2_KERNEL_PREAMBLE_2_2_SIZE;
+ else if (preamble->header_version_minor == 1)
+ min_size = EXPECTED_VB2_KERNEL_PREAMBLE_2_1_SIZE;
+ if(preamble->preamble_size < min_size) {
+ VB2_DEBUG("Preamble size too small for header.\n");
+ return VB2_ERROR_PREAMBLE_TOO_SMALL_FOR_HEADER;
}
if (size < preamble->preamble_size) {
VB2_DEBUG("Not enough data for preamble.\n");
@@ -325,7 +331,8 @@ int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble,
* If vmlinuz header is present, verify it's covered by the body
* signature.
*/
- if (preamble->vmlinuz_header_size) {
+ if (preamble->header_version_minor >= 1 &&
+ preamble->vmlinuz_header_size) {
const void *body_ptr =
(const void *)(uintptr_t)preamble->body_load_address;
const void *vmlinuz_header_ptr = (const void *)
@@ -442,3 +449,30 @@ int vb2_load_kernel_preamble(struct vb2_context *ctx)
return VB2_SUCCESS;
}
+
+void vb2_kernel_get_vmlinuz_header(const struct vb2_kernel_preamble *preamble,
+ uint64_t *vmlinuz_header_address,
+ uint32_t *vmlinuz_header_size)
+{
+ if (preamble->header_version_minor < 1) {
+ *vmlinuz_header_address = 0;
+ *vmlinuz_header_size = 0;
+ } else {
+ /*
+ * Set header and size only if the preamble header version is >
+ * 2.1 as they don't exist in version 2.0 (Note that we don't
+ * need to check header_version_major; if that's not 2 then
+ * VerifyKernelPreamble() would have already failed.
+ */
+ *vmlinuz_header_address = preamble->vmlinuz_header_address;
+ *vmlinuz_header_size = preamble->vmlinuz_header_size;
+ }
+}
+
+uint32_t vb2_kernel_get_flags(const struct vb2_kernel_preamble *preamble)
+{
+ if (preamble->header_version_minor < 2)
+ return 0;
+
+ return preamble->flags;
+}