163afb9a5SDavid du Colombier #include <u.h>
263afb9a5SDavid du Colombier #include <libc.h>
363afb9a5SDavid du Colombier #include <mp.h>
463afb9a5SDavid du Colombier #include <fcall.h>
563afb9a5SDavid du Colombier #include <thread.h>
663afb9a5SDavid du Colombier #include <9p.h>
763afb9a5SDavid du Colombier #include <libsec.h>
863afb9a5SDavid du Colombier #include "netssh.h"
963afb9a5SDavid du Colombier
1063afb9a5SDavid du Colombier static QLock aeslock;
1163afb9a5SDavid du Colombier
1263afb9a5SDavid du Colombier struct CipherState {
1363afb9a5SDavid du Colombier AESstate state;
1463afb9a5SDavid du Colombier };
1563afb9a5SDavid du Colombier
1663afb9a5SDavid du Colombier static CipherState *
initaes(Conn * c,int dir,int bits)1763afb9a5SDavid du Colombier initaes(Conn *c, int dir, int bits)
1863afb9a5SDavid du Colombier {
1963afb9a5SDavid du Colombier CipherState *cs;
2063afb9a5SDavid du Colombier
2163afb9a5SDavid du Colombier qlock(&aeslock);
2263afb9a5SDavid du Colombier cs = emalloc9p(sizeof(CipherState));
2363afb9a5SDavid du Colombier if(dir)
2463afb9a5SDavid du Colombier setupAESstate(&cs->state, c->s2cek, bits/8, c->s2civ);
2563afb9a5SDavid du Colombier else
2663afb9a5SDavid du Colombier setupAESstate(&cs->state, c->c2sek, bits/8, c->c2siv);
2763afb9a5SDavid du Colombier qunlock(&aeslock);
2863afb9a5SDavid du Colombier return cs;
2963afb9a5SDavid du Colombier }
3063afb9a5SDavid du Colombier
3163afb9a5SDavid du Colombier static CipherState*
initaes128(Conn * c,int dir)3263afb9a5SDavid du Colombier initaes128(Conn *c, int dir)
3363afb9a5SDavid du Colombier {
3463afb9a5SDavid du Colombier return initaes(c, dir, 128);
3563afb9a5SDavid du Colombier }
3663afb9a5SDavid du Colombier
3763afb9a5SDavid du Colombier static CipherState*
initaes192(Conn * c,int dir)3863afb9a5SDavid du Colombier initaes192(Conn *c, int dir)
3963afb9a5SDavid du Colombier {
4063afb9a5SDavid du Colombier return initaes(c, dir, 192);
4163afb9a5SDavid du Colombier }
4263afb9a5SDavid du Colombier
4363afb9a5SDavid du Colombier static CipherState*
initaes256(Conn * c,int dir)4463afb9a5SDavid du Colombier initaes256(Conn *c, int dir)
4563afb9a5SDavid du Colombier {
4663afb9a5SDavid du Colombier return initaes(c, dir, 256);
4763afb9a5SDavid du Colombier }
4863afb9a5SDavid du Colombier
4963afb9a5SDavid du Colombier static void
encryptaes(CipherState * cs,uchar * buf,int nbuf)5063afb9a5SDavid du Colombier encryptaes(CipherState *cs, uchar *buf, int nbuf)
5163afb9a5SDavid du Colombier {
5263afb9a5SDavid du Colombier if(cs->state.setup != 0xcafebabe || cs->state.rounds > AESmaxrounds)
5363afb9a5SDavid du Colombier return;
5463afb9a5SDavid du Colombier qlock(&aeslock);
5563afb9a5SDavid du Colombier aesCBCencrypt(buf, nbuf, &cs->state);
5663afb9a5SDavid du Colombier qunlock(&aeslock);
5763afb9a5SDavid du Colombier }
5863afb9a5SDavid du Colombier
5963afb9a5SDavid du Colombier static void
encryptaesctr(CipherState * cs,uchar * buf,int nbuf)60*c7034505SDavid du Colombier encryptaesctr(CipherState *cs, uchar *buf, int nbuf)
61*c7034505SDavid du Colombier {
62*c7034505SDavid du Colombier if(cs->state.setup != 0xcafebabe || cs->state.rounds > AESmaxrounds)
63*c7034505SDavid du Colombier return;
64*c7034505SDavid du Colombier qlock(&aeslock);
65*c7034505SDavid du Colombier aesCTRencrypt(buf, nbuf, &cs->state);
66*c7034505SDavid du Colombier qunlock(&aeslock);
67*c7034505SDavid du Colombier }
68*c7034505SDavid du Colombier
69*c7034505SDavid du Colombier static void
decryptaes(CipherState * cs,uchar * buf,int nbuf)7063afb9a5SDavid du Colombier decryptaes(CipherState *cs, uchar *buf, int nbuf)
7163afb9a5SDavid du Colombier {
7263afb9a5SDavid du Colombier if(cs->state.setup != 0xcafebabe || cs->state.rounds > AESmaxrounds)
7363afb9a5SDavid du Colombier return;
7463afb9a5SDavid du Colombier qlock(&aeslock);
7563afb9a5SDavid du Colombier aesCBCdecrypt(buf, nbuf, &cs->state);
7663afb9a5SDavid du Colombier qunlock(&aeslock);
7763afb9a5SDavid du Colombier }
7863afb9a5SDavid du Colombier
79*c7034505SDavid du Colombier static void
decryptaesctr(CipherState * cs,uchar * buf,int nbuf)80*c7034505SDavid du Colombier decryptaesctr(CipherState *cs, uchar *buf, int nbuf)
81*c7034505SDavid du Colombier {
82*c7034505SDavid du Colombier if(cs->state.setup != 0xcafebabe || cs->state.rounds > AESmaxrounds)
83*c7034505SDavid du Colombier return;
84*c7034505SDavid du Colombier qlock(&aeslock);
85*c7034505SDavid du Colombier aesCTRdecrypt(buf, nbuf, &cs->state);
86*c7034505SDavid du Colombier qunlock(&aeslock);
87*c7034505SDavid du Colombier }
88*c7034505SDavid du Colombier
8963afb9a5SDavid du Colombier Cipher cipheraes128 = {
9063afb9a5SDavid du Colombier "aes128-cbc",
9163afb9a5SDavid du Colombier AESbsize,
9263afb9a5SDavid du Colombier initaes128,
9363afb9a5SDavid du Colombier encryptaes,
9463afb9a5SDavid du Colombier decryptaes,
9563afb9a5SDavid du Colombier };
9663afb9a5SDavid du Colombier
97*c7034505SDavid du Colombier Cipher cipheraes128ctr = {
98*c7034505SDavid du Colombier "aes128-ctr",
99*c7034505SDavid du Colombier AESbsize,
100*c7034505SDavid du Colombier initaes128,
101*c7034505SDavid du Colombier encryptaesctr,
102*c7034505SDavid du Colombier decryptaesctr,
103*c7034505SDavid du Colombier };
104*c7034505SDavid du Colombier
10563afb9a5SDavid du Colombier Cipher cipheraes192 = {
10663afb9a5SDavid du Colombier "aes192-cbc",
10763afb9a5SDavid du Colombier AESbsize,
10863afb9a5SDavid du Colombier initaes192,
10963afb9a5SDavid du Colombier encryptaes,
11063afb9a5SDavid du Colombier decryptaes,
11163afb9a5SDavid du Colombier };
11263afb9a5SDavid du Colombier
113*c7034505SDavid du Colombier Cipher cipheraes192ctr = {
114*c7034505SDavid du Colombier "aes192-ctr",
115*c7034505SDavid du Colombier AESbsize,
116*c7034505SDavid du Colombier initaes192,
117*c7034505SDavid du Colombier encryptaesctr,
118*c7034505SDavid du Colombier decryptaesctr,
119*c7034505SDavid du Colombier };
120*c7034505SDavid du Colombier
12163afb9a5SDavid du Colombier Cipher cipheraes256 = {
12263afb9a5SDavid du Colombier "aes256-cbc",
12363afb9a5SDavid du Colombier AESbsize,
12463afb9a5SDavid du Colombier initaes256,
12563afb9a5SDavid du Colombier encryptaes,
12663afb9a5SDavid du Colombier decryptaes,
12763afb9a5SDavid du Colombier };
128*c7034505SDavid du Colombier
129*c7034505SDavid du Colombier Cipher cipheraes256ctr = {
130*c7034505SDavid du Colombier "aes256-ctr",
131*c7034505SDavid du Colombier AESbsize,
132*c7034505SDavid du Colombier initaes256,
133*c7034505SDavid du Colombier encryptaesctr,
134*c7034505SDavid du Colombier decryptaesctr,
135*c7034505SDavid du Colombier };
136