MAXREFDES143#: DeepCover Embedded Security in IoT Authenticated Sensing & Notification
Dependencies: MaximInterface mbed
The MAXREFDES143# is an Internet of Things (IoT) embedded security reference design, built to protect an industrial sensing node by means of authentication and notification to a web server. The hardware includes a peripheral module representing a protected sensor node monitoring operating temperature and remaining life of a filter (simulated through ambient light sensing) and an mbed shield representing a controller node responsible for monitoring one or more sensor nodes. The design is hierarchical with each controller node communicating data from connected sensor nodes to a web server that maintains a centralized log and dispatches notifications as necessary. The mbed shield contains a Wi-Fi module, a DS2465 coprocessor with 1-Wire® master function, an LCD, LEDs, and pushbuttons. The protected sensor node contains a DS28E15 authenticator, a DS7505 temperature sensor, and a MAX44009 light sensor. The mbed shield communicates to a web server by the onboard Wi-Fi module and to the protected sensor node with I2C and 1-Wire. The MAXREFDES143# is equipped with a standard shield connector for immediate testing using an mbed board such as the MAX32600MBED#. The simplicity of this design enables rapid integration into any star-topology IoT network requiring the heightened security with low overhead provided by the SHA-256 symmetric-key algorithm.
More information about the MAXREFDES143# is available on the Maxim Integrated website.
Diff: main.cpp
- Revision:
- 5:63232ef22abe
- Parent:
- 4:71d578d3af22
- Child:
- 6:b6bafd0a7013
--- a/main.cpp Wed Apr 20 09:49:25 2016 -0500 +++ b/main.cpp Wed Apr 20 20:13:33 2016 +0000 @@ -95,6 +95,7 @@ static bool result = false; static std::uint8_t consecutiveWebPostErrors = 0; ///< Account for a few network errors in case of flaky connection. static Timer webPostTimer; ///< Software timer to track web posting interval. +static Timer retryTimer; ///< Software timer to track authentication retries. static void blinkLeds(unsigned int time_ms); ///< Invert LEDs for a given amount of time. static bool buttonPressed(DigitalIn & button); ///< Checks if button is pressed (returns true) and waits for release. @@ -300,36 +301,45 @@ break; case SensorNodeNotAuthentic: - // Wait for user to press Provision button - if (buttonPressed(provisionButton)) + // Wait for some time before retrying authentication + retryTimer.reset(); + retryTimer.start(); + do { - nextStatus = ProvisioningSensorNode; - } - // Try to authenticate and return to normal operation - else if (webPostTimer.read_ms() >= webPostIntervalMs) - { - // Send event message to server - result = webIntf.authPostHttpEvent(ds2465, InvalidSensorEvent, "", !useInvalidSecret); - if (result) + // Wait for user to press Provision button + if (buttonPressed(provisionButton)) + { + nextStatus = ProvisioningSensorNode; + break; + } + // Try to authenticate and return to normal operation + else if (webPostTimer.read_ms() >= webPostIntervalMs) { - // Reset timer count after logging complete - webPostTimer.reset(); - consecutiveWebPostErrors = 0; + // Send event message to server + result = webIntf.authPostHttpEvent(ds2465, InvalidSensorEvent, "", !useInvalidSecret); + if (result) + { + // Reset timer count after logging complete + webPostTimer.reset(); + consecutiveWebPostErrors = 0; + + // Try to authenticate again + nextStatus = SensorNodeNeedsDetection; + } + else if (++consecutiveWebPostErrors < maxConsecutiveWebPostErrors) + { + // There was likely an error establishing a web connection + // Wait and try again + wait_ms(webPostRetryIntervalMs); + } + else + { + nextStatus = ControllerHardwareError; + break; + } } - else if (++consecutiveWebPostErrors < maxConsecutiveWebPostErrors) - { - // There was likely an error establishing a web connection - // Wait and try again - wait_ms(webPostRetryIntervalMs); - } - else - { - nextStatus = ControllerHardwareError; - } - - // Try to authenticate again - nextStatus = SensorNodeNeedsDetection; - } + } while (retryTimer.read_ms() < webPostIntervalMs); + retryTimer.stop(); break; case ControllerInitializationError: