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