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 struct CipherState {
11*63afb9a5SDavid du Colombier BFstate state;
12*63afb9a5SDavid du Colombier };
13*63afb9a5SDavid du Colombier
14*63afb9a5SDavid du Colombier static CipherState*
initblowfish(Conn * c,int dir)15*63afb9a5SDavid du Colombier initblowfish(Conn *c, int dir)
16*63afb9a5SDavid du Colombier {
17*63afb9a5SDavid du Colombier int i;
18*63afb9a5SDavid du Colombier CipherState *cs;
19*63afb9a5SDavid du Colombier
20*63afb9a5SDavid du Colombier if (debug > 1) {
21*63afb9a5SDavid du Colombier fprint(2, "initblowfish dir:%d\ns2cek: ", dir);
22*63afb9a5SDavid du Colombier for(i = 0; i < 16; ++i)
23*63afb9a5SDavid du Colombier fprint(2, "%02x", c->s2cek[i]);
24*63afb9a5SDavid du Colombier fprint(2, "\nc2sek: ");
25*63afb9a5SDavid du Colombier for(i = 0; i < 16; ++i)
26*63afb9a5SDavid du Colombier fprint(2, "%02x", c->c2sek[i]);
27*63afb9a5SDavid du Colombier fprint(2, "\ns2civ: ");
28*63afb9a5SDavid du Colombier for(i = 0; i < 8; ++i)
29*63afb9a5SDavid du Colombier fprint(2, "%02x", c->s2civ[i]);
30*63afb9a5SDavid du Colombier fprint(2, "\nc2siv: ");
31*63afb9a5SDavid du Colombier for(i = 0; i < 8; ++i)
32*63afb9a5SDavid du Colombier fprint(2, "%02x", c->c2siv[i]);
33*63afb9a5SDavid du Colombier fprint(2, "\n");
34*63afb9a5SDavid du Colombier }
35*63afb9a5SDavid du Colombier cs = emalloc9p(sizeof(CipherState));
36*63afb9a5SDavid du Colombier memset(cs, '\0', sizeof *cs);
37*63afb9a5SDavid du Colombier fprint(2, "cs: %p\n", cs);
38*63afb9a5SDavid du Colombier if(dir)
39*63afb9a5SDavid du Colombier setupBFstate(&cs->state, c->s2cek, 16, c->s2civ);
40*63afb9a5SDavid du Colombier else
41*63afb9a5SDavid du Colombier setupBFstate(&cs->state, c->c2sek, 16, c->c2siv);
42*63afb9a5SDavid du Colombier return cs;
43*63afb9a5SDavid du Colombier }
44*63afb9a5SDavid du Colombier
45*63afb9a5SDavid du Colombier static void
encryptblowfish(CipherState * cs,uchar * buf,int nbuf)46*63afb9a5SDavid du Colombier encryptblowfish(CipherState *cs, uchar *buf, int nbuf)
47*63afb9a5SDavid du Colombier {
48*63afb9a5SDavid du Colombier bfCBCencrypt(buf, nbuf, &cs->state);
49*63afb9a5SDavid du Colombier }
50*63afb9a5SDavid du Colombier
51*63afb9a5SDavid du Colombier static void
decryptblowfish(CipherState * cs,uchar * buf,int nbuf)52*63afb9a5SDavid du Colombier decryptblowfish(CipherState *cs, uchar *buf, int nbuf)
53*63afb9a5SDavid du Colombier {
54*63afb9a5SDavid du Colombier fprint(2, "cs: %p, nb:%d\n", cs, nbuf);
55*63afb9a5SDavid du Colombier fprint(2, "before decrypt: %02ux %02ux %02ux %02ux\n", buf[0], buf[1], buf[2], buf[3]);
56*63afb9a5SDavid du Colombier bfCBCdecrypt(buf, nbuf, &cs->state);
57*63afb9a5SDavid du Colombier fprint(2, "after decrypt: %02ux %02ux %02ux %02ux\n", buf[0], buf[1], buf[2], buf[3]);
58*63afb9a5SDavid du Colombier }
59*63afb9a5SDavid du Colombier
60*63afb9a5SDavid du Colombier Cipher cipherblowfish = {
61*63afb9a5SDavid du Colombier "blowfish-cbc",
62*63afb9a5SDavid du Colombier 8,
63*63afb9a5SDavid du Colombier initblowfish,
64*63afb9a5SDavid du Colombier encryptblowfish,
65*63afb9a5SDavid du Colombier decryptblowfish,
66*63afb9a5SDavid du Colombier };
67