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.

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: