aboutsummaryrefslogtreecommitdiffstats
path: root/security/integrity
diff options
context:
space:
mode:
authorDmitry Kasatkin <dmitry.kasatkin@intel.com>2011-12-05 13:17:41 +0200
committerJames Morris <jmorris@namei.org>2011-12-08 10:06:09 +1100
commit88d7ed35085184f15a2af3d9e88d775059b2f307 (patch)
treef02d2530e0f665fea4c5b240404f7767d39f47bf /security/integrity
parentfe0e94c5a7e5335ba0d200e7d3e26e9f80cda4b1 (diff)
downloadkernel_goldelico_gta04-88d7ed35085184f15a2af3d9e88d775059b2f307.zip
kernel_goldelico_gta04-88d7ed35085184f15a2af3d9e88d775059b2f307.tar.gz
kernel_goldelico_gta04-88d7ed35085184f15a2af3d9e88d775059b2f307.tar.bz2
evm: key must be set once during initialization
On multi-core systems, setting of the key before every caclculation, causes invalid HMAC calculation for other tfm users, because internal state (ipad, opad) can be invalid before set key call returns. It needs to be set only once during initialization. Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin@intel.com> Acked-by: Mimi Zohar <zohar@us.ibm.com> Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/integrity')
-rw-r--r--security/integrity/evm/evm_crypto.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c
index 847a2d7..3b9f5a0 100644
--- a/security/integrity/evm/evm_crypto.c
+++ b/security/integrity/evm/evm_crypto.c
@@ -52,6 +52,14 @@ static struct shash_desc *init_desc(const char type)
*tfm = NULL;
return ERR_PTR(rc);
}
+ if (type == EVM_XATTR_HMAC) {
+ rc = crypto_shash_setkey(*tfm, evmkey, evmkey_len);
+ if (rc) {
+ crypto_free_shash(*tfm);
+ *tfm = NULL;
+ return ERR_PTR(rc);
+ }
+ }
}
desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(*tfm),
@@ -62,14 +70,7 @@ static struct shash_desc *init_desc(const char type)
desc->tfm = *tfm;
desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
- if (type == EVM_XATTR_HMAC) {
- rc = crypto_shash_setkey(*tfm, evmkey, evmkey_len);
- if (rc)
- goto out;
- }
-
rc = crypto_shash_init(desc);
-out:
if (rc) {
kfree(desc);
return ERR_PTR(rc);