{
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) {
{"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},
}
}
- /* 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;
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));
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++) {
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 */
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");
/* 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 */
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;
}
__BEGIN_DECLS
+#define TOLERANCE 1e-5
+
/**
@ingroup MESSAGES
@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
@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; \
}
/**
@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; \
}
/**
@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; \
}
#define END_PARSE() \
else { \
VERBOSE (morep, WARNING, PRINTF ("can't understand '%s'\n", var)); \
- rc = -1; \
+ rc = -1; \
break; \
} \
} \
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);
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: */
@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);
@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);
@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__ */
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: */
@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);
@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);
@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__ */
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: */
@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);
@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);
@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__ */
{
BEGIN_PARSE (line)
PARSE_INT ("KEYID", out->key_id)
- PARSE_INT ("KEYLEN", out->key_len)
PARSE_ARRAY ("KEY", out->key)
END_PARSE ()
}
{
BEGIN_FORMAT (buffer, maxlen)
FORMAT_INT ("KEYID", in->key_id)
- FORMAT_INT ("KEYLEN", in->key_len)
FORMAT_ARRAY ("KEY", in->key)
END_FORMAT ()
}
{
BEGIN_SERIAL (buffer, maxlen)
SERIAL_INT ("KEYID", in->key_id)
- SERIAL_INT ("KEYLEN", in->key_len)
SERIAL_ARRAY ("KEY", in->key)
END_SERIAL ()
}
{
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: */
@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);
@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);
@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__ */
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: */
@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);
@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);
@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__ */
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: */
@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);
@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);
@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__ */
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: */
@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);
@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);
@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__ */
# 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
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
--- /dev/null
+# 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
# 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
# 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
# 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
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