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