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