xref: /plan9/sys/src/cmd/unix/drawterm/libsec/desCBC.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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