180ee5cbfSDavid du Colombier #include "os.h"
280ee5cbfSDavid du Colombier #include <mp.h>
380ee5cbfSDavid du Colombier #include <libsec.h>
480ee5cbfSDavid du Colombier
580ee5cbfSDavid du Colombier // Because of the way that non multiple of 8
680ee5cbfSDavid du Colombier // buffers are handled, the decryptor must
780ee5cbfSDavid du Colombier // be fed buffers of the same size as the
880ee5cbfSDavid du Colombier // encryptor
980ee5cbfSDavid du Colombier
1080ee5cbfSDavid du Colombier
1180ee5cbfSDavid du Colombier // If the length is not a multiple of 8, I encrypt
1280ee5cbfSDavid du Colombier // the overflow to be compatible with lacy's cryptlib
1380ee5cbfSDavid du Colombier void
des3CBCencrypt(uchar * p,int len,DES3state * s)1480ee5cbfSDavid du Colombier des3CBCencrypt(uchar *p, int len, DES3state *s)
1580ee5cbfSDavid du Colombier {
1680ee5cbfSDavid du Colombier uchar *p2, *ip, *eip;
1780ee5cbfSDavid du Colombier
1880ee5cbfSDavid du Colombier for(; len >= 8; len -= 8){
1980ee5cbfSDavid du Colombier p2 = p;
2080ee5cbfSDavid du Colombier ip = s->ivec;
2180ee5cbfSDavid du Colombier for(eip = ip+8; ip < eip; )
2280ee5cbfSDavid du Colombier *p2++ ^= *ip++;
23*9a747e4fSDavid du Colombier triple_block_cipher(s->expanded, p, DES3EDE);
2480ee5cbfSDavid du Colombier memmove(s->ivec, p, 8);
2580ee5cbfSDavid du Colombier p += 8;
2680ee5cbfSDavid du Colombier }
2780ee5cbfSDavid du Colombier
2880ee5cbfSDavid du Colombier if(len > 0){
2980ee5cbfSDavid du Colombier ip = s->ivec;
30*9a747e4fSDavid du Colombier triple_block_cipher(s->expanded, ip, DES3EDE);
3180ee5cbfSDavid du Colombier for(eip = ip+len; ip < eip; )
3280ee5cbfSDavid du Colombier *p++ ^= *ip++;
3380ee5cbfSDavid du Colombier }
3480ee5cbfSDavid du Colombier }
3580ee5cbfSDavid du Colombier
3680ee5cbfSDavid du Colombier void
des3CBCdecrypt(uchar * p,int len,DES3state * s)3780ee5cbfSDavid du Colombier des3CBCdecrypt(uchar *p, int len, DES3state *s)
3880ee5cbfSDavid du Colombier {
3980ee5cbfSDavid du Colombier uchar *ip, *eip, *tp;
4080ee5cbfSDavid du Colombier uchar tmp[8];
4180ee5cbfSDavid du Colombier
4280ee5cbfSDavid du Colombier for(; len >= 8; len -= 8){
4380ee5cbfSDavid du Colombier memmove(tmp, p, 8);
44*9a747e4fSDavid du Colombier triple_block_cipher(s->expanded, p, DES3DED);
4580ee5cbfSDavid du Colombier tp = tmp;
4680ee5cbfSDavid du Colombier ip = s->ivec;
4780ee5cbfSDavid du Colombier for(eip = ip+8; ip < eip; ){
4880ee5cbfSDavid du Colombier *p++ ^= *ip;
4980ee5cbfSDavid du Colombier *ip++ = *tp++;
5080ee5cbfSDavid du Colombier }
5180ee5cbfSDavid du Colombier }
5280ee5cbfSDavid du Colombier
5380ee5cbfSDavid du Colombier if(len > 0){
5480ee5cbfSDavid du Colombier ip = s->ivec;
55*9a747e4fSDavid du Colombier triple_block_cipher(s->expanded, ip, DES3EDE);
5680ee5cbfSDavid du Colombier for(eip = ip+len; ip < eip; )
5780ee5cbfSDavid du Colombier *p++ ^= *ip++;
5880ee5cbfSDavid du Colombier }
5980ee5cbfSDavid du Colombier }
60