des3CBC.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) 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 }