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: }