BSD 3 development
[unix-history] / usr / src / cmd / crypt.c
CommitLineData
9c79dca0
BJ
1/*
2 * A one-rotor machine designed along the lines of Enigma
3 * but considerably trivialized.
4 */
5
6#define ECHO 010
7#include <stdio.h>
8#define ROTORSZ 256
9#define MASK 0377
10char t1[ROTORSZ];
11char t2[ROTORSZ];
12char t3[ROTORSZ];
13char *getpass();
14
15setup(pw)
16char *pw;
17{
18 int ic, i, k, temp, pf[2];
19 unsigned random;
20 char buf[13];
21 long seed;
22
23 strncpy(buf, pw, 8);
24 while (*pw)
25 *pw++ = '\0';
26 buf[8] = buf[0];
27 buf[9] = buf[1];
28 pipe(pf);
29 if (fork()==0) {
30 close(0);
31 close(1);
32 dup(pf[0]);
33 dup(pf[1]);
34 execl("/usr/lib/makekey", "-", 0);
35 execl("/lib/makekey", "-", 0);
36 exit(1);
37 }
38 write(pf[1], buf, 10);
39 wait((int *)NULL);
40 if (read(pf[0], buf, 13) != 13) {
41 fprintf(stderr, "crypt: cannot generate key\n");
42 exit(1);
43 }
44 seed = 123;
45 for (i=0; i<13; i++)
46 seed = seed*buf[i] + i;
47 for(i=0;i<ROTORSZ;i++)
48 t1[i] = i;
49 for(i=0;i<ROTORSZ;i++) {
50 seed = 5*seed + buf[i%13];
51 random = seed % 65521;
52 k = ROTORSZ-1 - i;
53 ic = (random&MASK)%(k+1);
54 random >>= 8;
55 temp = t1[k];
56 t1[k] = t1[ic];
57 t1[ic] = temp;
58 if(t3[k]!=0) continue;
59 ic = (random&MASK) % k;
60 while(t3[ic]!=0) ic = (ic+1) % k;
61 t3[k] = ic;
62 t3[ic] = k;
63 }
64 for(i=0;i<ROTORSZ;i++)
65 t2[t1[i]&MASK] = i;
66}
67
68main(argc, argv)
69char *argv[];
70{
71 register i, n1, n2;
72
73 if (argc != 2){
74 setup(getpass("Enter key:"));
75 }
76 else
77 setup(argv[1]);
78 n1 = 0;
79 n2 = 0;
80
81 while((i=getchar()) >=0) {
82 i = t2[(t3[(t1[(i+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
83 putchar(i);
84 n1++;
85 if(n1==ROTORSZ) {
86 n1 = 0;
87 n2++;
88 if(n2==ROTORSZ) n2 = 0;
89 }
90 }
91}