struct ima_template_desc *template_desc);
 void process_buffer_measurement(struct inode *inode, const void *buf, int size,
                                const char *eventname, enum ima_hooks func,
-                               int pcr, const char *func_data);
+                               int pcr, const char *func_data,
+                               bool buf_hash);
 void ima_audit_measurement(struct integrity_iint_cache *iint,
                           const unsigned char *filename);
 int ima_alloc_init_template(struct ima_event_data *event_data,
 
 }
 
 /*
- * process_buffer_measurement - Measure the buffer to ima log.
+ * process_buffer_measurement - Measure the buffer or the buffer data hash
  * @inode: inode associated with the object being measured (NULL for KEY_CHECK)
  * @buf: pointer to the buffer that needs to be added to the log.
  * @size: size of buffer(in bytes).
  * @func: IMA hook
  * @pcr: pcr to extend the measurement
  * @func_data: func specific data, may be NULL
+ * @buf_hash: measure buffer data hash
  *
- * Based on policy, the buffer is measured into the ima log.
+ * Based on policy, either the buffer data or buffer data hash is measured
  */
 void process_buffer_measurement(struct inode *inode, const void *buf, int size,
                                const char *eventname, enum ima_hooks func,
-                               int pcr, const char *func_data)
+                               int pcr, const char *func_data,
+                               bool buf_hash)
 {
        int ret = 0;
        const char *audit_cause = "ENOMEM";
                struct ima_digest_data hdr;
                char digest[IMA_MAX_DIGEST_SIZE];
        } hash = {};
+       char digest_hash[IMA_MAX_DIGEST_SIZE];
+       int digest_hash_len = hash_digest_size[ima_hash_algo];
        int violation = 0;
        int action = 0;
        u32 secid;
                goto out;
        }
 
+       if (buf_hash) {
+               memcpy(digest_hash, hash.hdr.digest, digest_hash_len);
+
+               ret = ima_calc_buffer_hash(digest_hash, digest_hash_len,
+                                          iint.ima_hash);
+               if (ret < 0) {
+                       audit_cause = "hashing_error";
+                       goto out;
+               }
+
+               event_data.buf = digest_hash;
+               event_data.buf_len = digest_hash_len;
+       }
+
        ret = ima_alloc_init_template(&event_data, &entry, template);
        if (ret < 0) {
                audit_cause = "alloc_entry";
                goto out;
        }
 
-       ret = ima_store_template(entry, violation, NULL, buf, pcr);
+       ret = ima_store_template(entry, violation, NULL, event_data.buf, pcr);
        if (ret < 0) {
                audit_cause = "store_entry";
                ima_free_template_entry(entry);
                return;
 
        process_buffer_measurement(file_inode(f.file), buf, size,
-                                  "kexec-cmdline", KEXEC_CMDLINE, 0, NULL);
+                                  "kexec-cmdline", KEXEC_CMDLINE, 0, NULL,
+                                  false);
        fdput(f);
 }