xref: /plan9-contrib/sys/src/cmd/ssh2/cipheraes.c (revision c703450534a39fda5e37abe206338c3e0e4fc8cd)
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