xref: /plan9/sys/src/cmd/ssh2/cipher3des.c (revision 63afb9a5d3f910047231762bcce0ee49fed3d07c)
1*63afb9a5SDavid du Colombier #include <u.h>
2*63afb9a5SDavid du Colombier #include <libc.h>
3*63afb9a5SDavid du Colombier #include <mp.h>
4*63afb9a5SDavid du Colombier #include <fcall.h>
5*63afb9a5SDavid du Colombier #include <thread.h>
6*63afb9a5SDavid du Colombier #include <9p.h>
7*63afb9a5SDavid du Colombier #include <libsec.h>
8*63afb9a5SDavid du Colombier #include "netssh.h"
9*63afb9a5SDavid du Colombier 
10*63afb9a5SDavid du Colombier struct CipherState {
11*63afb9a5SDavid du Colombier 	DES3state state;
12*63afb9a5SDavid du Colombier };
13*63afb9a5SDavid du Colombier 
14*63afb9a5SDavid du Colombier static CipherState*
init3des(Conn * c,int dir)15*63afb9a5SDavid du Colombier init3des(Conn *c, int dir)
16*63afb9a5SDavid du Colombier {
17*63afb9a5SDavid du Colombier 	CipherState *cs;
18*63afb9a5SDavid du Colombier 	uchar key[3][8];
19*63afb9a5SDavid du Colombier 
20*63afb9a5SDavid du Colombier 	cs = emalloc9p(sizeof(CipherState));
21*63afb9a5SDavid du Colombier 	if(dir){
22*63afb9a5SDavid du Colombier 		memmove(key, c->s2cek, sizeof key);
23*63afb9a5SDavid du Colombier 		setupDES3state(&cs->state, key, c->s2civ);
24*63afb9a5SDavid du Colombier 	} else {
25*63afb9a5SDavid du Colombier 		memmove(key, c->c2sek, sizeof key);
26*63afb9a5SDavid du Colombier 		setupDES3state(&cs->state, key, c->c2siv);
27*63afb9a5SDavid du Colombier 	}
28*63afb9a5SDavid du Colombier 	return cs;
29*63afb9a5SDavid du Colombier }
30*63afb9a5SDavid du Colombier 
31*63afb9a5SDavid du Colombier static void
encrypt3des(CipherState * cs,uchar * buf,int nbuf)32*63afb9a5SDavid du Colombier encrypt3des(CipherState *cs, uchar *buf, int nbuf)
33*63afb9a5SDavid du Colombier {
34*63afb9a5SDavid du Colombier 	des3CBCencrypt(buf, nbuf, &cs->state);
35*63afb9a5SDavid du Colombier }
36*63afb9a5SDavid du Colombier 
37*63afb9a5SDavid du Colombier static void
decrypt3des(CipherState * cs,uchar * buf,int nbuf)38*63afb9a5SDavid du Colombier decrypt3des(CipherState *cs, uchar *buf, int nbuf)
39*63afb9a5SDavid du Colombier {
40*63afb9a5SDavid du Colombier 	des3CBCdecrypt(buf, nbuf, &cs->state);
41*63afb9a5SDavid du Colombier }
42*63afb9a5SDavid du Colombier 
43*63afb9a5SDavid du Colombier Cipher cipher3des = {
44*63afb9a5SDavid du Colombier 	"3des-cbc",
45*63afb9a5SDavid du Colombier 	8,
46*63afb9a5SDavid du Colombier 	init3des,
47*63afb9a5SDavid du Colombier 	encrypt3des,
48*63afb9a5SDavid du Colombier 	decrypt3des,
49*63afb9a5SDavid du Colombier };
50