aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/tcrypt.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-12-04 03:17:50 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2008-01-10 16:16:31 -0500
commit6160b289929c0b622e64aa36106d8e6e53fcd826 (patch)
treed8968b0e4aea9d9ef80459d344cd9f4a3e6221b2 /crypto/tcrypt.c
parent8df213d9b520a4b58b7a8f7f2200324d4e40363d (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.c44
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