char *remtun = "tun://10.2.1.0";
char *locudp = "udp://10.1.0.1:1234";
char *remudp = "udp://10.1.0.2:1235";
-char *cmblack = "";
-char *cmred = "";
+char *cmlocblack = NULL;
+char *cmremblack = NULL;
+char *cmlocred = NULL;
+char *cmremred = NULL;
+int timeout = 100; /* ms */
int stop = 0;
#define BUFMAX 4096
typedef struct {
uint8_t aad[4];
- int red;
- int black;
+ int rxred;
+ int rxblack;
+ int txred;
+ int txblack;
} cm_t;
void sig_handler (int sig)
void usage (void)
{
- printf ("usage: %s [-d devtun] [-h] [-l loctun] [-r remtun] [-t locudp] [-u remudp] [-v int] [-w]\n", progname);
+ printf ("usage: %s [-d devtun] [-h] [-l loctun] [-r remtun] [-t locudp] [-u remudp] [-v int] [-x url url] [-y url url] [-w]\n", progname);
printf (" -d: dev tun (%s)\n", devtun);
printf (" -h: help message\n");
printf (" -l: local tun (%s)\n", loctun);
printf (" -u: remote udp (%s)\n", remudp);
printf (" -v: program verbose level [%d..%d] (%d)\n", ERROR, TRACE, GET_VERBOSE_LEVEL (ulvpn));
printf (" -V: library verbose level [%d..%d] (%d)\n", ERROR, TRACE, GET_VERBOSE_LEVEL (mapec));
- printf (" -x: black CM service (%s)\n", cmblack);
- printf (" -y: red CM service (%s)\n", cmred);
+ printf (" -x: black CM service (%s|%s)\n", cmlocblack, cmremblack);
+ printf (" -y: red CM service (%s|%s)\n", cmlocred, cmremred);
printf ("%s version %s\n", progname, version);
}
VERBOSE (ulvpn, WARNING, PRINTF ("error when serializing clear message\n"));
return 0;
}
- int seqtx = MOREP_Send (cm->red, 0x00, out, out_len);
+ int seqtx = MOREP_Send (cm->txred, 0x00, out, out_len);
/* get encrypted message and check it */
uint8_t in[MAXPAYLOAD] = {0};
uint8_t msgtype = 0;
int in_len = 0;
- int seqrx = MOREP_Receive (cm->black, &msgtype, in, &in_len);
+ int seqrx = MOREP_Receive_timeout (cm->rxblack, &msgtype, in, &in_len, timeout);
if ((msgtype != 0x01) || (in_len != out_len + 16) || (seqtx != seqrx)) {
VERBOSE (ulvpn, WARNING, PRINTF ("non-coherent encrypyted message\n"));
return 0;
VERBOSE (ulvpn, WARNING, PRINTF ("error when serializing encrypted message\n"));
return 0;
}
- int seqtx = MOREP_Send (cm->black, 0x02, out, out_len);
+ int seqtx = MOREP_Send (cm->txblack, 0x02, out, out_len);
/* get clear message and check it */
uint8_t in[MAXPAYLOAD] = {0};
uint8_t msgtype = 0;
int in_len = 0;
- int seqrx = MOREP_Receive (cm->red, &msgtype, in, &in_len);
+ int seqrx = MOREP_Receive_timeout (cm->rxred, &msgtype, in, &in_len, timeout);
if ((msgtype != 0x03) || (in_len != out_len - 16) || (seqtx != seqrx)) {
VERBOSE (ulvpn, WARNING, PRINTF ("non-coherent decrypted message\n"));
return 0;
/* process argument */
while (argc-- > 1) {
char *arg = *(++argv);
+ char *arg2;
if (arg[0] != '-') {
usage ();
return 1;
break;
case 'x':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
- if (arg == NULL) {
+ arg2 = (arg) && (--argc > 0) ? *(++argv) : NULL;
+ if ((arg == NULL) || (arg2 == NULL)) {
VERBOSE (ulvpn, ERROR, PRINTF ("%s: black cm service not specified\n", progname));
return 1;
}
- cmblack = arg;
+ cmlocblack = arg;
+ cmremblack = arg2;
break;
case 'y':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
- if (arg == NULL) {
+ arg2 = (arg) && (--argc > 0) ? *(++argv) : NULL;
+ if ((arg == NULL) || (arg2 == NULL)) {
VERBOSE (ulvpn, ERROR, PRINTF ("%s: red cm service not specified\n", progname));
return 1;
}
- cmred = arg;
+ cmlocred = arg;
+ cmremred = arg2;
break;
case 'h':
default:
}
/* init crypto module */
- cm_t cm = {{0, 0, 0, 0}, -1, -1};
- if ((cmblack) && (*cmblack)) {
- cm.black = MOREP_Connect (cmblack);
- }
- if ((cmred) && (*cmred)) {
- cm.red = MOREP_Connect (cmred);
+ cm_t cm = {{0, 0, 0, 0}, -1, -1, -1, -1};
+ int cmok = 0;
+ if ((cmlocblack) && (cmremblack) && (cmlocred) && (cmremred)) {
+ cmok = 1;
+ if ((cm.rxblack = MOREP_Connect (cmlocblack)) < 0) {
+ cmok = 0;
+ }
+ if ((cm.txblack = MOREP_Connect (cmremblack)) < 0) {
+ cmok = 0;
+ }
+ if ((cm.rxred = MOREP_Connect (cmlocred)) < 0) {
+ cmok = 0;
+ }
+ if ((cm.txred = MOREP_Connect (cmremred)) < 0) {
+ cmok = 0;
+ }
}
- int cmok = (cm.black >= 0) && (cm.red >= 0);
if (!cmok) {
VERBOSE (ulvpn, INFO, PRINTF ("CM desactivated\n"));
}
r = encrypt (buffer, r, &cm);
}
- r = MAPEC_Send (udp_fd, buffer, r);
- if (r < 0) {
+ if (r > 0) {
+ r = MAPEC_Send (udp_fd, buffer, r);
+ }
+ if (r <= 0) {
// TODO: ignore some errno
VERBOSE (ulvpn, ERROR, PRINTF ("error when sending to udp\n"));
//break;
- } else {
+ } else if (r > 0) {
VERBOSE (ulvpn, DEBUG, PRINTF ("sent to udp %d bytes\n", r));
+ } else {
+ VERBOSE (ulvpn, DEBUG, PRINTF ("nothing sent to udp\n"));
}
}