file reorg, pathnames.h, paths.h
[unix-history] / usr / src / old / crypt / crypt.c
CommitLineData
435e8dff 1static char *sccsid = "@(#)crypt.c 4.4 (Berkeley) %G%";
154b09ca 2
eadbf085
BJ
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>
435e8dff 10#include "pathnames.h"
eadbf085
BJ
11#define ROTORSZ 256
12#define MASK 0377
13char t1[ROTORSZ];
14char t2[ROTORSZ];
15char t3[ROTORSZ];
154b09ca 16char deck[ROTORSZ];
eadbf085 17char *getpass();
154b09ca 18char buf[13];
eadbf085
BJ
19
20setup(pw)
21char *pw;
22{
23 int ic, i, k, temp, pf[2];
c3338ef1 24 int pid, wpid;
eadbf085 25 unsigned random;
eadbf085
BJ
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);
c3338ef1 34 if ((pid=fork())==0) {
eadbf085
BJ
35 close(0);
36 close(1);
37 dup(pf[0]);
38 dup(pf[1]);
435e8dff 39 execl(_PATH_MAKEKEY, "-", 0);
eadbf085
BJ
40 exit(1);
41 }
42 write(pf[1], buf, 10);
c3338ef1
RC
43 while ((wpid = wait((int *)NULL)) != -1 && wpid != pid)
44 ;
eadbf085
BJ
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;
154b09ca 52 for(i=0;i<ROTORSZ;i++) {
eadbf085 53 t1[i] = i;
154b09ca
KM
54 deck[i] = i;
55 }
eadbf085
BJ
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
75main(argc, argv)
76char *argv[];
77{
154b09ca
KM
78 register i, n1, n2, nr1, nr2;
79 int secureflg = 0;
eadbf085 80
154b09ca
KM
81 if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 's') {
82 argc--;
83 argv++;
84 secureflg = 1;
85 }
eadbf085
BJ
86 if (argc != 2){
87 setup(getpass("Enter key:"));
88 }
89 else
90 setup(argv[1]);
91 n1 = 0;
92 n2 = 0;
154b09ca 93 nr2 = 0;
eadbf085
BJ
94
95 while((i=getchar()) >=0) {
154b09ca
KM
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;
eadbf085
BJ
103 putchar(i);
104 n1++;
105 if(n1==ROTORSZ) {
106 n1 = 0;
107 n2++;
108 if(n2==ROTORSZ) n2 = 0;
154b09ca
KM
109 if (secureflg) {
110 shuffle(deck);
111 } else {
112 nr2 = n2;
113 }
eadbf085
BJ
114 }
115 }
116}
154b09ca
KM
117
118shuffle(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}