xref: /plan9/sys/src/libsec/port/des3ECB.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 // I wasn't sure what to do when the buffer was not
680ee5cbfSDavid du Colombier // a multiple of 8.  I did what lacy's cryptolib did
780ee5cbfSDavid du Colombier // to be compatible, but it looks dangerous to me
880ee5cbfSDavid du Colombier // since its encrypting plain text with the key. -- presotto
980ee5cbfSDavid du Colombier 
1080ee5cbfSDavid du Colombier void
des3ECBencrypt(uchar * p,int len,DES3state * s)1180ee5cbfSDavid du Colombier des3ECBencrypt(uchar *p, int len, DES3state *s)
1280ee5cbfSDavid du Colombier {
1380ee5cbfSDavid du Colombier 	int i;
1480ee5cbfSDavid du Colombier 	uchar tmp[8];
1580ee5cbfSDavid du Colombier 
1680ee5cbfSDavid du Colombier 	for(; len >= 8; len -= 8){
17*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, p, DES3EDE);
1880ee5cbfSDavid du Colombier 		p += 8;
1980ee5cbfSDavid du Colombier 	}
2080ee5cbfSDavid du Colombier 
2180ee5cbfSDavid du Colombier 	if(len > 0){
2280ee5cbfSDavid du Colombier 		for (i=0; i<8; i++)
2380ee5cbfSDavid du Colombier 			tmp[i] = i;
24*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, tmp, DES3EDE);
2580ee5cbfSDavid du Colombier 		for (i = 0; i < len; i++)
2680ee5cbfSDavid du Colombier 			p[i] ^= tmp[i];
2780ee5cbfSDavid du Colombier 	}
2880ee5cbfSDavid du Colombier }
2980ee5cbfSDavid du Colombier 
3080ee5cbfSDavid du Colombier void
des3ECBdecrypt(uchar * p,int len,DES3state * s)3180ee5cbfSDavid du Colombier des3ECBdecrypt(uchar *p, int len, DES3state *s)
3280ee5cbfSDavid du Colombier {
3380ee5cbfSDavid du Colombier 	int i;
3480ee5cbfSDavid du Colombier 	uchar tmp[8];
3580ee5cbfSDavid du Colombier 
3680ee5cbfSDavid du Colombier 	for(; len >= 8; len -= 8){
37*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, p, DES3DED);
3880ee5cbfSDavid du Colombier 		p += 8;
3980ee5cbfSDavid du Colombier 	}
4080ee5cbfSDavid du Colombier 
4180ee5cbfSDavid du Colombier 	if(len > 0){
4280ee5cbfSDavid du Colombier 		for (i=0; i<8; i++)
4380ee5cbfSDavid du Colombier 			tmp[i] = i;
44*9a747e4fSDavid du Colombier 		triple_block_cipher(s->expanded, tmp, DES3EDE);
4580ee5cbfSDavid du Colombier 		for (i = 0; i < len; i++)
4680ee5cbfSDavid du Colombier 			p[i] ^= tmp[i];
4780ee5cbfSDavid du Colombier 	}
4880ee5cbfSDavid du Colombier }
49