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 * 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* 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* 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* 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 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 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