1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
27 #include "cainterface.h"
28 #include "caremotehandler.h"
29 #include "camessagehandler.h"
30 #include "caprotocolmessage.h"
31 #include "canetworkconfigurator.h"
32 #include "cainterfacecontroller.h"
35 #include "caadapternetdtls.h"
39 #include "catcpadapter.h"
42 CAGlobals_t caglobals = { .clientFlags = 0,
45 #define TAG "OIC_CA_CONN_MGR"
47 static bool g_isInitialized = false;
50 // CAAdapterNetDTLS will register the callback.
51 // Taking callback all the way through adapters not the right approach, hence calling here.
52 extern void CADTLSSetCredentialsCallback(CAGetDTLSPskCredentialsHandler credCallback);
56 // CAAdapterNetDTLS will register the callback.
57 // Taking callback all the way through adapters not the right approach, hence calling here.
58 extern void CADTLSSetX509CredentialsCallback(CAGetDTLSX509CredentialsHandler credCallback);
59 extern void CADTLSSetCrlCallback(CAGetDTLSCrlHandler crlCallback);
62 CAResult_t CAInitialize()
64 OIC_LOG(DEBUG, TAG, "CAInitialize");
68 if (0 != OCSeedRandom())
70 OIC_LOG(ERROR, TAG, "Seed Random Failed");
73 CAResult_t res = CAInitializeMessageHandler();
74 if (res != CA_STATUS_OK)
76 OIC_LOG(ERROR, TAG, "CAInitialize has failed");
79 g_isInitialized = true;
87 OIC_LOG(DEBUG, TAG, "CATerminate");
91 CATerminateMessageHandler();
92 CATerminateNetworkType();
94 g_isInitialized = false;
98 CAResult_t CAStartListeningServer()
100 OIC_LOG(DEBUG, TAG, "CAStartListeningServer");
104 return CA_STATUS_NOT_INITIALIZED;
107 return CAStartListeningServerAdapters();
110 CAResult_t CAStopListeningServer()
112 OIC_LOG(DEBUG, TAG, "CAStopListeningServer");
116 return CA_STATUS_NOT_INITIALIZED;
119 return CAStopListeningServerAdapters();
122 CAResult_t CAStartDiscoveryServer()
124 OIC_LOG(DEBUG, TAG, "CAStartDiscoveryServer");
128 return CA_STATUS_NOT_INITIALIZED;
131 return CAStartDiscoveryServerAdapters();
134 void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHandler,
135 CAErrorCallback ErrorHandler)
137 OIC_LOG(DEBUG, TAG, "CARegisterHandler");
141 OIC_LOG(DEBUG, TAG, "CA is not initialized");
145 CASetInterfaceCallbacks(ReqHandler, RespHandler, ErrorHandler);
149 CAResult_t CARegisterDTLSHandshakeCallback(CAErrorCallback dtlsHandshakeCallback)
151 OIC_LOG(DEBUG, TAG, "CARegisterDTLSHandshakeCallback");
155 return CA_STATUS_NOT_INITIALIZED;
158 CADTLSSetHandshakeCallback(dtlsHandshakeCallback);
163 CAResult_t CARegisterDTLSCredentialsHandler(CAGetDTLSPskCredentialsHandler GetDTLSCredentialsHandler)
165 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCredentialsHandler");
169 return CA_STATUS_NOT_INITIALIZED;
172 CADTLSSetCredentialsCallback(GetDTLSCredentialsHandler);
175 #endif //__WITH_DTLS__
178 CAResult_t CARegisterDTLSX509CredentialsHandler(CAGetDTLSX509CredentialsHandler GetDTLSX509CredentialsHandler)
180 OIC_LOG(DEBUG, TAG, "CARegisterDTLSX509CredentialsHandler");
184 return CA_STATUS_NOT_INITIALIZED;
187 CADTLSSetX509CredentialsCallback(GetDTLSX509CredentialsHandler);
191 CAResult_t CARegisterDTLSCrlHandler(CAGetDTLSCrlHandler GetDTLSCrlHandler)
193 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCrlHandler");
197 return CA_STATUS_NOT_INITIALIZED;
200 CADTLSSetCrlCallback(GetDTLSCrlHandler);
203 #endif //__WITH_X509__
205 CAResult_t CACreateEndpoint(CATransportFlags_t flags,
206 CATransportAdapter_t adapter,
209 CAEndpoint_t **object)
213 OIC_LOG(ERROR, TAG, "Invalid Parameter");
214 return CA_STATUS_INVALID_PARAM;
217 CAEndpoint_t *endpoint = CACreateEndpointObject(flags, adapter, addr, port);
220 return CA_STATUS_FAILED;
226 void CADestroyEndpoint(CAEndpoint_t *rep)
228 OIC_LOG(DEBUG, TAG, "CADestroyEndpoint");
233 CAResult_t CAGenerateToken(CAToken_t *token, uint8_t tokenLength)
235 OIC_LOG(DEBUG, TAG, "CAGenerateToken");
237 return CAGenerateTokenInternal(token, tokenLength);
240 void CADestroyToken(CAToken_t token)
242 OIC_LOG(DEBUG, TAG, "CADestroyToken");
244 CADestroyTokenInternal(token);
246 OIC_LOG(DEBUG, TAG, "OUT");
249 CAResult_t CAGetNetworkInformation(CAEndpoint_t **info, uint32_t *size)
251 OIC_LOG(DEBUG, TAG, "CAGetNetworkInformation");
255 return CA_STATUS_NOT_INITIALIZED;
258 return CAGetNetworkInformationInternal(info, size);
261 CAResult_t CASendRequest(const CAEndpoint_t *object, const CARequestInfo_t *requestInfo)
263 OIC_LOG(DEBUG, TAG, "CASendRequest");
267 return CA_STATUS_NOT_INITIALIZED;
270 return CADetachSendMessage(object, requestInfo, CA_REQUEST_DATA);
273 CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
275 OIC_LOG(DEBUG, TAG, "CASendResponse");
279 return CA_STATUS_NOT_INITIALIZED;
282 return CADetachSendMessage(object, responseInfo, CA_RESPONSE_DATA);
285 CAResult_t CASelectNetwork(CATransportAdapter_t interestedNetwork)
287 OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
291 return CA_STATUS_NOT_INITIALIZED;
294 CAResult_t res = CA_STATUS_OK;
296 if (interestedNetwork & CA_ADAPTER_IP)
298 res = CAAddNetworkType(CA_ADAPTER_IP);
299 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_IP_ADAPTER) function returns result: %d", res);
301 else if (interestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
303 res = CAAddNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
304 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_RFCOMM_ADAPTER) function returns result : %d", res);
306 else if (interestedNetwork & CA_ADAPTER_GATT_BTLE)
308 res = CAAddNetworkType(CA_ADAPTER_GATT_BTLE);
309 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_GATT_ADAPTER) function returns result : %d", res);
313 else if (interestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
315 res = CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS);
316 OIC_LOG_V(DEBUG, TAG,
317 "CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns result : %d", res);
322 else if (interestedNetwork & CA_ADAPTER_TCP)
324 res = CAAddNetworkType(CA_ADAPTER_TCP);
325 OIC_LOG_V(DEBUG, TAG,
326 "CAAddNetworkType(CA_ADAPTER_TCP) function returns result : %d", res);
329 else if (interestedNetwork & CA_ADAPTER_NFC)
331 res = CAAddNetworkType(CA_ADAPTER_NFC);
332 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_ADAPTER_NFC) function returns result : %d", res);
336 res = CA_NOT_SUPPORTED;
341 CAResult_t CAUnSelectNetwork(CATransportAdapter_t nonInterestedNetwork)
343 OIC_LOG_V(DEBUG, TAG, "unselected network : %d", nonInterestedNetwork);
347 return CA_STATUS_NOT_INITIALIZED;
350 CAResult_t res = CA_STATUS_OK;
352 if (nonInterestedNetwork & CA_ADAPTER_IP)
354 res = CARemoveNetworkType(CA_ADAPTER_IP);
355 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_IP_ADAPTER) function returns result : %d", res);
357 else if (nonInterestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
359 res = CARemoveNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
360 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_RFCOMM_ADAPTER) function returns result : %d", res);
362 else if (nonInterestedNetwork & CA_ADAPTER_GATT_BTLE)
364 res = CARemoveNetworkType(CA_ADAPTER_GATT_BTLE);
365 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_GATT_ADAPTER) function returns result : %d", res);
368 else if (nonInterestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
370 res = CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS);
371 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns result : %d",
378 else if (nonInterestedNetwork & CA_ADAPTER_TCP)
380 res = CARemoveNetworkType(CA_ADAPTER_TCP);
381 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_ADAPTER_TCP) function returns result : %d",
388 res = CA_STATUS_FAILED;
393 CAResult_t CAHandleRequestResponse()
395 if (!g_isInitialized)
397 OIC_LOG(ERROR, TAG, "not initialized");
398 return CA_STATUS_NOT_INITIALIZED;
401 CAHandleRequestResponseCallbacks();
407 CAResult_t CASelectCipherSuite(const uint16_t cipher)
409 OIC_LOG_V(DEBUG, TAG, "CASelectCipherSuite");
411 return CADtlsSelectCipherSuite(cipher);
414 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
416 OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
418 return CADtlsEnableAnonECDHCipherSuite(enable);
421 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
422 const uint8_t* label, const size_t labelLen,
423 const uint8_t* rsrcServerDeviceID, const size_t rsrcServerDeviceIDLen,
424 const uint8_t* provServerDeviceID, const size_t provServerDeviceIDLen,
425 uint8_t* ownerPSK, const size_t ownerPSKSize)
427 OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
429 CAResult_t res = CA_STATUS_OK;
431 //newOwnerLabel and prevOwnerLabe can be NULL
432 if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPSKSize)
434 return CA_STATUS_INVALID_PARAM;
437 res = CADtlsGenerateOwnerPSK(endpoint, label, labelLen,
438 rsrcServerDeviceID, rsrcServerDeviceIDLen,
439 provServerDeviceID, provServerDeviceIDLen,
440 ownerPSK, ownerPSKSize);
441 if (CA_STATUS_OK != res)
443 OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
446 OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
451 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
453 OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
454 CAResult_t res = CA_STATUS_OK;
458 return CA_STATUS_INVALID_PARAM;
461 res = CADtlsInitiateHandshake(endpoint);
462 if (CA_STATUS_OK != res)
464 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsInitiateHandshake : %d", res);
467 OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
472 CAResult_t CACloseDtlsSession(const CAEndpoint_t *endpoint)
474 OIC_LOG_V(DEBUG, TAG, "IN : CACloseDtlsSession");
475 CAResult_t res = CA_STATUS_OK;
479 return CA_STATUS_INVALID_PARAM;
482 res = CADtlsClose(endpoint);
483 if (CA_STATUS_OK != res)
485 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsClose : %d", res);
488 OIC_LOG_V(DEBUG, TAG, "OUT : CACloseDtlsSession");
493 #endif /* __WITH_DTLS__ */
496 void CARegisterKeepAliveHandler(CAKeepAliveConnectedCallback ConnHandler,
497 CAKeepAliveDisconnectedCallback DisconnHandler)
499 CATCPSetKeepAliveCallbacks(ConnHandler, DisconnHandler);