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