Slim down dummy signing driver.
This commit is contained in:
@@ -36,51 +36,17 @@ static void DEBUG_DUMMY_PRINTBUF(char* str, uint8_t* buf, uint8_t sz)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
MySigningDriverDummy::MySigningDriverDummy() : MySigningDriver() {
|
MySigningDriverDummy::MySigningDriverDummy() : MySigningDriver() {
|
||||||
verification_ongoing = false;
|
|
||||||
current_nonce = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MySigningDriverDummy::getNonce(MyMessage &msg) {
|
bool MySigningDriverDummy::getNonce(MyMessage &msg) {
|
||||||
uint8_t nonce_buf[2];
|
|
||||||
nonce_buf[0] = SIGNING_IDENTIFIER;
|
|
||||||
// This is normally a buffer but for our minimal driver we use a single byte
|
|
||||||
// We at least use a new nonce for every session
|
|
||||||
nonce_buf[1] = ++current_nonce;
|
|
||||||
msg.set(nonce_buf, 2);
|
|
||||||
verification_ongoing = true;
|
|
||||||
timestamp = millis(); // Set timestamp to determine when to purge nonce
|
|
||||||
// Be a little fancy to handle turnover (prolong the time allowed to timeout after turnover)
|
|
||||||
// Note that if message is "too" quick, and arrives before turnover, it will be rejected
|
|
||||||
// but this is consider such a rare case that it is accepted and rejects are 'safe'
|
|
||||||
if (timestamp + VERIFICATION_TIMEOUT_MS < millis()) timestamp = 0;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MySigningDriverDummy::checkTimer() {
|
bool MySigningDriverDummy::checkTimer() {
|
||||||
if (verification_ongoing) {
|
|
||||||
if (millis() < timestamp || millis() > timestamp + VERIFICATION_TIMEOUT_MS) {
|
|
||||||
DEBUG_DUMMY_PRINTLN("Verification timeout");
|
|
||||||
// Purge nonce
|
|
||||||
current_nonce = 0; // purge nonce when used
|
|
||||||
verification_ongoing = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MySigningDriverDummy::putNonce(MyMessage &msg) {
|
bool MySigningDriverDummy::putNonce(MyMessage &msg) {
|
||||||
if (mGetLength(msg) != 2) {
|
|
||||||
DEBUG_DUMMY_PRINTLN("Incoming nonce with incorrect size");
|
|
||||||
return false; // We require a signing identifier and a 1byte nonce
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((uint8_t*)msg.getCustom())[0] != SIGNING_IDENTIFIER) {
|
|
||||||
DEBUG_DUMMY_PRINTLN("Incorrect signing identifier");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_nonce = ((uint8_t*)msg.getCustom())[1];
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,54 +56,15 @@ bool MySigningDriverDummy::signMsg(MyMessage &msg) {
|
|||||||
DEBUG_DUMMY_PRINTLN("Cannot fit any signature to this message");
|
DEBUG_DUMMY_PRINTLN("Cannot fit any signature to this message");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate signature of message
|
|
||||||
mSetSigned(msg, 1); // make sure signing flag is set before signature is calculated
|
mSetSigned(msg, 1); // make sure signing flag is set before signature is calculated
|
||||||
DEBUG_DUMMY_PRINTBUF("Message to sign:", (uint8_t*)&msg.data[1-HEADER_SIZE], MAX_MESSAGE_LENGTH-1-(MAX_PAYLOAD-mGetLength(msg)));
|
|
||||||
uint8_t signature = msg.data[0] ^ current_nonce;
|
|
||||||
msg.data[mGetLength(msg)] = SIGNING_IDENTIFIER; // Add signing identifier
|
msg.data[mGetLength(msg)] = SIGNING_IDENTIFIER; // Add signing identifier
|
||||||
msg.data[mGetLength(msg)+1] = signature;
|
|
||||||
current_nonce = 0; // purge nonce when used
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MySigningDriverDummy::verifyMsg(MyMessage &msg) {
|
bool MySigningDriverDummy::verifyMsg(MyMessage &msg) {
|
||||||
if (!verification_ongoing) {
|
if (msg.data[mGetLength(msg)] != SIGNING_IDENTIFIER)
|
||||||
DEBUG_DUMMY_PRINTLN("No active verification session");
|
return false;
|
||||||
return false;
|
else
|
||||||
} else {
|
return true;
|
||||||
// Make sure we have not expired
|
|
||||||
if (!checkTimer()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
verification_ongoing = false;
|
|
||||||
|
|
||||||
if (msg.data[mGetLength(msg)] != SIGNING_IDENTIFIER) {
|
|
||||||
DEBUG_DUMMY_PRINTLN("Incorrect signing identifier");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG_DUMMY_PRINTBUF("Message to verify:", (uint8_t*)&msg.data[1-HEADER_SIZE], MAX_MESSAGE_LENGTH-1-(MAX_PAYLOAD-mGetLength(msg)));
|
|
||||||
DEBUG_DUMMY_PRINTBUF("Signature in message:", (uint8_t*)&msg.data[mGetLength(msg)], 2);
|
|
||||||
|
|
||||||
// The dummy signing is the nonce XOR the first payload byte,
|
|
||||||
// so we "verify" by redoing that calculation with the nonce we transmitted
|
|
||||||
// Message without a payload this implementation always accepts as signed and messages that cannot
|
|
||||||
// fit a signature are also accepted as signed
|
|
||||||
if (mGetLength(msg) && mGetLength(msg) < MAX_PAYLOAD-2) {
|
|
||||||
uint8_t signature = msg.data[0] ^ current_nonce;
|
|
||||||
if (msg.data[mGetLength(msg)+1] != signature) {
|
|
||||||
DEBUG_DUMMY_PRINTBUF("Signature bad. Calculated signature:", &signature, 1);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
DEBUG_DUMMY_PRINTLN("Signature ok");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DEBUG_DUMMY_PRINTLN("No signature in message");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -10,11 +10,8 @@
|
|||||||
#include "MySigningDriver.h"
|
#include "MySigningDriver.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// The dummy signing driver implements the most rudimentary form of signing
|
// The dummy signing driver that can be used for nodes
|
||||||
// No pre-shared key is used, nonce is simply incremeted each turn and signature
|
// not requiring signing
|
||||||
// is only calculated on the fist byte using data XOR nonce.
|
|
||||||
// This driver is intended for library debugging and sensor network integrity
|
|
||||||
// verification (signed messages will force the radio to transmit all 32 bytes of data).
|
|
||||||
// It does check SIGNING_IDENTIFIER byte to avoid illegal mixing of signing back-ends in
|
// It does check SIGNING_IDENTIFIER byte to avoid illegal mixing of signing back-ends in
|
||||||
// the network (as seen by this node) and it does verify proper execution order on the API.
|
// the network (as seen by this node) and it does verify proper execution order on the API.
|
||||||
// The dummy driver rejects all other back-ends.
|
// The dummy driver rejects all other back-ends.
|
||||||
@@ -27,10 +24,6 @@ public:
|
|||||||
bool putNonce(MyMessage &msg);
|
bool putNonce(MyMessage &msg);
|
||||||
bool signMsg(MyMessage &msg);
|
bool signMsg(MyMessage &msg);
|
||||||
bool verifyMsg(MyMessage &msg);
|
bool verifyMsg(MyMessage &msg);
|
||||||
private:
|
|
||||||
unsigned long timestamp;
|
|
||||||
bool verification_ongoing;
|
|
||||||
uint8_t current_nonce;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user