1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <mp.h>
3*8ccd4a63SDavid du Colombier #include <libsec.h>
49b943567SDavid du Colombier
59b943567SDavid du Colombier // Because of the way that non multiple of 8
69b943567SDavid du Colombier // buffers are handled, the decryptor must
79b943567SDavid du Colombier // be fed buffers of the same size as the
89b943567SDavid du Colombier // encryptor
99b943567SDavid du Colombier
109b943567SDavid du Colombier
119b943567SDavid du Colombier // If the length is not a multiple of 8, I encrypt
129b943567SDavid du Colombier // the overflow to be compatible with lacy's cryptlib
139b943567SDavid du Colombier void
desCBCencrypt(uchar * p,int len,DESstate * s)149b943567SDavid du Colombier desCBCencrypt(uchar *p, int len, DESstate *s)
159b943567SDavid du Colombier {
169b943567SDavid du Colombier uchar *p2, *ip, *eip;
179b943567SDavid du Colombier
189b943567SDavid du Colombier for(; len >= 8; len -= 8){
199b943567SDavid du Colombier p2 = p;
209b943567SDavid du Colombier ip = s->ivec;
219b943567SDavid du Colombier for(eip = ip+8; ip < eip; )
229b943567SDavid du Colombier *p2++ ^= *ip++;
239b943567SDavid du Colombier block_cipher(s->expanded, p, 0);
249b943567SDavid du Colombier memmove(s->ivec, p, 8);
259b943567SDavid du Colombier p += 8;
269b943567SDavid du Colombier }
279b943567SDavid du Colombier
289b943567SDavid du Colombier if(len > 0){
299b943567SDavid du Colombier ip = s->ivec;
309b943567SDavid du Colombier block_cipher(s->expanded, ip, 0);
319b943567SDavid du Colombier for(eip = ip+len; ip < eip; )
329b943567SDavid du Colombier *p++ ^= *ip++;
339b943567SDavid du Colombier }
349b943567SDavid du Colombier }
359b943567SDavid du Colombier
369b943567SDavid du Colombier void
desCBCdecrypt(uchar * p,int len,DESstate * s)379b943567SDavid du Colombier desCBCdecrypt(uchar *p, int len, DESstate *s)
389b943567SDavid du Colombier {
399b943567SDavid du Colombier uchar *ip, *eip, *tp;
409b943567SDavid du Colombier uchar tmp[8];
419b943567SDavid du Colombier
429b943567SDavid du Colombier for(; len >= 8; len -= 8){
439b943567SDavid du Colombier memmove(tmp, p, 8);
449b943567SDavid du Colombier block_cipher(s->expanded, p, 1);
459b943567SDavid du Colombier tp = tmp;
469b943567SDavid du Colombier ip = s->ivec;
479b943567SDavid du Colombier for(eip = ip+8; ip < eip; ){
489b943567SDavid du Colombier *p++ ^= *ip;
499b943567SDavid du Colombier *ip++ = *tp++;
509b943567SDavid du Colombier }
519b943567SDavid du Colombier }
529b943567SDavid du Colombier
539b943567SDavid du Colombier if(len > 0){
549b943567SDavid du Colombier ip = s->ivec;
559b943567SDavid du Colombier block_cipher(s->expanded, ip, 0);
569b943567SDavid du Colombier for(eip = ip+len; ip < eip; )
579b943567SDavid du Colombier *p++ ^= *ip++;
589b943567SDavid du Colombier }
599b943567SDavid du Colombier }
60