#include "crypt2.hh"#include <string.h>Include dependency graph for crypt2.cc:

Go to the source code of this file.
Defines | |
| #define | ITERATIONS (16) |
Functions | |
| unsigned int | charToUnsigned (unsigned char b) |
| unsigned int | fourCharsToInt (unsigned char b[], unsigned int offset) |
| void | intToFourChars (unsigned int iValue, unsigned char b[], unsigned int offset) |
| void | PERM_OP (unsigned int a, unsigned int b, unsigned int n, unsigned int m, unsigned int results[]) |
| unsigned int | HPERM_OP (unsigned int a, int n, unsigned int m) |
| unsigned int * | des_set_key (unsigned char *key) |
| unsigned int | D_ENCRYPT (unsigned int L, unsigned int R, unsigned int S, unsigned int E0, unsigned int E1, unsigned int s[]) |
| unsigned int * | body (unsigned int *schedule, unsigned int Eswap0, unsigned int Eswap1) |
| char * | rcs_crypt (const char *original, const char *salt) |
Variables | |
| unsigned int | con_salt [] |
| unsigned int | shifts2 [] |
| unsigned int | skb [8][64] |
| unsigned int | SPtrans [8][64] |
| unsigned int | cov_2char [] |
|
|
|
|
|
Definition at line 383 of file crypt2.cc. Referenced by fourCharsToInt().
00384 {
00385 unsigned int value = (unsigned int) b;
00386
00387 return (value);
00388 }
|
|
||||||||||||
|
Definition at line 391 of file crypt2.cc. Referenced by des_set_key().
00392 {
00393 unsigned int value;
00394
00395 value = charToUnsigned (b[offset++]);
00396 value |= (charToUnsigned (b[offset++]) << 8);
00397 value |= (charToUnsigned (b[offset++]) << 16);
00398 value |= (charToUnsigned (b[offset++]) << 24);
00399
00400 return (value);
00401 }
|
|
||||||||||||||||
|
Definition at line 404 of file crypt2.cc. Referenced by rcs_crypt().
00405 {
00406 b[offset++] = (unsigned char) ((iValue) & 0xff);
00407 b[offset++] = (unsigned char) ((iValue >> 8) & 0xff);
00408 b[offset++] = (unsigned char) ((iValue >> 16) & 0xff);
00409 b[offset++] = (unsigned char) ((iValue >> 24) & 0xff);
00410 }
|
|
||||||||||||||||||||||||
|
Definition at line 413 of file crypt2.cc. Referenced by body(), and des_set_key().
00415 {
00416 unsigned int t;
00417 #ifdef DEBUG_CRYPT
00418 printf ("PERM_OP(%8.8X,%8.8X,%d,%d,results[]) called.\n", a, b, n, m);
00419 #endif
00420
00421 t = ((a >> n) ^ b) & m;
00422 a ^= t << n;
00423 b ^= t;
00424
00425 results[0] = a;
00426 results[1] = b;
00427 #ifdef DEBUG_CRYPT
00428 printf ("PERM_OP(): results[] = %8.8X , %8.8X .\n", a, b);
00429 #endif
00430
00431 }
|
|
||||||||||||||||
|
Definition at line 434 of file crypt2.cc. Referenced by des_set_key().
00435 {
00436 unsigned int t;
00437
00438 t = ((a << (16 - n)) ^ a) & m;
00439 a = a ^ t ^ (t >> (16 - n));
00440
00441 return (a);
00442 }
|
|
|
Definition at line 445 of file crypt2.cc. Referenced by rcs_crypt().
00446 {
00447 static unsigned int schedule[ITERATIONS * 2];
00448
00449 unsigned int c = fourCharsToInt (key, 0);
00450 unsigned int d = fourCharsToInt (key, 4);
00451
00452 unsigned int results[2];
00453
00454 PERM_OP (d, c, 4, 0x0f0f0f0f, results);
00455 d = results[0];
00456 c = results[1];
00457
00458 c = HPERM_OP (c, -2, 0xcccc0000);
00459 d = HPERM_OP (d, -2, 0xcccc0000);
00460
00461 PERM_OP (d, c, 1, 0x55555555, results);
00462 d = results[0];
00463 c = results[1];
00464
00465 PERM_OP (c, d, 8, 0x00ff00ff, results);
00466 c = results[0];
00467 d = results[1];
00468
00469 PERM_OP (d, c, 1, 0x55555555, results);
00470 d = results[0];
00471 c = results[1];
00472
00473 d = (((d & 0x000000ff) << 16) | (d & 0x0000ff00) |
00474 ((d & 0x00ff0000) >> 16) | ((c & 0xf0000000) >> 4));
00475 c &= 0x0fffffff;
00476
00477 unsigned int s, t;
00478 unsigned int j = 0;
00479
00480 for (unsigned int i = 0; i < ITERATIONS; i++)
00481 {
00482 if (shifts2[i])
00483 {
00484 c = (c >> 2) | (c << 26);
00485 d = (d >> 2) | (d << 26);
00486 }
00487 else
00488 {
00489 c = (c >> 1) | (c << 27);
00490 d = (d >> 1) | (d << 27);
00491 }
00492
00493 c &= 0x0fffffff;
00494 d &= 0x0fffffff;
00495
00496 s = skb[0][(c) & 0x3f] |
00497 skb[1][((c >> 6) & 0x03) | ((c >> 7) & 0x3c)] |
00498 skb[2][((c >> 13) & 0x0f) | ((c >> 14) & 0x30)] |
00499 skb[3][((c >> 20) & 0x01) | ((c >> 21) & 0x06) | ((c >> 22) & 0x38)];
00500
00501 t = skb[4][(d) & 0x3f] |
00502 skb[5][((d >> 7) & 0x03) | ((d >> 8) & 0x3c)] |
00503 skb[6][(d >> 15) & 0x3f] |
00504 skb[7][((d >> 21) & 0x0f) | ((d >> 22) & 0x30)];
00505
00506 #ifdef DEBUG_CRYPT
00507 printf
00508 ("des_set_key() : i = %d, c = %8.8X, d = %8.8X, s = %8.8X, t = %8.8X\n",
00509 i, c, d, s, t);
00510 #endif
00511
00512 schedule[j++] = ((t << 16) | (s & 0x0000ffff)) & 0xffffffff;
00513 s = ((s >> 16) | (t & 0xffff0000));
00514 #ifdef DEBUG_CRYPT
00515 printf ("des_set_key() : s = %8.8X, schedule[%d] = %8.8X\n", s, j - 1,
00516 schedule[j - 1]);
00517 #endif
00518
00519 s = (s << 4) | (s >> 28);
00520 schedule[j++] = s & 0xffffffff;
00521 #ifdef DEBUG_CRYPT
00522 printf ("des_set_key() : s = %8.8X, schedule[%d] = %8.8X\n", s, j - 1,
00523 schedule[j - 1]);
00524 #endif
00525 }
00526 return (schedule);
00527 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 530 of file crypt2.cc. Referenced by body().
00532 {
00533 unsigned int t, u, v;
00534
00535 v = R ^ (R >> 16);
00536 u = v & E0;
00537 v = v & E1;
00538 u = (u ^ (u << 16)) ^ R ^ s[S];
00539 t = (v ^ (v << 16)) ^ R ^ s[S + 1];
00540 t = (t >> 4) | (t << 28);
00541
00542 L ^= SPtrans[1][(t) & 0x3f] |
00543 SPtrans[3][(t >> 8) & 0x3f] |
00544 SPtrans[5][(t >> 16) & 0x3f] |
00545 SPtrans[7][(t >> 24) & 0x3f] |
00546 SPtrans[0][(u) & 0x3f] |
00547 SPtrans[2][(u >> 8) & 0x3f] |
00548 SPtrans[4][(u >> 16) & 0x3f] | SPtrans[6][(u >> 24) & 0x3f];
00549
00550 return (L);
00551 }
|
|
||||||||||||||||
|
Definition at line 554 of file crypt2.cc. Referenced by rcs_crypt().
00555 {
00556 unsigned int left = 0;
00557 unsigned int right = 0;
00558 unsigned int t = 0;
00559
00560 for (unsigned int j = 0; j < 25; j++)
00561 {
00562 for (unsigned int i = 0; i < ITERATIONS * 2; i += 4)
00563 {
00564 left = D_ENCRYPT (left, right, i, Eswap0, Eswap1, schedule);
00565 right = D_ENCRYPT (right, left, i + 2, Eswap0, Eswap1, schedule);
00566 }
00567 t = left;
00568 left = right;
00569 right = t;
00570 }
00571
00572 t = right;
00573
00574 right = (left >> 1) | (left << 31);
00575 left = (t >> 1) | (t << 31);
00576
00577 left &= 0xffffffff;
00578 right &= 0xffffffff;
00579
00580 unsigned int results[2];
00581
00582 PERM_OP (right, left, 1, 0x55555555, results);
00583 right = results[0];
00584 left = results[1];
00585
00586 PERM_OP (left, right, 8, 0x00ff00ff, results);
00587 left = results[0];
00588 right = results[1];
00589
00590 PERM_OP (right, left, 2, 0x33333333, results);
00591 right = results[0];
00592 left = results[1];
00593
00594 PERM_OP (left, right, 16, 0x0000ffff, results);
00595 left = results[0];
00596 right = results[1];
00597
00598 PERM_OP (right, left, 4, 0x0f0f0f0f, results);
00599 right = results[0];
00600 left = results[1];
00601
00602 static unsigned int out[2];
00603
00604 out[0] = left;
00605 out[1] = right;
00606
00607 return (out);
00608 }
|
|
||||||||||||
|
Definition at line 611 of file crypt2.cc. 00612 {
00613 // rcs_print("encrypting %s with %s\n", original, salt);
00614 unsigned int i, y, u;
00615
00616 if (strlen (salt) < 2)
00617 return NULL;
00618
00619 static unsigned char buffer[256];
00620 memset (buffer, 0, 256);
00621
00622 unsigned char charZero = (unsigned char) salt[(0)];
00623 unsigned char charOne = (unsigned char) salt[(1)];
00624
00625 buffer[0] = charZero;
00626 buffer[1] = charOne;
00627
00628 unsigned int Eswap0 = con_salt[(unsigned int) charZero];
00629 unsigned int Eswap1 = con_salt[(unsigned int) charOne] << 4;
00630
00631 unsigned char key[8];
00632
00633 for (i = 0; i < 8; i++)
00634 key[i] = (char) 0;
00635
00636 #ifdef DEBUG_CRYPT
00637 printf ("original = %s\n", original);
00638 #endif
00639
00640 for (i = 0; i < 8 && i < strlen (original); i++)
00641 {
00642 unsigned int iChar = (unsigned int) original[(i)];
00643
00644 key[i] = (unsigned char) (iChar << 1);
00645 }
00646 #ifdef DEBUG_CRYPT
00647 printf ("key = ");
00648 for (int jj = 0; jj < 8; jj++)
00649 {
00650 if (jj % 8 == 0)
00651 {
00652 printf ("\n");
00653 }
00654 printf (" %8.8X ", key[jj]);
00655 }
00656 printf ("\n");
00657 #endif
00658
00659 unsigned int *schedule = des_set_key (key);
00660 #ifdef DEBUG_CRYPT
00661 printf ("schedule = ");
00662 for (int ii = 0; ii < ITERATIONS * 2; ii++)
00663 {
00664 if (ii % 8 == 0)
00665 {
00666 printf ("\n");
00667 }
00668 printf (" %8.8X ", schedule[ii]);
00669 }
00670 printf ("\n");
00671 #endif
00672
00673 unsigned int *out = body (schedule, Eswap0, Eswap1);
00674 #ifdef DEBUG_CRYPT
00675 printf ("out = ");
00676 for (int iii = 0; iii < 2; iii++)
00677 {
00678 printf (" %8.8X ", out[iii]);
00679 }
00680 printf ("\n");
00681 #endif
00682
00683 unsigned char b[9];
00684
00685 intToFourChars (out[0], b, 0);
00686 intToFourChars (out[1], b, 4);
00687 b[8] = 0;
00688
00689 for (i = 2, y = 0, u = 0x80; i < 13; i++)
00690 {
00691 for (unsigned int j = 0, c = 0; j < 6; j++)
00692 {
00693 c <<= 1;
00694
00695 if (((unsigned int) b[y] & u) != 0)
00696 c |= 1;
00697
00698 u = u >> 1;
00699
00700 if (u == 0)
00701 {
00702 y++;
00703 u = 0x80;
00704 }
00705 buffer[i] = (unsigned char) cov_2char[c];
00706 }
00707 }
00708 return ((char *) buffer);
00709 }
|
|
|
Initial value: {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22,
0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C,
0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
} |
|
|
Initial value: {
0, 0, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0
} |
|
|
|
|
|
|
|
|
Initial value: {
0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,
0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54,
0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
} |
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001