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