Skip to content

Commit bcc981e

Browse files
committed
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fixes from Herbert Xu: "This fixes a couple of regressions in the talitos driver that were introduced back in 4.3. The first bug causes a crash when the driver's AEAD functionality is used while the second bug prevents its AEAD feature from working once you get past the first bug" * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: crypto: talitos - fix AEAD tcrypt tests crypto: talitos - fix crash in talitos_cra_init()
2 parents 02da2d7 + 340ff60 commit bcc981e

File tree

1 file changed

+57
-30
lines changed

1 file changed

+57
-30
lines changed

drivers/crypto/talitos.c

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ static void to_talitos_ptr(struct talitos_ptr *ptr, dma_addr_t dma_addr,
6363
ptr->eptr = upper_32_bits(dma_addr);
6464
}
6565

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+
6674
static void to_talitos_ptr_len(struct talitos_ptr *ptr, unsigned int len,
6775
bool is_sec1)
6876
{
@@ -1083,21 +1091,20 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
10831091
sg_count = dma_map_sg(dev, areq->src, edesc->src_nents ?: 1,
10841092
(areq->src == areq->dst) ? DMA_BIDIRECTIONAL
10851093
: DMA_TO_DEVICE);
1086-
10871094
/* hmac data */
10881095
desc->ptr[1].len = cpu_to_be16(areq->assoclen);
10891096
if (sg_count > 1 &&
10901097
(ret = sg_to_link_tbl_offset(areq->src, sg_count, 0,
10911098
areq->assoclen,
10921099
&edesc->link_tbl[tbl_off])) > 1) {
1093-
tbl_off += ret;
1094-
10951100
to_talitos_ptr(&desc->ptr[1], edesc->dma_link_tbl + tbl_off *
10961101
sizeof(struct talitos_ptr), 0);
10971102
desc->ptr[1].j_extent = DESC_PTR_LNKTBL_JUMP;
10981103

10991104
dma_sync_single_for_device(dev, edesc->dma_link_tbl,
11001105
edesc->dma_len, DMA_BIDIRECTIONAL);
1106+
1107+
tbl_off += ret;
11011108
} else {
11021109
to_talitos_ptr(&desc->ptr[1], sg_dma_address(areq->src), 0);
11031110
desc->ptr[1].j_extent = 0;
@@ -1126,20 +1133,24 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq,
11261133
if (edesc->desc.hdr & DESC_HDR_MODE1_MDEU_CICV)
11271134
sg_link_tbl_len += authsize;
11281135

1129-
if (sg_count > 1 &&
1130-
(ret = sg_to_link_tbl_offset(areq->src, sg_count, areq->assoclen,
1131-
sg_link_tbl_len,
1132-
&edesc->link_tbl[tbl_off])) > 1) {
1133-
tbl_off += ret;
1136+
if (sg_count == 1) {
1137+
to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src) +
1138+
areq->assoclen, 0);
1139+
} else if ((ret = sg_to_link_tbl_offset(areq->src, sg_count,
1140+
areq->assoclen, sg_link_tbl_len,
1141+
&edesc->link_tbl[tbl_off])) >
1142+
1) {
11341143
desc->ptr[4].j_extent |= DESC_PTR_LNKTBL_JUMP;
11351144
to_talitos_ptr(&desc->ptr[4], edesc->dma_link_tbl +
11361145
tbl_off *
11371146
sizeof(struct talitos_ptr), 0);
11381147
dma_sync_single_for_device(dev, edesc->dma_link_tbl,
11391148
edesc->dma_len,
11401149
DMA_BIDIRECTIONAL);
1141-
} else
1142-
to_talitos_ptr(&desc->ptr[4], sg_dma_address(areq->src), 0);
1150+
tbl_off += ret;
1151+
} else {
1152+
copy_talitos_ptr(&desc->ptr[4], &edesc->link_tbl[tbl_off], 0);
1153+
}
11431154

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

11521163
edesc->icv_ool = false;
11531164

1154-
if (sg_count > 1 &&
1155-
(sg_count = sg_to_link_tbl_offset(areq->dst, sg_count,
1165+
if (sg_count == 1) {
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,
11561170
areq->assoclen, cryptlen,
1157-
&edesc->link_tbl[tbl_off])) >
1158-
1) {
1171+
&edesc->link_tbl[tbl_off])) > 1) {
11591172
struct talitos_ptr *tbl_ptr = &edesc->link_tbl[tbl_off];
11601173

11611174
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,
11781191
edesc->dma_len, DMA_BIDIRECTIONAL);
11791192

11801193
edesc->icv_ool = true;
1181-
} else
1182-
to_talitos_ptr(&desc->ptr[5], sg_dma_address(areq->dst), 0);
1194+
} else {
1195+
copy_talitos_ptr(&desc->ptr[5], &edesc->link_tbl[tbl_off], 0);
1196+
}
11831197

11841198
/* iv out */
11851199
map_single_talitos_ptr(dev, &desc->ptr[6], ivsize, ctx->iv,
@@ -2629,21 +2643,11 @@ struct talitos_crypto_alg {
26292643
struct talitos_alg_template algt;
26302644
};
26312645

2632-
static int talitos_cra_init(struct crypto_tfm *tfm)
2646+
static int talitos_init_common(struct talitos_ctx *ctx,
2647+
struct talitos_crypto_alg *talitos_alg)
26332648
{
2634-
struct crypto_alg *alg = tfm->__crt_alg;
2635-
struct talitos_crypto_alg *talitos_alg;
2636-
struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
26372649
struct talitos_private *priv;
26382650

2639-
if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_AHASH)
2640-
talitos_alg = container_of(__crypto_ahash_alg(alg),
2641-
struct talitos_crypto_alg,
2642-
algt.alg.hash);
2643-
else
2644-
talitos_alg = container_of(alg, struct talitos_crypto_alg,
2645-
algt.alg.crypto);
2646-
26472651
/* update context with ptr to dev */
26482652
ctx->dev = talitos_alg->dev;
26492653

@@ -2661,10 +2665,33 @@ static int talitos_cra_init(struct crypto_tfm *tfm)
26612665
return 0;
26622666
}
26632667

2668+
static int talitos_cra_init(struct crypto_tfm *tfm)
2669+
{
2670+
struct crypto_alg *alg = tfm->__crt_alg;
2671+
struct talitos_crypto_alg *talitos_alg;
2672+
struct talitos_ctx *ctx = crypto_tfm_ctx(tfm);
2673+
2674+
if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) == CRYPTO_ALG_TYPE_AHASH)
2675+
talitos_alg = container_of(__crypto_ahash_alg(alg),
2676+
struct talitos_crypto_alg,
2677+
algt.alg.hash);
2678+
else
2679+
talitos_alg = container_of(alg, struct talitos_crypto_alg,
2680+
algt.alg.crypto);
2681+
2682+
return talitos_init_common(ctx, talitos_alg);
2683+
}
2684+
26642685
static int talitos_cra_init_aead(struct crypto_aead *tfm)
26652686
{
2666-
talitos_cra_init(crypto_aead_tfm(tfm));
2667-
return 0;
2687+
struct aead_alg *alg = crypto_aead_alg(tfm);
2688+
struct talitos_crypto_alg *talitos_alg;
2689+
struct talitos_ctx *ctx = crypto_aead_ctx(tfm);
2690+
2691+
talitos_alg = container_of(alg, struct talitos_crypto_alg,
2692+
algt.alg.aead);
2693+
2694+
return talitos_init_common(ctx, talitos_alg);
26682695
}
26692696

26702697
static int talitos_cra_init_ahash(struct crypto_tfm *tfm)

0 commit comments

Comments
 (0)