#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 } |