Message signing logic now integrated into sendRoute()
This commit is contained in:
@@ -192,7 +192,33 @@ boolean MySensor::sendRoute(MyMessage &message) {
|
|||||||
(message.type != I_GET_NONCE && message.type != I_GET_NONCE_RESPONSE && message.type != I_REQUEST_SIGNING &&
|
(message.type != I_GET_NONCE && message.type != I_GET_NONCE_RESPONSE && message.type != I_REQUEST_SIGNING &&
|
||||||
message.type != I_ID_REQUEST && message.type != I_ID_RESPONSE &&
|
message.type != I_ID_REQUEST && message.type != I_ID_RESPONSE &&
|
||||||
message.type != I_FIND_PARENT && message.type != I_FIND_PARENT_RESPONSE))) {
|
message.type != I_FIND_PARENT && message.type != I_FIND_PARENT_RESPONSE))) {
|
||||||
if (!sign(message)) {
|
bool signOk = false;
|
||||||
|
// Send nonce-request
|
||||||
|
if (!sendRoute(build(tmpMsg, nc.nodeId, message.destination, message.sensor, C_INTERNAL, I_GET_NONCE, false).set(""))) {
|
||||||
|
debug(PSTR("nonce tr err\n"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// We have to wait for the nonce to arrive before we can sign our original message
|
||||||
|
// Other messages could come in-between. We trust process() takes care of them
|
||||||
|
unsigned long enter = hw_millis();
|
||||||
|
msgSign = message; // Copy the message to sign since message buffer might be touched in process()
|
||||||
|
while (hw_millis() - enter < MY_VERIFICATION_TIMEOUT_MS) {
|
||||||
|
if (process()) {
|
||||||
|
if (mGetCommand(getLastMessage()) == C_INTERNAL && getLastMessage().type == I_GET_NONCE_RESPONSE) {
|
||||||
|
// Proceed with signing if nonce has been received
|
||||||
|
if (signer.putNonce(getLastMessage()) && signer.signMsg(msgSign)) {
|
||||||
|
message = msgSign; // Write the signed message back
|
||||||
|
signOk = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hw_millis() - enter > MY_VERIFICATION_TIMEOUT_MS) {
|
||||||
|
debug(PSTR("nonce tmo\n"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!signOk) {
|
||||||
debug(PSTR("sign fail\n"));
|
debug(PSTR("sign fail\n"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -524,27 +550,3 @@ int8_t MySensor::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, ui
|
|||||||
return hw.sleep(interrupt1, mode1, interrupt2, mode2, ms) ;
|
return hw.sleep(interrupt1, mode1, interrupt2, mode2, ms) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MySensor::sign(MyMessage &message) {
|
|
||||||
if (!sendRoute(build(tmpMsg, nc.nodeId, message.destination, message.sensor, C_INTERNAL, I_GET_NONCE, false).set(""))) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
// We have to wait for the nonce to arrive before we can sign our original message
|
|
||||||
// Other messages could come in-between. We trust process() takes care of them
|
|
||||||
unsigned long enter = hw_millis();
|
|
||||||
msgSign = message; // Copy the message to sign since message buffer might be touched in process()
|
|
||||||
while (hw_millis() - enter < 5000) {
|
|
||||||
if (process()) {
|
|
||||||
if (mGetCommand(getLastMessage()) == C_INTERNAL && getLastMessage().type == I_GET_NONCE_RESPONSE) {
|
|
||||||
// Proceed with signing if nonce has been received
|
|
||||||
if (signer.putNonce(getLastMessage()) && signer.signMsg(msgSign)) {
|
|
||||||
message = msgSign; // Write the signed message back
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -257,7 +257,6 @@ class MySensor
|
|||||||
void setupNode();
|
void setupNode();
|
||||||
void findParentNode();
|
void findParentNode();
|
||||||
uint8_t crc8Message(MyMessage &message);
|
uint8_t crc8Message(MyMessage &message);
|
||||||
bool sign(MyMessage &message);
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user