add received pdu checks
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Tue, 8 Apr 2025 23:45:52 +0000 (01:45 +0200)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Tue, 8 Apr 2025 23:45:52 +0000 (01:45 +0200)
24 files changed:
morep.c
morep_simulator.c
morep_valid.c
parse.h
pdu_channel.c
pdu_channel.h
pdu_clear_data.c
pdu_clear_data.h
pdu_encrypted_data.c
pdu_encrypted_data.h
pdu_key.c
pdu_key.h
pdu_prng_param.c
pdu_prng_param.h
pdu_raw_data.c
pdu_raw_data.h
pdu_status.c
pdu_status.h
script-bypass.eth
script-control.eth
script-cross_crypto-error.eth [new file with mode: 0644]
script-cross_crypto.eth
script-prng.eth
script-provisioning.eth

diff --git a/morep.c b/morep.c
index b011b2c08adae835c6e3e9f89c625ab9af7d2636..129e33947b872d2b769f99c811365a142ad8ac6a 100644 (file)
--- a/morep.c
+++ b/morep.c
@@ -148,7 +148,7 @@ int parse_mac (MOREP_addr_t *addr, char *url)
 {
     VERBOSE (morep, TRACE, PRINTF ("parse_mac\n"));
 
-    /* MAC address format: XX:XX:XX:XX:XX:XX/... */ 
+    /* MAC address format: XX:XX:XX:XX:XX:XX/... */
     int i, j;
     for (i = j = 0; i < 6; i++) {
         if (url[j] == 0) {
index 9af642172063cf89f35ac0e4e367adcb5f700755..b4ff4335a2ba8c85b5f07002b2d2442c8a43568b 100644 (file)
@@ -89,8 +89,8 @@ message_t message_list[] = {
     {"AUTHENTIFICATION_RESP", control_e, 0x03, raw_data_e},
     {"REBOOT_REQ", control_e, 0x04, nopdu_e},
     {"REBOOT_RESP", control_e, 0x05, status_e},
-    {"ZEROIZE_REQ", control_e, 0x04, nopdu_e},
-    {"ZEROIZE_RESP", control_e, 0x05, status_e},
+    {"ZEROIZE_REQ", control_e, 0x06, nopdu_e},
+    {"ZEROIZE_RESP", control_e, 0x07, status_e},
     {"LOCK_CRYPTO_REQ", control_e, 0xFE, nopdu_e},
     {"LOCK_CRYPTO_RESP", control_e, 0xFF, status_e},
 
@@ -424,21 +424,21 @@ int main (int argc, char **argv)
             }
         }
 
-        /* check message and service */ 
+        /* check message and service */
         if (serv->service_id != msg->service_id) {
             VERBOSE (simul, WARNING, PRINTF ("message %s is not allowed for service %s (line '%s')\n", msg->name, serv->name, line));
             continue;
         }
         VERBOSE (simul, DEBUG, PRINTF ("work with message %s\n", msg->name));
 
-        CHANNEL_t msg_channel = {0};
-        CLEAR_DATA_t msg_clear_data = {0};
-        ENCRYPTED_DATA_t msg_encrypted_data = {0};
-        KEY_t msg_key = {0};
-        PRNG_PARAM_t msg_prng_param = {0};
-        RAW_DATA_t msg_raw_data = {0};
-        STATUS_t msg_status = {0};
-        
+        CHANNEL_t pdu_channel = {0};
+        CLEAR_DATA_t pdu_clear_data = {0};
+        ENCRYPTED_DATA_t pdu_encrypted_data = {0};
+        KEY_t pdu_key = {0};
+        PRNG_PARAM_t pdu_prng_param = {0};
+        RAW_DATA_t pdu_raw_data = {0};
+        STATUS_t pdu_status = {0};
+
         int seqnum = -1;
         int len = 0;
         pdu_t pdu;
@@ -450,25 +450,25 @@ int main (int argc, char **argv)
             case nopdu_e:
                 break;
             case channel_e:
-                parse_channel (line + offset, &msg_channel);
+                parse_channel (line + offset, &pdu_channel);
                 break;
             case clear_data_e:
-                parse_clear_data (line + offset, &msg_clear_data);
+                parse_clear_data (line + offset, &pdu_clear_data);
                 break;
             case encrypted_data_e:
-                parse_encrypted_data (line + offset, &msg_encrypted_data);
+                parse_encrypted_data (line + offset, &pdu_encrypted_data);
                 break;
             case key_e:
-                parse_key (line + offset, &msg_key);
+                parse_key (line + offset, &pdu_key);
                 break;
             case prng_param_e:
-                parse_prng_param (line + offset, &msg_prng_param);
+                parse_prng_param (line + offset, &pdu_prng_param);
                 break;
             case raw_data_e:
-                parse_raw_data (line + offset, &msg_raw_data);
+                parse_raw_data (line + offset, &pdu_raw_data);
                 break;
             case status_e:
-                parse_status (line + offset, &msg_status);
+                parse_status (line + offset, &pdu_status);
                 break;
             default:
                 VERBOSE (simul, WARNING, PRINTF ("can't parse line '%s' (%d)\n", line, offset));
@@ -479,38 +479,41 @@ int main (int argc, char **argv)
             uint8_t payload[1496] = {0};
             switch (pdu) {
             case channel_e:
-                len = serial_channel (&msg_channel, payload, sizeof (payload));
+                len = serial_channel (&pdu_channel, payload, sizeof (payload));
                 break;
             case clear_data_e:
-                len = serial_clear_data (&msg_clear_data, payload, sizeof (payload));
+                len = serial_clear_data (&pdu_clear_data, payload, sizeof (payload));
                 break;
             case encrypted_data_e:
-                len = serial_encrypted_data (&msg_encrypted_data, payload, sizeof (payload));
+                len = serial_encrypted_data (&pdu_encrypted_data, payload, sizeof (payload));
                 break;
             case key_e:
-                len = serial_key (&msg_key, payload, sizeof (payload));
+                len = serial_key (&pdu_key, payload, sizeof (payload));
                 break;
             case prng_param_e:
-                len = serial_prng_param (&msg_prng_param, payload, sizeof (payload));
+                len = serial_prng_param (&pdu_prng_param, payload, sizeof (payload));
                 break;
             case raw_data_e:
-                len = serial_raw_data (&msg_raw_data, payload, sizeof (payload));
+                len = serial_raw_data (&pdu_raw_data, payload, sizeof (payload));
                 break;
             case status_e:
-                len = serial_status (&msg_status, payload, sizeof (payload));
+                len = serial_status (&pdu_status, payload, sizeof (payload));
                 break;
             default:
                 len = 0;
             }
             seqnum = MOREP_Send (comm->morep, msg->msgtype, payload, len);
+            VERBOSE (simul, INFO, PRINTF ("T:%s[%s] [SEQ=%d MSG=%d LEN=%d PDU=%d] %s\n", serv->name, comm->etype, seqnum, msg->msgtype, len, pdu, msg->name));
 
         } else { /* receive */
+            message_t *exp_msg = msg;
 
             uint8_t msgtype = 0;
             uint8_t payload[1496] = {0};
             seqnum = MOREP_Receive (comm->morep, &msgtype, payload, &len);
+printf("msgtype: %d\n", msgtype);
 
-            /* check pdu type */
+            /* check msg/pdu type */
             pdu = undef_pdu_e;
             msg = NULL;
             for (int i = 0; ((message_list + i)->service_id) && (pdu == undef_pdu_e); i++) {
@@ -518,44 +521,82 @@ int main (int argc, char **argv)
                 if ((m->service_id == serv->service_id) && (m->msgtype == msgtype)) {
                     pdu = m->pdu;
                     msg = m;
+printf("msgtype: %d %d\n", msgtype, msg->msgtype);
                 }
             }
-
             /* check msg type */
-            if (msgtype != msg->msgtype) {
-                VERBOSE (simul, WARNING, PRINTF ("R%sx SEQ=%d MSG=%d: expected msgtype %d\n", comm->etype, seqnum, msgtype, msg->msgtype));
+            if (msg == NULL) {
+                VERBOSE (simul, WARNING, PRINTF ("R:%s[%s] [SEQ=%d MSG=%d LEN=%d PDU=%d] message type is not allowed for this service\n", serv->name, comm->etype, seqnum, msg->msgtype, len, pdu));
+                continue;
             }
+printf("msgtype: %d %d %d\n", msgtype, msg->msgtype, exp_msg->msgtype);
+            if (exp_msg->msgtype != msg->msgtype) {
+                VERBOSE (simul, WARNING, PRINTF ("R:%s[%s] [SEQ=%d MSG=%d LEN=%d PDU=%d] expected message type %s\n", serv->name, comm->etype, seqnum, msg->msgtype, len, pdu, exp_msg->name));
+                continue;
+            }
+            VERBOSE (simul, INFO, PRINTF ("R:%s[%s] [SEQ=%d MSG=%d LEN=%d PDU=%d] %s\n", serv->name, comm->etype, seqnum, msg->msgtype, len, pdu, msg->name));
 
             /* deserialize message */
             switch (pdu) {
             case nopdu_e:
                 break;
             case channel_e:
-                deserial_channel (payload, len, &msg_channel);
+                deserial_channel (payload, len, &pdu_channel);
                 break;
             case clear_data_e:
-                deserial_clear_data (payload, len, &msg_clear_data);
+                deserial_clear_data (payload, len, &pdu_clear_data);
                 break;
             case encrypted_data_e:
-                deserial_encrypted_data (payload, len, &msg_encrypted_data);
+                deserial_encrypted_data (payload, len, &pdu_encrypted_data);
                 break;
             case key_e:
-                deserial_key (payload, len, &msg_key);
+                deserial_key (payload, len, &pdu_key);
                 break;
             case prng_param_e:
-                deserial_prng_param (payload, len, &msg_prng_param);
+                deserial_prng_param (payload, len, &pdu_prng_param);
                 break;
             case raw_data_e:
-                deserial_raw_data (payload, len, &msg_raw_data);
+                deserial_raw_data (payload, len, &pdu_raw_data);
                 break;
             case status_e:
-                deserial_status (payload, len, &msg_status);
+                deserial_status (payload, len, &pdu_status);
                 break;
             default:
-                VERBOSE (simul, WARNING, PRINTF ("can't deserialize message R%s[%02x]'\n", comm->etype, msgtype));
+                VERBOSE (simul, WARNING, PRINTF ("can't deserialize message %s\n", msg->name));
                 continue;
             }
 
+            /* check received pdu */
+            if (pdu == channel_e) {
+                CHANNEL_t exp_pdu_channel = {0};
+                int check_fields = parse_channel (line + offset, &exp_pdu_channel);
+                check_channel (&pdu_channel, &exp_pdu_channel, check_fields);
+            } else if (pdu == clear_data_e) {
+                CLEAR_DATA_t exp_pdu_clear_data = {0};
+                int check_fields = parse_clear_data (line + offset, &exp_pdu_clear_data);
+                check_clear_data (&pdu_clear_data, &exp_pdu_clear_data, check_fields);
+            } else if (pdu == encrypted_data_e) {
+                ENCRYPTED_DATA_t exp_pdu_encrypted_data = {0};
+                int check_fields = parse_encrypted_data (line + offset, &exp_pdu_encrypted_data);
+                check_encrypted_data (&pdu_encrypted_data, &exp_pdu_encrypted_data, check_fields);
+            } else if (pdu == key_e) {
+                KEY_t exp_pdu_key = {0};
+                int check_fields = parse_key (line + offset, &exp_pdu_key);
+                check_key (&pdu_key, &exp_pdu_key, check_fields);
+            } else if (pdu == prng_param_e) {
+                PRNG_PARAM_t exp_pdu_prng_param = {0};
+                int check_fields = parse_prng_param (line + offset, &exp_pdu_prng_param);
+                check_prng_param (&pdu_prng_param, &exp_pdu_prng_param, check_fields);
+            } else if (pdu == raw_data_e) {
+                RAW_DATA_t exp_pdu_raw_data = {0};
+                int check_fields = parse_raw_data (line + offset, &exp_pdu_raw_data);
+                check_raw_data (&pdu_raw_data, &exp_pdu_raw_data, check_fields);
+            } else if (pdu == status_e) {
+                STATUS_t exp_pdu_status = {0};
+                int check_fields = parse_status (line + offset, &exp_pdu_status);
+                check_status (&pdu_status, &exp_pdu_status, check_fields);
+            }
+
         }
 
         /* log message */
@@ -567,25 +608,25 @@ int main (int argc, char **argv)
             case nopdu_e:
                 break;
             case channel_e:
-                format_channel (&msg_channel, buffer, sizeof (buffer));
+                format_channel (&pdu_channel, buffer, sizeof (buffer));
                 break;
             case clear_data_e:
-                format_clear_data (&msg_clear_data, buffer, sizeof (buffer));
+                format_clear_data (&pdu_clear_data, buffer, sizeof (buffer));
                 break;
             case encrypted_data_e:
-                format_encrypted_data (&msg_encrypted_data, buffer, sizeof (buffer));
+                format_encrypted_data (&pdu_encrypted_data, buffer, sizeof (buffer));
                 break;
             case key_e:
-                format_key (&msg_key, buffer, sizeof (buffer));
+                format_key (&pdu_key, buffer, sizeof (buffer));
                 break;
             case prng_param_e:
-                format_prng_param (&msg_prng_param, buffer, sizeof (buffer));
+                format_prng_param (&pdu_prng_param, buffer, sizeof (buffer));
                 break;
             case raw_data_e:
-                format_raw_data (&msg_raw_data, buffer, sizeof (buffer));
+                format_raw_data (&pdu_raw_data, buffer, sizeof (buffer));
                 break;
             case status_e:
-                format_status (&msg_status, buffer, sizeof (buffer));
+                format_status (&pdu_status, buffer, sizeof (buffer));
                 break;
             default:
                 snprintf (buffer, sizeof (buffer), "unknown payload");
@@ -614,6 +655,8 @@ int main (int argc, char **argv)
 /* test: morep_simulator.exe -v | grep 'morep verbose level not specified' */
 /* test: morep_simulator.exe -V | grep 'simulator verbose level not specified' */
 /* test: morep_simulator.exe -l - -t lo://00:00:00:00:00:00/0809 -v 4 script-lo.eth */
+/* test: morep_simulator.exe -l script-cross_crypto-error.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-error.eth -V 3; test $? -ne 0 */
+/* test: morep_simulator.exe -l script-cross_crypto-error.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-error.eth -V 3 | grep WARNING */
 /* 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 -V 3 */
 /* 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 -V 3 */
 /* 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 -V 3 */
index bcff5123ccde15a5f3718af5bffe7875b69a53c2..ced7eca99c9d5d7b706c4054c02d83d98367d0b8 100644 (file)
@@ -300,9 +300,9 @@ int main (int argc, char **argv)
             VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
             continue;
         }
-    
+
         RAW_DATA_t payload = {0};
-        if (parse_raw_data (tmp, &payload) != 0) {
+        if (parse_raw_data (tmp, &payload) < 0) {
             VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
             continue;
         }
diff --git a/parse.h b/parse.h
index 67747b50f4c8834c95dead340e265ffe8342c504..396a2281d16940198662d6b4217d029f3d468d85 100644 (file)
--- a/parse.h
+++ b/parse.h
@@ -24,6 +24,8 @@
 
 __BEGIN_DECLS
 
+#define TOLERANCE 1e-5
+
 /**
    @ingroup MESSAGES
 
@@ -92,10 +94,10 @@ __BEGIN_DECLS
    @param name field name
    @param buf preallocated storage
 */
-#define PARSE_INT(name, buf)                \
+#define PARSE_INT(name, buf)                     \
         else if (p++, strcmp (var, name) == 0) { \
-            buf = parse_int (val);          \
-            rc |= 1 << p; \
+            buf = parse_int (val);               \
+            rc |= 1 << p;                        \
         }
 /**
    @ingroup MESSAGES
@@ -105,10 +107,10 @@ __BEGIN_DECLS
    @param name field name
    @param buf preallocated storage
 */
-#define PARSE_DOUBLE(name, buf)             \
+#define PARSE_DOUBLE(name, buf)                  \
         else if (p++, strcmp (var, name) == 0) { \
-            buf = parse_double (val);       \
-            rc |= 1 << p; \
+            buf = parse_double (val);            \
+            rc |= 1 << p;                        \
         }
 
 /**
@@ -121,9 +123,9 @@ __BEGIN_DECLS
    @param optinal parameter to use defined length
 */
 #define PARSE_ARRAY(name, buf, ...)                                                                \
-        else if (p++, strcmp (var, name) == 0) {                                                        \
+        else if (p++, strcmp (var, name) == 0) {                                                   \
             buf##_len = parse_array (val, buf, (__VA_ARGS__ + 0) ? buf##_len : (int)sizeof (buf)); \
-            rc |= 1 << p; \
+            rc |= 1 << p;                                                                          \
         }
 
 /**
@@ -135,7 +137,7 @@ __BEGIN_DECLS
    @param buf preallocated storage
 */
 #define PARSE_TAB(name, buf)                      \
-        else if (p++, strcmp (var, name) == 0) {       \
+        else if (p++, strcmp (var, name) == 0) {  \
             parse_array (val, buf, sizeof (buf)); \
             rc |= 1 << p; \
         }
@@ -148,7 +150,7 @@ __BEGIN_DECLS
 #define END_PARSE()                                                            \
         else {                                                                 \
             VERBOSE (morep, WARNING, PRINTF ("can't understand '%s'\n", var)); \
-            rc = -1;                                                            \
+            rc = -1;                                                           \
             break;                                                             \
         }                                                                      \
     }                                                                          \
@@ -483,9 +485,107 @@ __BEGIN_DECLS
 
    End of deserialisation section
 */
-#define END_DESERIAL()       \
+#define END_DESERIAL()  \
     return (ptr > end);
 
+/**
+   @ingroup MESSAGES
+
+   Initialize check section
+
+   @param fields field mask
+*/
+#define BEGIN_CHECK(fields) \
+    int _fields = fields;   \
+    int p = 0;              \
+    int rc = 0;
+
+/**
+   @ingroup MESSAGES
+
+   Check two integer fields
+
+   @param name field name
+   @param first first value
+   @param second second value
+*/
+#define CHECK_INT(name, first, second)                                                   \
+    if ((_fields & (1 << (++p))) && (first != second)) {                                 \
+        VERBOSE (morep, WARNING, PRINTF ("%s differed %d / %d\n", name, first, second)); \
+        rc = 1;                                                                          \
+    }
+
+/**
+   @ingroup MESSAGES
+
+   Check two floating point fields
+
+   @param name field name
+   @param first first value
+   @param second second value
+*/
+#define CHECK_DOUBLE(name, first, second)                                                        \
+    if (_fields & (1 << (++p))) {                                                                \
+        if (first == 0) {                                                                        \
+            if (first ! second) {                                                                \
+                VERBOSE (morep, WARNING, PRINTF ("%s differed %g / %g\n", name, first, second)); \
+                rc = 1;                                                                          \
+            }                                                                                    \
+        } else {                                                                                 \
+            double diff = (first - second) / first;                                              \
+            if (diff < 0) {                                                                      \
+                diff = -diff;                                                                    \
+            }                                                                                    \
+            if (diff > TOLERANCE) {                                                              \
+                VERBOSE (morep, WARNING, PRINTF ("%s differed %g / %g\n", name, first, second)); \
+                rc = 1;                                                                          \
+            }                                                                                    \
+        }                                                                                        \
+    }
+
+/**
+   @ingroup MESSAGES
+
+   Check two fix size table fields
+
+   @param name field name
+   @param first first value
+   @param second second value
+*/
+#define CHECK_TAB(name, first, second)                                          \
+    if ((_fields & (1 << (++p))) && (memcpy (first, second, sizeof (first)))) { \
+        VERBOSE (morep, WARNING, PRINTF ("%s differed\n", name));               \
+        rc = 1;                                                                 \
+    }
+
+/**
+   @ingroup MESSAGES
+
+   Check two array fields
+
+   @param name field name
+   @param first first value
+   @param second second value
+*/
+#define CHECK_ARRAY(name, first, second)                              \
+    if (_fields & (1 << (++p))) {                                     \
+        if (first##_len != second##_len) {                            \
+            VERBOSE (morep, WARNING, PRINTF ("%s size differed %d / %d\n", name, first##_len, second##_len)); \
+            rc = 1;                                                   \
+        } else if (memcmp (first, second, first##_len)) {             \
+            VERBOSE (morep, WARNING, PRINTF ("%s differed\n", name)); \
+            rc = 1;                                                   \
+        }                                                             \
+    }
+
+/**
+   @ingroup MESSAGES
+
+   End of check section
+*/
+#define END_CHECK() \
+    return rc;
+
 /* private function (do not use outside) */
 
 int parse_int (char *val);
index 39162ee03ec9cd8f637319a885a90f788c17037a..90dd888393cbf5f9d66eada9311bf0e9eb021492 100644 (file)
@@ -50,4 +50,12 @@ int deserial_channel (uint8_t *buffer, int len, CHANNEL_t *out)
     END_DESERIAL ()
 }
 
+int check_channel (CHANNEL_t *first, CHANNEL_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_INT ("CHANNELID", first->channel_id, second->channel_id)
+    CHECK_INT ("KEYID", first->key_id, second->key_id)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index 3f15847d4a51d4b2359850dd1a40da0998c17c74..1d343563fb9adc9e0b417067bab17d43cdba08f1 100644 (file)
@@ -37,7 +37,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_channel (char *line, CHANNEL_t *out);
 
@@ -49,7 +49,7 @@ int parse_channel (char *line, CHANNEL_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_channel (CHANNEL_t *in, char *buffer, int maxlen);
 
@@ -73,10 +73,22 @@ int serial_channel (CHANNEL_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_channel (uint8_t *buffer, int len, CHANNEL_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two channel structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_channel (CHANNEL_t *first, CHANNEL_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __CHANNEL_H__ */
index 04f81b17ae2b3b1447ab8fab5d680e1e35952cbf..e8bdcde34d6d8a4b776a4ed13be354a553cce842 100644 (file)
@@ -58,4 +58,14 @@ int deserial_clear_data (uint8_t *buffer, int len, CLEAR_DATA_t *out)
     END_DESERIAL ()
 }
 
+int check_clear_data (CLEAR_DATA_t *first, CLEAR_DATA_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_INT ("CHANNELID", first->channel_id, second->channel_id)
+    CHECK_INT ("BYPASSLEN", first->bypass_len, second->bypass_len)
+    CHECK_ARRAY ("BYPASS", first->bypass, second->bypass)
+    CHECK_ARRAY ("DATA", first->data, second->data)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index 8aac51779b91fede96a0aeebe6f44d897bb6144f..906c2788f4e6b809825ddf7e87fecc382ce0b385 100644 (file)
@@ -40,7 +40,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_clear_data (char *line, CLEAR_DATA_t *out);
 
@@ -52,7 +52,7 @@ int parse_clear_data (char *line, CLEAR_DATA_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_clear_data (CLEAR_DATA_t *in, char *buffer, int maxlen);
 
@@ -76,10 +76,22 @@ int serial_clear_data (CLEAR_DATA_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_clear_data (uint8_t *buffer, int len, CLEAR_DATA_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two clear data structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_clear_data (CLEAR_DATA_t *first, CLEAR_DATA_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __CLEAR_DATA_H__ */
index 6220d03895459ba48e295c2e79566e12cab79004..3a5988a6190cfccdd74aaa9cf617f4bee05d5d80 100644 (file)
@@ -62,4 +62,15 @@ int deserial_encrypted_data (uint8_t *buffer, int len, ENCRYPTED_DATA_t *out)
     END_DESERIAL ()
 }
 
+int check_encrypted_data (ENCRYPTED_DATA_t *first, ENCRYPTED_DATA_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_INT ("CHANNELID", first->channel_id, second->channel_id)
+    CHECK_TAB ("IV", first->iv, second->iv)
+    CHECK_INT ("BYPASSLEN", first->bypass_len, second->bypass_len)
+    CHECK_ARRAY ("BYPASS", first->bypass, second->bypass)
+    CHECK_ARRAY ("DATA", first->data, second->data)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index 1cf841de418cbf0ff69e797f6921e3f166724036..a84d7944028c44a23a1f72842c4a92b5a9793e28 100644 (file)
@@ -41,7 +41,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_encrypted_data (char *line, ENCRYPTED_DATA_t *out);
 
@@ -53,7 +53,7 @@ int parse_encrypted_data (char *line, ENCRYPTED_DATA_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_encrypted_data (ENCRYPTED_DATA_t *in, char *buffer, int maxlen);
 
@@ -77,10 +77,22 @@ int serial_encrypted_data (ENCRYPTED_DATA_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_encrypted_data (uint8_t *buffer, int len, ENCRYPTED_DATA_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two encrypted data structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_encrypted_data (ENCRYPTED_DATA_t *first, ENCRYPTED_DATA_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __ENCRYPTED_DATA_H__ */
index d5089aa3fe124a7535c401c354765db094390594..5aa6d025d63e794127c67b85a0c334fe20a58044 100644 (file)
--- a/pdu_key.c
+++ b/pdu_key.c
@@ -22,7 +22,6 @@ int parse_key (char *line, KEY_t *out)
 {
     BEGIN_PARSE (line)
     PARSE_INT ("KEYID", out->key_id)
-    PARSE_INT ("KEYLEN", out->key_len)
     PARSE_ARRAY ("KEY", out->key)
     END_PARSE ()
 }
@@ -31,7 +30,6 @@ int format_key (KEY_t *in, char *buffer, int maxlen)
 {
     BEGIN_FORMAT (buffer, maxlen)
     FORMAT_INT ("KEYID", in->key_id)
-    FORMAT_INT ("KEYLEN", in->key_len)
     FORMAT_ARRAY ("KEY", in->key)
     END_FORMAT ()
 }
@@ -40,7 +38,6 @@ int serial_key (KEY_t *in, uint8_t *buffer, int maxlen)
 {
     BEGIN_SERIAL (buffer, maxlen)
     SERIAL_INT ("KEYID", in->key_id)
-    SERIAL_INT ("KEYLEN", in->key_len)
     SERIAL_ARRAY ("KEY", in->key)
     END_SERIAL ()
 }
@@ -49,9 +46,16 @@ int deserial_key (uint8_t *buffer, int len, KEY_t *out)
 {
     BEGIN_DESERIAL (buffer, len)
     DESERIAL_INT ("KEYID", out->key_id)
-    DESERIAL_INT ("KEYLEN", out->key_len)
     DESERIAL_ARRAY ("KEY", out->key)
     END_DESERIAL ()
 }
 
+int check_key (KEY_t *first, KEY_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_INT ("KEYID", first->key_id, second->key_id)
+    CHECK_ARRAY ("KEY", first->key, second->key)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index fb23468d247065691c1aaa149fc6075acc5f30c5..5f9e6ef32dcc34953e0c74187aa563cd7eba6614 100644 (file)
--- a/pdu_key.h
+++ b/pdu_key.h
@@ -38,7 +38,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_key (char *line, KEY_t *out);
 
@@ -50,7 +50,7 @@ int parse_key (char *line, KEY_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_key (KEY_t *in, char *buffer, int maxlen);
 
@@ -74,10 +74,22 @@ int serial_key (KEY_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_key (uint8_t *buffer, int len, KEY_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two key structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_key (KEY_t *first, KEY_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __KEY_H__ */
index 3e48ae2d7c55d6afc50376dd5ae8d7776a039afa..eccb4d2c223021291e8494d536ad95328c4f97eb 100644 (file)
@@ -54,4 +54,13 @@ int deserial_prng_param (uint8_t *buffer, int len, PRNG_PARAM_t *out)
     END_DESERIAL ()
 }
 
+int check_prng_param (PRNG_PARAM_t *first, PRNG_PARAM_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_INT ("PRNGID", first->prng_id, second->prng_id)
+    CHECK_INT ("SEQLEN", first->seq_len, second->seq_len)
+    CHECK_ARRAY ("SEED", first->seed, second->seed)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index 1799def9945785d78b86f9d4ab3450c31eb8f309..eddd3680a8d007d4129968ddcfa2fc0472608836 100644 (file)
@@ -39,7 +39,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_prng_param (char *line, PRNG_PARAM_t *out);
 
@@ -51,7 +51,7 @@ int parse_prng_param (char *line, PRNG_PARAM_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_prng_param (PRNG_PARAM_t *in, char *buffer, int maxlen);
 
@@ -75,10 +75,22 @@ int serial_prng_param (PRNG_PARAM_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_prng_param (uint8_t *buffer, int len, PRNG_PARAM_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two PRNG parameter structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_prng_param (PRNG_PARAM_t *first, PRNG_PARAM_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __PRNG_PARAM_H__ */
index 8a7878902f4b96a72f5a41238ac09535399aec3a..71d5869c92ad67c10033a4b249af898bab0b0972 100644 (file)
@@ -46,4 +46,11 @@ int deserial_raw_data (uint8_t *buffer, int len, RAW_DATA_t *out)
     END_DESERIAL ()
 }
 
+int check_raw_data (RAW_DATA_t *first, RAW_DATA_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_ARRAY ("DATA", first->data, second->data)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index cf525cd19554e61b5585abebbe0c52c5556f7cd4..13325ffae9aa57c064736c32e3c64c335973ab29 100644 (file)
@@ -37,7 +37,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_raw_data (char *line, RAW_DATA_t *out);
 
@@ -49,7 +49,7 @@ int parse_raw_data (char *line, RAW_DATA_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_raw_data (RAW_DATA_t *in, char *buffer, int maxlen);
 
@@ -73,10 +73,22 @@ int serial_raw_data (RAW_DATA_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_raw_data (uint8_t *buffer, int len, RAW_DATA_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two raw data structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_raw_data (RAW_DATA_t *first, RAW_DATA_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __RAW_DATA_H__ */
index ba17b23da4cb08b62fb5a495277b531d9eee8268..e9c0081fe1c140a60540444e45649878009607d3 100644 (file)
@@ -46,4 +46,11 @@ int deserial_status (uint8_t *buffer, int len, STATUS_t *out)
     END_DESERIAL ()
 }
 
+int check_status (STATUS_t *first, STATUS_t *second, int fields)
+{
+    BEGIN_CHECK (fields)
+    CHECK_INT ("STATUS", first->status, second->status)
+    END_CHECK ()
+}
+
 /* vim: set ts=4 sw=4 si et: */
index 218620f1b48700ad515cf93a7241398ed95c1fa5..d9129af53447229b4bdcf70df5c645db0d1d79ea 100644 (file)
@@ -36,7 +36,7 @@ typedef struct {
 
    @param line string to analyse
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int parse_status (char *line, STATUS_t *out);
 
@@ -48,7 +48,7 @@ int parse_status (char *line, STATUS_t *out);
    @param in input structure
    @param buffer output string
    @param maxlen buffer limit
-   @return 0 on success 
+   @return 0 on success
 */
 int format_status (STATUS_t *in, char *buffer, int maxlen);
 
@@ -72,10 +72,22 @@ int serial_status (STATUS_t *in, uint8_t *buffer, int maxlen);
    @param buffer network stream
    @param len buffer length
    @param out output structure
-   @return 0 on success 
+   @return 0 on success
 */
 int deserial_status (uint8_t *buffer, int len, STATUS_t *out);
 
+/**
+   @ingroup MESSAGES
+
+   Check two status structures field by field
+
+   @param first first structure
+   @param second second structure
+   @param fields field mask to be checked
+   @return 0 on success
+*/
+int check_status (STATUS_t *first, STATUS_t *second, int fields);
+
 __END_DECLS
 
 #endif /* __STATUS_H__ */
index 8fed1178a8d26f585b81bdd6005aa55bc77a4272..322635dd9b2b057c7b803b7a3c30ec1b9a34de97 100644 (file)
@@ -1,7 +1,7 @@
 # Bypass test script
 
 T:BYPASS BYPASS_CROSS_ASYNC DATA=@script-bypass.eth
-R:BYPASS BYPASS_CROSS_ASYNC
+R:BYPASS BYPASS_CROSS_ASYNC DATA=@script-bypass.eth
 
 T:BYPASS BYPASSED_CROSS_ASYNC DATA=@script-bypass.eth
 R:BYPASS BYPASSED_CROSS_ASYNC
index 942ce1fa7b84d84a1f18f7301ea6f85a2f1723c8..c36084dff77d39dcfbc63ae8d422b5be6817da87 100644 (file)
@@ -4,10 +4,10 @@ T:CONTROL STATUS_REQ
 R:CONTROL STATUS_REQ
 
 T:CONTROL STATUS_RESP STATUS=4
-R:CONTROL STATUS_RESP
+R:CONTROL STATUS_RESP STATUS=4
 
 T:CONTROL AUTHENTIFICATION_REQ DATA="This\ is\ an\ authentification\ phrase"
-R:CONTROL AUTHENTIFICATION_REQ
+R:CONTROL AUTHENTIFICATION_REQ DATA="This\ is\ an\ authentification\ phrase"
 
 T:CONTROL AUTHENTIFICATION_RESP DATA="Authentification\ completed"
 R:CONTROL AUTHENTIFICATION_RESP
diff --git a/script-cross_crypto-error.eth b/script-cross_crypto-error.eth
new file mode 100644 (file)
index 0000000..777b845
--- /dev/null
@@ -0,0 +1,13 @@
+# Cross crypto test script
+
+T:CROSS_CRYPTO ENCRYPT_CROSS_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-local_crypto.eth
+R:CROSS_CRYPTO ENCRYPT_CROSS_ASYNC CHANNELID=2 BYPASSLEN=3 BYPASS=11:22:33
+
+T:CROSS_CRYPTO ENCRYPTED_CROSS_ASYNC CHANNELID=9 BYPASSLEN=1 BYPASS=55 DATA=@script-local_crypto.eth
+R:CROSS_CRYPTO ENCRYPT_CROSS_ASYNC
+
+T:CROSS_CRYPTO DECRYPT_CROSS_ASYNC CHANNELID=5 BYPASSLEN=0 DATA=@script-local_crypto.eth
+R:CROSS_CRYPTO DECRYPT_CROSS_ASYNC DATA=@script-cross_crypto.eth
+
+T:CROSS_CRYPTO DECRYPTED_CROSS_ASYNC CHANNELID=0 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
+R:CROSS_CRYPTO DECRYPTED_CROSS_ASYNC CHANNELID=9
index 67b46ce6903fa35b049756eb8f88ba1f18c04506..63cc8e5ada5b0f4baea64672c64f17e12822876e 100644 (file)
@@ -1,13 +1,13 @@
 # Cross crypto test script
 
 T:CROSS_CRYPTO ENCRYPT_CROSS_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-local_crypto.eth
-R:CROSS_CRYPTO ENCRYPT_CROSS_ASYNC
+R:CROSS_CRYPTO ENCRYPT_CROSS_ASYNC CHANNELID=2 BYPASSLEN=4 BYPASS=11:22:33:44
 
 T:CROSS_CRYPTO ENCRYPTED_CROSS_ASYNC CHANNELID=9 BYPASSLEN=1 BYPASS=55 DATA=@script-local_crypto.eth
-R:CROSS_CRYPTO ENCRYPTED_CROSS_ASYNC
+R:CROSS_CRYPTO ENCRYPTED_CROSS_ASYNC BYPASSLEN=1 BYPASS=55
 
 T:CROSS_CRYPTO DECRYPT_CROSS_ASYNC CHANNELID=5 BYPASSLEN=0 DATA=@script-local_crypto.eth
-R:CROSS_CRYPTO DECRYPT_CROSS_ASYNC
+R:CROSS_CRYPTO DECRYPT_CROSS_ASYNC DATA=@script-local_crypto.eth
 
 T:CROSS_CRYPTO DECRYPTED_CROSS_ASYNC CHANNELID=0 BYPASSLEN=4 BYPASS=11:22:33:44 DATA=@script-cross_crypto.eth
 R:CROSS_CRYPTO DECRYPTED_CROSS_ASYNC
index 2e6a47da29700eba769910c8228f1d0aa6d14971..61b61fdd41a953e44351258669bbf7fbf9737922 100644 (file)
@@ -1,7 +1,7 @@
 # PRNG test script
 
 T:PRNG RANDOM_REQ PRNGID=0 SEQLEN=64 SEED=01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10
-R:PRNG RANDOM_REQ
+R:PRNG RANDOM_REQ PRNGID=0 SEQLEN=64 SEED=01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10
 
 T:PRNG RANDOM_RESP DATA=@script-prng.eth
 R:PRNG RANDOM_RESP
index d078eb31a15726acfb607848c013db811a3bb98f..848d04a0cdea66d876ac4408482de142f848e5c4 100644 (file)
@@ -1,10 +1,10 @@
 # Provisioning test script
 
 T:PROVISIONING LOAD_KEY_REQ KEYID=2 KEY=01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10
-R:PROVISIONING LOAD_KEY_REQ
+R:PROVISIONING LOAD_KEY_REQ KEYID=2 KEY=01:02:03:04:05:06:07:08:09:0A:0B:0C:0D:0E:0F:10
 
 T:PROVISIONING LOAD_KEY_RESP STATUS=0
-T:PROVISIONING LOAD_KEY_RESP
+R:PROVISIONING LOAD_KEY_RESP
 
 T:PROVISIONING UNLOAD_KEY_REQ KEYID=42
 R:PROVISIONING UNLOAD_KEY_REQ
@@ -19,7 +19,7 @@ T:PROVISIONING ERASE_KEY_RESP STATUS=0
 R:PROVISIONING ERASE_KEY_RESP
 
 T:PROVISIONING ASSOCIATE_CHANNEL_REQ CHANNELID=0 KEYID=2
-R:PROVISIONING ASSOCIATE_CHANNEL_REQ
+R:PROVISIONING ASSOCIATE_CHANNEL_REQ CHANNELID=0 KEYID=2
 
 T:PROVISIONING ASSOCIATE_CHANNEL_RESP STATUS=0
 R:PROVISIONING ASSOCIATE_CHANNEL_RESP