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