mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 00:41:17 +00:00
13b8404b1e
This backports commits from master that fix AES ciphers when using the qce driver: - A couple of simple fixes for CTR and XTS modes used with AES: * 041-crypto-qce-fix-ctr-aes-qce-block-chunk-sizes.patch * 042-crypto-qce-fix-xts-aes-qce-key-sizes.patch - A fix for a bug that affected cases when there were more entries in the input sg list than necessary to actually encrypt, resulting in failure in gcm, where the authentication tag is present after the encryption data: * 043-crypto-qce-save-a-sg-table-slot-for-result-buf.patch - A fix to update the IV buffer passed to the driver from the kernel: * 044-crypto-qce-update-the-skcipher-IV.patch - A patch that reduces memory footprint and driver initialization by only initializing the fallback mechanism where it is actually used: * 046-crypto-qce-initialize-fallback-only-for-AES.patch - Three patches that make gcm and xts modes work with the qce driver, and improve performance with small blocks: * 047-crypto-qce-use-cryptlen-when-adding-extra-sgl.patch * 048-crypto-qce-use-AES-fallback-for-small-requests.patch * 049-crypto-qce-handle-AES-XTS-cases-that-qce-fails.patch - A patch that allows the hashes/ciphers to be built individually. * 051-crypto-qce-allow-building-only-hashes-ciphers.patch Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com> [renumbered patches, added patches from dropped commit, refreshed, 5.4] Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
84 lines
2.7 KiB
Diff
84 lines
2.7 KiB
Diff
From 686aa4db696270dadc5e8b2971769e1676251ff1 Mon Sep 17 00:00:00 2001
|
|
From: Eneas U de Queiroz <cotequeiroz@gmail.com>
|
|
Date: Fri, 31 Jan 2020 17:43:16 -0300
|
|
Subject: [PATCH] crypto: qce - use cryptlen when adding extra sgl
|
|
|
|
The qce crypto driver appends an extra entry to the dst sgl, to maintain
|
|
private state information.
|
|
|
|
When the gcm driver sends requests to the ctr skcipher, it passes the
|
|
authentication tag after the actual crypto payload, but it must not be
|
|
touched.
|
|
|
|
Commit 1336c2221bee ("crypto: qce - save a sg table slot for result
|
|
buf") limited the destination sgl to avoid overwriting the
|
|
authentication tag but it assumed the tag would be in a separate sgl
|
|
entry.
|
|
|
|
This is not always the case, so it is better to limit the length of the
|
|
destination buffer to req->cryptlen before appending the result buf.
|
|
|
|
Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
|
|
|
|
--- a/drivers/crypto/qce/dma.c
|
|
+++ b/drivers/crypto/qce/dma.c
|
|
@@ -56,9 +56,10 @@ void qce_dma_release(struct qce_dma_data
|
|
|
|
struct scatterlist *
|
|
qce_sgtable_add(struct sg_table *sgt, struct scatterlist *new_sgl,
|
|
- int max_ents)
|
|
+ unsigned int max_len)
|
|
{
|
|
struct scatterlist *sg = sgt->sgl, *sg_last = NULL;
|
|
+ unsigned int new_len;
|
|
|
|
while (sg) {
|
|
if (!sg_page(sg))
|
|
@@ -69,13 +70,13 @@ qce_sgtable_add(struct sg_table *sgt, st
|
|
if (!sg)
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
- while (new_sgl && sg && max_ents) {
|
|
- sg_set_page(sg, sg_page(new_sgl), new_sgl->length,
|
|
- new_sgl->offset);
|
|
+ while (new_sgl && sg && max_len) {
|
|
+ new_len = new_sgl->length > max_len ? max_len : new_sgl->length;
|
|
+ sg_set_page(sg, sg_page(new_sgl), new_len, new_sgl->offset);
|
|
sg_last = sg;
|
|
sg = sg_next(sg);
|
|
new_sgl = sg_next(new_sgl);
|
|
- max_ents--;
|
|
+ max_len -= new_len;
|
|
}
|
|
|
|
return sg_last;
|
|
--- a/drivers/crypto/qce/dma.h
|
|
+++ b/drivers/crypto/qce/dma.h
|
|
@@ -51,6 +51,6 @@ void qce_dma_issue_pending(struct qce_dm
|
|
int qce_dma_terminate_all(struct qce_dma_data *dma);
|
|
struct scatterlist *
|
|
qce_sgtable_add(struct sg_table *sgt, struct scatterlist *sg_add,
|
|
- int max_ents);
|
|
+ unsigned int max_len);
|
|
|
|
#endif /* _DMA_H_ */
|
|
--- a/drivers/crypto/qce/skcipher.c
|
|
+++ b/drivers/crypto/qce/skcipher.c
|
|
@@ -105,13 +105,14 @@ qce_skcipher_async_req_handle(struct cry
|
|
|
|
sg_init_one(&rctx->result_sg, qce->dma.result_buf, QCE_RESULT_BUF_SZ);
|
|
|
|
- sg = qce_sgtable_add(&rctx->dst_tbl, req->dst, rctx->dst_nents - 1);
|
|
+ sg = qce_sgtable_add(&rctx->dst_tbl, req->dst, req->cryptlen);
|
|
if (IS_ERR(sg)) {
|
|
ret = PTR_ERR(sg);
|
|
goto error_free;
|
|
}
|
|
|
|
- sg = qce_sgtable_add(&rctx->dst_tbl, &rctx->result_sg, 1);
|
|
+ sg = qce_sgtable_add(&rctx->dst_tbl, &rctx->result_sg,
|
|
+ QCE_RESULT_BUF_SZ);
|
|
if (IS_ERR(sg)) {
|
|
ret = PTR_ERR(sg);
|
|
goto error_free;
|