|
|
@@ -519,6 +519,53 @@ int ima_calc_field_array_hash(struct ima_field_data *field_data,
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
+static int calc_buffer_shash_tfm(const void *buf, loff_t size,
|
|
|
+ struct ima_digest_data *hash,
|
|
|
+ struct crypto_shash *tfm)
|
|
|
+{
|
|
|
+ SHASH_DESC_ON_STACK(shash, tfm);
|
|
|
+ unsigned int len;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ shash->tfm = tfm;
|
|
|
+ shash->flags = 0;
|
|
|
+
|
|
|
+ hash->length = crypto_shash_digestsize(tfm);
|
|
|
+
|
|
|
+ rc = crypto_shash_init(shash);
|
|
|
+ if (rc != 0)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ while (size) {
|
|
|
+ len = size < PAGE_SIZE ? size : PAGE_SIZE;
|
|
|
+ rc = crypto_shash_update(shash, buf, len);
|
|
|
+ if (rc)
|
|
|
+ break;
|
|
|
+ buf += len;
|
|
|
+ size -= len;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!rc)
|
|
|
+ rc = crypto_shash_final(shash, hash->digest);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
+int ima_calc_buffer_hash(const void *buf, loff_t len,
|
|
|
+ struct ima_digest_data *hash)
|
|
|
+{
|
|
|
+ struct crypto_shash *tfm;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ tfm = ima_alloc_tfm(hash->algo);
|
|
|
+ if (IS_ERR(tfm))
|
|
|
+ return PTR_ERR(tfm);
|
|
|
+
|
|
|
+ rc = calc_buffer_shash_tfm(buf, len, hash, tfm);
|
|
|
+
|
|
|
+ ima_free_tfm(tfm);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
static void __init ima_pcrread(int idx, u8 *pcr)
|
|
|
{
|
|
|
if (!ima_used_chip)
|