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