first try
authorLaurent Mazet <mazet@softndesign.org>
Wed, 9 Apr 2025 22:57:54 +0000 (00:57 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Wed, 9 Apr 2025 22:57:54 +0000 (00:57 +0200)
morep_simulator.c
parse.c
parse.h
script-cross_crypto.eth [new file with mode: 0644]
script-local_crypto.eth [new file with mode: 0644]

index 0528f49577842fbd2987548a8b58a3f1645ae8f1..a538c18f8c64130c830e4b31a1d1d8618b5f4632 100644 (file)
@@ -216,6 +216,8 @@ int main (int argc, char **argv)
 {
     char *filename = NULL;
     char *logname = NULL;
+    char *servname = NULL;
+    char *tmp = NULL;
     char *url = NULL;
     int mode = -1;
     int nbcomms = 0;
@@ -255,6 +257,14 @@ int main (int argc, char **argv)
             url = arg;
             mode = 0;
             break;
+        case 's':
+            arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+            if (arg == NULL) {
+                VERBOSE (morep, ERROR, PRINTF ("%s: service not specified\n", progname));
+                return 1;
+            }
+            servname = arg;
+            break;
         case 't':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg == NULL) {
@@ -274,7 +284,7 @@ int main (int argc, char **argv)
             break;
         case 'h':
         default:
-            printf ("usage: %s [-h] [-l log] [-r url] [-t url] [-v level] [file]\n", progname);
+            printf ("usage: %s [-h] [-l log] [-r url] [-s serv] [-t url] [-v level] [file]\n", progname);
             return (c != 'h');
         }
 
@@ -286,6 +296,13 @@ int main (int argc, char **argv)
                     (comm_list + nbcomms)->morep = morep;
                     (comm_list + nbcomms)->mode = mode;
                     (comm_list + nbcomms)->etype = strrchr (url, '/') + 1;
+                    for (int i = 0; (service_list + i)->service_id != noserv_e; i++) {
+                        service_t *s = service_list + i;
+                        if (strcmp (s->name, servname) == 0) {
+                            memcpy (mode ? &(s->rx) : &(s->tx), comm_list + nbcomms, sizeof (comm_t));
+                            break;
+                        }
+                    }
                     nbcomms++;
                 } else {
                     VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
@@ -373,6 +390,11 @@ int main (int argc, char **argv)
         }
         int offset = 1;
 
+        /* skip space */
+        tmp = line + offset;
+        TEST_CHARS (tmp, " \t:", 0);
+        offset = tmp - line;
+
         comm_t *comm = NULL;
         service_t *serv = NULL;
         /* find MOREP by service name */
@@ -409,7 +431,7 @@ int main (int argc, char **argv)
         VERBOSE (morep, DEBUG, PRINTF ("work with %c[%s]\n", comm->mode ? 'T' : 'R', serv->name));
 
         /* skip space */
-        char *tmp = line + offset;
+        tmp = line + offset;
         TEST_CHARS (tmp, " \t", 0);
         offset = tmp - line;
 
@@ -619,10 +641,16 @@ int main (int argc, char **argv)
 }
 
 /* test: morep_simulator.exe -h | grep usage */
+/* test: morep_simulator.exe -l 2>&1 | grep 'log file not specified' */
 /* test: morep_simulator.exe -r 2>&1 | grep 'url not specified' */
+/* test: morep_simulator.exe -s 2>&1 | grep 'service not specified' */
 /* test: morep_simulator.exe -t 2>&1 | grep 'url not specified' */
-/* test: morep_simulator.exe -l 2>&1 | grep 'log file not specified' */
-/* test: morep_simulator.exe -l - -t lo://00:00:00:00:00:00/0808 -v 4 script-lo.eth */
-/* test: morep_simulator.exe -l script.log -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-lo.eth */
+/* test: morep_simulator.exe -l - -t lo://00:00:00:00:00:00/0809 -v 4 script-l0.eth */
+/* test: morep_simulator.exe -l script-cross_crypto.log -s CROSS_CRYPTO -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-cross_crypto.eth */
+/* test: morep_simulator.exe -l script-local_crypto.log -s LOCAL_CRYPTO -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-local_crypto.eth */
+/* test: morep_simulator.exe -l script-provisioning.log -s PROVISIONING -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-provisioning.eth */
+/* test: morep_simulator.exe -l script-prng.log -s PRNG -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-prng.eth */
+/* test: morep_simulator.exe -l script-bypass.log -s BYPASS -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-bypass.eth */
+/* test: morep_simulator.exe -l script-control.log -s CONTROL -t lo://00:00:00:00:00:00/0808 -r lo://00:00:00:00:00:00/0808 script-control.eth */
 
 /* vim: set ts=4 sw=4 si et: */
diff --git a/parse.c b/parse.c
index 72bea91843049cc1f9b91c42932f2964d47d05a3..a8f8876d0fbc322e9cced4c8c83c9d7df32d2f59 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -47,6 +47,7 @@ int parse_array (char *str, uint8_t *buffer, int maxlen)
 
     /* string payload: "..." (space must be protected by '\') */
     if ((*str == '"') && (slen > 1)) {
+        if (maxlen < slen - 2) slen = maxlen + 2;
         if (str[slen - 1] == '"') {
             len = slen - 2;
             if (len > maxlen) {
@@ -79,31 +80,32 @@ int parse_array (char *str, uint8_t *buffer, int maxlen)
     }
 
     /* hexa payload: xxxxxx [0-9a-fA-F] */
-    else if (slen % 2 == 0) {
-        len = slen / 2;
-        if (len > maxlen) {
-            VERBOSE (morep, WARNING, PRINTF ("string too large (%d > %d) for '%s'\n", len, maxlen, str));
-            len = maxlen;
-        }
-        int i;
-        for (i = 0; i < len; i++) {
-            char digit[3] = {0};
-            char *ptr = NULL;
-            digit[0] = str[2 * i];
-            digit[1] = str[2 * i + 1];
-            buffer[i] = strtol (digit, &ptr, 16);
-            if (*ptr != '\0') {
-                VERBOSE (morep, ERROR, PRINTF ("unrecognize hexa-string (%d) '%s'\n", 2 * i, str));
-                break;
+    else {
+        if (maxlen * 2 < slen) slen = maxlen * 2;
+        if (slen % 2 == 0) {
+            len = slen / 2;
+            if (len > maxlen) {
+                VERBOSE (morep, WARNING, PRINTF ("string too large (%d > %d) for '%s'\n", len, maxlen, str));
+                len = maxlen;
+            }
+            for (int i = 0; i < len; i++) {
+                char digit[3] = {0};
+                char *ptr = NULL;
+                digit[0] = str[3 * i];
+                digit[1] = str[3 * i + 1];
+                buffer[i] = strtol (digit, &ptr, 16);
+                if ((*ptr != '\0') && (*ptr != ' ') && (*ptr != '\t')) {
+                    VERBOSE (morep, ERROR, PRINTF ("unrecognize hexa-string (%d) '%s'|%s\n", 2 * i, str, ptr));
+                    break;
+                }
             }
         }
-    }
 
-    /* unrecognize format */
-    else {
-        VERBOSE (morep, WARNING, PRINTF ("can't parse buffer '%s'\n", str));
+        /* unrecognize format */
+        else {
+            VERBOSE (morep, WARNING, PRINTF ("can't parse buffer '%s'\n", str));
+        }
     }
-
     return len;
 }
 
diff --git a/parse.h b/parse.h
index 1145fb1af37af5112565d97be2740d4181fecd78..3c9514007b2e8ced34ace0d3ea5897fc85784efb 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -116,9 +116,9 @@ __BEGIN_DECLS
    @param name field name
    @param buf preallocated storage
 */
-#define PARSE_ARRAY(name, buf)                                \
-        else if (strcmp (var, name) == 0) {                   \
-            buf##_len = parse_array (val, buf, sizeof (buf)); \
+#define PARSE_ARRAY(name, buf)                                                               \
+        else if (strcmp (var, name) == 0) {                                                  \
+            buf##_len = parse_array (val, buf, (buf##_len) ? buf##_len : (int)sizeof (buf)); \
         }
 
 /**
diff --git a/script-cross_crypto.eth b/script-cross_crypto.eth
new file mode 100644 (file)
index 0000000..f2fa7ba
--- /dev/null
@@ -0,0 +1,13 @@
+# Test script
+
+TCROSS_CRYPTO ENCRYPT_CROSS_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+RCROSS_CRYPTO ENCRYPT_CROSS_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+
+TCROSS_CRYPTO ENCRYPTED_CROSS_ASYNC CHANNELID=9 BYPASSLEN=0 DATA=@script-local_crypto.eth
+RCROSS_CRYPTO ENCRYPTED_CROSS_ASYNC CHANNELID=9 BYPASSLEN=0 DATA=@script-local_crypto.eth
+
+TCROSS_CRYPTO DECRYPT_CROSS_ASYNC CHANNELID=5 BYPASSLEN=0 DATA=@script-local_crypto.eth
+RCROSS_CRYPTO DECRYPT_CROSS_ASYNC CHANNELID=5 BYPASSLEN=0 DATA=@script-local_crypto.eth
+
+TCROSS_CRYPTO DECRYPTED_CROSS_ASYNC CHANNELID=0 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+RCROSS_CRYPTO DECRYPTED_CROSS_ASYNC CHANNELID=0 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
diff --git a/script-local_crypto.eth b/script-local_crypto.eth
new file mode 100644 (file)
index 0000000..e9e4312
--- /dev/null
@@ -0,0 +1,13 @@
+# Test script
+
+T:LOCAL_CRYPTO ENCRYPT_LOCAL_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+R:LOCAL_CRYPTO ENCRYPT_LOCAL_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+
+T:LOCAL_CRYPTO ENCRYPTED_LOCAL_ASYNC CHANNELID=9 BYPASSLEN=0 DATA=@script-local_crypto.eth
+R:LOCAL_CRYPTO ENCRYPTED_LOCAL_ASYNC CHANNELID=9 BYPASSLEN=0 DATA=@script-local_crypto.eth
+
+T:LOCAL_CRYPTO DECRYPT_LOCAL_ASYNC CHANNELID=5 BYPASSLEN=0 DATA=@script-local_crypto.eth
+R:LOCAL_CRYPTO DECRYPT_LOCAL_ASYNC CHANNELID=5 BYPASSLEN=0 DATA=@script-local_crypto.eth
+
+T:LOCAL_CRYPTO DECRYPTED_LOCAL_ASYNC CHANNELID=0 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+R:LOCAL_CRYPTO DECRYPTED_LOCAL_ASYNC CHANNELID=0 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth