Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Duwe <duwe@suse.de>2017-05-10 16:34:13 +0200
committerTakashi Iwai <tiwai@suse.de>2017-05-31 16:05:24 +0200
commit8cd473db02c2575c90e2586406a9886e32f51ca2 (patch)
tree8fd87a9e27fcc3a2f5ee94a17d2644e7bcfe660f
parent0b7966455abee733863909156d85b88ce26ba8a2 (diff)
crypto: sha-mb - Fix load failure (bsc#1037384).rpm-4.4.59-92.20
-rw-r--r--patches.fixes/crypto-sha-mb-Fix-load-failure125
-rw-r--r--series.conf1
2 files changed, 126 insertions, 0 deletions
diff --git a/patches.fixes/crypto-sha-mb-Fix-load-failure b/patches.fixes/crypto-sha-mb-Fix-load-failure
new file mode 100644
index 0000000000..e416197bfd
--- /dev/null
+++ b/patches.fixes/crypto-sha-mb-Fix-load-failure
@@ -0,0 +1,125 @@
+From: Wang, Rui Y <rui.y.wang@intel.com>
+Subject: crypto: sha-mb - Fix load failure
+Git-commit: fd09967b830c9ed60f53f318ee67907803065c9c
+Patch-mainline: v4.6
+References: bsc#1037384
+
+ crypto: sha-mb - Fix load failure
+
+On Monday, February 1, 2016 4:18 PM, Herbert Xu wrote:
+>
+> On Wed, Jan 27, 2016 at 05:08:35PM +0800, Rui Wang wrote:
+>>
+>> +static int sha1_mb_async_import(struct ahash_request *req, const void
+>> +*in) {
+>> + struct ahash_request *mcryptd_req = ahash_request_ctx(req);
+>> + struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
+>> + struct sha1_mb_ctx *ctx = crypto_ahash_ctx(tfm);
+>> + struct mcryptd_ahash *mcryptd_tfm = ctx->mcryptd_tfm;
+>> + struct crypto_shash *child = mcryptd_ahash_child(mcryptd_tfm);
+>> + struct mcryptd_hash_request_ctx *rctx;
+>> + struct shash_desc *desc;
+>> + int err;
+>> +
+>> + memcpy(mcryptd_req, req, sizeof(*req));
+>> + ahash_request_set_tfm(mcryptd_req, &mcryptd_tfm->base);
+>> + rctx = ahash_request_ctx(mcryptd_req);
+>> + desc = &rctx->desc;
+>> + desc->tfm = child;
+>> + desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
+>> +
+>> + err = crypto_shash_init(desc);
+>> + if (err)
+>> + return err;
+>
+> What is this desc for?
+
+Hi Herbert,
+
+Yeah I just realized that the call to crypto_shash_init() isn't necessary
+here. What it does is overwritten by crypto_ahash_import(). But this desc
+still needs to be initialized here because it's newly allocated by
+ahash_request_alloc(). We eventually calls the shash version of import()
+which needs desc as an argument. The real context to be imported is then
+derived from shash_desc_ctx(desc).
+
+desc is a sub-field of struct mcryptd_hash_request_ctx, which is again a
+sub-field of the bigger blob allocated by ahash_request_alloc(). The entire
+blob's size is set in sha1_mb_async_init_tfm(). So a better version is as
+follows:
+
+(just removed the call to crypto_shash_init())
+
+>From 4bcb73adbef99aada94c49f352063619aa24d43d Mon Sep 17 00:00:00 2001
+>From: Rui Wang <rui.y.wang@intel.com>
+>Date: Mon, 14 Dec 2015 17:22:13 +0800
+>Subject: [PATCH v2 1/4] crypto x86/sha1_mb: Fix load failure
+
+modprobe sha1_mb fails with the following message:
+
+modprobe: ERROR: could not insert 'sha1_mb': No such device
+
+It is because it needs to set its statesize and implement its
+import() and export() interface.
+
+v2: remove redundant call to crypto_shash_init()
+
+Signed-off-by: Rui Wang <rui.y.wang@intel.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Acked-by: Torsten Duwe <duwe@suse.de>
+
+diff --git a/arch/x86/crypto/sha-mb/sha1_mb.c b/arch/x86/crypto/sha-mb/sha1_mb.c
+index a841e97..a8a0224 100644
+--- a/arch/x86/crypto/sha-mb/sha1_mb.c
++++ b/arch/x86/crypto/sha-mb/sha1_mb.c
+@@ -762,6 +762,38 @@ static int sha1_mb_async_digest(struct ahash_request *req)
+ return crypto_ahash_digest(mcryptd_req);
+ }
+
++static int sha1_mb_async_export(struct ahash_request *req, void *out)
++{
++ struct ahash_request *mcryptd_req = ahash_request_ctx(req);
++ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++ struct sha1_mb_ctx *ctx = crypto_ahash_ctx(tfm);
++ struct mcryptd_ahash *mcryptd_tfm = ctx->mcryptd_tfm;
++
++ memcpy(mcryptd_req, req, sizeof(*req));
++ ahash_request_set_tfm(mcryptd_req, &mcryptd_tfm->base);
++ return crypto_ahash_export(mcryptd_req, out);
++}
++
++static int sha1_mb_async_import(struct ahash_request *req, const void *in)
++{
++ struct ahash_request *mcryptd_req = ahash_request_ctx(req);
++ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
++ struct sha1_mb_ctx *ctx = crypto_ahash_ctx(tfm);
++ struct mcryptd_ahash *mcryptd_tfm = ctx->mcryptd_tfm;
++ struct crypto_shash *child = mcryptd_ahash_child(mcryptd_tfm);
++ struct mcryptd_hash_request_ctx *rctx;
++ struct shash_desc *desc;
++
++ memcpy(mcryptd_req, req, sizeof(*req));
++ ahash_request_set_tfm(mcryptd_req, &mcryptd_tfm->base);
++ rctx = ahash_request_ctx(mcryptd_req);
++ desc = &rctx->desc;
++ desc->tfm = child;
++ desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
++
++ return crypto_ahash_import(mcryptd_req, in);
++}
++
+ static int sha1_mb_async_init_tfm(struct crypto_tfm *tfm)
+ {
+ struct mcryptd_ahash *mcryptd_tfm;
+@@ -796,8 +828,11 @@ static struct ahash_alg sha1_mb_async_alg = {
+ .final = sha1_mb_async_final,
+ .finup = sha1_mb_async_finup,
+ .digest = sha1_mb_async_digest,
++ .export = sha1_mb_async_export,
++ .import = sha1_mb_async_import,
+ .halg = {
+ .digestsize = SHA1_DIGEST_SIZE,
++ .statesize = sizeof(struct sha1_hash_ctx),
+ .base = {
+ .cra_name = "sha1",
+ .cra_driver_name = "sha1_mb",
diff --git a/series.conf b/series.conf
index b0f5e4d00a..14ec9c1043 100644
--- a/series.conf
+++ b/series.conf
@@ -6279,6 +6279,7 @@
patches.fixes/crypto-drbg-remove-FIPS-140-2-continuous-test
patches.fixes/crypto-rsa-allow-keys-=-2048-bits-in-FIPS-mode
patches.fixes/crypto-FIPS-allow-tests-to-be-disabled-in-FIPS-mode
+ patches.fixes/crypto-sha-mb-Fix-load-failure
########################################################
# standalone timekeeping/timers (ie non-scheduler dependent)