|
|
1.1 root 1: #include "xmail.h"
2: #include "sys/types.h"
3: #include "sys/dir.h"
4: #include "ctype.h"
5: #include "pwd.h"
6: #include "sys/stat.h"
7: char *myname;
8: int uid;
9: struct direct dbuf;
10: char *maildir = "/usr/spool/secretmail/";
11: FILE *kf, *mf, *df;
12: MINT *x, *b, *one, *t45, *z, *q, *r;
13: MINT *two, *t15, *mbuf;
14: char buf[256], line[128];
15: #define MXF 100
16: int fnum[MXF], fcnt;
17: struct stat stbuf;
18: main()
19: { int i;
20: char *p;
21: uid = getuid();
22: myname = getlogin();
23: if(myname == NULL)
24: myname = getpwuid(uid)->pw_name;
25: comminit();
26: mbuf = itom(0);
27: files();
28: setup(getpass("Key: "));
29: mkb();
30: mkx();
31: #ifndef debug
32: invert(x, b, x);
33: #else
34: invert(x, b, z);
35: mult(x, z, z);
36: mdiv(z, b, q, z);
37: omout(z);
38: invert(x, b, x);
39: #endif
40: for(i=0; i<fcnt; i++)
41: { sprintf(line, "%s%s.%d", maildir, myname, fnum[i]);
42: if(stat(line, &stbuf)<0)
43: { perror(line);
44: continue;
45: }
46: if(stbuf.st_size == 0)
47: { printf("zero length mail file\n");
48: unlink(line);
49: continue;
50: }
51: if((mf = fopen(line, "r"))==NULL)
52: { perror(line);
53: continue;
54: }
55: decipher(mf, stdout);
56: cmnd:
57: printf("? ");
58: fgets(buf, sizeof(buf), stdin);
59: if(feof(stdin)) exit(0);
60: switch(buf[0])
61: {
62: case 'q':
63: exit(0);
64: case 'n':
65: case 'd':
66: case '\n':
67: unlink(line);
68: fclose(mf);
69: break;
70: case '!':
71: system(buf+1);
72: printf("!\n");
73: goto cmnd;
74: case 's':
75: case 'w':
76: rewind(mf);
77: if(buf[1] == '\n' || buf[1] == '\0')
78: strcpy(buf, "s mbox\n");
79: for(p=buf; !isspace(*p); p++);
80: for(; isspace(*p); p++);
81: p[strlen(p)-1] = 0;
82: kf = fopen(p, "a");
83: if(kf == NULL)
84: { perror(p);
85: break;
86: }
87: decipher(mf, kf);
88: fclose(mf);
89: fclose(kf);
90: unlink(line);
91: break;
92: }
93: }
94: exit(0);
95: }
96: icmp(a, b) int *a, *b;
97: {
98: return(*a - *b);
99: }
100: files()
101: { int i;
102: if((df = fopen(maildir, "r")) == NULL)
103: { perror(maildir);
104: exit(1);
105: }
106: strcpy(line, myname);
107: strcat(line, ".%d");
108: for(; !feof(df);)
109: { fread(&dbuf, sizeof(dbuf), 1, df);
110: if(feof(df)) break;
111: if(dbuf.d_ino == 0) continue;
112: if(sscanf(dbuf.d_name, line, &i) != 1)
113: continue;
114: if(fcnt >= MXF)
115: break;
116: fnum[fcnt++] = i;
117: }
118: if(fcnt == 0)
119: { printf("no secret mail\n");
120: exit(0);
121: }
122: qsort(fnum, fcnt, sizeof(int), icmp);
123: }
124: decipher(u, w) FILE *u, *w;
125: { int i;
126: short a;
127: for(;;)
128: { nin(mbuf, u);
129: if(feof(u)) break;
130: mult(mbuf, x, mbuf);
131: mdiv(mbuf, b, q, mbuf);
132: for(i=1; i<=3; i++)
133: { a = mbuf->val[i];
134: putc(a&0177, w);
135: a >>= 8;
136: putc(a&0177, w);
137: }
138: }
139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.