diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2013-06-13 10:37:55 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2013-06-21 02:44:31 -0400 |
commit | da5ffe11342a0ecf2cce7000a9392c9ca959e9c8 (patch) | |
tree | d0586d9922dae9ce67b3e01a39974bd954adf549 /crypto | |
parent | 58dcf5484c0cbaddbba1d3ed074729f5078346bb (diff) |
crypto: testmgr - test hash implementations with unaligned buffers
This patch adds unaligned buffer tests for hashes.
The first new test is with one byte offset and the second test checks if
cra_alignmask for driver is big enough; for example, for testing a case
where cra_alignmask is set to 7, but driver really needs buffers to be
aligned to 16 bytes.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/testmgr.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/crypto/testmgr.c b/crypto/testmgr.c index f20538616776..2f00607039e2 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c | |||
@@ -184,8 +184,9 @@ static int do_one_async_hash_op(struct ahash_request *req, | |||
184 | return ret; | 184 | return ret; |
185 | } | 185 | } |
186 | 186 | ||
187 | static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, | 187 | static int __test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, |
188 | unsigned int tcount, bool use_digest) | 188 | unsigned int tcount, bool use_digest, |
189 | const int align_offset) | ||
189 | { | 190 | { |
190 | const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); | 191 | const char *algo = crypto_tfm_alg_driver_name(crypto_ahash_tfm(tfm)); |
191 | unsigned int i, j, k, temp; | 192 | unsigned int i, j, k, temp; |
@@ -216,10 +217,15 @@ static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, | |||
216 | if (template[i].np) | 217 | if (template[i].np) |
217 | continue; | 218 | continue; |
218 | 219 | ||
220 | ret = -EINVAL; | ||
221 | if (WARN_ON(align_offset + template[i].psize > PAGE_SIZE)) | ||
222 | goto out; | ||
223 | |||
219 | j++; | 224 | j++; |
220 | memset(result, 0, 64); | 225 | memset(result, 0, 64); |
221 | 226 | ||
222 | hash_buff = xbuf[0]; | 227 | hash_buff = xbuf[0]; |
228 | hash_buff += align_offset; | ||
223 | 229 | ||
224 | memcpy(hash_buff, template[i].plaintext, template[i].psize); | 230 | memcpy(hash_buff, template[i].plaintext, template[i].psize); |
225 | sg_init_one(&sg[0], hash_buff, template[i].psize); | 231 | sg_init_one(&sg[0], hash_buff, template[i].psize); |
@@ -281,6 +287,10 @@ static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, | |||
281 | 287 | ||
282 | j = 0; | 288 | j = 0; |
283 | for (i = 0; i < tcount; i++) { | 289 | for (i = 0; i < tcount; i++) { |
290 | /* alignment tests are only done with continuous buffers */ | ||
291 | if (align_offset != 0) | ||
292 | break; | ||
293 | |||
284 | if (template[i].np) { | 294 | if (template[i].np) { |
285 | j++; | 295 | j++; |
286 | memset(result, 0, 64); | 296 | memset(result, 0, 64); |
@@ -358,6 +368,33 @@ out_nobuf: | |||
358 | return ret; | 368 | return ret; |
359 | } | 369 | } |
360 | 370 | ||
371 | static int test_hash(struct crypto_ahash *tfm, struct hash_testvec *template, | ||
372 | unsigned int tcount, bool use_digest) | ||
373 | { | ||
374 | unsigned int alignmask; | ||
375 | int ret; | ||
376 | |||
377 | ret = __test_hash(tfm, template, tcount, use_digest, 0); | ||
378 | if (ret) | ||
379 | return ret; | ||
380 | |||
381 | /* test unaligned buffers, check with one byte offset */ | ||
382 | ret = __test_hash(tfm, template, tcount, use_digest, 1); | ||
383 | if (ret) | ||
384 | return ret; | ||
385 | |||
386 | alignmask = crypto_tfm_alg_alignmask(&tfm->base); | ||
387 | if (alignmask) { | ||
388 | /* Check if alignment mask for tfm is correctly set. */ | ||
389 | ret = __test_hash(tfm, template, tcount, use_digest, | ||
390 | alignmask + 1); | ||
391 | if (ret) | ||
392 | return ret; | ||
393 | } | ||
394 | |||
395 | return 0; | ||
396 | } | ||
397 | |||
361 | static int __test_aead(struct crypto_aead *tfm, int enc, | 398 | static int __test_aead(struct crypto_aead *tfm, int enc, |
362 | struct aead_testvec *template, unsigned int tcount, | 399 | struct aead_testvec *template, unsigned int tcount, |
363 | const bool diff_dst, const int align_offset) | 400 | const bool diff_dst, const int align_offset) |