aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-01-13 18:07:03 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2015-01-14 05:57:56 -0500
commit48eb3691e8beab349e3a700d45f070be8d4b88ba (patch)
tree41b9e5b80e17aa3c5b35e2bb4b56abf7d76662c1
parente31ac32d3bc27c33f002e0c9ffd6ae08b65474e6 (diff)
crypto: qat - Ensure ipad and opad are zeroed
The patch ad511e260a27b8e35d273cc0ecfe5a8ff9543181 (crypto: qat - Fix incorrect uses of memzero_explicit) broke hashing because the code was in fact overwriting the qat_auth_state variable. In fact there is no reason for the variable to exist anyway since all we are using it for is to store ipad and opad. So we could simply create ipad and opad directly and avoid this whole mess. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/qat/qat_common/qat_algs.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/drivers/crypto/qat/qat_common/qat_algs.c b/drivers/crypto/qat/qat_common/qat_algs.c
index a0d95f329094..e2c4b254ac41 100644
--- a/drivers/crypto/qat/qat_common/qat_algs.c
+++ b/drivers/crypto/qat/qat_common/qat_algs.c
@@ -160,33 +160,30 @@ static int qat_alg_do_precomputes(struct icp_qat_hw_auth_algo_blk *hash,
160 const uint8_t *auth_key, 160 const uint8_t *auth_key,
161 unsigned int auth_keylen) 161 unsigned int auth_keylen)
162{ 162{
163 struct qat_auth_state auth_state;
164 SHASH_DESC_ON_STACK(shash, ctx->hash_tfm); 163 SHASH_DESC_ON_STACK(shash, ctx->hash_tfm);
165 struct sha1_state sha1; 164 struct sha1_state sha1;
166 struct sha256_state sha256; 165 struct sha256_state sha256;
167 struct sha512_state sha512; 166 struct sha512_state sha512;
168 int block_size = crypto_shash_blocksize(ctx->hash_tfm); 167 int block_size = crypto_shash_blocksize(ctx->hash_tfm);
169 int digest_size = crypto_shash_digestsize(ctx->hash_tfm); 168 int digest_size = crypto_shash_digestsize(ctx->hash_tfm);
170 uint8_t *ipad = auth_state.data; 169 char ipad[block_size];
171 uint8_t *opad = ipad + block_size; 170 char opad[block_size];
172 __be32 *hash_state_out; 171 __be32 *hash_state_out;
173 __be64 *hash512_state_out; 172 __be64 *hash512_state_out;
174 int i, offset; 173 int i, offset;
175 174
176 memset(auth_state.data, 0, sizeof(auth_state.data)); 175 memset(ipad, 0, block_size);
176 memset(opad, 0, block_size);
177 shash->tfm = ctx->hash_tfm; 177 shash->tfm = ctx->hash_tfm;
178 shash->flags = 0x0; 178 shash->flags = 0x0;
179 179
180 if (auth_keylen > block_size) { 180 if (auth_keylen > block_size) {
181 char buff[SHA512_BLOCK_SIZE];
182 int ret = crypto_shash_digest(shash, auth_key, 181 int ret = crypto_shash_digest(shash, auth_key,
183 auth_keylen, buff); 182 auth_keylen, ipad);
184 if (ret) 183 if (ret)
185 return ret; 184 return ret;
186 185
187 memcpy(ipad, buff, digest_size); 186 memcpy(opad, ipad, digest_size);
188 memcpy(opad, buff, digest_size);
189 memzero_explicit(buff, sizeof(buff));
190 } else { 187 } else {
191 memcpy(ipad, auth_key, auth_keylen); 188 memcpy(ipad, auth_key, auth_keylen);
192 memcpy(opad, auth_key, auth_keylen); 189 memcpy(opad, auth_key, auth_keylen);