[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1580473133.6104.48.camel@linux.ibm.com>
Date: Fri, 31 Jan 2020 07:18:53 -0500
From: Mimi Zohar <zohar@...ux.ibm.com>
To: Roberto Sassu <roberto.sassu@...wei.com>,
jarkko.sakkinen@...ux.intel.com,
james.bottomley@...senpartnership.com,
linux-integrity@...r.kernel.org
Cc: linux-security-module@...r.kernel.org,
linux-kernel@...r.kernel.org, silviu.vlasceanu@...wei.com
Subject: Re: [PATCH 5/8] ima: allocate and initialize tfm for each PCR bank
On Mon, 2020-01-27 at 18:04 +0100, Roberto Sassu wrote:
> This patch creates a crypto_shash structure for each allocated PCR bank and
> for SHA1 if a bank with that algorithm is not currently allocated.
>
> Signed-off-by: Roberto Sassu <roberto.sassu@...wei.com>
<snip>
> +int __init ima_init_crypto(void)
> +{
> + enum hash_algo algo;
> + long rc;
> + int i;
> +
> + rc = ima_init_ima_crypto();
> + if (rc)
> + return rc;
> +
> + ima_algo_array = kmalloc_array(ima_tpm_chip->nr_allocated_banks + 1,
> + sizeof(*ima_algo_array), GFP_KERNEL);
Perhaps instead of hard coding "nr_allocated_banks + 1", create a
variable for storing the number of "extra" banks. Walk the banks
setting ima_sha1_idx and, later, in a subsequent patch set
ima_hash_algo_idx.
> + if (!ima_algo_array) {
> + rc = -ENOMEM;
> + goto out;
> + }
> +
> + for (i = 0; i < ima_tpm_chip->nr_allocated_banks + 1; i++) {
> + ima_algo_array[i].tfm = NULL;
> + ima_algo_array[i].algo = HASH_ALGO__LAST;
> + }
ima_init_crypto() is executed once on initialization. I'm not sure if
it makes a difference, but if you're really concerned about an
additional loop, the initialization, here, could be limited to the
"extra" banks. The other banks could be initialized at the beginning
of the next loop.
thanks,
Mimi
> + ima_sha1_idx = -1;
> +
> + for (i = 0; i < ima_tpm_chip->nr_allocated_banks; i++) {
> + algo = ima_tpm_chip->allocated_banks[i].crypto_id;
> + ima_algo_array[i].algo = algo;
> +
> + /* unknown TPM algorithm */
> + if (algo == HASH_ALGO__LAST)
> + continue;
> +
> + if (algo == HASH_ALGO_SHA1)
> + ima_sha1_idx = i;
> +
> + if (algo == ima_hash_algo) {
> + ima_algo_array[i].tfm = ima_shash_tfm;
> + continue;
> + }
> +
> + ima_algo_array[i].tfm = ima_alloc_tfm(algo);
> + if (IS_ERR(ima_algo_array[i].tfm)) {
> + if (algo == HASH_ALGO_SHA1) {
> + rc = PTR_ERR(ima_algo_array[i].tfm);
> + ima_algo_array[i].tfm = NULL;
> + goto out_array;
> + }
> +
> + ima_algo_array[i].tfm = NULL;
> + }
> + }
> +
> + if (ima_sha1_idx < 0) {
> + ima_algo_array[i].tfm = ima_alloc_tfm(HASH_ALGO_SHA1);
> + if (IS_ERR(ima_algo_array[i].tfm)) {
> + rc = PTR_ERR(ima_algo_array[i].tfm);
> + goto out_array;
> + }
> +
> + ima_sha1_idx = i;
> + ima_algo_array[i].algo = HASH_ALGO_SHA1;
> + }
> +
> + return 0;
> +out_array:
> + for (i = 0; i < ima_tpm_chip->nr_allocated_banks + 1; i++) {
> + if (!ima_algo_array[i].tfm ||
> + ima_algo_array[i].tfm == ima_shash_tfm)
> + continue;
> +
> + crypto_free_shash(ima_algo_array[i].tfm);
> + }
> +out:
> + crypto_free_shash(ima_shash_tfm);
> + return rc;
> +}
Powered by blists - more mailing lists