/* | |
* 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; | |
} |