xref: /original-bsd/old/crypt/crypt.c (revision 0b685140)
1 static char *sccsid = "@(#)crypt.c	4.2 (Berkeley) 07/09/81";
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 	unsigned random;
24 	long seed;
25 
26 	strncpy(buf, pw, 8);
27 	while (*pw)
28 		*pw++ = '\0';
29 	buf[8] = buf[0];
30 	buf[9] = buf[1];
31 	pipe(pf);
32 	if (fork()==0) {
33 		close(0);
34 		close(1);
35 		dup(pf[0]);
36 		dup(pf[1]);
37 		execl("/usr/lib/makekey", "-", 0);
38 		execl("/lib/makekey", "-", 0);
39 		exit(1);
40 	}
41 	write(pf[1], buf, 10);
42 	wait((int *)NULL);
43 	if (read(pf[0], buf, 13) != 13) {
44 		fprintf(stderr, "crypt: cannot generate key\n");
45 		exit(1);
46 	}
47 	seed = 123;
48 	for (i=0; i<13; i++)
49 		seed = seed*buf[i] + i;
50 	for(i=0;i<ROTORSZ;i++) {
51 		t1[i] = i;
52 		deck[i] = i;
53 	}
54 	for(i=0;i<ROTORSZ;i++) {
55 		seed = 5*seed + buf[i%13];
56 		random = seed % 65521;
57 		k = ROTORSZ-1 - i;
58 		ic = (random&MASK)%(k+1);
59 		random >>= 8;
60 		temp = t1[k];
61 		t1[k] = t1[ic];
62 		t1[ic] = temp;
63 		if(t3[k]!=0) continue;
64 		ic = (random&MASK) % k;
65 		while(t3[ic]!=0) ic = (ic+1) % k;
66 		t3[k] = ic;
67 		t3[ic] = k;
68 	}
69 	for(i=0;i<ROTORSZ;i++)
70 		t2[t1[i]&MASK] = i;
71 }
72 
73 main(argc, argv)
74 char *argv[];
75 {
76 	register i, n1, n2, nr1, nr2;
77 	int secureflg = 0;
78 
79 	if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 's') {
80 		argc--;
81 		argv++;
82 		secureflg = 1;
83 	}
84 	if (argc != 2){
85 		setup(getpass("Enter key:"));
86 	}
87 	else
88 		setup(argv[1]);
89 	n1 = 0;
90 	n2 = 0;
91 	nr2 = 0;
92 
93 	while((i=getchar()) >=0) {
94 		if (secureflg) {
95 			nr1 = deck[n1]&MASK;
96 			nr2 = deck[nr1]&MASK;
97 		} else {
98 			nr1 = n1;
99 		}
100 		i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1;
101 		putchar(i);
102 		n1++;
103 		if(n1==ROTORSZ) {
104 			n1 = 0;
105 			n2++;
106 			if(n2==ROTORSZ) n2 = 0;
107 			if (secureflg) {
108 				shuffle(deck);
109 			} else {
110 				nr2 = n2;
111 			}
112 		}
113 	}
114 }
115 
116 shuffle(deck)
117 	char deck[];
118 {
119 	int i, ic, k, temp;
120 	unsigned random;
121 	static long seed = 123;
122 
123 	for(i=0;i<ROTORSZ;i++) {
124 		seed = 5*seed + buf[i%13];
125 		random = seed % 65521;
126 		k = ROTORSZ-1 - i;
127 		ic = (random&MASK)%(k+1);
128 		temp = deck[k];
129 		deck[k] = deck[ic];
130 		deck[ic] = temp;
131 	}
132 }
133