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

Defined functions

main defined in line 75; never used
setup defined in line 19; used 2 times
shuffle defined in line 118; used 1 times

Defined variables

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

Defined macros

ECHO defined in line 8; never used
MASK defined in line 11; used 9 times
ROTORSZ defined in line 10; used 12 times
Last modified: 1985-01-26
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1172
Valid CSS Valid XHTML 1.0 Strict