IoT_Error_t iot_tls_connect(Network *pNetwork, TLSConnectParams *params)
{
	if (pNetwork == NULL)
		return NULL_VALUE_ERROR;

	IoT_Error_t ret_val = AWS_FAILURE;

	if (params != NULL) {
		Populate_ConnectParams(pNetwork, params->pRootCALocation,
				       params->pDeviceCertLocation,
				       params->pDevicePrivateKeyLocation,
				       params->pDestinationURL,
				       params->DestinationPort,
				       params->timeout_ms,
				       params->ServerVerificationFlag);
	}

	pNetwork->my_socket = Create_TCPSocket();
	if (-1 == pNetwork->my_socket) {
		ret_val = TCP_CONNECTION_ERROR;
		return ret_val;
	}

	ret_val = Connect_TCPSocket(pNetwork->my_socket,
				    pNetwork->tlsConnectParams.pDestinationURL,
				    pNetwork->tlsConnectParams.DestinationPort);
	if (AWS_SUCCESS != ret_val) {
		Close_TCPSocket(&pNetwork->my_socket);
		return ret_val;
	}
	tls_cfg.flags = TLS_USE_CLIENT_CERT;
	tls_cfg.tls.client.client_cert = (unsigned char *)
		pNetwork->tlsConnectParams.pDeviceCertLocation;
	tls_cfg.tls.client.client_cert_size =
		strlen(pNetwork->tlsConnectParams.pDeviceCertLocation);
	tls_cfg.tls.client.client_key = (unsigned char *)
		pNetwork->tlsConnectParams.pDevicePrivateKeyLocation;
	tls_cfg.tls.client.client_key_size =
		strlen(pNetwork->tlsConnectParams.pDevicePrivateKeyLocation);
	tls_cfg.tls.client.ca_cert =
		(unsigned char *)pNetwork->tlsConnectParams.pRootCALocation;
	tls_cfg.tls.client.ca_cert_size =
		strlen(pNetwork->tlsConnectParams.pRootCALocation);

	ret_val = tls_session_init(&tls_handle, pNetwork->my_socket, &tls_cfg);
	if (AWS_SUCCESS != ret_val)
		Close_TCPSocket(&pNetwork->my_socket);
	return ret_val;
}
IoT_Error_t iot_tls_connect(Network *pNetwork, TLSConnectParams *params)
{
	if (pNetwork == NULL)
		return NULL_VALUE_ERROR;

	IoT_Error_t ret_val = AWS_FAILURE;

	if (params != NULL) {
		Populate_ConnectParams(pNetwork, params->pRootCALocation,
				       params->pDeviceCertLocation,
				       params->pDevicePrivateKeyLocation,
				       params->pDestinationURL,
				       params->DestinationPort,
				       params->timeout_ms,
				       params->ServerVerificationFlag);
	}

	pNetwork->my_socket = Create_TCPSocket();
	if (-1 == pNetwork->my_socket) {
		ret_val = TCP_CONNECTION_ERROR;
		return ret_val;
	}

	ret_val = Connect_TCPSocket(pNetwork->my_socket,
				    pNetwork->tlsConnectParams.pDestinationURL,
				    pNetwork->tlsConnectParams.DestinationPort);
	if (AWS_SUCCESS != ret_val) {
		Close_TCPSocket(&pNetwork->my_socket);
		return ret_val;
	}
	memset(&tls_hd, 0, sizeof(tls_hd));
	ret_val = wm_tls_client_open(&tls_hd,
	 (wm_tls_cert_t *) pNetwork->tlsConnectParams.pRootCALocation,
	 (wm_tls_cert_t *) pNetwork->tlsConnectParams.pDeviceCertLocation,
	 (wm_tls_key_t *) pNetwork->tlsConnectParams.pDevicePrivateKeyLocation,
	 pNetwork->my_socket);
	if (ret_val != WM_SUCCESS)
		goto out;

	return WM_SUCCESS;
out:
	wm_tls_client_close(&tls_hd);
	Close_TCPSocket(&pNetwork->my_socket);
	return -WM_FAIL;

}
IoT_Error_t iot_tls_init(Network *pNetwork, char *pRootCALocation, char *pDeviceCertLocation,
			 char *pDevicePrivateKeyLocation, char *pDestinationURL,
			 uint16_t destinationPort, uint32_t timeout_ms, bool ServerVerificationFlag)
{
	Populate_ConnectParams(pNetwork, pRootCALocation, pDeviceCertLocation,
			       pDevicePrivateKeyLocation, pDestinationURL,
			       destinationPort, timeout_ms, ServerVerificationFlag);

	pNetwork->my_socket = 0;
	pNetwork->connect = iot_tls_connect;
	pNetwork->read = iot_tls_read;
	pNetwork->write = iot_tls_write;
	pNetwork->disconnect = iot_tls_disconnect;
	pNetwork->isConnected = iot_tls_is_connected;
	pNetwork->destroy = iot_tls_destroy;

	tls_lib_init();

	return AWS_SUCCESS;
}