ima: platform-independent hash value
authorAndreas Steffen <[email protected]>
Tue, 20 Dec 2016 00:23:00 +0000 (16:23 -0800)
committerLinus Torvalds <[email protected]>
Tue, 20 Dec 2016 17:48:46 +0000 (09:48 -0800)
For remote attestion it is important for the ima measurement values to
be platform-independent.  Therefore integer fields to be hashed must be
converted to canonical format.

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Andreas Steffen <[email protected]>
Signed-off-by: Mimi Zohar <[email protected]>
Cc: Thiago Jung Bauermann <[email protected]>
Cc: "Eric W. Biederman" <[email protected]>
Cc: Dmitry Kasatkin <[email protected]>
Cc: Josh Sklar <[email protected]>
Cc: Dave Young <[email protected]>
Cc: Vivek Goyal <[email protected]>
Cc: Baoquan He <[email protected]>
Cc: Michael Ellerman <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Stewart Smith <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
security/integrity/ima/ima_crypto.c

index 38f2ed830dd6fb23c216b014e39405318705d8ee..802d5d20f36fe46ecb787163f4dafd532741c78b 100644 (file)
@@ -477,11 +477,13 @@ static int ima_calc_field_array_hash_tfm(struct ima_field_data *field_data,
                u8 buffer[IMA_EVENT_NAME_LEN_MAX + 1] = { 0 };
                u8 *data_to_hash = field_data[i].data;
                u32 datalen = field_data[i].len;
+               u32 datalen_to_hash =
+                   !ima_canonical_fmt ? datalen : cpu_to_le32(datalen);
 
                if (strcmp(td->name, IMA_TEMPLATE_IMA_NAME) != 0) {
                        rc = crypto_shash_update(shash,
-                                               (const u8 *) &field_data[i].len,
-                                               sizeof(field_data[i].len));
+                                               (const u8 *) &datalen_to_hash,
+                                               sizeof(datalen_to_hash));
                        if (rc)
                                break;
                } else if (strcmp(td->fields[i]->field_id, "n") == 0) {