diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-12-04 03:17:50 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2008-01-10 16:16:31 -0500 |
commit | 6160b289929c0b622e64aa36106d8e6e53fcd826 (patch) | |
tree | d8968b0e4aea9d9ef80459d344cd9f4a3e6221b2 /crypto/tcrypt.c | |
parent | 8df213d9b520a4b58b7a8f7f2200324d4e40363d (diff) |
[CRYPTO] gcm: Fix ICV handling
The crypto_aead convention for ICVs is to include it directly in the
output. If we decided to change this in future then we would make
the ICV (if the algorithm has an explicit one) available in the
request itself.
For now no algorithm needs this so this patch changes gcm to conform
to this convention. It also adjusts the tcrypt aead tests to take
this into account.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/tcrypt.c')
-rw-r--r-- | crypto/tcrypt.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index df93595c2c68..a6d4160c37f7 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c | |||
@@ -235,6 +235,7 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
235 | struct scatterlist asg[8]; | 235 | struct scatterlist asg[8]; |
236 | const char *e; | 236 | const char *e; |
237 | struct tcrypt_result result; | 237 | struct tcrypt_result result; |
238 | unsigned int authsize; | ||
238 | 239 | ||
239 | if (enc == ENCRYPT) | 240 | if (enc == ENCRYPT) |
240 | e = "encryption"; | 241 | e = "encryption"; |
@@ -265,6 +266,8 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
265 | return; | 266 | return; |
266 | } | 267 | } |
267 | 268 | ||
269 | authsize = crypto_aead_authsize(tfm); | ||
270 | |||
268 | req = aead_request_alloc(tfm, GFP_KERNEL); | 271 | req = aead_request_alloc(tfm, GFP_KERNEL); |
269 | if (!req) { | 272 | if (!req) { |
270 | printk(KERN_INFO "failed to allocate request for %s\n", algo); | 273 | printk(KERN_INFO "failed to allocate request for %s\n", algo); |
@@ -296,7 +299,7 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
296 | } | 299 | } |
297 | 300 | ||
298 | sg_init_one(&sg[0], aead_tv[i].input, | 301 | sg_init_one(&sg[0], aead_tv[i].input, |
299 | aead_tv[i].ilen); | 302 | aead_tv[i].ilen + (enc ? authsize : 0)); |
300 | 303 | ||
301 | sg_init_one(&asg[0], aead_tv[i].assoc, | 304 | sg_init_one(&asg[0], aead_tv[i].assoc, |
302 | aead_tv[i].alen); | 305 | aead_tv[i].alen); |
@@ -307,13 +310,9 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
307 | 310 | ||
308 | aead_request_set_assoc(req, asg, aead_tv[i].alen); | 311 | aead_request_set_assoc(req, asg, aead_tv[i].alen); |
309 | 312 | ||
310 | if (enc) { | 313 | ret = enc ? |
311 | ret = crypto_aead_encrypt(req); | 314 | crypto_aead_encrypt(req) : |
312 | } else { | 315 | crypto_aead_decrypt(req); |
313 | memcpy(req->__ctx, aead_tv[i].tag, | ||
314 | aead_tv[i].tlen); | ||
315 | ret = crypto_aead_decrypt(req); | ||
316 | } | ||
317 | 316 | ||
318 | switch (ret) { | 317 | switch (ret) { |
319 | case 0: | 318 | case 0: |
@@ -335,16 +334,10 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
335 | 334 | ||
336 | q = kmap(sg_page(&sg[0])) + sg[0].offset; | 335 | q = kmap(sg_page(&sg[0])) + sg[0].offset; |
337 | hexdump(q, aead_tv[i].rlen); | 336 | hexdump(q, aead_tv[i].rlen); |
338 | printk(KERN_INFO "auth tag: "); | ||
339 | hexdump((unsigned char *)req->__ctx, aead_tv[i].tlen); | ||
340 | 337 | ||
341 | printk(KERN_INFO "enc/dec: %s\n", | 338 | printk(KERN_INFO "enc/dec: %s\n", |
342 | memcmp(q, aead_tv[i].result, | 339 | memcmp(q, aead_tv[i].result, |
343 | aead_tv[i].rlen) ? "fail" : "pass"); | 340 | aead_tv[i].rlen) ? "fail" : "pass"); |
344 | |||
345 | printk(KERN_INFO "auth tag: %s\n", | ||
346 | memcmp(req->__ctx, aead_tv[i].tag, | ||
347 | aead_tv[i].tlen) ? "fail" : "pass"); | ||
348 | } | 341 | } |
349 | } | 342 | } |
350 | 343 | ||
@@ -381,6 +374,9 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
381 | aead_tv[i].tap[k]); | 374 | aead_tv[i].tap[k]); |
382 | } | 375 | } |
383 | 376 | ||
377 | if (enc) | ||
378 | sg[k - 1].length += authsize; | ||
379 | |||
384 | sg_init_table(asg, aead_tv[i].anp); | 380 | sg_init_table(asg, aead_tv[i].anp); |
385 | for (k = 0, temp = 0; k < aead_tv[i].anp; k++) { | 381 | for (k = 0, temp = 0; k < aead_tv[i].anp; k++) { |
386 | memcpy(&axbuf[IDX[k]], | 382 | memcpy(&axbuf[IDX[k]], |
@@ -397,13 +393,9 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
397 | 393 | ||
398 | aead_request_set_assoc(req, asg, aead_tv[i].alen); | 394 | aead_request_set_assoc(req, asg, aead_tv[i].alen); |
399 | 395 | ||
400 | if (enc) { | 396 | ret = enc ? |
401 | ret = crypto_aead_encrypt(req); | 397 | crypto_aead_encrypt(req) : |
402 | } else { | 398 | crypto_aead_decrypt(req); |
403 | memcpy(req->__ctx, aead_tv[i].tag, | ||
404 | aead_tv[i].tlen); | ||
405 | ret = crypto_aead_decrypt(req); | ||
406 | } | ||
407 | 399 | ||
408 | switch (ret) { | 400 | switch (ret) { |
409 | case 0: | 401 | case 0: |
@@ -429,17 +421,13 @@ static void test_aead(char *algo, int enc, struct aead_testvec *template, | |||
429 | hexdump(q, aead_tv[i].tap[k]); | 421 | hexdump(q, aead_tv[i].tap[k]); |
430 | printk(KERN_INFO "%s\n", | 422 | printk(KERN_INFO "%s\n", |
431 | memcmp(q, aead_tv[i].result + temp, | 423 | memcmp(q, aead_tv[i].result + temp, |
432 | aead_tv[i].tap[k]) ? | 424 | aead_tv[i].tap[k] - |
425 | (k < aead_tv[i].np - 1 || enc ? | ||
426 | 0 : authsize)) ? | ||
433 | "fail" : "pass"); | 427 | "fail" : "pass"); |
434 | 428 | ||
435 | temp += aead_tv[i].tap[k]; | 429 | temp += aead_tv[i].tap[k]; |
436 | } | 430 | } |
437 | printk(KERN_INFO "auth tag: "); | ||
438 | hexdump((unsigned char *)req->__ctx, aead_tv[i].tlen); | ||
439 | |||
440 | printk(KERN_INFO "auth tag: %s\n", | ||
441 | memcmp(req->__ctx, aead_tv[i].tag, | ||
442 | aead_tv[i].tlen) ? "fail" : "pass"); | ||
443 | } | 431 | } |
444 | } | 432 | } |
445 | 433 | ||