Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 340ff60a authored by Horia Geant?'s avatar Horia Geant? Committed by Herbert Xu
Browse files

crypto: talitos - fix AEAD tcrypt tests



After conversion to new AEAD interface, tcrypt tests fail as follows:

[...]
[    1.145414] alg: aead: Test 1 failed on encryption for authenc-hmac-sha1-cbc-aes-talitos
[    1.153564] 00000000: 53 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6d 73 67
[    1.160041] 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[    1.166509] 00000020: 00 00 00 00
[...]

Fix them by providing the correct cipher in & cipher out pointers,
i.e. must skip over associated data in src and dst S/G.

While here, fix a problem with the HW S/G table index usage:
tbl_off must be updated after the pointer to the table entries is set.

Cc: <stable@vger.kernel.org> # 4.3+
Fixes: aeb4c132 ("crypto: talitos - Convert to new AEAD interface")
Reported-by: default avatarJonas Eymann <J.Eymann@gmx.net>
Signed-off-by: default avatarHoria Geant? <horia.geanta@nxp.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 89d124cb
Loading
Loading
Loading
Loading
+30 −16
Original line number Original line Diff line number Diff line
@@ -63,6 +63,14 @@ static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
		ptr->eptr = upper_32_bits(dma_addr);
		ptr->eptr = upper_32_bits(dma_addr);
}
}


static void copy_talitos_ptr(struct talitos_ptr *dst_ptr,
			     struct talitos_ptr *src_ptr, bool is_sec1)
{
	dst_ptr->ptr = src_ptr->ptr;
	if (!is_sec1)
		dst_ptr->eptr = src_ptr->eptr;
}

static void to_talitos_ptr_len(struct talitos_ptr *ptr, unsigned int len,
static void to_talitos_ptr_len(struct talitos_ptr *ptr, unsigned int len,
			       bool is_sec1)
			       bool is_sec1)
{
{
@@ -1083,21 +1091,20 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
	sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ?: 1,
	sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ?: 1,
			      (areq->src == areq->dst) ? DMA_BIDIRECTIONAL
			      (areq->src == areq->dst) ? DMA_BIDIRECTIONAL
							   : DMA_TO_DEVICE);
							   : DMA_TO_DEVICE);

	/* hmac data */
	/* hmac data */
	desc->ptr[1].len = cpu_to_be16(areq->assoclen);
	desc->ptr[1].len = cpu_to_be16(areq->assoclen);
	if (sg_count > 1 &&
	if (sg_count > 1 &&
	    (ret = sg_to_link_tbl_offset(areq->src, sg_count, 0,
	    (ret = sg_to_link_tbl_offset(areq->src, sg_count, 0,
					 areq->assoclen,
					 areq->assoclen,
					 &edesc->link_tbl[tbl_off])) > 1) {
					 &edesc->link_tbl[tbl_off])) > 1) {
		tbl_off += ret;

		to_talitos_ptr(&desc->ptr[1], edesc->dma_link_tbl + tbl_off *
		to_talitos_ptr(&desc->ptr[1], edesc->dma_link_tbl + tbl_off *
			       sizeof(struct talitos_ptr), 0);
			       sizeof(struct talitos_ptr), 0);
		desc->ptr[1].j_extent = DESC_PTR_LNKTBL_JUMP;
		desc->ptr[1].j_extent = DESC_PTR_LNKTBL_JUMP;


		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
					   edesc->dma_len, DMA_BIDIRECTIONAL);
					   edesc->dma_len, DMA_BIDIRECTIONAL);

		tbl_off += ret;
	} else {
	} else {
		to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->src), 0);
		to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->src), 0);
		desc->ptr[1].j_extent = 0;
		desc->ptr[1].j_extent = 0;
@@ -1126,11 +1133,13 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
	if (edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV)
	if (edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV)
		sg_link_tbl_len += authsize;
		sg_link_tbl_len += authsize;


	if (sg_count > 1 &&
	if (sg_count == 1) {
	    (ret = sg_to_link_tbl_offset(areq->src, sg_count, areq->assoclen,
		to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src) +
					 sg_link_tbl_len,
			       areq->assoclen, 0);
					 &edesc->link_tbl[tbl_off])) > 1) {
	} else if ((ret = sg_to_link_tbl_offset(areq->src, sg_count,
		tbl_off += ret;
						areq->assoclen, sg_link_tbl_len,
						&edesc->link_tbl[tbl_off])) >
		   1) {
		desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP;
		desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP;
		to_talitos_ptr(&desc->ptr[4], edesc->dma_link_tbl +
		to_talitos_ptr(&desc->ptr[4], edesc->dma_link_tbl +
					      tbl_off *
					      tbl_off *
@@ -1138,8 +1147,10 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
		dma_sync_single_for_device(dev, edesc->dma_link_tbl,
					   edesc->dma_len,
					   edesc->dma_len,
					   DMA_BIDIRECTIONAL);
					   DMA_BIDIRECTIONAL);
	} else
		tbl_off += ret;
		to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src), 0);
	} else {
		copy_talitos_ptr(&desc->ptr[4], &edesc->link_tbl[tbl_off], 0);
	}


	/* cipher out */
	/* cipher out */
	desc->ptr[5].len = cpu_to_be16(cryptlen);
	desc->ptr[5].len = cpu_to_be16(cryptlen);
@@ -1151,11 +1162,13 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,


	edesc->icv_ool = false;
	edesc->icv_ool = false;


	if (sg_count > 1 &&
	if (sg_count == 1) {
	    (sg_count = sg_to_link_tbl_offset(areq->dst, sg_count,
		to_talitos_ptr(&desc->ptr[5], sg_dma_address(areq->dst) +
			       areq->assoclen, 0);
	} else if ((sg_count =
			sg_to_link_tbl_offset(areq->dst, sg_count,
					      areq->assoclen, cryptlen,
					      areq->assoclen, cryptlen,
					      &edesc->link_tbl[tbl_off])) >
					      &edesc->link_tbl[tbl_off])) > 1) {
	    1) {
		struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
		struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];


		to_talitos_ptr(&desc->ptr[5], edesc->dma_link_tbl +
		to_talitos_ptr(&desc->ptr[5], edesc->dma_link_tbl +
@@ -1178,8 +1191,9 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
					   edesc->dma_len, DMA_BIDIRECTIONAL);
					   edesc->dma_len, DMA_BIDIRECTIONAL);


		edesc->icv_ool = true;
		edesc->icv_ool = true;
	} else
	} else {
		to_talitos_ptr(&desc->ptr[5], sg_dma_address(areq->dst), 0);
		copy_talitos_ptr(&desc->ptr[5], &edesc->link_tbl[tbl_off], 0);
	}


	/* iv out */
	/* iv out */
	map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
	map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,