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