vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

des3CBC.c (1119B)


      1 #include "os.h"
      2 #include "libsec.h"
      3 
      4 // Because of the way that non multiple of 8
      5 // buffers are handled, the decryptor must
      6 // be fed buffers of the same size as the
      7 // encryptor
      8 
      9 
     10 // If the length is not a multiple of 8, I encrypt
     11 // the overflow to be compatible with lacy's cryptlib
     12 void
     13 des3CBCencrypt(uchar *p, int len, DES3state *s)
     14 {
     15 	uchar *p2, *ip, *eip;
     16 
     17 	for(; len >= 8; len -= 8){
     18 		p2 = p;
     19 		ip = s->ivec;
     20 		for(eip = ip+8; ip < eip; )
     21 			*p2++ ^= *ip++;
     22 		triple_block_cipher(s->expanded, p, DES3EDE);
     23 		memmove(s->ivec, p, 8);
     24 		p += 8;
     25 	}
     26 
     27 	if(len > 0){
     28 		ip = s->ivec;
     29 		triple_block_cipher(s->expanded, ip, DES3EDE);
     30 		for(eip = ip+len; ip < eip; )
     31 			*p++ ^= *ip++;
     32 	}
     33 }
     34 
     35 void
     36 des3CBCdecrypt(uchar *p, int len, DES3state *s)
     37 {
     38 	uchar *ip, *eip, *tp;
     39 	uchar tmp[8];
     40 
     41 	for(; len >= 8; len -= 8){
     42 		memmove(tmp, p, 8);
     43 		triple_block_cipher(s->expanded, p, DES3DED);
     44 		tp = tmp;
     45 		ip = s->ivec;
     46 		for(eip = ip+8; ip < eip; ){
     47 			*p++ ^= *ip;
     48 			*ip++ = *tp++;
     49 		}
     50 	}
     51 
     52 	if(len > 0){
     53 		ip = s->ivec;
     54 		triple_block_cipher(s->expanded, ip, DES3EDE);
     55 		for(eip = ip+len; ip < eip; )
     56 			*p++ ^= *ip++;
     57 	}
     58 }