|
|
1.1 ! root 1: /* ! 2: * encryption service routines ! 3: */ ! 4: ! 5: #include <stdio.h> ! 6: ! 7: /* encryption parameters and tables */ ! 8: #define ROTORSZ 256 ! 9: #define MASK 0377 ! 10: static char t1[ROTORSZ]; ! 11: static char t2[ROTORSZ]; ! 12: static char t3[ROTORSZ]; ! 13: static char t4[ROTORSZ]; ! 14: ! 15: /* current rotor settings */ ! 16: static int N1, N2; ! 17: ! 18: resetN12() ! 19: { ! 20: N1 = N2 = 0; ! 21: } ! 22: ! 23: setup(pw) ! 24: char *pw; ! 25: { ! 26: int ic, i, k, temp, pf[2]; ! 27: unsigned random; ! 28: char buf[13]; ! 29: long seed; ! 30: int pid; ! 31: ! 32: resetN12(); ! 33: ! 34: strncpy(buf, pw, 8); ! 35: while (*pw) ! 36: *pw++ = '\0'; ! 37: buf[8] = buf[0]; ! 38: buf[9] = buf[1]; ! 39: pipe(pf); ! 40: ! 41: switch (pid = fork()) { ! 42: ! 43: case -1: ! 44: fprintf (stderr, "seal: cannot fork\n"); ! 45: exit (1); ! 46: ! 47: case 0: ! 48: close(0); ! 49: close(1); ! 50: dup(pf[0]); ! 51: dup(pf[1]); ! 52: execl("/usr/lib/makekey", "-", 0); ! 53: execl("/lib/makekey", "-", 0); ! 54: exit(1); ! 55: ! 56: default: ! 57: write(pf[1], buf, 10); ! 58: while (wait ((int *) NULL) != pid) ! 59: ; ! 60: } ! 61: ! 62: if (read(pf[0], buf, 13) != 13) { ! 63: fprintf(stderr, "seal: cannot generate key\n"); ! 64: exit(1); ! 65: } ! 66: seed = 123; ! 67: for (i=0; i<13; i++) ! 68: seed = seed*buf[i] + i; ! 69: for(i=0;i<ROTORSZ;i++) ! 70: t1[i] = i; ! 71: for(i=0;i<ROTORSZ;i++) { ! 72: seed = 5*seed + buf[i%13]; ! 73: random = seed % 65521; ! 74: k = ROTORSZ-1 - i; ! 75: ic = (random&MASK)%(k+1); ! 76: random >>= 8; ! 77: temp = t1[k]; ! 78: t1[k] = t1[ic]; ! 79: t1[ic] = temp; ! 80: if(t3[k]!=0) continue; ! 81: ic = (random&MASK) % k; ! 82: while(t3[ic]!=0) ic = (ic+1) % k; ! 83: t3[k] = ic; ! 84: t3[ic] = k; ! 85: } ! 86: for(i=0;i<ROTORSZ;i++){ ! 87: t2[t1[i]&MASK] = i; ! 88: t4[i] = (t1[i] + t3[i]) & 0377; ! 89: } ! 90: } ! 91: ! 92: mangle (buf, limit) ! 93: char *buf; ! 94: register char *limit; ! 95: { ! 96: register int i; ! 97: register char *p; ! 98: register int n1 = N1, n2 = N2; ! 99: int n3; ! 100: ! 101: p = buf; ! 102: ! 103: while(p < limit) { ! 104: i = *p; ! 105: n3 = t4[n1]; ! 106: i = t2[(t3[(t1[(i+n3)&MASK]+n2)&MASK]-n2)&MASK]-n3; ! 107: *p++ = i; ! 108: n1++; ! 109: if(n1==ROTORSZ) { ! 110: n1 = 0; ! 111: n2++; ! 112: if(n2==ROTORSZ) n2 = 0; ! 113: } ! 114: } ! 115: N1 = n1; ! 116: N2 = n2; ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.