|
@@ -134,7 +134,7 @@ static int esp6_input(struct xfrm_state *x, struct xfrm_decap_state *decap, stru
|
|
|
struct ipv6_esp_hdr *esph;
|
|
|
struct esp_data *esp = x->data;
|
|
|
struct sk_buff *trailer;
|
|
|
- int blksize = crypto_tfm_alg_blocksize(esp->conf.tfm);
|
|
|
+ int blksize = ALIGN(crypto_tfm_alg_blocksize(esp->conf.tfm), 4);
|
|
|
int alen = esp->auth.icv_trunc_len;
|
|
|
int elen = skb->len - sizeof(struct ipv6_esp_hdr) - esp->conf.ivlen - alen;
|
|
|
|
|
@@ -236,13 +236,14 @@ out_nofree:
|
|
|
static u32 esp6_get_max_size(struct xfrm_state *x, int mtu)
|
|
|
{
|
|
|
struct esp_data *esp = x->data;
|
|
|
- u32 blksize = crypto_tfm_alg_blocksize(esp->conf.tfm);
|
|
|
+ u32 blksize = ALIGN(crypto_tfm_alg_blocksize(esp->conf.tfm), 4);
|
|
|
|
|
|
if (x->props.mode) {
|
|
|
mtu = ALIGN(mtu + 2, blksize);
|
|
|
} else {
|
|
|
/* The worst case. */
|
|
|
- mtu += 2 + blksize;
|
|
|
+ u32 padsize = ((blksize - 1) & 7) + 1;
|
|
|
+ mtu = ALIGN(mtu + 2, padsize) + blksize - padsize;
|
|
|
}
|
|
|
if (esp->conf.padlen)
|
|
|
mtu = ALIGN(mtu, esp->conf.padlen);
|