Updated DTLS usage as per discussion
authorSachin Agrawal <sachin.agrawal@intel.com>
Tue, 7 Apr 2015 20:55:51 +0000 (13:55 -0700)
committerErich Keane <erich.keane@intel.com>
Tue, 7 Apr 2015 21:36:34 +0000 (21:36 +0000)
As per discussion between Sachin and Ashok, following are updated:
1) CA API modified such that memory holding credentials is not
   shared between RI and CA i.e. For GetCredential() call, RI will
   allocate memory and CA will free it.
2) Since there was no consensus on "creds" member of
   "OCDtlsPskCredsBlob", as per discussion, CA has forked a separate
   structure i.e. CADtlsPskCredsBlob and samples modified to use it.
3) Duplicate ocsecurityconfig.h is updated as per the original version.
   This will be removed in a separate commit with other forked files.
4) RI layer is updated to remove SEC_CA_MERGE_WORKAROUND.

Change-Id: I174d82616985e0064e9a2fdccf08cbf8a43dfb7d
Signed-off-by: Abhishek Sharma <ce.abhishek@samsung.com>
Signed-off-by: Sachin Agrawal <sachin.agrawal@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/605
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Erich Keane <erich.keane@intel.com>
resource/csdk/SConscript
resource/csdk/connectivity/api/cainterface.h
resource/csdk/connectivity/external/inc/ocsecurityconfig.h
resource/csdk/connectivity/samples/android/sample_service/jni/ResourceModel.c
resource/csdk/connectivity/samples/linux/sample_main.c
resource/csdk/connectivity/samples/tizen/casample.c
resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
resource/csdk/connectivity/test/ca_api_unittest.cpp
resource/csdk/security/include/internal/ocsecurityinternal.h
resource/csdk/security/src/ocsecurity.c

index c32cca0..8bc655c 100644 (file)
@@ -64,8 +64,6 @@ if target_os not in ['windows', 'winrt']:
 liboctbstack_env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')])
 liboctbstack_env.AppendUnique(LIBS = ['coap', 'm'])
 
-liboctbstack_env.AppendUnique(CPPDEFINES = ['CA_SEC_MERGE_WORKAROUND'])
-
 if target_os == 'arduino':
        liboctbstack_env.AppendUnique(CPPDEFINES = ['NDEBUG', 'WITH_ARDUINO'])
 else:
index f2d34bd..9f6fd36 100644 (file)
@@ -61,12 +61,26 @@ typedef void (*CAResponseCallback)(const CARemoteEndpoint_t *object,
                                    const CAResponseInfo_t *responseInfo);
 
 #ifdef __WITH_DTLS__
+
+/**
+ * Binary blob containing device identity and the credentials for all devices
+ * trusted by this device.
+ */
+typedef struct
+{
+   unsigned char identity[DTLS_PSK_ID_LEN]; /** identity of self */
+   uint32_t num;                            /** number of credentials in this blob */
+   OCDtlsPskCreds *creds;                   /** list of credentials. Size of this
+                                                array is determined by 'num' variable. */
+} CADtlsPskCredsBlob_t;
+
 /**
  * @brief   Callback function type for getting DTLS credentials.
- * @param   credInfo          [OUT] DTLS credentials info
+ * @param   credInfo          [OUT] DTLS credentials info. Handler has to allocate new memory for
+ *                                  both credInfo and credInfo->creds which is then freed by CA
  * @return  NONE
  */
-typedef void (*CAGetDTLSCredentialsHandler)(OCDtlsPskCredsBlob **credInfo);
+typedef void (*CAGetDTLSCredentialsHandler)(CADtlsPskCredsBlob_t **credInfo);
 #endif //__WITH_DTLS__
 
 /**
@@ -184,7 +198,7 @@ CAResult_t CAFindResource(const CAURI_t resourceUri, const CAToken_t token, uint
  * @param   requestInfo [IN] Information for the request.
  * @return  #CA_STATUS_OK #CA_STATUS_FAILED #CA_MEMORY_ALLOC_FAILED
  */
-CAResult_t CASendRequest(const CARemoteEndpoint_t *object,const CARequestInfo_t *requestInfo);
+CAResult_t CASendRequest(const CARemoteEndpoint_t *object, const CARequestInfo_t *requestInfo);
 
 /**
  * @brief   Send control Request on a resource to multicast group
index fa94db2..9ad8af4 100644 (file)
@@ -44,15 +44,12 @@ typedef struct
  */
 typedef struct
 {
-   uint16_t blobVer;                        /**< version of the blob */
-   uint16_t reserved;                       /**< reserved for future use */
-   unsigned char identity[DTLS_PSK_ID_LEN]; /**< identity of self */
-   uint32_t num;                            /**< number of credentials in this blob */
-   OCDtlsPskCreds *creds;                 /**< list of credentials. Size of this
-                                                 array is determined by 'num' variable. */
+   unsigned char identity[DTLS_PSK_ID_LEN]; /** identity of self */
+   uint32_t num;                            /** number of credentials in this blob */
+   OCDtlsPskCreds creds[1];                 /** list of credentials. Size of this
+                                                array is determined by 'num' variable. */
 } OCDtlsPskCredsBlob;
 
-
 #endif //OC_SECURITY_CONFIG_H
 
 
index 0790b28..2bbb091 100644 (file)
@@ -60,7 +60,7 @@ JNIEXPORT void JNICALL Java_com_iotivity_service_RMInterface_setNativeResponseLi
 }
 
 #ifdef __WITH_DTLS__
-static OCDtlsPskCredsBlob *pskCredsBlob = NULL;
+static CADtlsPskCredsBlob_t *pskCredsBlob = NULL;
 
 void clearDtlsCredentialInfo()
 {
@@ -68,58 +68,78 @@ void clearDtlsCredentialInfo()
     if (pskCredsBlob)
     {
         // Initialize sensitive data to zeroes before freeing.
-        if (pskCredsBlob->creds != NULL)
+        if (pskCredsBlob->creds)
         {
-            memset(pskCredsBlob->creds, 0, sizeof(OCDtlsPskCredsBlob)*(pskCredsBlob->num));
+            memset(pskCredsBlob->creds, 0, sizeof(OCDtlsPskCreds)*(pskCredsBlob->num));
             free(pskCredsBlob->creds);
         }
 
-        memset(pskCredsBlob, 0, sizeof(OCDtlsPskCredsBlob));
+        memset(pskCredsBlob, 0, sizeof(CADtlsPskCredsBlob_t));
         free(pskCredsBlob);
         pskCredsBlob = NULL;
     }
     LOGI("clearDtlsCredentialInfo OUT\n");
 }
 
-// Internal API. Invoked by OC stack to retrieve credentials from this module
-void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
+// Internal API. Invoked by CA stack to retrieve credentials from this module
+void CAGetDtlsPskCredentials(CADtlsPskCredsBlob_t **credInfo)
 {
     LOGI("CAGetDtlsPskCredentials IN\n");
+    if(!credInfo)
+    {
+        LOGE("Invalid credential container");
+        return;
+    }
+
+    *credInfo = (CADtlsPskCredsBlob_t *)malloc(sizeof(CADtlsPskCredsBlob_t));
+    if (NULL == *credInfo)
+    {
+        LOGE("Failed to allocate credential blob.");
+        return;
+    }
+
+    int16_t credLen = sizeof(OCDtlsPskCreds) * (pskCredsBlob->num);
+    (*credInfo)->creds = (OCDtlsPskCreds *)malloc(credLen);
+    if (NULL == (*credInfo)->creds)
+    {
+        LOGE("Failed to allocate crentials.");
+        free(*credInfo);
+        *credInfo = NULL;
+        return;
+    }
 
-    *credInfo = pskCredsBlob;
+    memcpy((*credInfo)->identity, pskCredsBlob->identity, DTLS_PSK_ID_LEN);
+    (*credInfo)->num = pskCredsBlob->num;
+    memcpy((*credInfo)->creds, pskCredsBlob->creds, credLen);
 
     LOGI("CAGetDtlsPskCredentials OUT\n");
 }
 
-int32_t SetCredentials()
+bool SetCredentials()
 {
     LOGI("SetCredentials IN\n");
-    pskCredsBlob = (OCDtlsPskCredsBlob *)calloc(1, sizeof(OCDtlsPskCredsBlob));
+    pskCredsBlob = (CADtlsPskCredsBlob_t *)calloc(1, sizeof(CADtlsPskCredsBlob_t));
     if (NULL == pskCredsBlob)
      {
-        LOGI("Memory allocation failed!\n");
-        return -1;
+        LOGE("Memory allocation failed!\n");
+        return false;
      }
-    memcpy(pskCredsBlob->rsIdentity, IDENTITY, DTLS_PSK_ID_LEN);
-
+    memcpy(pskCredsBlob->identity, IDENTITY, DTLS_PSK_ID_LEN);
     pskCredsBlob->num = 1;
 
-    pskCredsBlob->creds = (OCDtlsPskCredsBlob *)malloc(sizeof(OCDtlsPskCredsBlob) *
-            (pskCredsBlob->num));
+    pskCredsBlob->creds = (OCDtlsPskCreds *)malloc(sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
     if (NULL == pskCredsBlob->creds)
     {
-        LOGI("Memory allocation failed!\n");
-        return -1;
+        LOGE("Memory allocation failed!\n");
+        free(pskCredsBlob);
+        return false;
     }
 
-    uint32_t i;
-    for (i = 0; i < pskCredsBlob->num; i++)
-    {
-        memcpy(pskCredsBlob->creds[i].id, IDENTITY, DTLS_PSK_ID_LEN);
-        memcpy(pskCredsBlob->creds[i].psk, RS_CLIENT_PSK, DTLS_PSK_PSK_LEN);
-    }
+    memcpy(pskCredsBlob->creds[0].id, IDENTITY, DTLS_PSK_ID_LEN);
+    memcpy(pskCredsBlob->creds[0].psk, RS_CLIENT_PSK, DTLS_PSK_PSK_LEN);
+
     LOGI("SetCredentials OUT\n");
-    return 1;
+    return true;
 }
 #endif
 
@@ -136,7 +156,7 @@ JNIEXPORT void JNICALL Java_com_iotivity_service_RMInterface_RMInitialize
     CAResult_t res;
 
 #ifdef __WITH_DTLS__
-    if (SetCredentials() != 1)
+    if (true != SetCredentials())
     {
         LOGI("SetCredentials failed\n");
         return;
index c74a87c..9141e88 100644 (file)
@@ -94,7 +94,7 @@ static const char NORMAL_INFO_DATA[] =
                                      "\"if\":[\"oc.mi.def\"],\"obs\":1}}]}";
 
 #ifdef __WITH_DTLS__
-static OCDtlsPskCredsBlob *pskCredsBlob = NULL;
+static CADtlsPskCredsBlob_t *pskCredsBlob = NULL;
 
 void clearDtlsCredentialInfo()
 {
@@ -108,43 +108,67 @@ void clearDtlsCredentialInfo()
             free(pskCredsBlob->creds);
         }
 
-        memset(pskCredsBlob, 0, sizeof(OCDtlsPskCredsBlob));
+        memset(pskCredsBlob, 0, sizeof(CADtlsPskCredsBlob_t));
         free(pskCredsBlob);
         pskCredsBlob = NULL;
     }
     printf("clearDtlsCredentialInfo OUT\n");
 }
 
-// Internal API. Invoked by OC stack to retrieve credentials from this module
-void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
+// Internal API. Invoked by CA stack to retrieve credentials from this module
+void CAGetDtlsPskCredentials(CADtlsPskCredsBlob_t **credInfo)
 {
     printf("CAGetDtlsPskCredentials IN\n");
+    if(!credInfo)
+    {
+        printf("Invalid credential container");
+        return;
+    }
 
-    if (pskCredsBlob != NULL)
+    *credInfo = (CADtlsPskCredsBlob_t *)malloc(sizeof(CADtlsPskCredsBlob_t));
+    if (NULL == *credInfo)
     {
-        *credInfo = pskCredsBlob;
+        printf("Failed to allocate credential blob.");
+        return;
     }
 
+    size_t credLen = sizeof(OCDtlsPskCreds) * (pskCredsBlob->num);
+    (*credInfo)->creds = (OCDtlsPskCreds *)malloc(credLen);
+    if (NULL == (*credInfo)->creds)
+    {
+        printf("Failed to allocate credentials.");
+        free(*credInfo);
+        *credInfo = NULL;
+        return;
+    }
+
+    memcpy((*credInfo)->identity, pskCredsBlob->identity, DTLS_PSK_ID_LEN);
+    (*credInfo)->num = pskCredsBlob->num;
+    memcpy((*credInfo)->creds, pskCredsBlob->creds, credLen);
+
     printf("CAGetDtlsPskCredentials OUT\n");
 }
 
+
 CAResult_t SetCredentials()
 {
     printf("SetCredentials IN\n");
-    pskCredsBlob = (OCDtlsPskCredsBlob *)calloc(1, sizeof(OCDtlsPskCredsBlob));
+    pskCredsBlob = (CADtlsPskCredsBlob_t *)calloc(1, sizeof(CADtlsPskCredsBlob_t));
     if (NULL == pskCredsBlob)
-     {
+    {
         printf("Memory allocation failed!\n");
         return CA_MEMORY_ALLOC_FAILED;
      }
     memcpy(pskCredsBlob->identity, IDENTITY, DTLS_PSK_ID_LEN);
 
+
     pskCredsBlob->num = 1;
 
     pskCredsBlob->creds = (OCDtlsPskCreds *)malloc(sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
     if (NULL == pskCredsBlob->creds)
     {
         printf("Memory allocation failed!\n");
+        free(pskCredsBlob);
         return CA_MEMORY_ALLOC_FAILED;
     }
 
index de45350..f10c1a3 100644 (file)
@@ -87,7 +87,7 @@ static const char g_normalInfoData[] = "{\"oc\":[{\"href\":\"%s\",\"prop\":{\"rt
                                      "\"if\":[\"oc.mi.def\"],\"obs\":1}}]}";
 
 #ifdef __WITH_DTLS__
-static OCDtlsPskCredsBlob *pskCredsBlob = NULL;
+static CADtlsPskCredsBlob_t *pskCredsBlob = NULL;
 
 void ClearDtlsCredentialInfo()
 {
@@ -95,28 +95,49 @@ void ClearDtlsCredentialInfo()
     if (pskCredsBlob)
     {
         // Initialize sensitive data to zeroes before freeing.
-        memset(pskCredsBlob->creds, 0, sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
-        free(pskCredsBlob->creds);
+        if (pskCredsBlob->creds)
+        {
+            memset(pskCredsBlob->creds, 0, sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
+            free(pskCredsBlob->creds);
+        }
 
-        memset(pskCredsBlob, 0, sizeof(OCDtlsPskCredsBlob));
+        memset(pskCredsBlob, 0, sizeof(CADtlsPskCredsBlob_t));
         free(pskCredsBlob);
         pskCredsBlob = NULL;
     }
     printf("clearDtlsCredentialInfo OUT\n");
 }
 
-// Internal API. Invoked by OC stack to retrieve credentials from this module
-void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
+// Internal API. Invoked by CA stack to retrieve credentials from this module
+void CAGetDtlsPskCredentials(CADtlsPskCredsBlob_t **credInfo)
 {
     printf("CAGetDtlsPskCredentials IN\n");
-
     if(!credInfo)
     {
-        printf("Memory is not allocated for credInfo\n");
+        printf("Invalid credential container");
+        return;
+    }
+
+    *credInfo = (CADtlsPskCredsBlob_t *)malloc(sizeof(CADtlsPskCredsBlob_t));
+    if (NULL == *credInfo)
+    {
+        printf("Failed to allocate credential blob.");
+        return;
+    }
+
+    int16_t credLen = sizeof(OCDtlsPskCreds) * (pskCredsBlob->num);
+    (*credInfo)->creds = (OCDtlsPskCreds *)malloc(credLen);
+    if (NULL == (*credInfo)->creds)
+    {
+        printf("Failed to allocate credentials.");
+        free(*credInfo);
+        *credInfo = NULL;
         return;
     }
 
-    *credInfo = pskCredsBlob;
+    memcpy((*credInfo)->identity, pskCredsBlob->identity, DTLS_PSK_ID_LEN);
+    (*credInfo)->num = pskCredsBlob->num;
+    memcpy((*credInfo)->creds, pskCredsBlob->creds, credLen);
 
     printf("CAGetDtlsPskCredentials OUT\n");
 }
@@ -124,33 +145,29 @@ void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
 bool SetCredentials()
 {
     printf("SetCredentials IN\n");
-    pskCredsBlob = (OCDtlsPskCredsBlob *)malloc(sizeof(OCDtlsPskCredsBlob));
-
-    if(!pskCredsBlob)
+    pskCredsBlob = (CADtlsPskCredsBlob_t *)calloc(1, sizeof(CADtlsPskCredsBlob_t));
+    if (NULL == pskCredsBlob)
     {
-        printf("Memory allocation is failed\n");
-        return 0;
+        printf("Memory allocation failed!\n");
+        return false;
     }
 
-    memset(pskCredsBlob, 0x0, sizeof(OCDtlsPskCredsBlob));
     memcpy(pskCredsBlob->identity, IDENTITY, DTLS_PSK_ID_LEN);
-
     pskCredsBlob->num = 1;
 
     pskCredsBlob->creds = (OCDtlsPskCreds *)malloc(sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
-
-    if(!pskCredsBlob->creds)
+    if (NULL == pskCredsBlob->creds)
     {
-        printf("Memory allocation is failed\n");
-        return 0;
+        printf("Memory allocation failed!\n");
+        free(pskCredsBlob);
+        return false;
     }
 
-
     memcpy(pskCredsBlob->creds[0].id, IDENTITY, DTLS_PSK_ID_LEN);
     memcpy(pskCredsBlob->creds[0].psk, RS_CLIENT_PSK, DTLS_PSK_PSK_LEN);
 
     printf("SetCredentials OUT\n");
-    return 1;
+    return true;
 }
 #endif
 
@@ -173,7 +190,7 @@ int main()
     * set in the OC stack.
     */
 #ifdef __WITH_DTLS__
-    if (SetCredentials() == 0)
+    if (SetCredentials() == false)
     {
         printf("SetCredentials failed\n");
         return 1;
index 5838a83..7e53fb8 100644 (file)
@@ -359,13 +359,19 @@ static int32_t CAGetPskCredentials(dtls_context_t *ctx,
     VERIFY_NON_NULL_RET(g_getCredentialsCallback, NET_DTLS_TAG, "GetCredential callback", -1);
     VERIFY_NON_NULL_RET(result, NET_DTLS_TAG, "result", -1);
 
-    OCDtlsPskCredsBlob *credInfo = NULL;
+    CADtlsPskCredsBlob_t *credInfo = NULL;
 
     // Retrieve the credentials blob from security module
-    // OCGetDtlsPskCredentials(&credInfo);
     g_getCredentialsCallback(&credInfo);
 
-    VERIFY_NON_NULL_RET(credInfo, NET_DTLS_TAG, "CAGetDtlsPskCredentials credInfo is NULL", -1);
+    VERIFY_NON_NULL_RET(credInfo, NET_DTLS_TAG, "credInfo is NULL", -1);
+    if(NULL == credInfo->creds)
+    {
+        OIC_LOG(DEBUG, NET_DTLS_TAG, "credentials are NULL");
+        memset(credInfo, 0, sizeof(CADtlsPskCredsBlob_t));
+        OICFree(credInfo);
+        return -1;
+    }
 
     if ((type == DTLS_PSK_HINT) || (type == DTLS_PSK_IDENTITY))
     {
@@ -378,8 +384,8 @@ static int32_t CAGetPskCredentials(dtls_context_t *ctx,
 
     if ((type == DTLS_PSK_KEY) && (desc) && (descLen == DTLS_PSK_PSK_LEN))
     {
-        //Check if we have the credentials for the device with which we
-        //are trying to perform a handshake
+        // Check if we have the credentials for the device with which we
+        // are trying to perform a handshake
         int index = 0;
         for (index = 0; index < credInfo->num; index++)
         {
@@ -391,6 +397,14 @@ static int32_t CAGetPskCredentials(dtls_context_t *ctx,
         }
     }
 
+    // Erase sensitive data before freeing.
+    memset(credInfo->creds, 0, sizeof(OCDtlsPskCreds) * (credInfo->num));
+    OICFree(credInfo->creds);
+
+    memset(credInfo, 0, sizeof(CADtlsPskCredsBlob_t));
+    OICFree(credInfo);
+    credInfo = NULL;
+
     return ret;
 }
 
index 454a80a..7b54b3b 100644 (file)
@@ -56,7 +56,18 @@ static const char NORMAL_INFO_DATA[] =
                                      "\"if\":[\"oc.mi.def\"],\"obs\":1}}]}";
 
 #ifdef __WITH_DTLS__
-static OCDtlsPskCredsBlob *pskCredsBlob = NULL;
+
+/**
+ * @def RS_IDENTITY
+ * @brief
+ */
+#define IDENTITY     ("1111111111111111")
+/* @def RS_CLIENT_PSK
+ * @brief
+ */
+#define RS_CLIENT_PSK   ("AAAAAAAAAAAAAAAA")
+
+static CADtlsPskCredsBlob_t *pskCredsBlob = NULL;
 
 void clearDtlsCredentialInfo()
 {
@@ -67,7 +78,7 @@ void clearDtlsCredentialInfo()
         memset(pskCredsBlob->creds, 0, sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
         free(pskCredsBlob->creds);
 
-        memset(pskCredsBlob, 0, sizeof(OCDtlsPskCredsBlob));
+        memset(pskCredsBlob, 0, sizeof(CADtlsPskCredsBlob_t));
         free(pskCredsBlob);
         pskCredsBlob = NULL;
     }
@@ -75,7 +86,7 @@ void clearDtlsCredentialInfo()
 }
 
 // Internal API. Invoked by OC stack to retrieve credentials from this module
-void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
+void CAGetDtlsPskCredentials(CADtlsPskCredsBlob_t **credInfo)
 {
     printf("CAGetDtlsPskCredentials IN\n");
 
@@ -90,9 +101,9 @@ void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
 int32_t SetCredentials()
 {
     printf("SetCredentials IN\n");
-    pskCredsBlob = (OCDtlsPskCredsBlob *)malloc(sizeof(OCDtlsPskCredsBlob));
+    pskCredsBlob = (CADtlsPskCredsBlob_t *)malloc(sizeof(CADtlsPskCredsBlob_t));
 
-    memset(pskCredsBlob, 0x0, sizeof(OCDtlsPskCredsBlob));
+    memset(pskCredsBlob, 0x0, sizeof(CADtlsPskCredsBlob_t));
     memcpy(pskCredsBlob->identity, IDENTITY, DTLS_PSK_ID_LEN);
 
     pskCredsBlob->num = 1;
@@ -690,10 +701,8 @@ TEST(RegisterDTLSCredentialsHandlerTest, TC_34_positive_01)
     if (SetCredentials() == 0)
     {
         printf("SetCredentials failed\n");
-        return 0;
     }
 
-    res = CARegisterDTLSCredentialsHandler(CAGetDtlsPskCredentials);
     EXPECT_EQ(CA_STATUS_OK, CARegisterDTLSCredentialsHandler(CAGetDtlsPskCredentials));
 #endif
 }
index 5f5b2d1..d080546 100644 (file)
 
 #include "ocsecurityconfig.h"
 
-
-#ifdef CA_SEC_MERGE_WORKAROUND
-/**
- * This is a workaround to enable CA merge into master branch.
- * This will be removed by updating code in CA library to use updated data structure.
- */
-typedef struct
-{
-   uint32_t unused;
-   unsigned char identity[DTLS_PSK_ID_LEN];
-   uint32_t num;
-   OCDtlsPskCreds *creds;
-} CADtlsPskCredsBlob;
-#endif //CA_SEC_MERGE_WORKAROUND
-
-
 /**
  * This callback is used by lower stack (i.e. CA layer) to retrieve PSK
  * credentials from RI security layer.
@@ -51,7 +35,9 @@ typedef struct
  *
  * @retval none
  */
-void GetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo);
+#ifdef __WITH_DTLS__
+void GetDtlsPskCredentials(CADtlsPskCredsBlob_t **credInfo);
+#endif //__WITH_DTLS__
 
 
 /**
index cf2fd74..3dfe6e0 100644 (file)
 #include "ocmalloc.h"
 #include "ocsecurity.h"
 #include "ocsecurityconfig.h"
-#ifdef CA_SEC_MERGE_WORKAROUND
-#include "ocsecurityinternal.h"
-#endif //CA_SEC_MERGE_WORKAROUND
+#include "cainterface.h"
 #include <string.h>
 
 static OCSecConfigData* secConfigData;
 static int secConfigDataLen;
 
-/**
- * Currently, there is a disconnect in the data structure used between RI layer
- * and CA layer to convey DTLS PSK credentials. We cannot update this data
- * structure until all reviews of CA layer is completed. To enable security
- * feature in CA branch this workaround is added as a temporary stop-gap.
- *
- */
-#ifdef CA_SEC_MERGE_WORKAROUND
-static CADtlsPskCredsBlob *caBlob;
-#endif //CA_SEC_MERGE_WORKAROUND
 
 /**
  * This internal API removes/clears the global variable holding the security
@@ -57,15 +45,6 @@ void DeinitOCSecurityInfo()
         OCFree(secConfigData);
         secConfigData = NULL;
     }
-
-#ifdef CA_SEC_MERGE_WORKAROUND
-    if (caBlob)
-    {
-        OCFree(caBlob->creds);
-    }
-    OCFree(caBlob);
-#endif
-
 }
 
 /**
@@ -80,8 +59,12 @@ void DeinitOCSecurityInfo()
  *
  * @retval none
  */
-void GetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
+#ifdef __WITH_DTLS__
+void GetDtlsPskCredentials(CADtlsPskCredsBlob_t **credInfo)
 {
+    // CA layer interface publishes security data structures ONLY if
+    // stack is compiled in SECURED mode
+    CADtlsPskCredsBlob_t * caBlob = NULL;
     if(secConfigData && credInfo)
     {
         unsigned int i = 0;
@@ -90,41 +73,39 @@ void GetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
         {
             if (osb->type == OC_BLOB_TYPE_PSK)
             {
-#ifdef CA_SEC_MERGE_WORKAROUND
-                OCDtlsPskCredsBlob * ocBlob = (OCDtlsPskCredsBlob *)osb->val;
-                if (!caBlob)
+                caBlob = (CADtlsPskCredsBlob_t *)OCCalloc(sizeof(CADtlsPskCredsBlob_t), 1);
+                if (caBlob)
                 {
-                    caBlob = (CADtlsPskCredsBlob *)OCCalloc(sizeof(CADtlsPskCredsBlob), 1);
-                    if (caBlob)
+                    OCDtlsPskCredsBlob * ocBlob = (OCDtlsPskCredsBlob *)osb->val;
+
+                    memcpy(caBlob->identity, ocBlob->identity, sizeof(caBlob->identity));
+                    caBlob->num = ocBlob->num;
+                    caBlob->creds =
+                        (OCDtlsPskCreds*) OCMalloc(caBlob->num * sizeof(OCDtlsPskCreds));
+                    if (caBlob->creds)
                     {
-                        memcpy(caBlob->identity, ocBlob->identity, sizeof(caBlob->identity));
-                        caBlob->num = ocBlob->num;
-                        caBlob->creds =
-                            (OCDtlsPskCreds*) OCMalloc(caBlob->num * sizeof(OCDtlsPskCreds));
-                        if (caBlob->creds)
-                        {
-                            memcpy(caBlob->creds, ocBlob->creds,
-                                    caBlob->num * sizeof(OCDtlsPskCreds));
-                        }
+                        memcpy(caBlob->creds, ocBlob->creds,
+                                caBlob->num * sizeof(OCDtlsPskCreds));
+                        *credInfo = caBlob;
+                        // We copied the credential blob in the CA data structure.
+                        // Let's get out of here.
+                        return;
                     }
                 }
-                *credInfo = (OCDtlsPskCredsBlob *) caBlob;
                 break;
-#else
-                OCDtlsPskCredsBlob * blob;
-                blob = (OCDtlsPskCredsBlob *)OCMalloc(osb->len);
-                if (blob)
-                {
-                    memcpy(blob, osb->val, osb->len);
-                    *credInfo = blob;
-                    break;
-                }
-#endif //CA_SEC_MERGE_WORKAROUND
             }
             osb = config_data_next_blob(osb);
         }
     }
+
+    // Clear memory if any memory allocation failed above
+    if(caBlob)
+    {
+        OCFree(caBlob->creds);
+        OCFree(caBlob);
+    }
 }
+#endif //__WITH_DTLS__
 
 
 /**