diff options
author | Horia Geant? <horia.geanta@nxp.com> | 2016-04-19 13:33:48 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-04-20 05:42:49 -0400 |
commit | 340ff60ae93a5db2b2be6f38868df9a1293b6007 (patch) | |
tree | 3a0df2c2d8098d23ff6ca95c7f9061326a484707 /drivers/crypto/talitos.c | |
parent | 89d124cb61b39900959e2839ac06b6339b6a54cb (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.c | 46 |
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 | ||
66 | static 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 | |||
66 | static void to_talitos_ptr_len(struct talitos_ptr *ptr, unsigned int len, | 74 | static 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, |