uint8_t payload[MOREP_PAYLOAD] = {0};
int len = 0;
int seqnum = MOREP_Receive (in, &msgtype, payload, &len);
+ VERBOSE (crypto, DEBUG, PRINTF ("%s received a message (%d)\n", servname, len));
/* check service/msgtype */
message_t *msg = NULL;
}
/* send message */
+ VERBOSE (crypto, DEBUG, PRINTF ("%s is sending a message (%d)\n", servname, len));
seqnum = MOREP_Send (out, msgtype, payload, len);
/* log transmitted message */
if (mode != -1) {
service_t *serv = find_service (servname);
if (serv) {
- VERBOSE (crypto, DEBUG, PRINTF ("url '%s' for service '%s' on %cX\n", url, servname, mode ? 'R' : 'T'));
- if (mode) {
+ VERBOSE (crypto, DEBUG, PRINTF ("url '%s' for service '%s' on %cX\n", url, servname, (mode == 0) ? 'R' : 'T'));
+ if (mode == 0) {
serv->rx = url;
} else {
serv->tx = url;
/* main loop */
int stop = 0;
while (!stop) {
- usleep (1000);
+ usleep (1000); // wait before ready state
switch (state) {
case idle_e:
VERBOSE (crypto, DEBUG, PRINTF ("starting\n"));
case shutdowning_e:
case error_e:
VERBOSE (crypto, DEBUG, PRINTF ("shutdowning\n"));
+ usleep (100); // ugly!
stop = 1;
break;
default:
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "cryptomod.h"
#include "pdu_channel.h"
/* encrypt with key */
int cid = in->channel_id;
- if ((channels[cid]) && (keys[channels[cid] - 1])) {
- uint8_t *key = keys[channels[cid] - 1];
- int key_len = key_lengths[channels[cid] - 1];
+ int kid = channels[cid] - 1;
+ if (kid >= 0) {
+ uint8_t *key = keys[kid];
+ int klen = key_lengths[kid];
for (int i = 0; i < out->data_len; i++) {
- out->data[i] = (out->data[i] ^ key[i % key_len]) & 0xff;
+ int a = out->data[i];
+ out->data[i] = (out->data[i] ^ key[i % klen]) & 0xff;
+ if (i < 8) printf ("%02x%02x%02x%c", a, key[i % klen], out->data[i], (i != 7) ? '|' : '\n');
}
} else {
- VERBOSE (crypto, WARNING, PRINTF ("no key associated to channel %d\n", in->channel_id));
+ VERBOSE (crypto, WARNING, PRINTF ("no key associated to channel %d (%d))\n", cid, kid));
}
+ usleep (200); // simulate cpu time
+
state = ready_e;
return 0;
/* decrypt with key */
int cid = in->channel_id;
- if ((channels[cid]) && (keys[channels[cid] - 1])) {
- uint8_t *key = keys[channels[cid] - 1];
- int key_len = key_lengths[channels[cid] - 1];
+ int kid = channels[cid] - 1;
+ if (kid >= 0) {
+ uint8_t *key = keys[kid];
+ int klen = key_lengths[kid];
for (int i = 0; i < out->data_len; i++) {
- out->data[i] = (out->data[i] ^ key[i % key_len]) & 0xff;
+ out->data[i] = (out->data[i] ^ key[i % klen]) & 0xff;
}
} else {
- VERBOSE (crypto, WARNING, PRINTF ("no key associated to channel %d\n", in->channel_id));
+ VERBOSE (crypto, WARNING, PRINTF ("no key associated to channel %d (%d)\n", cid, kid));
}
+ usleep (200); // simulate cpu time
+
state = ready_e;
return 0;
{
VERBOSE (crypto, TRACE, PRINTF ("load_key_func\n"));
- free (keys[in->key_id]);
- keys[in->key_id] = (uint8_t *) calloc (1, in->key_len);
- memcpy (in->key, keys[in->key_id], in->key_len);
+ int kid = in->key_id;
+ int klen = in->key_len;
+ free (keys[kid]);
+ keys[kid] = (uint8_t *) calloc (1, klen);
+ memcpy (keys[in->key_id], in->key, klen);
+ key_lengths[kid] = klen;
out->status = ok_e;
{
VERBOSE (crypto, TRACE, PRINTF ("unload_key_func\n"));
- out->status = (keys[in->key_id]) ? ok_e : error_e;
- free (keys[in->key_id]);
- keys[in->key_id] = NULL;
+ int kid = in->key_id;
+ out->status = (keys[kid]) ? ok_e : error_e;
+ free (keys[kid]);
+ keys[kid] = NULL;
+ key_lengths[kid] = 0;
return 0;
}
for (int i = 0; i < NB_KEYS; i++) {
free (keys[i]);
- keys[i] = NULL;
}
+ memset (keys, 0, NB_KEYS * sizeof (uint8_t *));
+ memset (key_lengths, 0, NB_KEYS * sizeof (int));
out->status = ok_e;
free (keys[i]);
}
memset (keys, 0, NB_KEYS * sizeof (uint8_t *));
+ memset (key_lengths, 0, NB_KEYS * sizeof (int));
memset (channels, 0, NB_CHANNELS * sizeof (uint8_t));
state = ready_e;
}