xref: /plan9/sys/src/libsec/port/desCBC.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
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