aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/talitos.c
diff options
context:
space:
mode:
authorHoria Geant? <horia.geanta@nxp.com>2016-04-19 13:33:48 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-04-20 05:42:49 -0400
commit340ff60ae93a5db2b2be6f38868df9a1293b6007 (patch)
tree3a0df2c2d8098d23ff6ca95c7f9061326a484707 /drivers/crypto/talitos.c
parent89d124cb61b39900959e2839ac06b6339b6a54cb (diff)
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: aeb4c132f33d ("crypto: talitos - Convert to new AEAD interface") Reported-by: Jonas Eymann <J.Eymann@gmx.net> Signed-off-by: Horia Geant? <horia.geanta@nxp.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/talitos.c')
-rw-r--r--drivers/crypto/talitos.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
index 35198804d6d3..aae05547b924 100644
--- a/drivers/crypto/talitos.c
+++ b/drivers/crypto/talitos.c
@@ -63,6 +63,14 @@ static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
63 ptr->eptr = upper_32_bits(dma_addr); 63 ptr->eptr = upper_32_bits(dma_addr);
64} 64}
65 65
66static void copy_talitos_ptr(struct talitos_ptr *dst_ptr,
67 struct talitos_ptr *src_ptr, bool is_sec1)
68{
69 dst_ptr->ptr = src_ptr->ptr;
70 if (!is_sec1)
71 dst_ptr->eptr = src_ptr->eptr;
72}
73
66static void to_talitos_ptr_len(struct talitos_ptr *ptr, unsigned int len, 74static void to_talitos_ptr_len(struct talitos_ptr *ptr, unsigned int len,
67 bool is_sec1) 75 bool is_sec1)
68{ 76{
@@ -1083,21 +1091,20 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1083 sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ?: 1, 1091 sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ?: 1,
1084 (areq->src == areq->dst) ? DMA_BIDIRECTIONAL 1092 (areq->src == areq->dst) ? DMA_BIDIRECTIONAL
1085 : DMA_TO_DEVICE); 1093 : DMA_TO_DEVICE);
1086
1087 /* hmac data */ 1094 /* hmac data */
1088 desc->ptr[1].len = cpu_to_be16(areq->assoclen); 1095 desc->ptr[1].len = cpu_to_be16(areq->assoclen);
1089 if (sg_count > 1 && 1096 if (sg_count > 1 &&
1090 (ret = sg_to_link_tbl_offset(areq->src, sg_count, 0, 1097 (ret = sg_to_link_tbl_offset(areq->src, sg_count, 0,
1091 areq->assoclen, 1098 areq->assoclen,
1092 &edesc->link_tbl[tbl_off])) > 1) { 1099 &edesc->link_tbl[tbl_off])) > 1) {
1093 tbl_off += ret;
1094
1095 to_talitos_ptr(&desc->ptr[1], edesc->dma_link_tbl + tbl_off * 1100 to_talitos_ptr(&desc->ptr[1], edesc->dma_link_tbl + tbl_off *
1096 sizeof(struct talitos_ptr), 0); 1101 sizeof(struct talitos_ptr), 0);
1097 desc->ptr[1].j_extent = DESC_PTR_LNKTBL_JUMP; 1102 desc->ptr[1].j_extent = DESC_PTR_LNKTBL_JUMP;
1098 1103
1099 dma_sync_single_for_device(dev, edesc->dma_link_tbl, 1104 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1100 edesc->dma_len, DMA_BIDIRECTIONAL); 1105 edesc->dma_len, DMA_BIDIRECTIONAL);
1106
1107 tbl_off += ret;
1101 } else { 1108 } else {
1102 to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->src), 0); 1109 to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->src), 0);
1103 desc->ptr[1].j_extent = 0; 1110 desc->ptr[1].j_extent = 0;
@@ -1126,11 +1133,13 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1126 if (edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV) 1133 if (edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV)
1127 sg_link_tbl_len += authsize; 1134 sg_link_tbl_len += authsize;
1128 1135
1129 if (sg_count > 1 && 1136 if (sg_count == 1) {
1130 (ret = sg_to_link_tbl_offset(areq->src, sg_count, areq->assoclen, 1137 to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src) +
1131 sg_link_tbl_len, 1138 areq->assoclen, 0);
1132 &edesc->link_tbl[tbl_off])) > 1) { 1139 } else if ((ret = sg_to_link_tbl_offset(areq->src, sg_count,
1133 tbl_off += ret; 1140 areq->assoclen, sg_link_tbl_len,
1141 &edesc->link_tbl[tbl_off])) >
1142 1) {
1134 desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP; 1143 desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP;
1135 to_talitos_ptr(&desc->ptr[4], edesc->dma_link_tbl + 1144 to_talitos_ptr(&desc->ptr[4], edesc->dma_link_tbl +
1136 tbl_off * 1145 tbl_off *
@@ -1138,8 +1147,10 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1138 dma_sync_single_for_device(dev, edesc->dma_link_tbl, 1147 dma_sync_single_for_device(dev, edesc->dma_link_tbl,
1139 edesc->dma_len, 1148 edesc->dma_len,
1140 DMA_BIDIRECTIONAL); 1149 DMA_BIDIRECTIONAL);
1141 } else 1150 tbl_off += ret;
1142 to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src), 0); 1151 } else {
1152 copy_talitos_ptr(&desc->ptr[4], &edesc->link_tbl[tbl_off], 0);
1153 }
1143 1154
1144 /* cipher out */ 1155 /* cipher out */
1145 desc->ptr[5].len = cpu_to_be16(cryptlen); 1156 desc->ptr[5].len = cpu_to_be16(cryptlen);
@@ -1151,11 +1162,13 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
1151 1162
1152 edesc->icv_ool = false; 1163 edesc->icv_ool = false;
1153 1164
1154 if (sg_count > 1 && 1165 if (sg_count == 1) {
1155 (sg_count = sg_to_link_tbl_offset(areq->dst, sg_count, 1166 to_talitos_ptr(&desc->ptr[5], sg_dma_address(areq->dst) +
1167 areq->assoclen, 0);
1168 } else if ((sg_count =
1169 sg_to_link_tbl_offset(areq->dst, sg_count,
1156 areq->assoclen, cryptlen, 1170 areq->assoclen, cryptlen,
1157 &edesc->link_tbl[tbl_off])) > 1171 &edesc->link_tbl[tbl_off])) > 1) {
1158 1) {
1159 struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off]; 1172 struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
1160 1173
1161 to_talitos_ptr(&desc->ptr[5], edesc->dma_link_tbl + 1174 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,
1178 edesc->dma_len, DMA_BIDIRECTIONAL); 1191 edesc->dma_len, DMA_BIDIRECTIONAL);
1179 1192
1180 edesc->icv_ool = true; 1193 edesc->icv_ool = true;
1181 } else 1194 } else {
1182 to_talitos_ptr(&desc->ptr[5], sg_dma_address(areq->dst), 0); 1195 copy_talitos_ptr(&desc->ptr[5], &edesc->link_tbl[tbl_off], 0);
1196 }
1183 1197
1184 /* iv out */ 1198 /* iv out */
1185 map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv, 1199 map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,