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