Blame


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