1 #ifndef lint 2 static char sccsid[] = "@(#)lib.c 4.1 03/30/83"; 3 #endif 4 5 #include "xmail.h" 6 MINT *x, *b, *one, *c64, *t45, *z, *q, *r, *two, *t15; 7 MINT *a[42]; 8 setup(s) char *s; 9 { int pf[2]; 10 strncpy(buf, s, 10); 11 while(*s) *s++ = 0; 12 pipe(pf); 13 if(fork()==0) 14 { 15 close(0); 16 close(1); 17 dup(pf[0]); 18 dup(pf[1]); 19 execl("/usr/lib/makekey", "-", 0); 20 execl("/lib/makekey", "-", 0); 21 exit(1); 22 } 23 write(pf[1], buf, 10); 24 wait((int *)NULL); 25 if(read(pf[0], buf, 13) != 13) 26 { fprintf(stderr, "enroll: cannot generate key\n"); 27 exit(1); 28 } 29 } 30 mkx() 31 { int i, j; 32 for(i=0; i<4; i++) 33 { mult(x, t15, x); 34 *z->val = (short)(rand() ^ buf[i]); 35 madd(x, z, x); 36 } 37 mdiv(x, b, q, x); 38 for(;;) 39 { gcd(b, x, q); 40 if(q->len == 1 && q->val[0] == 1) 41 return; 42 madd(x, one, x); 43 } 44 } 45 mka() 46 { int i, j; 47 for(i=0; i<42; i++) 48 a[i] = itom(1); 49 for(i=j=0; i<42; i++, j++) 50 { *z->val = (short)rand()&00; 51 mult(a[i], z, a[i]); 52 mult(a[i], t45, a[i]); 53 rpow(two, j, q); 54 if( i%14 == 6) j++; 55 madd(a[i], q, a[i]); 56 mult(a[i], t15, a[i]); 57 *z->val = (short)rand()&0777; 58 madd(a[i], z, a[i]); 59 mdiv(a[i], b, q, a[i]); 60 } 61 for(i=0; i<42; i++) 62 mult(a[i], x, a[i]); 63 for(i=0; i<42; i++) 64 { mdiv(a[i], b, q, a[i]); 65 } 66 } 67 mkb() 68 { int i, c; 69 unsigned seed; 70 seed = 123; 71 for(i=0; i<13; i++) 72 seed = seed*buf[i] + i; 73 srand(seed); 74 *b->val = 04 + (rand()&03); 75 for(i=0; i<11; i++) 76 { *z->val = (buf[i+2] + rand()) & 077; 77 mult(b, c64, b); 78 madd(b, z, b); 79 } 80 } 81 comminit() 82 { int i; 83 x = itom(0); 84 b = itom(1); 85 one = itom(1); 86 two = itom(2); 87 c64 = itom(64); 88 t45 = itom(1); 89 t15 = itom(1); 90 rpow(two, 45, t45); 91 rpow(two, 15, t15); 92 z = itom(1); 93 q = itom(1); 94 } 95 #ifndef debug 96 nout(a, fd) MINT *a; FILE *fd; 97 { 98 fwrite(&a->len, sizeof(int), 1, fd); 99 fwrite(a->val, sizeof(short), a->len, fd); 100 } 101 nin(a, fd) MINT *a; FILE *fd; 102 { 103 xfree(a); 104 fread(&a->len, sizeof(int), 1, fd); 105 a->val = xalloc(a->len, "nin"); 106 fread(a->val, sizeof(short), a->len, fd); 107 } 108 #endif 109 xfatal(s) char *s; 110 { 111 fprintf(stderr, "%s\n", s); 112 exit(1); 113 } 114