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) |
