| /* |
| * Data Encryption Standard |
| * D.P.Mitchell 83/06/08. |
| * |
| * block_cipher(key, block, decrypting) |
| * |
| * these routines use the non-standard 7 byte format |
| * for DES keys. |
| */ |
| #include <u.h> |
| #include <libc.h> |
| #include <auth.h> |
| #include <libsec.h> |
| |
| /* |
| * destructively encrypt the buffer, which |
| * must be at least 8 characters long. |
| */ |
| int |
| encrypt(void *key, void *vbuf, int n) |
| { |
| ulong ekey[32]; |
| uchar *buf; |
| int i, r; |
| |
| if(n < 8) |
| return 0; |
| key_setup(key, ekey); |
| buf = vbuf; |
| n--; |
| r = n % 7; |
| n /= 7; |
| for(i = 0; i < n; i++){ |
| block_cipher(ekey, buf, 0); |
| buf += 7; |
| } |
| if(r) |
| block_cipher(ekey, buf - 7 + r, 0); |
| return 1; |
| } |
| |
| /* |
| * destructively decrypt the buffer, which |
| * must be at least 8 characters long. |
| */ |
| int |
| decrypt(void *key, void *vbuf, int n) |
| { |
| ulong ekey[128]; |
| uchar *buf; |
| int i, r; |
| |
| if(n < 8) |
| return 0; |
| key_setup(key, ekey); |
| buf = vbuf; |
| n--; |
| r = n % 7; |
| n /= 7; |
| buf += n * 7; |
| if(r) |
| block_cipher(ekey, buf - 7 + r, 1); |
| for(i = 0; i < n; i++){ |
| buf -= 7; |
| block_cipher(ekey, buf, 1); |
| } |
| return 1; |
| } |