diff options
author | Eric Biggers <ebiggers@google.com> | 2019-01-03 23:16:13 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-01-11 01:16:57 -0500 |
commit | 251b7aea34ba3c4d4fdfa9447695642eb8b8b098 (patch) | |
tree | 4e2b2ce50c7f79ac784abfc4332f2301d51cf4e9 /crypto | |
parent | b3e3e2db7de4a1ffe8845876c3520b866cd48de1 (diff) |
crypto: pcbc - remove bogus memcpy()s with src == dest
The memcpy()s in the PCBC implementation use walk->iv as both the source
and destination, which has undefined behavior. These memcpy()'s are
actually unneeded, because walk->iv is already used to hold the previous
plaintext block XOR'd with the previous ciphertext block. Thus,
walk->iv is already updated to its final value.
So remove the broken and unnecessary memcpy()s.
Fixes: 91652be5d1b9 ("[CRYPTO] pcbc: Add Propagated CBC template")
Cc: <stable@vger.kernel.org> # v2.6.21+
Cc: David Howells <dhowells@redhat.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/pcbc.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/crypto/pcbc.c b/crypto/pcbc.c index 8aa10144407c..1b182dfedc94 100644 --- a/crypto/pcbc.c +++ b/crypto/pcbc.c | |||
@@ -51,7 +51,7 @@ static int crypto_pcbc_encrypt_segment(struct skcipher_request *req, | |||
51 | unsigned int nbytes = walk->nbytes; | 51 | unsigned int nbytes = walk->nbytes; |
52 | u8 *src = walk->src.virt.addr; | 52 | u8 *src = walk->src.virt.addr; |
53 | u8 *dst = walk->dst.virt.addr; | 53 | u8 *dst = walk->dst.virt.addr; |
54 | u8 *iv = walk->iv; | 54 | u8 * const iv = walk->iv; |
55 | 55 | ||
56 | do { | 56 | do { |
57 | crypto_xor(iv, src, bsize); | 57 | crypto_xor(iv, src, bsize); |
@@ -72,7 +72,7 @@ static int crypto_pcbc_encrypt_inplace(struct skcipher_request *req, | |||
72 | int bsize = crypto_cipher_blocksize(tfm); | 72 | int bsize = crypto_cipher_blocksize(tfm); |
73 | unsigned int nbytes = walk->nbytes; | 73 | unsigned int nbytes = walk->nbytes; |
74 | u8 *src = walk->src.virt.addr; | 74 | u8 *src = walk->src.virt.addr; |
75 | u8 *iv = walk->iv; | 75 | u8 * const iv = walk->iv; |
76 | u8 tmpbuf[MAX_CIPHER_BLOCKSIZE]; | 76 | u8 tmpbuf[MAX_CIPHER_BLOCKSIZE]; |
77 | 77 | ||
78 | do { | 78 | do { |
@@ -84,8 +84,6 @@ static int crypto_pcbc_encrypt_inplace(struct skcipher_request *req, | |||
84 | src += bsize; | 84 | src += bsize; |
85 | } while ((nbytes -= bsize) >= bsize); | 85 | } while ((nbytes -= bsize) >= bsize); |
86 | 86 | ||
87 | memcpy(walk->iv, iv, bsize); | ||
88 | |||
89 | return nbytes; | 87 | return nbytes; |
90 | } | 88 | } |
91 | 89 | ||
@@ -121,7 +119,7 @@ static int crypto_pcbc_decrypt_segment(struct skcipher_request *req, | |||
121 | unsigned int nbytes = walk->nbytes; | 119 | unsigned int nbytes = walk->nbytes; |
122 | u8 *src = walk->src.virt.addr; | 120 | u8 *src = walk->src.virt.addr; |
123 | u8 *dst = walk->dst.virt.addr; | 121 | u8 *dst = walk->dst.virt.addr; |
124 | u8 *iv = walk->iv; | 122 | u8 * const iv = walk->iv; |
125 | 123 | ||
126 | do { | 124 | do { |
127 | crypto_cipher_decrypt_one(tfm, dst, src); | 125 | crypto_cipher_decrypt_one(tfm, dst, src); |
@@ -132,8 +130,6 @@ static int crypto_pcbc_decrypt_segment(struct skcipher_request *req, | |||
132 | dst += bsize; | 130 | dst += bsize; |
133 | } while ((nbytes -= bsize) >= bsize); | 131 | } while ((nbytes -= bsize) >= bsize); |
134 | 132 | ||
135 | memcpy(walk->iv, iv, bsize); | ||
136 | |||
137 | return nbytes; | 133 | return nbytes; |
138 | } | 134 | } |
139 | 135 | ||
@@ -144,7 +140,7 @@ static int crypto_pcbc_decrypt_inplace(struct skcipher_request *req, | |||
144 | int bsize = crypto_cipher_blocksize(tfm); | 140 | int bsize = crypto_cipher_blocksize(tfm); |
145 | unsigned int nbytes = walk->nbytes; | 141 | unsigned int nbytes = walk->nbytes; |
146 | u8 *src = walk->src.virt.addr; | 142 | u8 *src = walk->src.virt.addr; |
147 | u8 *iv = walk->iv; | 143 | u8 * const iv = walk->iv; |
148 | u8 tmpbuf[MAX_CIPHER_BLOCKSIZE] __aligned(__alignof__(u32)); | 144 | u8 tmpbuf[MAX_CIPHER_BLOCKSIZE] __aligned(__alignof__(u32)); |
149 | 145 | ||
150 | do { | 146 | do { |
@@ -156,8 +152,6 @@ static int crypto_pcbc_decrypt_inplace(struct skcipher_request *req, | |||
156 | src += bsize; | 152 | src += bsize; |
157 | } while ((nbytes -= bsize) >= bsize); | 153 | } while ((nbytes -= bsize) >= bsize); |
158 | 154 | ||
159 | memcpy(walk->iv, iv, bsize); | ||
160 | |||
161 | return nbytes; | 155 | return nbytes; |
162 | } | 156 | } |
163 | 157 | ||