1: #if !defined(lint) && defined(DOSCCS)
   2: static char *sccsid = "@(#)crypt.c	4.3.1 (2.11BSD) 1996/10/23";
   3: #endif
   4: 
   5: /*
   6:  *	A one-rotor machine designed along the lines of Enigma
   7:  *	but considerably trivialized.
   8:  */
   9: 
  10: #define ECHO 010
  11: #include <stdio.h>
  12: #define ROTORSZ 256
  13: #define MASK 0377
  14: char    t1[ROTORSZ];
  15: char    t2[ROTORSZ];
  16: char    t3[ROTORSZ];
  17: char    deck[ROTORSZ];
  18: char    *getpass();
  19: char    buf[13];
  20: 
  21: setup(pw)
  22: char *pw;
  23: {
  24:     int ic, i, k, temp, pf[2];
  25:     int pid, wpid;
  26:     unsigned random;
  27:     long seed;
  28: 
  29:     strncpy(buf, pw, 8);
  30:     while (*pw)
  31:         *pw++ = '\0';
  32:     buf[8] = buf[0];
  33:     buf[9] = buf[1];
  34:     pipe(pf);
  35:     if ((pid=fork())==0) {
  36:         close(0);
  37:         close(1);
  38:         dup(pf[0]);
  39:         dup(pf[1]);
  40:         execl("/usr/libexec/makekey", "-", 0);
  41:         exit(1);
  42:     }
  43:     write(pf[1], buf, 10);
  44:     while ((wpid = wait((int *)NULL)) != -1 && wpid != pid)
  45:         ;
  46:     if (read(pf[0], buf, 13) != 13) {
  47:         fprintf(stderr, "crypt: cannot generate key\n");
  48:         exit(1);
  49:     }
  50:     seed = 123;
  51:     for (i=0; i<13; i++)
  52:         seed = seed*buf[i] + i;
  53:     for(i=0;i<ROTORSZ;i++) {
  54:         t1[i] = i;
  55:         deck[i] = i;
  56:     }
  57:     for(i=0;i<ROTORSZ;i++) {
  58:         seed = 5*seed + buf[i%13];
  59:         random = seed % 65521;
  60:         k = ROTORSZ-1 - i;
  61:         ic = (random&MASK)%(k+1);
  62:         random >>= 8;
  63:         temp = t1[k];
  64:         t1[k] = t1[ic];
  65:         t1[ic] = temp;
  66:         if(t3[k]!=0) continue;
  67:         ic = (random&MASK) % k;
  68:         while(t3[ic]!=0) ic = (ic+1) % k;
  69:         t3[k] = ic;
  70:         t3[ic] = k;
  71:     }
  72:     for(i=0;i<ROTORSZ;i++)
  73:         t2[t1[i]&MASK] = i;
  74: }
  75: 
  76: main(argc, argv)
  77: char *argv[];
  78: {
  79:     register i, n1, n2, nr1, nr2;
  80:     int secureflg = 0;
  81: 
  82:     if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 's') {
  83:         argc--;
  84:         argv++;
  85:         secureflg = 1;
  86:     }
  87:     if (argc != 2){
  88:         setup(getpass("Enter key:"));
  89:     }
  90:     else
  91:         setup(argv[1]);
  92:     n1 = 0;
  93:     n2 = 0;
  94:     nr2 = 0;
  95: 
  96:     while((i=getchar()) >=0) {
  97:         if (secureflg) {
  98:             nr1 = deck[n1]&MASK;
  99:             nr2 = deck[nr1]&MASK;
 100:         } else {
 101:             nr1 = n1;
 102:         }
 103:         i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1;
 104:         putchar(i);
 105:         n1++;
 106:         if(n1==ROTORSZ) {
 107:             n1 = 0;
 108:             n2++;
 109:             if(n2==ROTORSZ) n2 = 0;
 110:             if (secureflg) {
 111:                 shuffle(deck);
 112:             } else {
 113:                 nr2 = n2;
 114:             }
 115:         }
 116:     }
 117: }
 118: 
 119: shuffle(deck)
 120:     char deck[];
 121: {
 122:     int i, ic, k, temp;
 123:     unsigned random;
 124:     static long seed = 123;
 125: 
 126:     for(i=0;i<ROTORSZ;i++) {
 127:         seed = 5*seed + buf[i%13];
 128:         random = seed % 65521;
 129:         k = ROTORSZ-1 - i;
 130:         ic = (random&MASK)%(k+1);
 131:         temp = deck[k];
 132:         deck[k] = deck[ic];
 133:         deck[ic] = temp;
 134:     }
 135: }

Defined functions

main defined in line 76; never used
setup defined in line 21; used 2 times
shuffle defined in line 119; used 1 times

Defined variables

buf defined in line 19; used 10 times
deck defined in line 17; used 10 times
sccsid defined in line 2; never used
t1 defined in line 14; used 7 times
t2 defined in line 15; used 2 times
t3 defined in line 16; used 5 times

Defined macros

ECHO defined in line 10; never used
MASK defined in line 13; used 9 times
ROTORSZ defined in line 12; used 12 times
Last modified: 1996-10-24
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1234
Valid CSS Valid XHTML 1.0 Strict