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.

Files at this revision

API Documentation at this revision

Comitter:
IanBenzMaxim
Date:
Wed Apr 20 20:13:33 2016 +0000
Parent:
4:71d578d3af22
Child:
6:b6bafd0a7013
Commit message:
Always give the user a chance to provision when an invalid sensor node is detected before retrying authentication.

Changed in this revision

OneWire.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/OneWire.lib	Wed Apr 20 09:49:25 2016 -0500
+++ b/OneWire.lib	Wed Apr 20 20:13:33 2016 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/Maxim-Integrated/code/OneWire/#43039aeca2ab
+https://developer.mbed.org/teams/Maxim-Integrated/code/OneWire/#08384e63ee40
--- 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: