Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

crypt2.cc File Reference

#include "crypt2.hh"
#include <string.h>

Include dependency graph for crypt2.cc:

Include dependency graph

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 []


Define Documentation

#define ITERATIONS   (16)
 

Definition at line 36 of file crypt2.cc.


Function Documentation

unsigned int charToUnsigned unsigned char    b
 

Definition at line 383 of file crypt2.cc.

Referenced by fourCharsToInt().

00384 {
00385   unsigned int value = (unsigned int) b;
00386 
00387   return (value);
00388 }

unsigned int fourCharsToInt unsigned char    b[],
unsigned int    offset
 

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 }

void intToFourChars unsigned int    iValue,
unsigned char    b[],
unsigned int    offset
 

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 }

void PERM_OP unsigned int    a,
unsigned int    b,
unsigned int    n,
unsigned int    m,
unsigned int    results[]
 

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 }

unsigned int HPERM_OP unsigned int    a,
int    n,
unsigned int    m
 

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 }

unsigned int* des_set_key unsigned char *    key
 

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 }

unsigned int D_ENCRYPT unsigned int    L,
unsigned int    R,
unsigned int    S,
unsigned int    E0,
unsigned int    E1,
unsigned int    s[]
 

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 }

unsigned int* body unsigned int *    schedule,
unsigned int    Eswap0,
unsigned int    Eswap1
 

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 }

char* rcs_crypt const char *    key,
const char *    passwd
 

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 }


Variable Documentation

unsigned int con_salt[]
 

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

Definition at line 38 of file crypt2.cc.

unsigned int shifts2[]
 

Initial value:

 {
  0, 0, 1, 1, 1, 1, 1, 1,
  0, 1, 1, 1, 1, 1, 1, 0
}

Definition at line 57 of file crypt2.cc.

unsigned int skb[8][64]
 

Definition at line 62 of file crypt2.cc.

unsigned int SPtrans[8][64]
 

Definition at line 217 of file crypt2.cc.

unsigned int cov_2char[]
 

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
}

Definition at line 371 of file crypt2.cc.


Generated on Sun Dec 2 15:57:05 2001 for rcslib by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001