replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / caconnectivitymanager.c
index f430de2..c3247d2 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 
+#include "octypes.h"
 #include "ocrandom.h"
 #include "cainterface.h"
 #include "caremotehandler.h"
@@ -51,13 +52,14 @@ static bool g_isInitialized = false;
 extern void CAsetPkixInfoCallback(CAgetPkixInfoHandler infCallback);
 extern void CAsetPskCredentialsCallback(CAgetPskCredentialsHandler credCallback);
 extern void CAsetCredentialTypesCallback(CAgetCredentialTypesHandler credCallback);
+extern void CAsetSetupPkContextCallback(CAsetupPkContextHandler setupPkCtxCallback);
 #endif // __WITH_DTLS__ or __WITH_TLS__
 
 
-CAResult_t CAInitialize()
+CAResult_t CAInitialize(CATransportAdapter_t transportType)
 {
     OIC_LOG_V(DEBUG, TAG, "IoTivity version is v%s", IOTIVITY_VERSION);
-    OIC_LOG(DEBUG, TAG, "CAInitialize");
+    OIC_LOG_V(DEBUG, TAG, "CAInitialize type : %d", transportType);
 
     if (!g_isInitialized)
     {
@@ -66,10 +68,11 @@ CAResult_t CAInitialize()
             OIC_LOG(ERROR, TAG, "Seed Random Failed");
         }
 
-        CAResult_t res = CAInitializeMessageHandler();
+        CAResult_t res = CAInitializeMessageHandler(transportType);
         if (res != CA_STATUS_OK)
         {
             OIC_LOG(ERROR, TAG, "CAInitialize has failed");
+            CATerminateMessageHandler();
             return res;
         }
         g_isInitialized = true;
@@ -140,11 +143,27 @@ void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHand
 
     CASetInterfaceCallbacks(ReqHandler, RespHandler, ErrorHandler);
 }
+
 #if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
+#ifdef MULTIPLE_OWNER
+const CASecureEndpoint_t *CAGetSecureEndpointData(const CAEndpoint_t *peer)
+{
+    OIC_LOG(DEBUG, TAG, "IN CAGetSecurePeerInfo");
+
+    if (!g_isInitialized)
+    {
+        OIC_LOG(DEBUG, TAG, "CA is not initialized");
+        return NULL;
+    }
+
+    OIC_LOG(DEBUG, TAG, "OUT CAGetSecurePeerInfo");
+    return GetCASecureEndpointData(peer);
+}
+#endif //MULTIPLE_OWNER
+
 CAResult_t CAregisterSslHandshakeCallback(CAErrorCallback tlsHandshakeCallback)
 {
     OIC_LOG(DEBUG, TAG, "CAregisterSslHandshakeCallback");
-
     if(!g_isInitialized)
     {
         return CA_STATUS_NOT_INITIALIZED;
@@ -192,6 +211,19 @@ CAResult_t CAregisterGetCredentialTypesHandler(CAgetCredentialTypesHandler getCr
     OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
     return CA_STATUS_OK;
 }
+
+CAResult_t CAregisterSetupPkContextHandler(CAsetupPkContextHandler setupPkContextCallback)
+{
+    OIC_LOG_V(DEBUG, TAG, "In %s", __func__);
+
+    if (!g_isInitialized)
+    {
+        return CA_STATUS_NOT_INITIALIZED;
+    }
+    CAsetSetupPkContextCallback(setupPkContextCallback);
+    OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
+    return CA_STATUS_OK;
+}
 #endif // __WITH_DTLS__ or __WITH_TLS__
 
 CAResult_t CACreateEndpoint(CATransportFlags_t flags,
@@ -307,6 +339,11 @@ CAResult_t CASendRequest(const CAEndpoint_t *object, const CARequestInfo_t *requ
     {
         return CASendMessageMultiAdapter(object, requestInfo, CA_REQUEST_DATA);
     }
+    else if (requestInfo && requestInfo->info.event == CA_REQ_DISCONNECT &&
+            (object->adapter == CA_ADAPTER_TCP || object->adapter == CA_ALL_ADAPTERS))
+    {
+        return CADetachSendNetworkReqMessage(object, requestInfo->info.event, CA_NETWORK_COMMAND);
+    }
     else
     {
         return CADetachSendMessage(object, requestInfo, CA_REQUEST_DATA);
@@ -340,8 +377,6 @@ CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *re
 
 CAResult_t CASelectNetwork(CATransportAdapter_t interestedNetwork)
 {
-    OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
-
     if (!g_isInitialized)
     {
         return CA_STATUS_NOT_INITIALIZED;
@@ -459,33 +494,40 @@ CAResult_t CAHandleRequestResponse()
     return CA_STATUS_OK;
 }
 
-#if defined (__WITH_DTLS__) || defined(__WITH_TLS__)
 CAResult_t CASelectCipherSuite(const uint16_t cipher, CATransportAdapter_t adapter)
 {
     OIC_LOG_V(DEBUG, TAG, "IN %s", __func__);
     OIC_LOG_V(DEBUG, TAG, "cipher : %d , CATransportAdapter : %d", cipher, adapter);
-    if (CA_STATUS_OK != CAsetTlsCipherSuite(cipher))
+    CAResult_t res = CA_STATUS_FAILED;
+#if defined (__WITH_DTLS__) || defined(__WITH_TLS__)
+    res = CAsetTlsCipherSuite(cipher);
+    if (CA_STATUS_OK != res)
     {
-        OIC_LOG_V(ERROR, TAG, "Out %s", __func__);
-        return CA_STATUS_FAILED;
+        OIC_LOG_V(ERROR, TAG, "Failed to CAsetTlsCipherSuite : %d", res);
     }
+#else
+    OIC_LOG(ERROR, TAG, "Method not supported");
+#endif
     OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
-    return CA_STATUS_OK;
+    return res;
 }
 
 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
 {
     OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
-
+    CAResult_t res = CA_STATUS_FAILED;
 #if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
     // TLS_ECDH_ANON_WITH_AES_128_CBC_SHA256    0xFF00 replaces 0xC018
-    // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256    0xC037
-    if (CA_STATUS_OK != CAsetTlsCipherSuite(enable ? 0xFF00 : 0xC037))
+    res = CAsetTlsCipherSuite(enable ? 0xFF00 : 0x00);
+    if (CA_STATUS_OK != res)
     {
-        return CA_STATUS_FAILED;
+        OIC_LOG_V(ERROR, TAG, "Failed to CAsetTlsCipherSuite : %d", res);
     }
+#else
+    OIC_LOG(ERROR, TAG, "Method not supported");
 #endif
-    return CA_STATUS_OK;
+    OIC_LOG_V(ERROR, TAG, "Out %s", __func__);
+    return res;
 }
 
 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
@@ -495,9 +537,8 @@ CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
                     uint8_t* ownerPSK, const size_t ownerPskSize)
 {
     OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
-
-    CAResult_t res = CA_STATUS_OK;
-
+    CAResult_t res = CA_STATUS_FAILED;
+#if defined (__WITH_DTLS__) || defined(__WITH_TLS__)
     //newOwnerLabel and prevOwnerLabe can be NULL
     if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPskSize)
     {
@@ -508,22 +549,22 @@ CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
                                       rsrcServerDeviceID, rsrcServerDeviceIDLen,
                                       provServerDeviceID, provServerDeviceIDLen,
                                       ownerPSK, ownerPskSize);
-
     if (CA_STATUS_OK != res)
     {
         OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
     }
-
+#else
+    OIC_LOG(ERROR, TAG, "Method not supported");
+#endif
     OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
-
     return res;
 }
 
 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
 {
     OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
-    CAResult_t res = CA_STATUS_OK;
-
+    CAResult_t res = CA_STATUS_FAILED;
+#if defined (__WITH_DTLS__) || defined(__WITH_TLS__)
     if (!endpoint)
     {
         return CA_STATUS_INVALID_PARAM;
@@ -534,17 +575,18 @@ CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
     {
         OIC_LOG_V(ERROR, TAG, "Failed to CAinitiateSslHandshake : %d", res);
     }
-
+#else
+        OIC_LOG(ERROR, TAG, "Method not supported");
+#endif
     OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
-
     return res;
 }
 
 CAResult_t CAcloseSslSession(const CAEndpoint_t *endpoint)
 {
     OIC_LOG_V(DEBUG, TAG, "IN : CAcloseSslSession");
-    CAResult_t res = CA_STATUS_OK;
-
+    CAResult_t res = CA_STATUS_FAILED;
+#if defined (__WITH_DTLS__) || defined(__WITH_TLS__)
     if (!endpoint)
     {
         return CA_STATUS_INVALID_PARAM;
@@ -555,14 +597,13 @@ CAResult_t CAcloseSslSession(const CAEndpoint_t *endpoint)
     {
         OIC_LOG_V(ERROR, TAG, "Failed to CAsslClose : %d", res);
     }
-
+#else
+    OIC_LOG(ERROR, TAG, "Method not supported");
+#endif
     OIC_LOG_V(DEBUG, TAG, "OUT : CAcloseSslSession");
-
     return res;
 }
 
-#endif /* __WITH_DTLS__ */
-
 #ifdef TCP_ADAPTER
 void CARegisterKeepAliveHandler(CAKeepAliveConnectionCallback ConnHandler)
 {