|
@@ -1651,16 +1651,6 @@ static int drbg_fini_sym_kernel(struct drbg_state *drbg)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static void drbg_skcipher_cb(struct crypto_async_request *req, int error)
|
|
|
|
-{
|
|
|
|
- struct drbg_state *drbg = req->data;
|
|
|
|
-
|
|
|
|
- if (error == -EINPROGRESS)
|
|
|
|
- return;
|
|
|
|
- drbg->ctr_async_err = error;
|
|
|
|
- complete(&drbg->ctr_completion);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static int drbg_init_sym_kernel(struct drbg_state *drbg)
|
|
static int drbg_init_sym_kernel(struct drbg_state *drbg)
|
|
{
|
|
{
|
|
struct crypto_cipher *tfm;
|
|
struct crypto_cipher *tfm;
|
|
@@ -1691,7 +1681,7 @@ static int drbg_init_sym_kernel(struct drbg_state *drbg)
|
|
return PTR_ERR(sk_tfm);
|
|
return PTR_ERR(sk_tfm);
|
|
}
|
|
}
|
|
drbg->ctr_handle = sk_tfm;
|
|
drbg->ctr_handle = sk_tfm;
|
|
- init_completion(&drbg->ctr_completion);
|
|
|
|
|
|
+ crypto_init_wait(&drbg->ctr_wait);
|
|
|
|
|
|
req = skcipher_request_alloc(sk_tfm, GFP_KERNEL);
|
|
req = skcipher_request_alloc(sk_tfm, GFP_KERNEL);
|
|
if (!req) {
|
|
if (!req) {
|
|
@@ -1700,8 +1690,9 @@ static int drbg_init_sym_kernel(struct drbg_state *drbg)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
drbg->ctr_req = req;
|
|
drbg->ctr_req = req;
|
|
- skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
|
|
|
|
- drbg_skcipher_cb, drbg);
|
|
|
|
|
|
+ skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
|
|
|
|
+ CRYPTO_TFM_REQ_MAY_SLEEP,
|
|
|
|
+ crypto_req_done, &drbg->ctr_wait);
|
|
|
|
|
|
alignmask = crypto_skcipher_alignmask(sk_tfm);
|
|
alignmask = crypto_skcipher_alignmask(sk_tfm);
|
|
drbg->ctr_null_value_buf = kzalloc(DRBG_CTR_NULL_LEN + alignmask,
|
|
drbg->ctr_null_value_buf = kzalloc(DRBG_CTR_NULL_LEN + alignmask,
|
|
@@ -1762,21 +1753,12 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
|
|
/* Output buffer may not be valid for SGL, use scratchpad */
|
|
/* Output buffer may not be valid for SGL, use scratchpad */
|
|
skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out,
|
|
skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out,
|
|
cryptlen, drbg->V);
|
|
cryptlen, drbg->V);
|
|
- ret = crypto_skcipher_encrypt(drbg->ctr_req);
|
|
|
|
- switch (ret) {
|
|
|
|
- case 0:
|
|
|
|
- break;
|
|
|
|
- case -EINPROGRESS:
|
|
|
|
- case -EBUSY:
|
|
|
|
- wait_for_completion(&drbg->ctr_completion);
|
|
|
|
- if (!drbg->ctr_async_err) {
|
|
|
|
- reinit_completion(&drbg->ctr_completion);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- default:
|
|
|
|
|
|
+ ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req),
|
|
|
|
+ &drbg->ctr_wait);
|
|
|
|
+ if (ret)
|
|
goto out;
|
|
goto out;
|
|
- }
|
|
|
|
- init_completion(&drbg->ctr_completion);
|
|
|
|
|
|
+
|
|
|
|
+ crypto_init_wait(&drbg->ctr_wait);
|
|
|
|
|
|
memcpy(outbuf, drbg->outscratchpad, cryptlen);
|
|
memcpy(outbuf, drbg->outscratchpad, cryptlen);
|
|
|
|
|