xref: /plan9/sys/src/libsec/port/des3CBC.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include "os.h"
280ee5cbfSDavid du Colombier #include <mp.h>
380ee5cbfSDavid du Colombier #include <libsec.h>
480ee5cbfSDavid du Colombier 
580ee5cbfSDavid du Colombier // Because of the way that non multiple of 8
680ee5cbfSDavid du Colombier // buffers are handled, the decryptor must
780ee5cbfSDavid du Colombier // be fed buffers of the same size as the
880ee5cbfSDavid du Colombier // encryptor
980ee5cbfSDavid du Colombier 
1080ee5cbfSDavid du Colombier 
1180ee5cbfSDavid du Colombier // If the length is not a multiple of 8, I encrypt
1280ee5cbfSDavid du Colombier // the overflow to be compatible with lacy's cryptlib
1380ee5cbfSDavid du Colombier void
des3CBCencrypt(uchar * p,int len,DES3state * s)1480ee5cbfSDavid du Colombier des3CBCencrypt(uchar *p, int len, DES3state *s)
1580ee5cbfSDavid du Colombier {
1680ee5cbfSDavid du Colombier 	uchar *p2, *ip, *eip;
1780ee5cbfSDavid du Colombier 
1880ee5cbfSDavid du Colombier 	for(; len >= 8; len -= 8){
1980ee5cbfSDavid du Colombier 		p2 = p;
2080ee5cbfSDavid du Colombier 		ip = s->ivec;
2180ee5cbfSDavid du Colombier 		for(eip = ip+8; ip < eip; )
2280ee5cbfSDavid du Colombier 			*p2++ ^= *ip++;
23*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, p, DES3EDE);
2480ee5cbfSDavid du Colombier 		memmove(s->ivec, p, 8);
2580ee5cbfSDavid du Colombier 		p += 8;
2680ee5cbfSDavid du Colombier 	}
2780ee5cbfSDavid du Colombier 
2880ee5cbfSDavid du Colombier 	if(len > 0){
2980ee5cbfSDavid du Colombier 		ip = s->ivec;
30*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, ip, DES3EDE);
3180ee5cbfSDavid du Colombier 		for(eip = ip+len; ip < eip; )
3280ee5cbfSDavid du Colombier 			*p++ ^= *ip++;
3380ee5cbfSDavid du Colombier 	}
3480ee5cbfSDavid du Colombier }
3580ee5cbfSDavid du Colombier 
3680ee5cbfSDavid du Colombier void
des3CBCdecrypt(uchar * p,int len,DES3state * s)3780ee5cbfSDavid du Colombier des3CBCdecrypt(uchar *p, int len, DES3state *s)
3880ee5cbfSDavid du Colombier {
3980ee5cbfSDavid du Colombier 	uchar *ip, *eip, *tp;
4080ee5cbfSDavid du Colombier 	uchar tmp[8];
4180ee5cbfSDavid du Colombier 
4280ee5cbfSDavid du Colombier 	for(; len >= 8; len -= 8){
4380ee5cbfSDavid du Colombier 		memmove(tmp, p, 8);
44*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, p, DES3DED);
4580ee5cbfSDavid du Colombier 		tp = tmp;
4680ee5cbfSDavid du Colombier 		ip = s->ivec;
4780ee5cbfSDavid du Colombier 		for(eip = ip+8; ip < eip; ){
4880ee5cbfSDavid du Colombier 			*p++ ^= *ip;
4980ee5cbfSDavid du Colombier 			*ip++ = *tp++;
5080ee5cbfSDavid du Colombier 		}
5180ee5cbfSDavid du Colombier 	}
5280ee5cbfSDavid du Colombier 
5380ee5cbfSDavid du Colombier 	if(len > 0){
5480ee5cbfSDavid du Colombier 		ip = s->ivec;
55*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, ip, DES3EDE);
5680ee5cbfSDavid du Colombier 		for(eip = ip+len; ip < eip; )
5780ee5cbfSDavid du Colombier 			*p++ ^= *ip++;
5880ee5cbfSDavid du Colombier 	}
5980ee5cbfSDavid du Colombier }
60