Skip to content

Commit

Permalink
ima: provide dedicated hash algo allocation function
Browse files Browse the repository at this point in the history
This patch provides dedicated hash algo allocation and
deallocation function which can be used by different clients.

Signed-off-by: Dmitry Kasatkin <d.kasatkin@samsung.com>
Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
  • Loading branch information
Dmitry Kasatkin authored and Mimi Zohar committed Oct 25, 2013
1 parent 140d802 commit 723326b
Showing 1 changed file with 29 additions and 14 deletions.
43 changes: 29 additions & 14 deletions security/integrity/ima/ima_crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,28 @@ int ima_init_crypto(void)
return 0;
}

static struct crypto_shash *ima_alloc_tfm(enum hash_algo algo)
{
struct crypto_shash *tfm = ima_shash_tfm;
int rc;

if (algo != ima_hash_algo && algo < HASH_ALGO__LAST) {
tfm = crypto_alloc_shash(hash_algo_name[algo], 0, 0);
if (IS_ERR(tfm)) {
rc = PTR_ERR(tfm);
pr_err("Can not allocate %s (reason: %d)\n",
hash_algo_name[algo], rc);
}
}
return tfm;
}

static void ima_free_tfm(struct crypto_shash *tfm)
{
if (tfm != ima_shash_tfm)
crypto_free_shash(tfm);
}

/*
* Calculate the MD5/SHA1 file digest
*/
Expand All @@ -57,6 +79,8 @@ static int ima_calc_file_hash_tfm(struct file *file,
desc.shash.tfm = tfm;
desc.shash.flags = 0;

hash->length = crypto_shash_digestsize(tfm);

rc = crypto_shash_init(&desc.shash);
if (rc != 0)
return rc;
Expand Down Expand Up @@ -98,25 +122,16 @@ static int ima_calc_file_hash_tfm(struct file *file,

int ima_calc_file_hash(struct file *file, struct ima_digest_data *hash)
{
struct crypto_shash *tfm = ima_shash_tfm;
struct crypto_shash *tfm;
int rc;

if (hash->algo != ima_hash_algo && hash->algo < HASH_ALGO__LAST) {
tfm = crypto_alloc_shash(hash_algo_name[hash->algo], 0, 0);
if (IS_ERR(tfm)) {
rc = PTR_ERR(tfm);
pr_err("Can not allocate %s (reason: %d)\n",
hash_algo_name[hash->algo], rc);
return rc;
}
}

hash->length = crypto_shash_digestsize(tfm);
tfm = ima_alloc_tfm(hash->algo);
if (IS_ERR(tfm))
return PTR_ERR(tfm);

rc = ima_calc_file_hash_tfm(file, hash, tfm);

if (tfm != ima_shash_tfm)
crypto_free_shash(tfm);
ima_free_tfm(tfm);

return rc;
}
Expand Down

0 comments on commit 723326b

Please sign in to comment.