xref: /plan9/sys/src/libauthsrv/opasstokey.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <authsrv.h>
4*9a747e4fSDavid du Colombier 
5*9a747e4fSDavid du Colombier int
opasstokey(char * key,char * p)6*9a747e4fSDavid du Colombier opasstokey(char *key, char *p)
7*9a747e4fSDavid du Colombier {
8*9a747e4fSDavid du Colombier 	uchar t[10];
9*9a747e4fSDavid du Colombier 	int c, n;
10*9a747e4fSDavid du Colombier 
11*9a747e4fSDavid du Colombier 	n = strlen(p);
12*9a747e4fSDavid du Colombier 	memset(t, ' ', sizeof t);
13*9a747e4fSDavid du Colombier 	if(n < 5)
14*9a747e4fSDavid du Colombier 		return 0;
15*9a747e4fSDavid du Colombier 	if(n > 10)
16*9a747e4fSDavid du Colombier 		n = 10;
17*9a747e4fSDavid du Colombier 	strncpy((char*)t, p, n);
18*9a747e4fSDavid du Colombier 	if(n >= 9){
19*9a747e4fSDavid du Colombier 		c = p[8] & 0xf;
20*9a747e4fSDavid du Colombier 		if(n == 10)
21*9a747e4fSDavid du Colombier 			c += p[9] << 4;
22*9a747e4fSDavid du Colombier 		for(n = 0; n < 8; n++)
23*9a747e4fSDavid du Colombier 			if(c & (1 << n))
24*9a747e4fSDavid du Colombier 				t[n] -= ' ';
25*9a747e4fSDavid du Colombier 	}
26*9a747e4fSDavid du Colombier 	for(n = 0; n < 7; n++)
27*9a747e4fSDavid du Colombier 		key[n] = (t[n] >> n) + (t[n+1] << (8 - (n+1)));
28*9a747e4fSDavid du Colombier 	return 1;
29*9a747e4fSDavid du Colombier }
30