1 static char *sccsid = "@(#)crypt.c 4.4 (Berkeley) 05/11/89";
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 #include "pathnames.h"
11 #define ROTORSZ 256
12 #define MASK 0377
13 char t1[ROTORSZ];
14 char t2[ROTORSZ];
15 char t3[ROTORSZ];
16 char deck[ROTORSZ];
17 char *getpass();
18 char buf[13];
19
setup(pw)20 setup(pw)
21 char *pw;
22 {
23 int ic, i, k, temp, pf[2];
24 int pid, wpid;
25 unsigned random;
26 long seed;
27
28 strncpy(buf, pw, 8);
29 while (*pw)
30 *pw++ = '\0';
31 buf[8] = buf[0];
32 buf[9] = buf[1];
33 pipe(pf);
34 if ((pid=fork())==0) {
35 close(0);
36 close(1);
37 dup(pf[0]);
38 dup(pf[1]);
39 execl(_PATH_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
main(argc,argv)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
shuffle(deck)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 }
135