xref: /plan9/sys/src/cmd/ssh2/cipheraes.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 static QLock aeslock;
11*63afb9a5SDavid du Colombier 
12*63afb9a5SDavid du Colombier struct CipherState {
13*63afb9a5SDavid du Colombier 	AESstate state;
14*63afb9a5SDavid du Colombier };
15*63afb9a5SDavid du Colombier 
16*63afb9a5SDavid du Colombier static CipherState *
initaes(Conn * c,int dir,int bits)17*63afb9a5SDavid du Colombier initaes(Conn *c, int dir, int bits)
18*63afb9a5SDavid du Colombier {
19*63afb9a5SDavid du Colombier 	CipherState *cs;
20*63afb9a5SDavid du Colombier 
21*63afb9a5SDavid du Colombier 	qlock(&aeslock);
22*63afb9a5SDavid du Colombier 	cs = emalloc9p(sizeof(CipherState));
23*63afb9a5SDavid du Colombier 	if(dir)
24*63afb9a5SDavid du Colombier 		setupAESstate(&cs->state, c->s2cek, bits/8, c->s2civ);
25*63afb9a5SDavid du Colombier 	else
26*63afb9a5SDavid du Colombier 		setupAESstate(&cs->state, c->c2sek, bits/8, c->c2siv);
27*63afb9a5SDavid du Colombier 	qunlock(&aeslock);
28*63afb9a5SDavid du Colombier 	return cs;
29*63afb9a5SDavid du Colombier }
30*63afb9a5SDavid du Colombier 
31*63afb9a5SDavid du Colombier static CipherState*
initaes128(Conn * c,int dir)32*63afb9a5SDavid du Colombier initaes128(Conn *c, int dir)
33*63afb9a5SDavid du Colombier {
34*63afb9a5SDavid du Colombier 	return initaes(c, dir, 128);
35*63afb9a5SDavid du Colombier }
36*63afb9a5SDavid du Colombier 
37*63afb9a5SDavid du Colombier static CipherState*
initaes192(Conn * c,int dir)38*63afb9a5SDavid du Colombier initaes192(Conn *c, int dir)
39*63afb9a5SDavid du Colombier {
40*63afb9a5SDavid du Colombier 	return initaes(c, dir, 192);
41*63afb9a5SDavid du Colombier }
42*63afb9a5SDavid du Colombier 
43*63afb9a5SDavid du Colombier static CipherState*
initaes256(Conn * c,int dir)44*63afb9a5SDavid du Colombier initaes256(Conn *c, int dir)
45*63afb9a5SDavid du Colombier {
46*63afb9a5SDavid du Colombier 	return initaes(c, dir, 256);
47*63afb9a5SDavid du Colombier }
48*63afb9a5SDavid du Colombier 
49*63afb9a5SDavid du Colombier static void
encryptaes(CipherState * cs,uchar * buf,int nbuf)50*63afb9a5SDavid du Colombier encryptaes(CipherState *cs, uchar *buf, int nbuf)
51*63afb9a5SDavid du Colombier {
52*63afb9a5SDavid du Colombier 	if(cs->state.setup != 0xcafebabe || cs->state.rounds > AESmaxrounds)
53*63afb9a5SDavid du Colombier 		return;
54*63afb9a5SDavid du Colombier 	qlock(&aeslock);
55*63afb9a5SDavid du Colombier 	aesCBCencrypt(buf, nbuf, &cs->state);
56*63afb9a5SDavid du Colombier 	qunlock(&aeslock);
57*63afb9a5SDavid du Colombier }
58*63afb9a5SDavid du Colombier 
59*63afb9a5SDavid du Colombier static void
decryptaes(CipherState * cs,uchar * buf,int nbuf)60*63afb9a5SDavid du Colombier decryptaes(CipherState *cs, uchar *buf, int nbuf)
61*63afb9a5SDavid du Colombier {
62*63afb9a5SDavid du Colombier 	if(cs->state.setup != 0xcafebabe || cs->state.rounds > AESmaxrounds)
63*63afb9a5SDavid du Colombier 		return;
64*63afb9a5SDavid du Colombier 	qlock(&aeslock);
65*63afb9a5SDavid du Colombier 	aesCBCdecrypt(buf, nbuf, &cs->state);
66*63afb9a5SDavid du Colombier 	qunlock(&aeslock);
67*63afb9a5SDavid du Colombier }
68*63afb9a5SDavid du Colombier 
69*63afb9a5SDavid du Colombier Cipher cipheraes128 = {
70*63afb9a5SDavid du Colombier 	"aes128-cbc",
71*63afb9a5SDavid du Colombier 	AESbsize,
72*63afb9a5SDavid du Colombier 	initaes128,
73*63afb9a5SDavid du Colombier 	encryptaes,
74*63afb9a5SDavid du Colombier 	decryptaes,
75*63afb9a5SDavid du Colombier };
76*63afb9a5SDavid du Colombier 
77*63afb9a5SDavid du Colombier Cipher cipheraes192 = {
78*63afb9a5SDavid du Colombier 	"aes192-cbc",
79*63afb9a5SDavid du Colombier 	AESbsize,
80*63afb9a5SDavid du Colombier 	initaes192,
81*63afb9a5SDavid du Colombier 	encryptaes,
82*63afb9a5SDavid du Colombier 	decryptaes,
83*63afb9a5SDavid du Colombier };
84*63afb9a5SDavid du Colombier 
85*63afb9a5SDavid du Colombier Cipher cipheraes256 = {
86*63afb9a5SDavid du Colombier 	"aes256-cbc",
87*63afb9a5SDavid du Colombier 	AESbsize,
88*63afb9a5SDavid du Colombier 	initaes256,
89*63afb9a5SDavid du Colombier 	encryptaes,
90*63afb9a5SDavid du Colombier 	decryptaes,
91*63afb9a5SDavid du Colombier };
92