[IOT-2930] Device Config Resources 87/24287/5
authorNathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
Mon, 5 Mar 2018 21:51:43 +0000 (13:51 -0800)
committerAleksey Volkov <a.volkov@samsung.com>
Fri, 9 Mar 2018 11:18:51 +0000 (11:18 +0000)
Adds functions to determine if a request is for a DCR; denies
requests for NCRs outside of RFNOP.

Note: the SRMIsSecurityVirtualResourceURI() function is not new, but
moved from secureresourcemanager.h to srmutility.h as it is used in
more than one SRM source file now.

Change-Id: I98c707fc6dcf46e903f6adf1c0485d4484f7a1a9
Signed-off-by: Nathan Heldt-Sheller <nathan.heldt-sheller@intel.com>
resource/csdk/security/include/internal/secureresourcemanager.h
resource/csdk/security/include/srmutility.h
resource/csdk/security/src/policyengine.c
resource/csdk/security/src/secureresourcemanager.c
resource/csdk/security/src/srmutility.c
resource/csdk/stack/src/ocresource.c
resource/csdk/stack/src/ocstack.c

index 63133e8..b67ad71 100644 (file)
@@ -114,14 +114,6 @@ void SRMDeInitSecureResources();
  */
 typedef bool (*SPResponseCallback) (const CAEndpoint_t *object,
                                     const CAResponseInfo_t *responseInfo);
-
-/**
- * Check the security resource URI.
- * @param uri Pointers to security resource URI.
- * @return true if the URI is one of security resources, otherwise false.
- */
-bool SRMIsSecurityResourceURI(const char* uri);
-
 /**
  * Get the resource type from the URI.
  * @param   uri [IN] Pointers to security resource URI.
index aa833a2..0bf3857 100644 (file)
@@ -59,8 +59,10 @@ struct OicParseQueryIter
  * eg: VERIFY_SUCCESS(TAG, OC_STACK_OK == foo(), ERROR);
  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
  */
+#ifndef VERIFY_SUCCESS
 #define VERIFY_SUCCESS(tag, op, logLevel) do{ if (!(op)) \
             {OIC_LOG((logLevel), tag, #op " failed!!"); goto exit; } }while(0)
+#endif
 
 /**
  * Macro to verify a conditional, if fails, log supplied message and goto exit
@@ -75,31 +77,39 @@ struct OicParseQueryIter
  * eg: VERIFY_TRUE_OR_EXIT(TAG, OC_STACK_OK == foo(), ERROR);
  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
  */
+#ifndef VERIFY_TRUE_OR_EXIT
 #define VERIFY_TRUE_OR_EXIT(tag, op, logLevel) do{ if (!(op)) \
             {OIC_LOG_V((logLevel), tag, "%s:" #op "evaluates to false!",__func__); \
             goto exit; } }while(0)
+#endif
 
 /**
  * Macro to verify success of operation.
  * eg: VERIFY_SUCCESS_RETURN(TAG, OC_STACK_OK == foo(), ERROR, OC_STACK_ERROR);
  */
+#ifndef VERIFY_SUCCESS_RETURN
 #define VERIFY_SUCCESS_RETURN(tag, op, logLevel, retValue) do { if (!(op)) \
             {OIC_LOG((logLevel), tag, #op " failed!!"); return retValue;} } while(0)
+#endif
 
 /**
  * Macro to verify argument is not equal to NULL.
  * eg: VERIFY_NOT_NULL(TAG, ptrData, ERROR);
  * @note Invoking function must define "exit:" label for goto functionality to work correctly.
  */
+#ifndef VERIFY_NOT_NULL
 #define VERIFY_NOT_NULL(tag, arg, logLevel) do{ if (NULL == (arg)) \
             { OIC_LOG((logLevel), tag, #arg " is NULL"); goto exit; } }while(0)
+#endif
 
 /**
  * Macro to verify argument is not equal to NULL.
  * eg: VERIFY_NOT_NULL_RETURN(TAG, ptrData, ERROR, OC_STACK_ERROR);
  */
+#ifndef VERIFY_NOT_NULL_RETURN
 #define VERIFY_NOT_NULL_RETURN(tag, arg, logLevel, retValue) do { if (NULL == (arg)) \
             { OIC_LOG((logLevel), tag, #arg " is NULL"); return retValue; } } while(0)
+#endif
 
 /**
  * Macro to log an mbedtls error
@@ -161,6 +171,14 @@ OCStackResult ConvertUuidToStr(const OicUuid_t* uuid, char** strUuid);
  */
 OCStackResult OC_CALL ConvertStrToUuid(const char* strUuid, OicUuid_t* uuid);
 
+/**
+ * Is the URI for a Device Configuration Resource as defined
+ * by Security Specification.
+ *
+ * @return true IFF the uri is for a DCR
+ */
+bool IsDeviceConfigurationResourceUri(const char *uri);
+
 /**
  * Compares two OicUuid_t structs.
  *
@@ -190,6 +208,14 @@ bool IsNilUuid(const OicUuid_t *uuid);
 OCStackResult OC_CALL SetDeviceIdSeed(const uint8_t* seed, size_t seedSize);
 #endif
 
+/**
+ * Is the URI for a Security Virtual Resource as defined
+ * by Security Specification.
+ *
+ * @return true IFF the uri is for a SVR
+ */
+bool SRMIsSecurityResourceURI(const char* uri);
+
 /**
  * Log OicUuid_t structs.
  */
index 20c6cde..3c3b701 100644 (file)
@@ -775,8 +775,17 @@ void CheckPermission(SRMRequestContext_t *context)
     OicSecDostype_t dos;
     VERIFY_SUCCESS(TAG, OC_STACK_OK == GetDos(&dos), ERROR);
 
+    // As of Bangkok Security Specification, only the Device Configuration
+    // Resources are accessible outside of RFNOP
+    if ((DOS_RFNOP != dos.state) &&
+        (!IsDeviceConfigurationResourceUri(context->resourceUri)))
+    {
+        OIC_LOG_V(WARNING, TAG, "%s: denying request for any NCR when device is not"
+            " in RFNOP state!", __func__);
+        context->responseVal = ACCESS_DENIED;
+    }
     // Test for implicit access.
-    if (IsRequestFromDevOwner(context) &&
+    else if (IsRequestFromDevOwner(context) &&
         ((DOS_RFOTM == dos.state) || (DOS_SRESET == dos.state)) &&
         (NOT_A_SVR_RESOURCE != context->resourceType))
     {
@@ -811,7 +820,7 @@ void CheckPermission(SRMRequestContext_t *context)
     else if (((OIC_R_DOXM_TYPE == context->resourceType) ||
               (OIC_R_PSTAT_TYPE == context->resourceType) ||
               (OIC_R_CRED_TYPE == context->resourceType) ||
-              (OIC_R_ACL_TYPE == context->resourceType)) && 
+              (OIC_R_ACL_TYPE == context->resourceType)) &&
              (IsRequestFromDoxs(context)))
     {
         OIC_LOG_V(INFO, TAG, "%s: granting DOXS implicit access to /acl2, /cred, /doxm or /pstat.", __func__);
index 21eef1f..799a750 100644 (file)
@@ -236,7 +236,7 @@ static void ClearRequestContext(SRMRequestContext_t *context)
 // this function, or this function may incorrectly read the nil-UUID (0s)
 // and assume CoAP request (which can result in request being incorrectly
 // denied).
-bool isRequestOverSecureChannel(SRMRequestContext_t *context)
+bool IsRequestOverSecureChannel(SRMRequestContext_t *context)
 {
     OicUuid_t nullSubjectId = {.id = {0}};
 
@@ -310,7 +310,7 @@ void SRMRequestHandler(const CAEndpoint_t *endPoint, const CARequestInfo_t *requ
 #endif
 
     // Set secure channel boolean.
-    ctx->secureChannel = isRequestOverSecureChannel(ctx);
+    ctx->secureChannel = IsRequestOverSecureChannel(ctx);
 
 #if defined( __WITH_TLS__) || defined(__WITH_DTLS__)
 
@@ -461,59 +461,6 @@ void SRMDeInitSecureResources()
     DestroySecureResources();
 }
 
-bool SRMIsSecurityResourceURI(const char* uri)
-{
-    if (!uri)
-    {
-        return false;
-    }
-
-#ifdef _MSC_VER
-    // The strings below are const but they are also marked as extern so they cause warnings.
-#pragma warning(push)
-#pragma warning(disable:4204)
-#endif
-    const char *rsrcs[] = {
-        OIC_RSRC_SVC_URI,
-        OIC_RSRC_AMACL_URI,
-        OIC_RSRC_CRL_URI,
-        OIC_RSRC_CRED_URI,
-        OIC_RSRC_CSR_URI,
-        OIC_RSRC_ACL_URI,
-        OIC_RSRC_ACL2_URI,
-        OIC_RSRC_DOXM_URI,
-        OIC_RSRC_PSTAT_URI,
-        OIC_RSRC_VER_URI,
-        OIC_RSRC_ROLES_URI,
-        OC_RSRVD_PROV_CRL_URL
-    };
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-    // Remove query from Uri for resource string comparison
-    size_t uriLen = strlen(uri);
-    char *query = strchr (uri, '?');
-    if (query)
-    {
-        uriLen = query - uri;
-    }
-
-    for (size_t i = 0; i < sizeof(rsrcs)/sizeof(rsrcs[0]); i++)
-    {
-        size_t svrLen = strlen(rsrcs[i]);
-
-        if ((uriLen == svrLen) &&
-            (strncmp(uri, rsrcs[i], svrLen) == 0))
-        {
-            return true;
-        }
-    }
-
-    return false;
-}
-
 /**
  * Get the Secure Virtual Resource (SVR) type from the URI.
  * @param   uri [IN] Pointer to URI in question.
index a236182..4f26dea 100644 (file)
@@ -225,3 +225,112 @@ OCStackResult OC_CALL SetDeviceIdSeed(const uint8_t* seed, size_t seedSize)
     return SetDoxmDeviceIDSeed(seed, seedSize);
 }
 #endif
+
+bool SRMIsSecurityResourceURI(const char* uri)
+{
+    if (!uri)
+    {
+        return false;
+    }
+
+#ifdef _MSC_VER
+    // The strings below are const but they are also marked as extern so they cause warnings.
+#pragma warning(push)
+#pragma warning(disable:4204)
+#endif
+    const char *rsrcs[] = {
+        OIC_RSRC_SVC_URI,
+        OIC_RSRC_AMACL_URI,
+        OIC_RSRC_CRL_URI,
+        OIC_RSRC_CRED_URI,
+        OIC_RSRC_CSR_URI,
+        OIC_RSRC_ACL_URI,
+        OIC_RSRC_ACL2_URI,
+        OIC_RSRC_DOXM_URI,
+        OIC_RSRC_PSTAT_URI,
+        OIC_RSRC_VER_URI,
+        OIC_RSRC_ROLES_URI,
+        OC_RSRVD_PROV_CRL_URL
+    };
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+    // Remove query from Uri for resource string comparison
+    size_t uriLen = strlen(uri);
+    char *query = strchr (uri, '?');
+    if (query)
+    {
+        uriLen = query - uri;
+    }
+
+    for (size_t i = 0; i < sizeof(rsrcs)/sizeof(rsrcs[0]); i++)
+    {
+        size_t svrLen = strlen(rsrcs[i]);
+
+        if ((uriLen == svrLen) &&
+            (strncmp(uri, rsrcs[i], svrLen) == 0))
+        {
+            OIC_LOG_V(INFO, TAG, "%s: resource %s is SVR.", __func__, uri);
+            return true;
+        }
+    }
+
+    return false;
+}
+
+/**
+ * return true IFF the uri is for a DCR as defined by Security Specification.
+ */
+bool IsDeviceConfigurationResourceUri(const char *uri)
+{
+    if (!uri)
+    {
+        return false;
+    }
+
+    if (SRMIsSecurityResourceURI(uri))
+    {
+        return true;
+    }
+
+#ifdef _MSC_VER
+    // The strings below are const but they are also marked as extern so they cause warnings.
+#pragma warning(push)
+#pragma warning(disable:4204)
+#endif
+    const char *rsrcs[] = {
+        OC_RSRVD_DEVICE_URI,
+        OC_RSRVD_PLATFORM_URI,
+        OC_RSRVD_WELL_KNOWN_URI
+        // TODO [IOT-3006]: add WES resources as needed to enable easy setup use cases
+        // TODO [IOT-3006]: add CNC resources as needed to enable CNC use cases
+    };
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+    // Remove query from Uri for resource string comparison
+    size_t uriLen = strlen(uri);
+    char *query = strchr (uri, '?');
+    if (query)
+    {
+        uriLen = query - uri;
+    }
+
+    for (size_t i = 0; i < sizeof(rsrcs)/sizeof(rsrcs[0]); i++)
+    {
+        size_t svrLen = strlen(rsrcs[i]);
+
+        if ((uriLen == svrLen) &&
+            (strncmp(uri, rsrcs[i], svrLen) == 0))
+        {
+            OIC_LOG_V(INFO, TAG, "%s: resource %s is DCR.", __func__, uri);
+            return true;
+        }
+    }
+
+    return false;
+}
index fe9eabe..f9b5f1f 100644 (file)
@@ -48,6 +48,7 @@
 #include "experimental/logger.h"
 #include "ocpayload.h"
 #include "secureresourcemanager.h"
+#include "srmutility.h"
 #include "cacommon.h"
 #include "cainterface.h"
 #include "oickeepalive.h"
@@ -69,6 +70,9 @@
 // Using 1k as block size since most persistent storage implementations use a power of 2.
 #define INTROSPECTION_FILE_SIZE_BLOCK  1024
 
+#ifdef VERIFY_SUCCESS
+#undef VERIFY_SUCCESS
+#endif
 #define VERIFY_SUCCESS(op) { if (op != (OC_STACK_OK)) \
             {OIC_LOG_V(FATAL, TAG, "%s failed!!", #op); goto exit;} }
 
index c180f3b..395f5de 100644 (file)
@@ -57,6 +57,7 @@
 #include "trace.h"
 #include "ocserverrequest.h"
 #include "secureresourcemanager.h"
+#include "srmutility.h"
 #include "psinterface.h"
 #include "experimental/doxmresource.h"
 #include "cacommon.h"
@@ -174,6 +175,9 @@ bool g_multicastServerStopped = false;
 // Macros
 //-----------------------------------------------------------------------------
 #define TAG  "OIC_RI_STACK"
+#ifdef VERIFY_SUCCESS
+#undef VERIFY_SUCCESS
+#endif
 #define VERIFY_SUCCESS(op, successCode) { if ((op) != (successCode)) \
             {OIC_LOG_V(FATAL, TAG, "%s failed!!", #op); goto exit;} }
 #define VERIFY_NON_NULL(arg, logLevel, retVal) { if (!(arg)) { OIC_LOG((logLevel), \