xref: /original-bsd/old/crypt/crypt.c (revision a0a7d8f4)
1 static char *sccsid = "@(#)crypt.c	4.3 (Berkeley) 01/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 }
135