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