| #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 |
| des3CBCencrypt(uchar *p, int len, DES3state *s) |
| { |
| uchar *p2, *ip, *eip; |
| |
| for(; len >= 8; len -= 8){ |
| p2 = p; |
| ip = s->ivec; |
| for(eip = ip+8; ip < eip; ) |
| *p2++ ^= *ip++; |
| triple_block_cipher(s->expanded, p, DES3EDE); |
| memmove(s->ivec, p, 8); |
| p += 8; |
| } |
| |
| if(len > 0){ |
| ip = s->ivec; |
| triple_block_cipher(s->expanded, ip, DES3EDE); |
| for(eip = ip+len; ip < eip; ) |
| *p++ ^= *ip++; |
| } |
| } |
| |
| void |
| des3CBCdecrypt(uchar *p, int len, DES3state *s) |
| { |
| uchar *ip, *eip, *tp; |
| uchar tmp[8]; |
| |
| for(; len >= 8; len -= 8){ |
| memmove(tmp, p, 8); |
| triple_block_cipher(s->expanded, p, DES3DED); |
| tp = tmp; |
| ip = s->ivec; |
| for(eip = ip+8; ip < eip; ){ |
| *p++ ^= *ip; |
| *ip++ = *tp++; |
| } |
| } |
| |
| if(len > 0){ |
| ip = s->ivec; |
| triple_block_cipher(s->expanded, ip, DES3EDE); |
| for(eip = ip+len; ip < eip; ) |
| *p++ ^= *ip++; |
| } |
| } |