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: struct passwd *pwent; 22: 23: uid = getuid(); 24: if ((pwent = getpwuid(uid)) != (struct passwd *) 0) 25: myname = pwent->pw_name; 26: comminit(); 27: mbuf = itom(0); 28: files(); 29: setup(getpass("Key: ")); 30: mkb(); 31: mkx(); 32: #ifndef debug 33: invert(x, b, x); 34: #else 35: invert(x, b, z); 36: mult(x, z, z); 37: mdiv(z, b, q, z); 38: omout(z); 39: invert(x, b, x); 40: #endif 41: for(i=0; i<fcnt; i++) 42: { sprintf(line, "%s%s.%d", maildir, myname, fnum[i]); 43: if(stat(line, &stbuf)<0) 44: { perror(line); 45: continue; 46: } 47: if(stbuf.st_size == 0) 48: { printf("zero length mail file\n"); 49: unlink(line); 50: continue; 51: } 52: if((mf = fopen(line, "r"))==NULL) 53: { perror(line); 54: continue; 55: } 56: decipher(mf, stdout); 57: cmnd: 58: printf("? "); 59: fgets(buf, sizeof(buf), stdin); 60: if(feof(stdin)) exit(0); 61: switch(buf[0]) 62: { 63: case 'q': 64: exit(0); 65: case 'n': 66: case 'd': 67: case '\n': 68: unlink(line); 69: fclose(mf); 70: break; 71: case '!': 72: system(buf+1); 73: printf("!\n"); 74: goto cmnd; 75: case 's': 76: case 'w': 77: rewind(mf); 78: if(buf[1] == '\n' || buf[1] == '\0') 79: strcpy(buf, "s mbox\n"); 80: for(p=buf; !isspace(*p); p++); 81: for(; isspace(*p); p++); 82: p[strlen(p)-1] = 0; 83: kf = fopen(p, "a"); 84: chmod(p, 0600); 85: if(kf == NULL) 86: { perror(p); 87: break; 88: } 89: decipher(mf, kf); 90: fclose(mf); 91: fclose(kf); 92: unlink(line); 93: break; 94: } 95: } 96: exit(0); 97: } 98: icmp(a, b) int *a, *b; 99: { 100: return(*a - *b); 101: } 102: files() 103: { int i; 104: if((df = fopen(maildir, "r")) == NULL) 105: { perror(maildir); 106: exit(1); 107: } 108: strcpy(line, myname); 109: strcat(line, ".%d"); 110: for(; !feof(df);) 111: { fread(&dbuf, sizeof(dbuf), 1, df); 112: if(feof(df)) break; 113: if(dbuf.d_ino == 0) continue; 114: if(sscanf(dbuf.d_name, line, &i) != 1) 115: continue; 116: if(fcnt >= MXF) 117: break; 118: fnum[fcnt++] = i; 119: } 120: if(fcnt == 0) 121: { printf("no secret mail\n"); 122: exit(0); 123: } 124: qsort(fnum, fcnt, sizeof(int), icmp); 125: } 126: decipher(u, w) FILE *u, *w; 127: { int i; 128: short a; 129: for(;;) 130: { nin(mbuf, u); 131: if(feof(u)) break; 132: mult(mbuf, x, mbuf); 133: mdiv(mbuf, b, q, mbuf); 134: for(i=1; i<=3; i++) 135: { a = mbuf->val[i]; 136: putc(a&0177, w); 137: a >>= 8; 138: putc(a&0177, w); 139: } 140: } 141: }