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