xref: /plan9/sys/src/libc/port/crypt.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*7dd7cddfSDavid du Colombier /*
2*7dd7cddfSDavid du Colombier  *	Data Encryption Standard
3*7dd7cddfSDavid du Colombier  *	D.P.Mitchell  83/06/08.
4*7dd7cddfSDavid du Colombier  *
5*7dd7cddfSDavid du Colombier  *	block_cipher(key, block, decrypting)
6*7dd7cddfSDavid du Colombier  *
7*7dd7cddfSDavid du Colombier  *	these routines use the non-standard 7 byte format
8*7dd7cddfSDavid du Colombier  *	for DES keys.
9*7dd7cddfSDavid du Colombier  */
10*7dd7cddfSDavid du Colombier #include <u.h>
11*7dd7cddfSDavid du Colombier #include <libc.h>
12*7dd7cddfSDavid du Colombier #include <auth.h>
13*7dd7cddfSDavid du Colombier #include <libsec.h>
14*7dd7cddfSDavid du Colombier 
15*7dd7cddfSDavid du Colombier /*
16*7dd7cddfSDavid du Colombier  * destructively encrypt the buffer, which
17*7dd7cddfSDavid du Colombier  * must be at least 8 characters long.
18*7dd7cddfSDavid du Colombier  */
19*7dd7cddfSDavid du Colombier int
encrypt(void * key,void * vbuf,int n)20*7dd7cddfSDavid du Colombier encrypt(void *key, void *vbuf, int n)
21*7dd7cddfSDavid du Colombier {
22*7dd7cddfSDavid du Colombier 	ulong ekey[32];
23*7dd7cddfSDavid du Colombier 	uchar *buf;
24*7dd7cddfSDavid du Colombier 	int i, r;
25*7dd7cddfSDavid du Colombier 
26*7dd7cddfSDavid du Colombier 	if(n < 8)
27*7dd7cddfSDavid du Colombier 		return 0;
28*7dd7cddfSDavid du Colombier 	key_setup(key, ekey);
29*7dd7cddfSDavid du Colombier 	buf = vbuf;
30*7dd7cddfSDavid du Colombier 	n--;
31*7dd7cddfSDavid du Colombier 	r = n % 7;
32*7dd7cddfSDavid du Colombier 	n /= 7;
33*7dd7cddfSDavid du Colombier 	for(i = 0; i < n; i++){
34*7dd7cddfSDavid du Colombier 		block_cipher(ekey, buf, 0);
35*7dd7cddfSDavid du Colombier 		buf += 7;
36*7dd7cddfSDavid du Colombier 	}
37*7dd7cddfSDavid du Colombier 	if(r)
38*7dd7cddfSDavid du Colombier 		block_cipher(ekey, buf - 7 + r, 0);
39*7dd7cddfSDavid du Colombier 	return 1;
40*7dd7cddfSDavid du Colombier }
41*7dd7cddfSDavid du Colombier 
42*7dd7cddfSDavid du Colombier /*
43*7dd7cddfSDavid du Colombier  * destructively decrypt the buffer, which
44*7dd7cddfSDavid du Colombier  * must be at least 8 characters long.
45*7dd7cddfSDavid du Colombier  */
46*7dd7cddfSDavid du Colombier int
decrypt(void * key,void * vbuf,int n)47*7dd7cddfSDavid du Colombier decrypt(void *key, void *vbuf, int n)
48*7dd7cddfSDavid du Colombier {
49*7dd7cddfSDavid du Colombier 	ulong ekey[128];
50*7dd7cddfSDavid du Colombier 	uchar *buf;
51*7dd7cddfSDavid du Colombier 	int i, r;
52*7dd7cddfSDavid du Colombier 
53*7dd7cddfSDavid du Colombier 	if(n < 8)
54*7dd7cddfSDavid du Colombier 		return 0;
55*7dd7cddfSDavid du Colombier 	key_setup(key, ekey);
56*7dd7cddfSDavid du Colombier 	buf = vbuf;
57*7dd7cddfSDavid du Colombier 	n--;
58*7dd7cddfSDavid du Colombier 	r = n % 7;
59*7dd7cddfSDavid du Colombier 	n /= 7;
60*7dd7cddfSDavid du Colombier 	buf += n * 7;
61*7dd7cddfSDavid du Colombier 	if(r)
62*7dd7cddfSDavid du Colombier 		block_cipher(ekey, buf - 7 + r, 1);
63*7dd7cddfSDavid du Colombier 	for(i = 0; i < n; i++){
64*7dd7cddfSDavid du Colombier 		buf -= 7;
65*7dd7cddfSDavid du Colombier 		block_cipher(ekey, buf, 1);
66*7dd7cddfSDavid du Colombier 	}
67*7dd7cddfSDavid du Colombier 	return 1;
68*7dd7cddfSDavid du Colombier }
69