Commit 76c67394 authored by Gilad Ben-Yossef's avatar Gilad Ben-Yossef Committed by Herbert Xu

crypto: gcm - move to generic async completion

gcm is starting an async. crypto op and waiting for it complete.
Move it over to generic code doing the same.
Signed-off-by: default avatarGilad Ben-Yossef <gilad@benyossef.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 85a2dea4
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include <crypto/gcm.h> #include <crypto/gcm.h>
#include <crypto/hash.h> #include <crypto/hash.h>
#include "internal.h" #include "internal.h"
#include <linux/completion.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -79,11 +78,6 @@ struct crypto_gcm_req_priv_ctx { ...@@ -79,11 +78,6 @@ struct crypto_gcm_req_priv_ctx {
} u; } u;
}; };
struct crypto_gcm_setkey_result {
int err;
struct completion completion;
};
static struct { static struct {
u8 buf[16]; u8 buf[16];
struct scatterlist sg; struct scatterlist sg;
...@@ -99,17 +93,6 @@ static inline struct crypto_gcm_req_priv_ctx *crypto_gcm_reqctx( ...@@ -99,17 +93,6 @@ static inline struct crypto_gcm_req_priv_ctx *crypto_gcm_reqctx(
return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1); return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1);
} }
static void crypto_gcm_setkey_done(struct crypto_async_request *req, int err)
{
struct crypto_gcm_setkey_result *result = req->data;
if (err == -EINPROGRESS)
return;
result->err = err;
complete(&result->completion);
}
static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
unsigned int keylen) unsigned int keylen)
{ {
...@@ -120,7 +103,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, ...@@ -120,7 +103,7 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
be128 hash; be128 hash;
u8 iv[16]; u8 iv[16];
struct crypto_gcm_setkey_result result; struct crypto_wait wait;
struct scatterlist sg[1]; struct scatterlist sg[1];
struct skcipher_request req; struct skcipher_request req;
...@@ -141,21 +124,18 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key, ...@@ -141,21 +124,18 @@ static int crypto_gcm_setkey(struct crypto_aead *aead, const u8 *key,
if (!data) if (!data)
return -ENOMEM; return -ENOMEM;
init_completion(&data->result.completion); crypto_init_wait(&data->wait);
sg_init_one(data->sg, &data->hash, sizeof(data->hash)); sg_init_one(data->sg, &data->hash, sizeof(data->hash));
skcipher_request_set_tfm(&data->req, ctr); skcipher_request_set_tfm(&data->req, ctr);
skcipher_request_set_callback(&data->req, CRYPTO_TFM_REQ_MAY_SLEEP | skcipher_request_set_callback(&data->req, CRYPTO_TFM_REQ_MAY_SLEEP |
CRYPTO_TFM_REQ_MAY_BACKLOG, CRYPTO_TFM_REQ_MAY_BACKLOG,
crypto_gcm_setkey_done, crypto_req_done,
&data->result); &data->wait);
skcipher_request_set_crypt(&data->req, data->sg, data->sg, skcipher_request_set_crypt(&data->req, data->sg, data->sg,
sizeof(data->hash), data->iv); sizeof(data->hash), data->iv);
err = crypto_skcipher_encrypt(&data->req); err = crypto_wait_req(crypto_skcipher_encrypt(&data->req),
if (err == -EINPROGRESS || err == -EBUSY) { &data->wait);
wait_for_completion(&data->result.completion);
err = data->result.err;
}
if (err) if (err)
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment