|  | #include "os.h" | 
|  | #include <mp.h> | 
|  | #include <libsec.h> | 
|  |  | 
|  | /* Because of the way that non multiple of 8 */ | 
|  | /* buffers are handled, the decryptor must */ | 
|  | /* be fed buffers of the same size as the */ | 
|  | /* encryptor */ | 
|  |  | 
|  |  | 
|  | /* If the length is not a multiple of 8, I encrypt */ | 
|  | /* the overflow to be compatible with lacy's cryptlib */ | 
|  | void | 
|  | desCBCencrypt(uchar *p, int len, DESstate *s) | 
|  | { | 
|  | uchar *p2, *ip, *eip; | 
|  |  | 
|  | for(; len >= 8; len -= 8){ | 
|  | p2 = p; | 
|  | ip = s->ivec; | 
|  | for(eip = ip+8; ip < eip; ) | 
|  | *p2++ ^= *ip++; | 
|  | block_cipher(s->expanded, p, 0); | 
|  | memmove(s->ivec, p, 8); | 
|  | p += 8; | 
|  | } | 
|  |  | 
|  | if(len > 0){ | 
|  | ip = s->ivec; | 
|  | block_cipher(s->expanded, ip, 0); | 
|  | for(eip = ip+len; ip < eip; ) | 
|  | *p++ ^= *ip++; | 
|  | } | 
|  | } | 
|  |  | 
|  | void | 
|  | desCBCdecrypt(uchar *p, int len, DESstate *s) | 
|  | { | 
|  | uchar *ip, *eip, *tp; | 
|  | uchar tmp[8]; | 
|  |  | 
|  | for(; len >= 8; len -= 8){ | 
|  | memmove(tmp, p, 8); | 
|  | block_cipher(s->expanded, p, 1); | 
|  | tp = tmp; | 
|  | ip = s->ivec; | 
|  | for(eip = ip+8; ip < eip; ){ | 
|  | *p++ ^= *ip; | 
|  | *ip++ = *tp++; | 
|  | } | 
|  | } | 
|  |  | 
|  | if(len > 0){ | 
|  | ip = s->ivec; | 
|  | block_cipher(s->expanded, ip, 0); | 
|  | for(eip = ip+len; ip < eip; ) | 
|  | *p++ ^= *ip++; | 
|  | } | 
|  | } |