File tboot-support-sinit-padding.patch of Package tboot.18210

changeset:   551:2f03b57ffdba
user:        Lukasz Hawrylko <lukasz.hawrylko@intel.com>
date:        Mon Nov 25 15:46:09 2019 +0100
summary:     SINIT ACM can have padding, handle that when checking size

diff -r fe2dddd742dc -r 2f03b57ffdba tboot/include/txt/acmod.h
--- a/tboot/include/txt/acmod.h	Mon Oct 21 12:09:04 2019 +0200
+++ b/tboot/include/txt/acmod.h	Mon Nov 25 15:46:09 2019 +0100
@@ -88,6 +88,10 @@
 /* value of module_vendor field */
 #define ACM_VENDOR_INTEL        0x8086
 
+/* ranges of padding present in TXTCR_SINIT_SIZE reg */
+#define ACM_SIZE_MIN_PADDING    0x10000
+#define ACM_SIZE_MAX_PADDING    0x40000
+
 typedef union {
     uint32_t _raw;
     struct {
diff -r fe2dddd742dc -r 2f03b57ffdba tboot/txt/acmod.c
--- a/tboot/txt/acmod.c	Mon Oct 21 12:09:04 2019 +0200
+++ b/tboot/txt/acmod.c	Mon Nov 25 15:46:09 2019 +0100
@@ -438,7 +438,31 @@
     return info_table->capabilities;
 }
 
-static bool is_acmod(const void *acmod_base, uint32_t acmod_size, uint8_t *type,                      bool quiet)
+static bool are_sizes_equal_pad_adjusted(uint32_t acmod_size, acm_hdr_t *acm_hdr)
+{
+    /* Sizes are equal, so no padding */
+    if ( acmod_size == (acm_hdr->size * 4) ) {
+        return true;
+    }
+
+    /* Padding can't be negative */
+    if ( acmod_size < (acm_hdr->size * 4) ) {
+        return false;
+    }
+
+    /* Check if padding is in allowed range */
+    if ( (acmod_size - (acm_hdr->size * 4) >= ACM_SIZE_MIN_PADDING) &&
+         (acmod_size - (acm_hdr->size * 4) <= ACM_SIZE_MAX_PADDING) ) {
+        printk(TBOOT_WARN"\t acmod_size=%x, != acm_hdr->size*4=%x"
+               ", padding present (assuming 0x%x padding)\n",
+               acmod_size, acm_hdr->size * 4, acmod_size - (acm_hdr->size * 4));
+        return true;
+    }
+
+    return false;
+}
+
+static bool is_acmod(const void *acmod_base, uint32_t acmod_size, uint8_t *type, bool quiet)
 {
     acm_hdr_t *acm_hdr = (acm_hdr_t *)acmod_base;
 
@@ -459,9 +483,9 @@
     }
 
     /* then check size equivalency */
-    if ( acmod_size != acm_hdr->size * 4 ) {
+    if ( !are_sizes_equal_pad_adjusted(acmod_size, acm_hdr) ) {
         if ( !quiet )
-            printk(TBOOT_ERR"\t ACM size is too small: acmod_size=%x,"
+            printk(TBOOT_ERR"\t ACM size mismatch: acmod_size=%x,"
                    " acm_hdr->size*4=%x\n", acmod_size, acm_hdr->size*4);
         return false;
     }

openSUSE Build Service is sponsored by