[IOT-2387][IOT-2479] Fix RESET behavior 13/21913/5
authorNathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
Tue, 15 Aug 2017 08:02:28 +0000 (01:02 -0700)
committerRandeep Singh <randeep.s@samsung.com>
Tue, 5 Sep 2017 10:55:17 +0000 (10:55 +0000)
This fixes the Device Onboarding State logic, but still omits the
ResetSecureResources() call because it's causing a crash.

That issue is being tracked separately in IOT-2633, and can
be fixed in a separate patch.

Change-Id: Iebeafc1cfb34a9c009ec4d59e4c74838838c950d
Signed-off-by: Nathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/21913
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Mushfiqul Islam <i.mushfiq@samsung.com>
Reviewed-by: Randeep Singh <randeep.s@samsung.com>
resource/csdk/security/include/internal/resourcemanager.h
resource/csdk/security/src/deviceonboardingstate.c
resource/csdk/security/src/pstatresource.c
resource/csdk/security/src/resourcemanager.c

index c0bb611..0b33411 100644 (file)
@@ -43,6 +43,15 @@ OCStackResult InitSecureResources();
  */
 OCStackResult DestroySecureResources();
 
+/**
+ * Reset SVRs to backup values kept in persistent storage.  These backup values
+ * were created at first device boot, and should be a copy of the values
+ * configured by the mfr in the initial persistent storage data file.
+ *
+ * @return ::OC_STACK_OK for Success, otherwise some error value
+ */
+OCStackResult ResetSecureResources();
+
 /**
  * This method is used by all secure resource modules to send responses to REST queries.
  *
index c0c4ea6..11d6a50 100644 (file)
@@ -31,6 +31,7 @@
 #endif /* (__WITH_DTLS__) || (__WITH_TLS__) */
 #include "doxmresource.h"
 #include "pstatresource.h"
+#include "resourcemanager.h"
 
 #define TAG "OIC_SRM_DOS"
 
@@ -154,7 +155,7 @@ static bool IsReadyToEnterRFOTM()
 
     // Verify doxm.devowneruuid == nil UUID.
     VERIFY_SUCCESS(TAG, OC_STACK_OK == GetDoxmDevOwnerId(&tempUuid), ERROR);
-    VERIFY_TRUE_OR_EXIT(TAG, !IsNilUuid(&tempUuid), WARNING);
+    VERIFY_TRUE_OR_EXIT(TAG, IsNilUuid(&tempUuid), WARNING);
 
     // Check and log whether doxm.deviceuuid == nil UUID ("may" reqt not "shall")
     VERIFY_SUCCESS(TAG, OC_STACK_OK == GetDoxmDeviceID(&tempUuid), ERROR);
@@ -380,12 +381,11 @@ static bool EnterRESET()
     bool ret = false;
 
     // Restore Mfr Defaults
-    // TODO [IOT-2023]: we need OSWG Security TG to decide on how "mfr defaults"
-    // should really work.  Hard coded SVRs?  Backup .dat file?  Hard coded
-    // policy without SVRs?  IMO this is *highly* platform and mfr process
-    // dependent and probably isn't worth investing the time to create an
-    // IoTivity "backup/restore" capability.  Instead the need to do so should
-    // be documented in the device vendor certification paperwork, per BZ 1383.
+    // "Mfr Defaults" is defined by manufacturer.  It could be "failsafe"
+    // SVRs (e.g. the hard-coded SVRs in IoTivity) or it could be a backup
+    // copy of the initally-provisioned SVRs (e.g. the ResetSecureResourceInPS
+    // function in IoTivity).
+    // TODO [IOT-2633]: VERIFY_SUCCESS(TAG, OC_STACK_OK == ResetSecureResources(), ERROR);
 
     // Set doxm.deviceuuid = Mfr Default (handled above)
     // Set doxm.sct = Mfr Default ("")
@@ -402,7 +402,6 @@ static bool EnterRESET()
 
     // Set acl, doxm, cred and pstat rowneruuids = Nil UUID
     VERIFY_SUCCESS(TAG, OC_STACK_OK == SetAclRownerId(&THE_NIL_UUID), ERROR);
-    VERIFY_SUCCESS(TAG, OC_STACK_OK == SetCredRownerId(&THE_NIL_UUID), ERROR);
     VERIFY_SUCCESS(TAG, OC_STACK_OK == SetDoxmRownerId(&THE_NIL_UUID), ERROR);
     VERIFY_SUCCESS(TAG, OC_STACK_OK == SetPstatRownerId(&THE_NIL_UUID), ERROR);
 
@@ -414,6 +413,8 @@ static bool EnterRESET()
         EnterStateGeneric(false, true, false, false, true, DOS_RESET),
         ERROR);
 
+    ret = true;
+
 exit:
     OIC_LOG_V(DEBUG, TAG, "%s: returning %s.", __func__, ret?"true":"false");
     return ret;
@@ -459,7 +460,22 @@ static OCStackResult DoStateChange(OicSecDeviceOnboardingState_t newState)
         // No preconditions other than setting dos.p = true, which is done above
         if (EnterRESET())
         {
-            ret = OC_STACK_OK;
+            // if RESET succeeds, immediately enter RFOTM
+            if (IsReadyToEnterRFOTM())
+            {
+                if (EnterRFOTM())
+                {
+                    ret = OC_STACK_OK;
+                }
+                else
+                {
+                    ret = OC_STACK_INTERNAL_SERVER_ERROR;
+                }
+            }
+            else
+            {
+                ret = OC_STACK_FORBIDDEN_REQ;
+            }
         }
         else
         {
@@ -615,8 +631,6 @@ OCStackResult SetDosState(const OicSecDeviceOnboardingState_t desiredState)
         ret = OC_STACK_FORBIDDEN_REQ;
     }
 
-    // TODO [IOT-2023] implement RESET->RFOTM change once supported by prov tool
-
     // TODO [IOT-2023] if OC_STACK_OK, update all SVRs in Persistent Storage?
 
     return ret;
index bd30fb0..5cd1bd7 100644 (file)
@@ -885,23 +885,6 @@ static OCEntityHandlerResult HandlePstatPostRequest(OCEntityHandlerRequest *ehRe
             {
                 ehRet = OC_EH_OK;
             }
-            if (true == (pstat->cm & RESET))
-            {
-                if (OC_STACK_OK != SendSRMResponse(ehRequest, ehRet, NULL, 0))
-                {
-                    ehRet = OC_EH_ERROR;
-                    OIC_LOG_V(ERROR, TAG, "%s: SendSRMResponse failed.", __func__);
-                    DeletePstatBinData(pstat);
-                    return ehRet;
-                }
-                ret = ResetSecureResourceInPS();
-                if (OC_STACK_OK == ret)
-                {
-                    ehRet = OC_EH_OK;
-                }
-                DeletePstatBinData(pstat);
-                return ehRet;
-            }
         }
     }
 
index c35ce0b..a822378 100644 (file)
@@ -29,6 +29,7 @@
 #include "oic_string.h"
 #include "logger.h"
 #include "utlist.h"
+#include "psinterface.h"
 
 //#ifdef DIRECT_PAIRING
 #include "pconfresource.h"
@@ -134,6 +135,8 @@ OCStackResult InitSecureResources( )
 
 OCStackResult DestroySecureResources( )
 {
+    OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
+
     DeInitACLResource();
     DeInitCredResource();
     DeInitDoxmResource();
@@ -149,5 +152,39 @@ OCStackResult DestroySecureResources( )
     DeInitDpairingResource();
 //#endif // DIRECT_PAIRING
 
+    OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__);
+
     return OC_STACK_OK;
 }
+
+OCStackResult ResetSecureResources()
+{
+    OCStackResult ret = OC_STACK_ERROR;
+
+    ret = DestroySecureResources();
+
+    if (OC_STACK_OK == ret)
+    {
+        ret = InitSecureResources();
+    }
+
+    if (OC_STACK_OK == ret)
+    {
+        ret = ResetSecureResourceInPS();
+    }
+
+    if (OC_STACK_OK != ret)
+    {
+        OIC_LOG_V(ERROR, TAG, "%s: resetting device to mfr defaults failed!",
+            __func__);
+        // TODO: vendor may wish to fall back to hard-coded defaults
+        // if the persistent storage backup values cannot be restored.
+        // However in this case, vendor should ensure hard-coded
+        // defaults match intended settings, especially the supported
+        // OTMs default in /doxm resource.  IoTivity for example disables
+        // JustWorks OTM in hard-coded defaults, which may not be suitable
+        // to some devices.
+    }
+
+    return ret;
+}