correct dummy crypto
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Wed, 7 May 2025 13:39:34 +0000 (15:39 +0200)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Wed, 7 May 2025 13:39:34 +0000 (15:39 +0200)
cryptomod.c
function.c

index 9547d85e576b931a018f9ab0b9a3ffbf5515d392..a726369df30bcc20cdebf7eb581b09af50de92f0 100644 (file)
@@ -203,6 +203,7 @@ int main_thread (sub_task_t *s, int id)
         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;
@@ -394,6 +395,7 @@ int main_thread (sub_task_t *s, int id)
         }
         
         /* 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 */
@@ -552,8 +554,8 @@ int main (int argc, char **argv)
         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;
@@ -580,7 +582,7 @@ int main (int argc, char **argv)
     /* 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"));
@@ -599,6 +601,7 @@ int main (int argc, char **argv)
         case shutdowning_e:
         case error_e:
             VERBOSE (crypto, DEBUG, PRINTF ("shutdowning\n"));
+            usleep (100); // ugly!
             stop = 1;
             break;
         default:
index 402a3e7df6214690339013bcc2fa38da8004304d..900cdc1bfc41da2b4682f188f033e4534d802a3c 100644 (file)
@@ -15,6 +15,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "cryptomod.h"
 #include "pdu_channel.h"
@@ -70,16 +71,21 @@ int encrypt_func (CLEAR_DATA_t *in, ENCRYPTED_DATA_t *out)
 
     /* 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;
@@ -109,16 +115,19 @@ int decrypt_func (ENCRYPTED_DATA_t *in, CLEAR_DATA_t *out)
 
     /* 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;
@@ -128,9 +137,12 @@ int load_key_func (KEY_t *in, STATUS_t *out)
 {
     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;
 
@@ -141,9 +153,11 @@ int unload_key_func (KEY_t *in, STATUS_t *out)
 {
     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;
 }
@@ -158,8 +172,9 @@ int erase_key_func (KEY_t *in, STATUS_t *out)
 
     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;
 
@@ -310,6 +325,7 @@ void clean_crypto_memory (void)
         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;
 }