diff options
Diffstat (limited to 'crypto/cast6.c')
-rw-r--r-- | crypto/cast6.c | 122 |
1 files changed, 62 insertions, 60 deletions
diff --git a/crypto/cast6.c b/crypto/cast6.c index 007d02beed67..e0c15a6c7c34 100644 --- a/crypto/cast6.c +++ b/crypto/cast6.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * under the terms of GNU General Public License as published by the Free | 11 | * under the terms of GNU General Public License as published by the Free |
12 | * Software Foundation; either version 2 of the License, or (at your option) | 12 | * Software Foundation; either version 2 of the License, or (at your option) |
13 | * any later version. | 13 | * any later version. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | 17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
@@ -35,12 +35,12 @@ struct cast6_ctx { | |||
35 | u8 Kr[12][4]; | 35 | u8 Kr[12][4]; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | #define F1(D,r,m) ( (I = ((m) + (D))), (I=rol32(I,(r))), \ | 38 | #define F1(D, r, m) ((I = ((m) + (D))), (I = rol32(I, (r))), \ |
39 | (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]) ) | 39 | (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff])) |
40 | #define F2(D,r,m) ( (I = ((m) ^ (D))), (I=rol32(I,(r))), \ | 40 | #define F2(D, r, m) ((I = ((m) ^ (D))), (I = rol32(I, (r))), \ |
41 | (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]) ) | 41 | (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff])) |
42 | #define F3(D,r,m) ( (I = ((m) - (D))), (I=rol32(I,(r))), \ | 42 | #define F3(D, r, m) ((I = ((m) - (D))), (I = rol32(I, (r))), \ |
43 | (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) ) | 43 | (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff])) |
44 | 44 | ||
45 | static const u32 s1[256] = { | 45 | static const u32 s1[256] = { |
46 | 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, | 46 | 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, |
@@ -312,7 +312,7 @@ static const u32 s4[256] = { | |||
312 | 312 | ||
313 | static const u32 Tm[24][8] = { | 313 | static const u32 Tm[24][8] = { |
314 | { 0x5a827999, 0xc95c653a, 0x383650db, 0xa7103c7c, 0x15ea281d, | 314 | { 0x5a827999, 0xc95c653a, 0x383650db, 0xa7103c7c, 0x15ea281d, |
315 | 0x84c413be, 0xf39dff5f, 0x6277eb00 } , | 315 | 0x84c413be, 0xf39dff5f, 0x6277eb00 } , |
316 | { 0xd151d6a1, 0x402bc242, 0xaf05ade3, 0x1ddf9984, 0x8cb98525, | 316 | { 0xd151d6a1, 0x402bc242, 0xaf05ade3, 0x1ddf9984, 0x8cb98525, |
317 | 0xfb9370c6, 0x6a6d5c67, 0xd9474808 } , | 317 | 0xfb9370c6, 0x6a6d5c67, 0xd9474808 } , |
318 | { 0x482133a9, 0xb6fb1f4a, 0x25d50aeb, 0x94aef68c, 0x0388e22d, | 318 | { 0x482133a9, 0xb6fb1f4a, 0x25d50aeb, 0x94aef68c, 0x0388e22d, |
@@ -369,7 +369,8 @@ static const u8 Tr[4][8] = { | |||
369 | }; | 369 | }; |
370 | 370 | ||
371 | /* forward octave */ | 371 | /* forward octave */ |
372 | static void W(u32 *key, unsigned int i) { | 372 | static void W(u32 *key, unsigned int i) |
373 | { | ||
373 | u32 I; | 374 | u32 I; |
374 | key[6] ^= F1(key[7], Tr[i % 4][0], Tm[i][0]); | 375 | key[6] ^= F1(key[7], Tr[i % 4][0], Tm[i][0]); |
375 | key[5] ^= F2(key[6], Tr[i % 4][1], Tm[i][1]); | 376 | key[5] ^= F2(key[6], Tr[i % 4][1], Tm[i][1]); |
@@ -377,7 +378,7 @@ static void W(u32 *key, unsigned int i) { | |||
377 | key[3] ^= F1(key[4], Tr[i % 4][3], Tm[i][3]); | 378 | key[3] ^= F1(key[4], Tr[i % 4][3], Tm[i][3]); |
378 | key[2] ^= F2(key[3], Tr[i % 4][4], Tm[i][4]); | 379 | key[2] ^= F2(key[3], Tr[i % 4][4], Tm[i][4]); |
379 | key[1] ^= F3(key[2], Tr[i % 4][5], Tm[i][5]); | 380 | key[1] ^= F3(key[2], Tr[i % 4][5], Tm[i][5]); |
380 | key[0] ^= F1(key[1], Tr[i % 4][6], Tm[i][6]); | 381 | key[0] ^= F1(key[1], Tr[i % 4][6], Tm[i][6]); |
381 | key[7] ^= F2(key[0], Tr[i % 4][7], Tm[i][7]); | 382 | key[7] ^= F2(key[0], Tr[i % 4][7], Tm[i][7]); |
382 | } | 383 | } |
383 | 384 | ||
@@ -393,11 +394,11 @@ static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key, | |||
393 | if (key_len % 4 != 0) { | 394 | if (key_len % 4 != 0) { |
394 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 395 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
395 | return -EINVAL; | 396 | return -EINVAL; |
396 | } | 397 | } |
398 | |||
399 | memset(p_key, 0, 32); | ||
400 | memcpy(p_key, in_key, key_len); | ||
397 | 401 | ||
398 | memset (p_key, 0, 32); | ||
399 | memcpy (p_key, in_key, key_len); | ||
400 | |||
401 | key[0] = be32_to_cpu(p_key[0]); /* A */ | 402 | key[0] = be32_to_cpu(p_key[0]); /* A */ |
402 | key[1] = be32_to_cpu(p_key[1]); /* B */ | 403 | key[1] = be32_to_cpu(p_key[1]); /* B */ |
403 | key[2] = be32_to_cpu(p_key[2]); /* C */ | 404 | key[2] = be32_to_cpu(p_key[2]); /* C */ |
@@ -406,18 +407,16 @@ static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key, | |||
406 | key[5] = be32_to_cpu(p_key[5]); /* F */ | 407 | key[5] = be32_to_cpu(p_key[5]); /* F */ |
407 | key[6] = be32_to_cpu(p_key[6]); /* G */ | 408 | key[6] = be32_to_cpu(p_key[6]); /* G */ |
408 | key[7] = be32_to_cpu(p_key[7]); /* H */ | 409 | key[7] = be32_to_cpu(p_key[7]); /* H */ |
409 | |||
410 | |||
411 | 410 | ||
412 | for (i = 0; i < 12; i++) { | 411 | for (i = 0; i < 12; i++) { |
413 | W (key, 2 * i); | 412 | W(key, 2 * i); |
414 | W (key, 2 * i + 1); | 413 | W(key, 2 * i + 1); |
415 | 414 | ||
416 | c->Kr[i][0] = key[0] & 0x1f; | 415 | c->Kr[i][0] = key[0] & 0x1f; |
417 | c->Kr[i][1] = key[2] & 0x1f; | 416 | c->Kr[i][1] = key[2] & 0x1f; |
418 | c->Kr[i][2] = key[4] & 0x1f; | 417 | c->Kr[i][2] = key[4] & 0x1f; |
419 | c->Kr[i][3] = key[6] & 0x1f; | 418 | c->Kr[i][3] = key[6] & 0x1f; |
420 | 419 | ||
421 | c->Km[i][0] = key[7]; | 420 | c->Km[i][0] = key[7]; |
422 | c->Km[i][1] = key[5]; | 421 | c->Km[i][1] = key[5]; |
423 | c->Km[i][2] = key[3]; | 422 | c->Km[i][2] = key[3]; |
@@ -428,21 +427,23 @@ static int cast6_setkey(struct crypto_tfm *tfm, const u8 *in_key, | |||
428 | } | 427 | } |
429 | 428 | ||
430 | /*forward quad round*/ | 429 | /*forward quad round*/ |
431 | static void Q (u32 * block, u8 * Kr, u32 * Km) { | 430 | static void Q(u32 *block, u8 *Kr, u32 *Km) |
431 | { | ||
432 | u32 I; | 432 | u32 I; |
433 | block[2] ^= F1(block[3], Kr[0], Km[0]); | 433 | block[2] ^= F1(block[3], Kr[0], Km[0]); |
434 | block[1] ^= F2(block[2], Kr[1], Km[1]); | 434 | block[1] ^= F2(block[2], Kr[1], Km[1]); |
435 | block[0] ^= F3(block[1], Kr[2], Km[2]); | 435 | block[0] ^= F3(block[1], Kr[2], Km[2]); |
436 | block[3] ^= F1(block[0], Kr[3], Km[3]); | 436 | block[3] ^= F1(block[0], Kr[3], Km[3]); |
437 | } | 437 | } |
438 | 438 | ||
439 | /*reverse quad round*/ | 439 | /*reverse quad round*/ |
440 | static void QBAR (u32 * block, u8 * Kr, u32 * Km) { | 440 | static void QBAR(u32 *block, u8 *Kr, u32 *Km) |
441 | { | ||
441 | u32 I; | 442 | u32 I; |
442 | block[3] ^= F1(block[0], Kr[3], Km[3]); | 443 | block[3] ^= F1(block[0], Kr[3], Km[3]); |
443 | block[0] ^= F3(block[1], Kr[2], Km[2]); | 444 | block[0] ^= F3(block[1], Kr[2], Km[2]); |
444 | block[1] ^= F2(block[2], Kr[1], Km[1]); | 445 | block[1] ^= F2(block[2], Kr[1], Km[1]); |
445 | block[2] ^= F1(block[3], Kr[0], Km[0]); | 446 | block[2] ^= F1(block[3], Kr[0], Km[0]); |
446 | } | 447 | } |
447 | 448 | ||
448 | static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf) | 449 | static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf) |
@@ -451,64 +452,65 @@ static void cast6_encrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf) | |||
451 | const __be32 *src = (const __be32 *)inbuf; | 452 | const __be32 *src = (const __be32 *)inbuf; |
452 | __be32 *dst = (__be32 *)outbuf; | 453 | __be32 *dst = (__be32 *)outbuf; |
453 | u32 block[4]; | 454 | u32 block[4]; |
454 | u32 * Km; | 455 | u32 *Km; |
455 | u8 * Kr; | 456 | u8 *Kr; |
456 | 457 | ||
457 | block[0] = be32_to_cpu(src[0]); | 458 | block[0] = be32_to_cpu(src[0]); |
458 | block[1] = be32_to_cpu(src[1]); | 459 | block[1] = be32_to_cpu(src[1]); |
459 | block[2] = be32_to_cpu(src[2]); | 460 | block[2] = be32_to_cpu(src[2]); |
460 | block[3] = be32_to_cpu(src[3]); | 461 | block[3] = be32_to_cpu(src[3]); |
461 | 462 | ||
462 | Km = c->Km[0]; Kr = c->Kr[0]; Q (block, Kr, Km); | 463 | Km = c->Km[0]; Kr = c->Kr[0]; Q(block, Kr, Km); |
463 | Km = c->Km[1]; Kr = c->Kr[1]; Q (block, Kr, Km); | 464 | Km = c->Km[1]; Kr = c->Kr[1]; Q(block, Kr, Km); |
464 | Km = c->Km[2]; Kr = c->Kr[2]; Q (block, Kr, Km); | 465 | Km = c->Km[2]; Kr = c->Kr[2]; Q(block, Kr, Km); |
465 | Km = c->Km[3]; Kr = c->Kr[3]; Q (block, Kr, Km); | 466 | Km = c->Km[3]; Kr = c->Kr[3]; Q(block, Kr, Km); |
466 | Km = c->Km[4]; Kr = c->Kr[4]; Q (block, Kr, Km); | 467 | Km = c->Km[4]; Kr = c->Kr[4]; Q(block, Kr, Km); |
467 | Km = c->Km[5]; Kr = c->Kr[5]; Q (block, Kr, Km); | 468 | Km = c->Km[5]; Kr = c->Kr[5]; Q(block, Kr, Km); |
468 | Km = c->Km[6]; Kr = c->Kr[6]; QBAR (block, Kr, Km); | 469 | Km = c->Km[6]; Kr = c->Kr[6]; QBAR(block, Kr, Km); |
469 | Km = c->Km[7]; Kr = c->Kr[7]; QBAR (block, Kr, Km); | 470 | Km = c->Km[7]; Kr = c->Kr[7]; QBAR(block, Kr, Km); |
470 | Km = c->Km[8]; Kr = c->Kr[8]; QBAR (block, Kr, Km); | 471 | Km = c->Km[8]; Kr = c->Kr[8]; QBAR(block, Kr, Km); |
471 | Km = c->Km[9]; Kr = c->Kr[9]; QBAR (block, Kr, Km); | 472 | Km = c->Km[9]; Kr = c->Kr[9]; QBAR(block, Kr, Km); |
472 | Km = c->Km[10]; Kr = c->Kr[10]; QBAR (block, Kr, Km); | 473 | Km = c->Km[10]; Kr = c->Kr[10]; QBAR(block, Kr, Km); |
473 | Km = c->Km[11]; Kr = c->Kr[11]; QBAR (block, Kr, Km); | 474 | Km = c->Km[11]; Kr = c->Kr[11]; QBAR(block, Kr, Km); |
474 | 475 | ||
475 | dst[0] = cpu_to_be32(block[0]); | 476 | dst[0] = cpu_to_be32(block[0]); |
476 | dst[1] = cpu_to_be32(block[1]); | 477 | dst[1] = cpu_to_be32(block[1]); |
477 | dst[2] = cpu_to_be32(block[2]); | 478 | dst[2] = cpu_to_be32(block[2]); |
478 | dst[3] = cpu_to_be32(block[3]); | 479 | dst[3] = cpu_to_be32(block[3]); |
479 | } | 480 | } |
480 | 481 | ||
481 | static void cast6_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf) { | 482 | static void cast6_decrypt(struct crypto_tfm *tfm, u8 *outbuf, const u8 *inbuf) |
482 | struct cast6_ctx * c = crypto_tfm_ctx(tfm); | 483 | { |
484 | struct cast6_ctx *c = crypto_tfm_ctx(tfm); | ||
483 | const __be32 *src = (const __be32 *)inbuf; | 485 | const __be32 *src = (const __be32 *)inbuf; |
484 | __be32 *dst = (__be32 *)outbuf; | 486 | __be32 *dst = (__be32 *)outbuf; |
485 | u32 block[4]; | 487 | u32 block[4]; |
486 | u32 * Km; | 488 | u32 *Km; |
487 | u8 * Kr; | 489 | u8 *Kr; |
488 | 490 | ||
489 | block[0] = be32_to_cpu(src[0]); | 491 | block[0] = be32_to_cpu(src[0]); |
490 | block[1] = be32_to_cpu(src[1]); | 492 | block[1] = be32_to_cpu(src[1]); |
491 | block[2] = be32_to_cpu(src[2]); | 493 | block[2] = be32_to_cpu(src[2]); |
492 | block[3] = be32_to_cpu(src[3]); | 494 | block[3] = be32_to_cpu(src[3]); |
493 | 495 | ||
494 | Km = c->Km[11]; Kr = c->Kr[11]; Q (block, Kr, Km); | 496 | Km = c->Km[11]; Kr = c->Kr[11]; Q(block, Kr, Km); |
495 | Km = c->Km[10]; Kr = c->Kr[10]; Q (block, Kr, Km); | 497 | Km = c->Km[10]; Kr = c->Kr[10]; Q(block, Kr, Km); |
496 | Km = c->Km[9]; Kr = c->Kr[9]; Q (block, Kr, Km); | 498 | Km = c->Km[9]; Kr = c->Kr[9]; Q(block, Kr, Km); |
497 | Km = c->Km[8]; Kr = c->Kr[8]; Q (block, Kr, Km); | 499 | Km = c->Km[8]; Kr = c->Kr[8]; Q(block, Kr, Km); |
498 | Km = c->Km[7]; Kr = c->Kr[7]; Q (block, Kr, Km); | 500 | Km = c->Km[7]; Kr = c->Kr[7]; Q(block, Kr, Km); |
499 | Km = c->Km[6]; Kr = c->Kr[6]; Q (block, Kr, Km); | 501 | Km = c->Km[6]; Kr = c->Kr[6]; Q(block, Kr, Km); |
500 | Km = c->Km[5]; Kr = c->Kr[5]; QBAR (block, Kr, Km); | 502 | Km = c->Km[5]; Kr = c->Kr[5]; QBAR(block, Kr, Km); |
501 | Km = c->Km[4]; Kr = c->Kr[4]; QBAR (block, Kr, Km); | 503 | Km = c->Km[4]; Kr = c->Kr[4]; QBAR(block, Kr, Km); |
502 | Km = c->Km[3]; Kr = c->Kr[3]; QBAR (block, Kr, Km); | 504 | Km = c->Km[3]; Kr = c->Kr[3]; QBAR(block, Kr, Km); |
503 | Km = c->Km[2]; Kr = c->Kr[2]; QBAR (block, Kr, Km); | 505 | Km = c->Km[2]; Kr = c->Kr[2]; QBAR(block, Kr, Km); |
504 | Km = c->Km[1]; Kr = c->Kr[1]; QBAR (block, Kr, Km); | 506 | Km = c->Km[1]; Kr = c->Kr[1]; QBAR(block, Kr, Km); |
505 | Km = c->Km[0]; Kr = c->Kr[0]; QBAR (block, Kr, Km); | 507 | Km = c->Km[0]; Kr = c->Kr[0]; QBAR(block, Kr, Km); |
506 | 508 | ||
507 | dst[0] = cpu_to_be32(block[0]); | 509 | dst[0] = cpu_to_be32(block[0]); |
508 | dst[1] = cpu_to_be32(block[1]); | 510 | dst[1] = cpu_to_be32(block[1]); |
509 | dst[2] = cpu_to_be32(block[2]); | 511 | dst[2] = cpu_to_be32(block[2]); |
510 | dst[3] = cpu_to_be32(block[3]); | 512 | dst[3] = cpu_to_be32(block[3]); |
511 | } | 513 | } |
512 | 514 | ||
513 | static struct crypto_alg alg = { | 515 | static struct crypto_alg alg = { |
514 | .cra_name = "cast6", | 516 | .cra_name = "cast6", |