9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

crypt.c (1045B)


      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
     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
     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 }