From bc4c8355d7e2dbbf782b18569faaba5ae8469ce6 Mon Sep 17 00:00:00 2001 From: Mazet Laurent Date: Wed, 9 Apr 2025 01:45:52 +0200 Subject: [PATCH] add received pdu checks --- morep.c | 2 +- morep_simulator.c | 131 ++++++++++++++++++++++------------ morep_valid.c | 4 +- parse.h | 122 ++++++++++++++++++++++++++++--- pdu_channel.c | 8 +++ pdu_channel.h | 18 ++++- pdu_clear_data.c | 10 +++ pdu_clear_data.h | 18 ++++- pdu_encrypted_data.c | 11 +++ pdu_encrypted_data.h | 18 ++++- pdu_key.c | 12 ++-- pdu_key.h | 18 ++++- pdu_prng_param.c | 9 +++ pdu_prng_param.h | 18 ++++- pdu_raw_data.c | 7 ++ pdu_raw_data.h | 18 ++++- pdu_status.c | 7 ++ pdu_status.h | 18 ++++- script-bypass.eth | 2 +- script-control.eth | 4 +- script-cross_crypto-error.eth | 13 ++++ script-cross_crypto.eth | 6 +- script-prng.eth | 2 +- script-provisioning.eth | 6 +- 24 files changed, 389 insertions(+), 93 deletions(-) create mode 100644 script-cross_crypto-error.eth diff --git a/morep.c b/morep.c index b011b2c..129e339 100644 --- 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) { diff --git a/morep_simulator.c b/morep_simulator.c index 9af6421..b4ff433 100644 --- a/morep_simulator.c +++ b/morep_simulator.c @@ -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 */ diff --git a/morep_valid.c b/morep_valid.c index bcff512..ced7eca 100644 --- a/morep_valid.c +++ b/morep_valid.c @@ -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 67747b5..396a228 100644 --- 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); diff --git a/pdu_channel.c b/pdu_channel.c index 39162ee..90dd888 100644 --- a/pdu_channel.c +++ b/pdu_channel.c @@ -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: */ diff --git a/pdu_channel.h b/pdu_channel.h index 3f15847..1d34356 100644 --- a/pdu_channel.h +++ b/pdu_channel.h @@ -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__ */ diff --git a/pdu_clear_data.c b/pdu_clear_data.c index 04f81b1..e8bdcde 100644 --- a/pdu_clear_data.c +++ b/pdu_clear_data.c @@ -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: */ diff --git a/pdu_clear_data.h b/pdu_clear_data.h index 8aac517..906c278 100644 --- a/pdu_clear_data.h +++ b/pdu_clear_data.h @@ -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__ */ diff --git a/pdu_encrypted_data.c b/pdu_encrypted_data.c index 6220d03..3a5988a 100644 --- a/pdu_encrypted_data.c +++ b/pdu_encrypted_data.c @@ -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: */ diff --git a/pdu_encrypted_data.h b/pdu_encrypted_data.h index 1cf841d..a84d794 100644 --- a/pdu_encrypted_data.h +++ b/pdu_encrypted_data.h @@ -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__ */ diff --git a/pdu_key.c b/pdu_key.c index d5089aa..5aa6d02 100644 --- 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: */ diff --git a/pdu_key.h b/pdu_key.h index fb23468..5f9e6ef 100644 --- 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__ */ diff --git a/pdu_prng_param.c b/pdu_prng_param.c index 3e48ae2..eccb4d2 100644 --- a/pdu_prng_param.c +++ b/pdu_prng_param.c @@ -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: */ diff --git a/pdu_prng_param.h b/pdu_prng_param.h index 1799def..eddd368 100644 --- a/pdu_prng_param.h +++ b/pdu_prng_param.h @@ -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__ */ diff --git a/pdu_raw_data.c b/pdu_raw_data.c index 8a78789..71d5869 100644 --- a/pdu_raw_data.c +++ b/pdu_raw_data.c @@ -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: */ diff --git a/pdu_raw_data.h b/pdu_raw_data.h index cf525cd..13325ff 100644 --- a/pdu_raw_data.h +++ b/pdu_raw_data.h @@ -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__ */ diff --git a/pdu_status.c b/pdu_status.c index ba17b23..e9c0081 100644 --- a/pdu_status.c +++ b/pdu_status.c @@ -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: */ diff --git a/pdu_status.h b/pdu_status.h index 218620f..d9129af 100644 --- a/pdu_status.h +++ b/pdu_status.h @@ -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__ */ diff --git a/script-bypass.eth b/script-bypass.eth index 8fed117..322635d 100644 --- a/script-bypass.eth +++ b/script-bypass.eth @@ -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 diff --git a/script-control.eth b/script-control.eth index 942ce1f..c36084d 100644 --- a/script-control.eth +++ b/script-control.eth @@ -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 index 0000000..777b845 --- /dev/null +++ b/script-cross_crypto-error.eth @@ -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 diff --git a/script-cross_crypto.eth b/script-cross_crypto.eth index 67b46ce..63cc8e5 100644 --- a/script-cross_crypto.eth +++ b/script-cross_crypto.eth @@ -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 diff --git a/script-prng.eth b/script-prng.eth index 2e6a47d..61b61fd 100644 --- a/script-prng.eth +++ b/script-prng.eth @@ -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 diff --git a/script-provisioning.eth b/script-provisioning.eth index d078eb3..848d04a 100644 --- a/script-provisioning.eth +++ b/script-provisioning.eth @@ -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 -- 2.30.2