/*
* Encrypting tunnel for userv-ipif tunnels, actual implementation
- *
+ */
+/*
* usage:
* udptunnel-forwarder <optchars>
* <public-local-fd> <private-in-fd> <private-out-fd>
* <encdec-keys-fd>
* <mtu> <keepalive> <timeout>
* <public-remote-addr> [<public-remote-port>]
- * !<mech1> [<mech1-params> ...]
- * !<mech2> [<mech2-params> ...]
+ * |<mech1> [<mech1-params> ...]
+ * |<mech2> [<mech2-params> ...]
* ''
*
* Remote addr may '' to mean wait to receive a packet and reply to
* w means generate and write encdec keys, rather than reading them
* K means do crypto debug (use with care!)
*
+ * encdec keys datastream has keys for packets from key datastream
+ * writer to reader first, then keys for packets from reader to
+ * writer.
+ *
* Every must be numeric. There is very little argument checking.
*
* Exit status:
* 12 usage error
* 16 bad trouble
*/
+/*
+ * Copyright (C) 2000 Ian Jackson
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with userv-utils; if not, write to the Free Software
+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
#include <sys/socket.h>
#include <netinet/in.h>
static void cdebug(int mechno /*or -1*/, const char *msg) {
if (!crypto_debug) return;
- printf("%s: CRYPTO: %-20s %s\n",
- programid,
+ printf("%-8.8s: CRYPTO: %-20s %s\n",
+ uname_result.nodename,
mechno >= 0 ? mechs[mechno]->name : "",
msg);
}
write_must(encdec_keys_fd,ptr,sz,"write keys datastream");
} else {
read_must(encdec_keys_fd,ptr,sz,"read keys datastream");
+ cdebughex(-1, "random_key", ptr, sz, 0,0,0);
}
}
for (i=n_mechs-1; i>=0; i--) {
emsg= mechs[i]->decode(md_in[i],&buf_in);
if (emsg) {
- fprintf(stderr, "%s: bad packet: %s: %s\n", programid, mechs[i]->name, emsg);
+ if (*emsg)
+ fprintf(stderr, "%s: bad packet: %s: %s\n",
+ programid, mechs[i]->name, emsg);
+ else
+ cdebug(i,"silently discarded");
return;
}
cdebugbuf(i, "decode", &buf_in, 3,0);
maxprefix= 0;
i= 0;
while ((arg= *++argv)) {
- arg_assert(*arg++ == '!');
+ arg_assert(*arg++ == '|');
arg_assert(i <= MAXMECHS);
mechs[i]= find_mech(arg);
- cdebug(i,"encsetup");
+ cdebug(i,"writer->reader setup");
argv_save= argv;
- mechs[i]->encsetup(&md_out[i], &maxprefix, &maxsuffix);
+
+ if (encdec_keys_write)
+ mechs[i]->encsetup(&md_out[i], &maxprefix, &maxsuffix);
+ else
+ mechs[i]->decsetup(&md_in[i]);
argv_done= argv;
argv= argv_save;
- cdebug(i,"decsetup");
- mechs[i]->decsetup(&md_in[i]);
+ cdebug(i,"reader->writer setup");
+
+ if (encdec_keys_write)
+ mechs[i]->decsetup(&md_in[i]);
+ else
+ mechs[i]->encsetup(&md_out[i], &maxprefix, &maxsuffix);
assert(argv == argv_done);