Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Sat Jan 28 09:35:22 2017 -0800
Revision:
19:2e0811512ceb
Parent:
15:956c6d205aa7
Child:
21:b92006c5b9ff
1.1.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 5 #include "wolfssl/ssl.h"
Azure.IoT Build 0:fa2de1b79154 6 #include "wolfssl/error-ssl.h"
Azure.IoT Build 0:fa2de1b79154 7 #include <stdio.h>
Azure.IoT Build 0:fa2de1b79154 8 #include <stdbool.h>
Azure.IoT Build 0:fa2de1b79154 9 #include <string.h>
Azure.IoT Build 0:fa2de1b79154 10 #include "azure_c_shared_utility/tlsio.h"
Azure.IoT Build 0:fa2de1b79154 11 #include "azure_c_shared_utility/tlsio_wolfssl.h"
Azure.IoT Build 0:fa2de1b79154 12 #include "azure_c_shared_utility/socketio.h"
Azure.IoT Build 6:c55b013dfc2a 13 #include "azure_c_shared_utility/crt_abstractions.h"
Azure.IoT Build 6:c55b013dfc2a 14 #include "azure_c_shared_utility/xlogging.h"
AzureIoTClient 15:956c6d205aa7 15 #include "azure_c_shared_utility/shared_util_options.h"
AzureIoTClient 15:956c6d205aa7 16
Azure.IoT Build 0:fa2de1b79154 17
Azure.IoT Build 0:fa2de1b79154 18 typedef enum TLSIO_STATE_ENUM_TAG
Azure.IoT Build 0:fa2de1b79154 19 {
Azure.IoT Build 0:fa2de1b79154 20 TLSIO_STATE_NOT_OPEN,
Azure.IoT Build 0:fa2de1b79154 21 TLSIO_STATE_OPENING_UNDERLYING_IO,
Azure.IoT Build 0:fa2de1b79154 22 TLSIO_STATE_IN_HANDSHAKE,
Azure.IoT Build 0:fa2de1b79154 23 TLSIO_STATE_OPEN,
Azure.IoT Build 0:fa2de1b79154 24 TLSIO_STATE_CLOSING,
Azure.IoT Build 0:fa2de1b79154 25 TLSIO_STATE_ERROR
Azure.IoT Build 0:fa2de1b79154 26 } TLSIO_STATE_ENUM;
Azure.IoT Build 0:fa2de1b79154 27
Azure.IoT Build 0:fa2de1b79154 28 typedef struct TLS_IO_INSTANCE_TAG
Azure.IoT Build 0:fa2de1b79154 29 {
Azure.IoT Build 0:fa2de1b79154 30 XIO_HANDLE socket_io;
Azure.IoT Build 0:fa2de1b79154 31 ON_BYTES_RECEIVED on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 32 ON_IO_OPEN_COMPLETE on_io_open_complete;
Azure.IoT Build 0:fa2de1b79154 33 ON_IO_CLOSE_COMPLETE on_io_close_complete;
Azure.IoT Build 0:fa2de1b79154 34 ON_IO_ERROR on_io_error;
Azure.IoT Build 0:fa2de1b79154 35 void* on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 36 void* on_io_open_complete_context;
Azure.IoT Build 0:fa2de1b79154 37 void* on_io_close_complete_context;
Azure.IoT Build 0:fa2de1b79154 38 void* on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 39 WOLFSSL* ssl;
Azure.IoT Build 0:fa2de1b79154 40 WOLFSSL_CTX* ssl_context;
Azure.IoT Build 0:fa2de1b79154 41 TLSIO_STATE_ENUM tlsio_state;
Azure.IoT Build 0:fa2de1b79154 42 unsigned char* socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 43 size_t socket_io_read_byte_count;
Azure.IoT Build 0:fa2de1b79154 44 ON_SEND_COMPLETE on_send_complete;
Azure.IoT Build 0:fa2de1b79154 45 void* on_send_complete_callback_context;
Azure.IoT Build 6:c55b013dfc2a 46 char* certificate;
AzureIoTClient 15:956c6d205aa7 47 char* x509certificate;
AzureIoTClient 15:956c6d205aa7 48 char* x509privatekey;
Azure.IoT Build 6:c55b013dfc2a 49 char* hostname;
Azure.IoT Build 6:c55b013dfc2a 50 int port;
Azure.IoT Build 0:fa2de1b79154 51 } TLS_IO_INSTANCE;
Azure.IoT Build 0:fa2de1b79154 52
AzureIoTClient 10:1be0bc9a9deb 53 /*this function will clone an option given by name and value*/
AzureIoTClient 10:1be0bc9a9deb 54 static void* tlsio_wolfssl_CloneOption(const char* name, const void* value)
AzureIoTClient 10:1be0bc9a9deb 55 {
AzureIoTClient 10:1be0bc9a9deb 56 void* result;
AzureIoTClient 15:956c6d205aa7 57 if ((name == NULL) || (value == NULL))
AzureIoTClient 10:1be0bc9a9deb 58 {
AzureIoTClient 15:956c6d205aa7 59 LogError("invalid parameter detected: const char* name=%p, const void* value=%p", name, value);
AzureIoTClient 10:1be0bc9a9deb 60 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 61 }
AzureIoTClient 10:1be0bc9a9deb 62 else
AzureIoTClient 10:1be0bc9a9deb 63 {
AzureIoTClient 10:1be0bc9a9deb 64 if (strcmp(name, "TrustedCerts") == 0)
AzureIoTClient 10:1be0bc9a9deb 65 {
AzureIoTClient 10:1be0bc9a9deb 66 if (mallocAndStrcpy_s((char**)&result, value) != 0)
AzureIoTClient 10:1be0bc9a9deb 67 {
AzureIoTClient 15:956c6d205aa7 68 LogError("unable to mallocAndStrcpy_s TrustedCerts value");
AzureIoTClient 15:956c6d205aa7 69 result = NULL;
AzureIoTClient 15:956c6d205aa7 70 }
AzureIoTClient 15:956c6d205aa7 71 else
AzureIoTClient 15:956c6d205aa7 72 {
AzureIoTClient 15:956c6d205aa7 73 /*return as is*/
AzureIoTClient 15:956c6d205aa7 74 }
AzureIoTClient 15:956c6d205aa7 75 }
AzureIoTClient 15:956c6d205aa7 76 else if (strcmp(name, SU_OPTION_X509_CERT) == 0)
AzureIoTClient 15:956c6d205aa7 77 {
AzureIoTClient 15:956c6d205aa7 78 if (mallocAndStrcpy_s((char**)&result, value) != 0)
AzureIoTClient 15:956c6d205aa7 79 {
AzureIoTClient 15:956c6d205aa7 80 LogError("unable to mallocAndStrcpy_s x509certificate value");
AzureIoTClient 15:956c6d205aa7 81 result = NULL;
AzureIoTClient 15:956c6d205aa7 82 }
AzureIoTClient 15:956c6d205aa7 83 else
AzureIoTClient 15:956c6d205aa7 84 {
AzureIoTClient 15:956c6d205aa7 85 /*return as is*/
AzureIoTClient 15:956c6d205aa7 86 }
AzureIoTClient 15:956c6d205aa7 87 }
AzureIoTClient 15:956c6d205aa7 88 else if (strcmp(name, SU_OPTION_X509_PRIVATE_KEY) == 0)
AzureIoTClient 15:956c6d205aa7 89 {
AzureIoTClient 15:956c6d205aa7 90 if (mallocAndStrcpy_s((char**)&result, value) != 0)
AzureIoTClient 15:956c6d205aa7 91 {
AzureIoTClient 15:956c6d205aa7 92 LogError("unable to mallocAndStrcpy_s x509privatekey value");
AzureIoTClient 10:1be0bc9a9deb 93 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 94 }
AzureIoTClient 10:1be0bc9a9deb 95 else
AzureIoTClient 10:1be0bc9a9deb 96 {
AzureIoTClient 10:1be0bc9a9deb 97 /*return as is*/
AzureIoTClient 10:1be0bc9a9deb 98 }
AzureIoTClient 10:1be0bc9a9deb 99 }
AzureIoTClient 10:1be0bc9a9deb 100 else
AzureIoTClient 10:1be0bc9a9deb 101 {
AzureIoTClient 15:956c6d205aa7 102 LogError("not handled option : %s", name);
AzureIoTClient 10:1be0bc9a9deb 103 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 104 }
AzureIoTClient 10:1be0bc9a9deb 105 }
AzureIoTClient 10:1be0bc9a9deb 106 return result;
AzureIoTClient 10:1be0bc9a9deb 107 }
AzureIoTClient 10:1be0bc9a9deb 108
AzureIoTClient 10:1be0bc9a9deb 109 /*this function destroys an option previously created*/
AzureIoTClient 10:1be0bc9a9deb 110 static void tlsio_wolfssl_DestroyOption(const char* name, const void* value)
AzureIoTClient 10:1be0bc9a9deb 111 {
AzureIoTClient 10:1be0bc9a9deb 112 /*since all options for this layer are actually string copies., disposing of one is just calling free*/
AzureIoTClient 15:956c6d205aa7 113 if ((name == NULL) || (value == NULL))
AzureIoTClient 10:1be0bc9a9deb 114 {
AzureIoTClient 15:956c6d205aa7 115 LogError("invalid parameter detected: const char* name=%p, const void* value=%p", name, value);
AzureIoTClient 15:956c6d205aa7 116 }
AzureIoTClient 15:956c6d205aa7 117 else
AzureIoTClient 15:956c6d205aa7 118 {
AzureIoTClient 15:956c6d205aa7 119 if ((strcmp(name, "TrustedCerts") == 0) ||
AzureIoTClient 15:956c6d205aa7 120 (strcmp(name, SU_OPTION_X509_CERT) == 0) ||
AzureIoTClient 15:956c6d205aa7 121 (strcmp(name, SU_OPTION_X509_PRIVATE_KEY) == 0))
AzureIoTClient 10:1be0bc9a9deb 122 {
AzureIoTClient 10:1be0bc9a9deb 123 free((void*)value);
AzureIoTClient 10:1be0bc9a9deb 124 }
AzureIoTClient 10:1be0bc9a9deb 125 else
AzureIoTClient 10:1be0bc9a9deb 126 {
AzureIoTClient 15:956c6d205aa7 127 LogError("not handled option : %s", name);
AzureIoTClient 10:1be0bc9a9deb 128 }
AzureIoTClient 10:1be0bc9a9deb 129 }
AzureIoTClient 10:1be0bc9a9deb 130 }
AzureIoTClient 10:1be0bc9a9deb 131
AzureIoTClient 10:1be0bc9a9deb 132 static OPTIONHANDLER_HANDLE tlsio_wolfssl_retrieveoptions(CONCRETE_IO_HANDLE tls_io)
AzureIoTClient 10:1be0bc9a9deb 133 {
AzureIoTClient 10:1be0bc9a9deb 134 OPTIONHANDLER_HANDLE result;
AzureIoTClient 19:2e0811512ceb 135 if (tls_io == NULL)
AzureIoTClient 10:1be0bc9a9deb 136 {
AzureIoTClient 19:2e0811512ceb 137 LogError("NULL tls_io parameter");
AzureIoTClient 19:2e0811512ceb 138 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 139 }
AzureIoTClient 10:1be0bc9a9deb 140 else
AzureIoTClient 10:1be0bc9a9deb 141 {
AzureIoTClient 19:2e0811512ceb 142 result = OptionHandler_Create(tlsio_wolfssl_CloneOption, tlsio_wolfssl_DestroyOption, tlsio_wolfssl_setoption);
AzureIoTClient 19:2e0811512ceb 143 if (result == NULL)
AzureIoTClient 19:2e0811512ceb 144 {
AzureIoTClient 19:2e0811512ceb 145 LogError("unable to OptionHandler_Create");
AzureIoTClient 19:2e0811512ceb 146 /*return as is*/
AzureIoTClient 19:2e0811512ceb 147 }
AzureIoTClient 19:2e0811512ceb 148 else
AzureIoTClient 19:2e0811512ceb 149 {
AzureIoTClient 19:2e0811512ceb 150 /*this layer cares about the certificates and the x509 credentials*/
AzureIoTClient 19:2e0811512ceb 151 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
AzureIoTClient 19:2e0811512ceb 152 if (
AzureIoTClient 19:2e0811512ceb 153 (tls_io_instance->x509certificate != NULL) &&
AzureIoTClient 19:2e0811512ceb 154 (OptionHandler_AddOption(result, SU_OPTION_X509_CERT, tls_io_instance->x509certificate) != 0)
AzureIoTClient 19:2e0811512ceb 155 )
AzureIoTClient 19:2e0811512ceb 156 {
AzureIoTClient 19:2e0811512ceb 157 LogError("unable to save x509certificate option");
AzureIoTClient 19:2e0811512ceb 158 OptionHandler_Destroy(result);
AzureIoTClient 19:2e0811512ceb 159 result = NULL;
AzureIoTClient 19:2e0811512ceb 160 }
AzureIoTClient 19:2e0811512ceb 161 else if (
AzureIoTClient 19:2e0811512ceb 162 (tls_io_instance->x509privatekey != NULL) &&
AzureIoTClient 19:2e0811512ceb 163 (OptionHandler_AddOption(result, SU_OPTION_X509_PRIVATE_KEY, tls_io_instance->x509privatekey) != 0)
AzureIoTClient 19:2e0811512ceb 164 )
AzureIoTClient 19:2e0811512ceb 165 {
AzureIoTClient 19:2e0811512ceb 166 LogError("unable to save x509privatekey option");
AzureIoTClient 19:2e0811512ceb 167 OptionHandler_Destroy(result);
AzureIoTClient 19:2e0811512ceb 168 result = NULL;
AzureIoTClient 19:2e0811512ceb 169 }
AzureIoTClient 19:2e0811512ceb 170 else if (
AzureIoTClient 19:2e0811512ceb 171 (tls_io_instance->x509privatekey != NULL) &&
AzureIoTClient 19:2e0811512ceb 172 (OptionHandler_AddOption(result, "TrustedCerts", tls_io_instance->certificate) != 0)
AzureIoTClient 19:2e0811512ceb 173 )
AzureIoTClient 19:2e0811512ceb 174 {
AzureIoTClient 19:2e0811512ceb 175 LogError("unable to save TrustedCerts option");
AzureIoTClient 19:2e0811512ceb 176 OptionHandler_Destroy(result);
AzureIoTClient 19:2e0811512ceb 177 result = NULL;
AzureIoTClient 19:2e0811512ceb 178 }
AzureIoTClient 19:2e0811512ceb 179 else
AzureIoTClient 19:2e0811512ceb 180 {
AzureIoTClient 19:2e0811512ceb 181 /*all is fine, all interesting options have been saved*/
AzureIoTClient 19:2e0811512ceb 182 /*return as is*/
AzureIoTClient 19:2e0811512ceb 183 }
AzureIoTClient 19:2e0811512ceb 184 }
AzureIoTClient 10:1be0bc9a9deb 185 }
AzureIoTClient 19:2e0811512ceb 186
AzureIoTClient 10:1be0bc9a9deb 187 return result;
AzureIoTClient 10:1be0bc9a9deb 188 }
AzureIoTClient 10:1be0bc9a9deb 189
Azure.IoT Build 0:fa2de1b79154 190 static const IO_INTERFACE_DESCRIPTION tlsio_wolfssl_interface_description =
Azure.IoT Build 0:fa2de1b79154 191 {
AzureIoTClient 10:1be0bc9a9deb 192 tlsio_wolfssl_retrieveoptions,
Azure.IoT Build 0:fa2de1b79154 193 tlsio_wolfssl_create,
Azure.IoT Build 0:fa2de1b79154 194 tlsio_wolfssl_destroy,
Azure.IoT Build 0:fa2de1b79154 195 tlsio_wolfssl_open,
Azure.IoT Build 0:fa2de1b79154 196 tlsio_wolfssl_close,
Azure.IoT Build 0:fa2de1b79154 197 tlsio_wolfssl_send,
Azure.IoT Build 0:fa2de1b79154 198 tlsio_wolfssl_dowork,
Azure.IoT Build 0:fa2de1b79154 199 tlsio_wolfssl_setoption
Azure.IoT Build 0:fa2de1b79154 200 };
Azure.IoT Build 0:fa2de1b79154 201
Azure.IoT Build 0:fa2de1b79154 202 static void indicate_error(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 0:fa2de1b79154 203 {
Azure.IoT Build 0:fa2de1b79154 204 if (tls_io_instance->on_io_error != NULL)
Azure.IoT Build 0:fa2de1b79154 205 {
Azure.IoT Build 0:fa2de1b79154 206 tls_io_instance->on_io_error(tls_io_instance->on_io_error_context);
Azure.IoT Build 0:fa2de1b79154 207 }
Azure.IoT Build 0:fa2de1b79154 208 }
Azure.IoT Build 0:fa2de1b79154 209
Azure.IoT Build 0:fa2de1b79154 210 static void indicate_open_complete(TLS_IO_INSTANCE* tls_io_instance, IO_OPEN_RESULT open_result)
Azure.IoT Build 0:fa2de1b79154 211 {
Azure.IoT Build 0:fa2de1b79154 212 if (tls_io_instance->on_io_open_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 213 {
Azure.IoT Build 0:fa2de1b79154 214 tls_io_instance->on_io_open_complete(tls_io_instance->on_io_open_complete_context, open_result);
Azure.IoT Build 0:fa2de1b79154 215 }
Azure.IoT Build 0:fa2de1b79154 216 }
Azure.IoT Build 0:fa2de1b79154 217
Azure.IoT Build 0:fa2de1b79154 218 static int decode_ssl_received_bytes(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 0:fa2de1b79154 219 {
Azure.IoT Build 0:fa2de1b79154 220 int result = 0;
Azure.IoT Build 0:fa2de1b79154 221 unsigned char buffer[64];
Azure.IoT Build 0:fa2de1b79154 222
Azure.IoT Build 0:fa2de1b79154 223 int rcv_bytes = 1;
Azure.IoT Build 0:fa2de1b79154 224 while (rcv_bytes > 0)
Azure.IoT Build 0:fa2de1b79154 225 {
Azure.IoT Build 0:fa2de1b79154 226 rcv_bytes = wolfSSL_read(tls_io_instance->ssl, buffer, sizeof(buffer));
Azure.IoT Build 0:fa2de1b79154 227 if (rcv_bytes > 0)
Azure.IoT Build 0:fa2de1b79154 228 {
Azure.IoT Build 0:fa2de1b79154 229 if (tls_io_instance->on_bytes_received != NULL)
Azure.IoT Build 0:fa2de1b79154 230 {
Azure.IoT Build 0:fa2de1b79154 231 tls_io_instance->on_bytes_received(tls_io_instance->on_bytes_received_context, buffer, rcv_bytes);
Azure.IoT Build 0:fa2de1b79154 232 }
Azure.IoT Build 0:fa2de1b79154 233 }
Azure.IoT Build 0:fa2de1b79154 234 }
Azure.IoT Build 0:fa2de1b79154 235
Azure.IoT Build 0:fa2de1b79154 236 return result;
Azure.IoT Build 0:fa2de1b79154 237 }
Azure.IoT Build 0:fa2de1b79154 238
Azure.IoT Build 0:fa2de1b79154 239 static void on_underlying_io_open_complete(void* context, IO_OPEN_RESULT open_result)
Azure.IoT Build 0:fa2de1b79154 240 {
Azure.IoT Build 0:fa2de1b79154 241 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 242
Azure.IoT Build 0:fa2de1b79154 243 if (open_result != IO_OPEN_OK)
Azure.IoT Build 0:fa2de1b79154 244 {
AzureIoTClient 19:2e0811512ceb 245 LogError("Underlying IO open failed");
Azure.IoT Build 0:fa2de1b79154 246 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 247 indicate_open_complete(tls_io_instance, IO_OPEN_ERROR);
Azure.IoT Build 0:fa2de1b79154 248 }
Azure.IoT Build 0:fa2de1b79154 249 else
Azure.IoT Build 0:fa2de1b79154 250 {
Azure.IoT Build 0:fa2de1b79154 251 int res;
Azure.IoT Build 0:fa2de1b79154 252 tls_io_instance->tlsio_state = TLSIO_STATE_IN_HANDSHAKE;
Azure.IoT Build 0:fa2de1b79154 253
Azure.IoT Build 0:fa2de1b79154 254 res = wolfSSL_connect(tls_io_instance->ssl);
Azure.IoT Build 0:fa2de1b79154 255 if (res != SSL_SUCCESS)
Azure.IoT Build 0:fa2de1b79154 256 {
AzureIoTClient 19:2e0811512ceb 257 LogError("WolfSSL connect failed");
Azure.IoT Build 0:fa2de1b79154 258 indicate_open_complete(tls_io_instance, IO_OPEN_ERROR);
Azure.IoT Build 6:c55b013dfc2a 259 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 260 }
Azure.IoT Build 0:fa2de1b79154 261 }
Azure.IoT Build 0:fa2de1b79154 262 }
Azure.IoT Build 0:fa2de1b79154 263
Azure.IoT Build 0:fa2de1b79154 264 static void on_underlying_io_bytes_received(void* context, const unsigned char* buffer, size_t size)
Azure.IoT Build 0:fa2de1b79154 265 {
Azure.IoT Build 0:fa2de1b79154 266 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 267
Azure.IoT Build 0:fa2de1b79154 268 unsigned char* new_socket_io_read_bytes = (unsigned char*)realloc(tls_io_instance->socket_io_read_bytes, tls_io_instance->socket_io_read_byte_count + size);
Azure.IoT Build 0:fa2de1b79154 269 if (new_socket_io_read_bytes == NULL)
Azure.IoT Build 0:fa2de1b79154 270 {
AzureIoTClient 19:2e0811512ceb 271 LogError("Failed allocating memory for received bytes");
Azure.IoT Build 0:fa2de1b79154 272 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 273 indicate_error(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 274 }
Azure.IoT Build 0:fa2de1b79154 275 else
Azure.IoT Build 0:fa2de1b79154 276 {
Azure.IoT Build 0:fa2de1b79154 277 tls_io_instance->socket_io_read_bytes = new_socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 278 (void)memcpy(tls_io_instance->socket_io_read_bytes + tls_io_instance->socket_io_read_byte_count, buffer, size);
Azure.IoT Build 0:fa2de1b79154 279 tls_io_instance->socket_io_read_byte_count += size;
Azure.IoT Build 0:fa2de1b79154 280 }
Azure.IoT Build 0:fa2de1b79154 281 }
Azure.IoT Build 0:fa2de1b79154 282
Azure.IoT Build 0:fa2de1b79154 283 static void on_underlying_io_error(void* context)
Azure.IoT Build 0:fa2de1b79154 284 {
Azure.IoT Build 0:fa2de1b79154 285 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 286
Azure.IoT Build 0:fa2de1b79154 287 switch (tls_io_instance->tlsio_state)
Azure.IoT Build 0:fa2de1b79154 288 {
AzureIoTClient 15:956c6d205aa7 289 default:
AzureIoTClient 19:2e0811512ceb 290 LogError("Unknown TLS IO WolfSSL state: %d", (int)tls_io_instance->tlsio_state);
AzureIoTClient 19:2e0811512ceb 291 break;
AzureIoTClient 19:2e0811512ceb 292
AzureIoTClient 15:956c6d205aa7 293 case TLSIO_STATE_NOT_OPEN:
AzureIoTClient 15:956c6d205aa7 294 case TLSIO_STATE_ERROR:
AzureIoTClient 15:956c6d205aa7 295 break;
Azure.IoT Build 0:fa2de1b79154 296
AzureIoTClient 15:956c6d205aa7 297 case TLSIO_STATE_OPENING_UNDERLYING_IO:
AzureIoTClient 15:956c6d205aa7 298 case TLSIO_STATE_IN_HANDSHAKE:
AzureIoTClient 15:956c6d205aa7 299 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
AzureIoTClient 15:956c6d205aa7 300 indicate_open_complete(tls_io_instance, IO_OPEN_ERROR);
AzureIoTClient 15:956c6d205aa7 301 break;
Azure.IoT Build 0:fa2de1b79154 302
AzureIoTClient 15:956c6d205aa7 303 case TLSIO_STATE_OPEN:
AzureIoTClient 15:956c6d205aa7 304 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
AzureIoTClient 15:956c6d205aa7 305 indicate_error(tls_io_instance);
AzureIoTClient 15:956c6d205aa7 306 break;
Azure.IoT Build 0:fa2de1b79154 307 }
Azure.IoT Build 0:fa2de1b79154 308 }
Azure.IoT Build 0:fa2de1b79154 309
Azure.IoT Build 0:fa2de1b79154 310 static void on_underlying_io_close_complete(void* context)
Azure.IoT Build 0:fa2de1b79154 311 {
Azure.IoT Build 0:fa2de1b79154 312 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 313
AzureIoTClient 19:2e0811512ceb 314 if (tls_io_instance->tlsio_state != TLSIO_STATE_CLOSING)
AzureIoTClient 19:2e0811512ceb 315 {
AzureIoTClient 19:2e0811512ceb 316 LogError("on_underlying_io_close_complete called when not in CLOSING state");
AzureIoTClient 19:2e0811512ceb 317 }
AzureIoTClient 19:2e0811512ceb 318 else
Azure.IoT Build 0:fa2de1b79154 319 {
Azure.IoT Build 0:fa2de1b79154 320 if (tls_io_instance->on_io_close_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 321 {
Azure.IoT Build 0:fa2de1b79154 322 tls_io_instance->on_io_close_complete(tls_io_instance->on_io_close_complete_context);
Azure.IoT Build 0:fa2de1b79154 323 }
Azure.IoT Build 6:c55b013dfc2a 324 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 0:fa2de1b79154 325 }
Azure.IoT Build 0:fa2de1b79154 326 }
Azure.IoT Build 0:fa2de1b79154 327
Azure.IoT Build 0:fa2de1b79154 328 static int on_io_recv(WOLFSSL *ssl, char *buf, int sz, void *context)
Azure.IoT Build 0:fa2de1b79154 329 {
Azure.IoT Build 0:fa2de1b79154 330 int result;
Azure.IoT Build 0:fa2de1b79154 331 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 332 unsigned char* new_socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 333
AzureIoTClient 15:956c6d205aa7 334 (void)ssl;
Azure.IoT Build 0:fa2de1b79154 335 while (tls_io_instance->socket_io_read_byte_count == 0)
Azure.IoT Build 0:fa2de1b79154 336 {
Azure.IoT Build 0:fa2de1b79154 337 xio_dowork(tls_io_instance->socket_io);
Azure.IoT Build 6:c55b013dfc2a 338 if (tls_io_instance->tlsio_state != TLSIO_STATE_IN_HANDSHAKE)
Azure.IoT Build 0:fa2de1b79154 339 {
Azure.IoT Build 0:fa2de1b79154 340 break;
Azure.IoT Build 0:fa2de1b79154 341 }
Azure.IoT Build 0:fa2de1b79154 342 }
Azure.IoT Build 0:fa2de1b79154 343
Azure.IoT Build 0:fa2de1b79154 344 result = tls_io_instance->socket_io_read_byte_count;
Azure.IoT Build 0:fa2de1b79154 345 if (result > sz)
Azure.IoT Build 0:fa2de1b79154 346 {
Azure.IoT Build 0:fa2de1b79154 347 result = sz;
Azure.IoT Build 0:fa2de1b79154 348 }
Azure.IoT Build 0:fa2de1b79154 349
Azure.IoT Build 0:fa2de1b79154 350 if (result > 0)
Azure.IoT Build 0:fa2de1b79154 351 {
Azure.IoT Build 0:fa2de1b79154 352 (void)memcpy(buf, tls_io_instance->socket_io_read_bytes, result);
Azure.IoT Build 0:fa2de1b79154 353 (void)memmove(tls_io_instance->socket_io_read_bytes, tls_io_instance->socket_io_read_bytes + result, tls_io_instance->socket_io_read_byte_count - result);
Azure.IoT Build 0:fa2de1b79154 354 tls_io_instance->socket_io_read_byte_count -= result;
Azure.IoT Build 0:fa2de1b79154 355 if (tls_io_instance->socket_io_read_byte_count > 0)
Azure.IoT Build 0:fa2de1b79154 356 {
Azure.IoT Build 0:fa2de1b79154 357 new_socket_io_read_bytes = (unsigned char*)realloc(tls_io_instance->socket_io_read_bytes, tls_io_instance->socket_io_read_byte_count);
Azure.IoT Build 0:fa2de1b79154 358 if (new_socket_io_read_bytes != NULL)
Azure.IoT Build 0:fa2de1b79154 359 {
Azure.IoT Build 0:fa2de1b79154 360 tls_io_instance->socket_io_read_bytes = new_socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 361 }
Azure.IoT Build 0:fa2de1b79154 362 }
Azure.IoT Build 0:fa2de1b79154 363 else
Azure.IoT Build 0:fa2de1b79154 364 {
Azure.IoT Build 0:fa2de1b79154 365 free(tls_io_instance->socket_io_read_bytes);
Azure.IoT Build 0:fa2de1b79154 366 tls_io_instance->socket_io_read_bytes = NULL;
Azure.IoT Build 0:fa2de1b79154 367 }
Azure.IoT Build 0:fa2de1b79154 368 }
Azure.IoT Build 0:fa2de1b79154 369
Azure.IoT Build 0:fa2de1b79154 370 if ((result == 0) && (tls_io_instance->tlsio_state == TLSIO_STATE_OPEN))
Azure.IoT Build 0:fa2de1b79154 371 {
Azure.IoT Build 0:fa2de1b79154 372 result = WOLFSSL_CBIO_ERR_WANT_READ;
Azure.IoT Build 0:fa2de1b79154 373 }
Azure.IoT Build 6:c55b013dfc2a 374 else if ((result == 0) && tls_io_instance->tlsio_state == TLSIO_STATE_CLOSING)
Azure.IoT Build 6:c55b013dfc2a 375 {
Azure.IoT Build 6:c55b013dfc2a 376 result = WOLFSSL_CBIO_ERR_CONN_CLOSE;
Azure.IoT Build 6:c55b013dfc2a 377 }
Azure.IoT Build 0:fa2de1b79154 378
Azure.IoT Build 0:fa2de1b79154 379 return result;
Azure.IoT Build 0:fa2de1b79154 380 }
Azure.IoT Build 0:fa2de1b79154 381
Azure.IoT Build 0:fa2de1b79154 382 static int on_io_send(WOLFSSL *ssl, char *buf, int sz, void *context)
Azure.IoT Build 0:fa2de1b79154 383 {
Azure.IoT Build 0:fa2de1b79154 384 int result;
Azure.IoT Build 0:fa2de1b79154 385 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 386
AzureIoTClient 15:956c6d205aa7 387 (void)ssl;
Azure.IoT Build 0:fa2de1b79154 388 if (xio_send(tls_io_instance->socket_io, buf, sz, tls_io_instance->on_send_complete, tls_io_instance->on_send_complete_callback_context) != 0)
Azure.IoT Build 0:fa2de1b79154 389 {
AzureIoTClient 19:2e0811512ceb 390 LogError("Failed sending bytes through underlying IO");
Azure.IoT Build 0:fa2de1b79154 391 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 392 indicate_error(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 393 result = 0;
Azure.IoT Build 0:fa2de1b79154 394 }
Azure.IoT Build 0:fa2de1b79154 395 else
Azure.IoT Build 0:fa2de1b79154 396 {
Azure.IoT Build 0:fa2de1b79154 397 result = sz;
Azure.IoT Build 0:fa2de1b79154 398 }
Azure.IoT Build 0:fa2de1b79154 399
Azure.IoT Build 0:fa2de1b79154 400 return result;
Azure.IoT Build 0:fa2de1b79154 401 }
Azure.IoT Build 0:fa2de1b79154 402
Azure.IoT Build 0:fa2de1b79154 403 static int on_handshake_done(WOLFSSL* ssl, void* context)
Azure.IoT Build 0:fa2de1b79154 404 {
Azure.IoT Build 0:fa2de1b79154 405 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
AzureIoTClient 15:956c6d205aa7 406 (void)ssl;
AzureIoTClient 19:2e0811512ceb 407 if (tls_io_instance->tlsio_state != TLSIO_STATE_IN_HANDSHAKE)
AzureIoTClient 19:2e0811512ceb 408 {
AzureIoTClient 19:2e0811512ceb 409 LogInfo("on_handshake_done called when not in IN_HANDSHAKE state");
AzureIoTClient 19:2e0811512ceb 410 }
AzureIoTClient 19:2e0811512ceb 411 else
Azure.IoT Build 0:fa2de1b79154 412 {
Azure.IoT Build 0:fa2de1b79154 413 tls_io_instance->tlsio_state = TLSIO_STATE_OPEN;
Azure.IoT Build 0:fa2de1b79154 414 indicate_open_complete(tls_io_instance, IO_OPEN_OK);
Azure.IoT Build 0:fa2de1b79154 415 }
Azure.IoT Build 0:fa2de1b79154 416
Azure.IoT Build 0:fa2de1b79154 417 return 0;
Azure.IoT Build 0:fa2de1b79154 418 }
Azure.IoT Build 0:fa2de1b79154 419
Azure.IoT Build 6:c55b013dfc2a 420 static int add_certificate_to_store(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 6:c55b013dfc2a 421 {
Azure.IoT Build 6:c55b013dfc2a 422 int result;
Azure.IoT Build 6:c55b013dfc2a 423 if (tls_io_instance->certificate != NULL)
Azure.IoT Build 6:c55b013dfc2a 424 {
AzureIoTClient 15:956c6d205aa7 425 int res = wolfSSL_CTX_load_verify_buffer(tls_io_instance->ssl_context, (const unsigned char*)tls_io_instance->certificate, strlen(tls_io_instance->certificate) + 1, SSL_FILETYPE_PEM);
Azure.IoT Build 6:c55b013dfc2a 426 if (res != SSL_SUCCESS)
Azure.IoT Build 6:c55b013dfc2a 427 {
AzureIoTClient 19:2e0811512ceb 428 LogError("wolfSSL_CTX_load_verify_buffer failed");
Azure.IoT Build 6:c55b013dfc2a 429 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 430 }
Azure.IoT Build 6:c55b013dfc2a 431 else
Azure.IoT Build 6:c55b013dfc2a 432 {
Azure.IoT Build 6:c55b013dfc2a 433 result = 0;
Azure.IoT Build 6:c55b013dfc2a 434 }
Azure.IoT Build 6:c55b013dfc2a 435 }
Azure.IoT Build 6:c55b013dfc2a 436 else
Azure.IoT Build 6:c55b013dfc2a 437 {
Azure.IoT Build 6:c55b013dfc2a 438 result = 0;
Azure.IoT Build 6:c55b013dfc2a 439 }
Azure.IoT Build 6:c55b013dfc2a 440 return result;
Azure.IoT Build 6:c55b013dfc2a 441 }
Azure.IoT Build 6:c55b013dfc2a 442
AzureIoTClient 15:956c6d205aa7 443 static int x509_wolfssl_add_credentials(WOLFSSL* ssl, char* x509certificate, char* x509privatekey) {
AzureIoTClient 15:956c6d205aa7 444
AzureIoTClient 15:956c6d205aa7 445 int result;
AzureIoTClient 15:956c6d205aa7 446
AzureIoTClient 15:956c6d205aa7 447 if (wolfSSL_use_certificate_buffer(ssl, (unsigned char*)x509certificate, strlen(x509certificate) + 1, SSL_FILETYPE_PEM) != SSL_SUCCESS)
AzureIoTClient 15:956c6d205aa7 448 {
AzureIoTClient 15:956c6d205aa7 449 LogError("unable to load x509 client certificate");
AzureIoTClient 15:956c6d205aa7 450 result = __LINE__;
AzureIoTClient 15:956c6d205aa7 451 }
AzureIoTClient 15:956c6d205aa7 452 else if (wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)x509privatekey, strlen(x509privatekey) + 1, SSL_FILETYPE_PEM) != SSL_SUCCESS)
AzureIoTClient 15:956c6d205aa7 453 {
AzureIoTClient 15:956c6d205aa7 454 LogError("unable to load x509 client private key");
AzureIoTClient 15:956c6d205aa7 455 result = __LINE__;
AzureIoTClient 15:956c6d205aa7 456 }
AzureIoTClient 15:956c6d205aa7 457 #ifdef HAVE_SECURE_RENEGOTIATION
AzureIoTClient 19:2e0811512ceb 458 else if (wolfSSL_UseSecureRenegotiation(ssl) != SSL_SUCCESS)
AzureIoTClient 19:2e0811512ceb 459 {
AzureIoTClient 15:956c6d205aa7 460 LogError("unable to enable secure renegotiation");
AzureIoTClient 15:956c6d205aa7 461 result = __LINE__;
AzureIoTClient 15:956c6d205aa7 462 }
AzureIoTClient 15:956c6d205aa7 463 #endif
AzureIoTClient 15:956c6d205aa7 464 else
AzureIoTClient 15:956c6d205aa7 465 {
AzureIoTClient 15:956c6d205aa7 466 result = 0;
AzureIoTClient 15:956c6d205aa7 467 }
AzureIoTClient 15:956c6d205aa7 468 return result;
AzureIoTClient 15:956c6d205aa7 469 }
AzureIoTClient 15:956c6d205aa7 470
AzureIoTClient 15:956c6d205aa7 471 static void destroy_wolfssl_instance(TLS_IO_INSTANCE* tls_io_instance)
AzureIoTClient 15:956c6d205aa7 472 {
AzureIoTClient 15:956c6d205aa7 473 wolfSSL_free(tls_io_instance->ssl);
AzureIoTClient 15:956c6d205aa7 474 }
AzureIoTClient 15:956c6d205aa7 475
Azure.IoT Build 6:c55b013dfc2a 476 static int create_wolfssl_instance(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 6:c55b013dfc2a 477 {
Azure.IoT Build 6:c55b013dfc2a 478 int result;
Azure.IoT Build 6:c55b013dfc2a 479
Azure.IoT Build 6:c55b013dfc2a 480 if (add_certificate_to_store(tls_io_instance) != 0)
Azure.IoT Build 6:c55b013dfc2a 481 {
AzureIoTClient 19:2e0811512ceb 482 LogError("Failed to add certificates to store");
Azure.IoT Build 6:c55b013dfc2a 483 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 484 }
Azure.IoT Build 6:c55b013dfc2a 485 else
Azure.IoT Build 6:c55b013dfc2a 486 {
Azure.IoT Build 6:c55b013dfc2a 487 tls_io_instance->ssl = wolfSSL_new(tls_io_instance->ssl_context);
Azure.IoT Build 6:c55b013dfc2a 488 if (tls_io_instance->ssl == NULL)
Azure.IoT Build 6:c55b013dfc2a 489 {
AzureIoTClient 19:2e0811512ceb 490 LogError("Failed to add certificates to store");
Azure.IoT Build 6:c55b013dfc2a 491 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 492 }
AzureIoTClient 15:956c6d205aa7 493 /*x509 authentication can only be build before underlying connection is realized*/
AzureIoTClient 15:956c6d205aa7 494 else if ((tls_io_instance->x509certificate != NULL) &&
AzureIoTClient 15:956c6d205aa7 495 (tls_io_instance->x509privatekey != NULL) &&
AzureIoTClient 15:956c6d205aa7 496 (x509_wolfssl_add_credentials(tls_io_instance->ssl, tls_io_instance->x509certificate, tls_io_instance->x509privatekey) != 0))
AzureIoTClient 15:956c6d205aa7 497 {
AzureIoTClient 15:956c6d205aa7 498 destroy_wolfssl_instance(tls_io_instance);
AzureIoTClient 15:956c6d205aa7 499 LogError("unable to use x509 authentication");
AzureIoTClient 15:956c6d205aa7 500 result = __LINE__;
AzureIoTClient 15:956c6d205aa7 501 }
Azure.IoT Build 6:c55b013dfc2a 502 else
Azure.IoT Build 6:c55b013dfc2a 503 {
Azure.IoT Build 6:c55b013dfc2a 504 tls_io_instance->socket_io_read_bytes = NULL;
Azure.IoT Build 6:c55b013dfc2a 505 tls_io_instance->socket_io_read_byte_count = 0;
Azure.IoT Build 6:c55b013dfc2a 506 tls_io_instance->on_send_complete = NULL;
Azure.IoT Build 6:c55b013dfc2a 507 tls_io_instance->on_send_complete_callback_context = NULL;
Azure.IoT Build 6:c55b013dfc2a 508
Azure.IoT Build 6:c55b013dfc2a 509 wolfSSL_set_using_nonblock(tls_io_instance->ssl, 1);
Azure.IoT Build 6:c55b013dfc2a 510 wolfSSL_SetIOSend(tls_io_instance->ssl_context, on_io_send);
Azure.IoT Build 6:c55b013dfc2a 511 wolfSSL_SetIORecv(tls_io_instance->ssl_context, on_io_recv);
Azure.IoT Build 6:c55b013dfc2a 512 wolfSSL_SetHsDoneCb(tls_io_instance->ssl, on_handshake_done, tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 513 wolfSSL_SetIOWriteCtx(tls_io_instance->ssl, tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 514 wolfSSL_SetIOReadCtx(tls_io_instance->ssl, tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 515
Azure.IoT Build 6:c55b013dfc2a 516 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 6:c55b013dfc2a 517 result = 0;
Azure.IoT Build 6:c55b013dfc2a 518 }
Azure.IoT Build 6:c55b013dfc2a 519 }
AzureIoTClient 19:2e0811512ceb 520
Azure.IoT Build 6:c55b013dfc2a 521 return result;
Azure.IoT Build 6:c55b013dfc2a 522 }
Azure.IoT Build 6:c55b013dfc2a 523
Azure.IoT Build 0:fa2de1b79154 524 int tlsio_wolfssl_init(void)
Azure.IoT Build 0:fa2de1b79154 525 {
Azure.IoT Build 0:fa2de1b79154 526 (void)wolfSSL_library_init();
Azure.IoT Build 0:fa2de1b79154 527 wolfSSL_load_error_strings();
Azure.IoT Build 0:fa2de1b79154 528
Azure.IoT Build 0:fa2de1b79154 529 return 0;
Azure.IoT Build 0:fa2de1b79154 530 }
Azure.IoT Build 0:fa2de1b79154 531
Azure.IoT Build 0:fa2de1b79154 532 void tlsio_wolfssl_deinit(void)
Azure.IoT Build 0:fa2de1b79154 533 {
Azure.IoT Build 0:fa2de1b79154 534 }
Azure.IoT Build 0:fa2de1b79154 535
Azure.IoT Build 6:c55b013dfc2a 536 CONCRETE_IO_HANDLE tlsio_wolfssl_create(void* io_create_parameters)
Azure.IoT Build 0:fa2de1b79154 537 {
Azure.IoT Build 0:fa2de1b79154 538 TLS_IO_INSTANCE* result;
Azure.IoT Build 0:fa2de1b79154 539
AzureIoTClient 19:2e0811512ceb 540 if (io_create_parameters == NULL)
Azure.IoT Build 0:fa2de1b79154 541 {
AzureIoTClient 19:2e0811512ceb 542 LogError("NULL io_create_parameters");
Azure.IoT Build 0:fa2de1b79154 543 result = NULL;
Azure.IoT Build 0:fa2de1b79154 544 }
Azure.IoT Build 0:fa2de1b79154 545 else
Azure.IoT Build 0:fa2de1b79154 546 {
AzureIoTClient 19:2e0811512ceb 547 TLSIO_CONFIG* tls_io_config = io_create_parameters;
AzureIoTClient 19:2e0811512ceb 548
Azure.IoT Build 6:c55b013dfc2a 549 result = (TLS_IO_INSTANCE*)malloc(sizeof(TLS_IO_INSTANCE));
Azure.IoT Build 0:fa2de1b79154 550 if (result != NULL)
Azure.IoT Build 0:fa2de1b79154 551 {
Azure.IoT Build 6:c55b013dfc2a 552 memset(result, 0, sizeof(TLS_IO_INSTANCE));
AzureIoTClient 19:2e0811512ceb 553 if (mallocAndStrcpy_s(&result->hostname, tls_io_config->hostname) != 0)
Azure.IoT Build 0:fa2de1b79154 554 {
AzureIoTClient 19:2e0811512ceb 555 LogError("Cannot copy the hostname");
Azure.IoT Build 0:fa2de1b79154 556 free(result);
Azure.IoT Build 0:fa2de1b79154 557 result = NULL;
Azure.IoT Build 0:fa2de1b79154 558 }
Azure.IoT Build 0:fa2de1b79154 559 else
Azure.IoT Build 0:fa2de1b79154 560 {
AzureIoTClient 19:2e0811512ceb 561 result->port = tls_io_config->port;
AzureIoTClient 19:2e0811512ceb 562
AzureIoTClient 19:2e0811512ceb 563 result->socket_io_read_bytes = 0;
AzureIoTClient 19:2e0811512ceb 564 result->socket_io_read_byte_count = 0;
AzureIoTClient 19:2e0811512ceb 565 result->socket_io = NULL;
AzureIoTClient 19:2e0811512ceb 566
AzureIoTClient 19:2e0811512ceb 567 result->ssl = NULL;
AzureIoTClient 19:2e0811512ceb 568 result->certificate = NULL;
AzureIoTClient 19:2e0811512ceb 569 result->x509certificate = NULL;
AzureIoTClient 19:2e0811512ceb 570 result->x509privatekey = NULL;
AzureIoTClient 19:2e0811512ceb 571
AzureIoTClient 19:2e0811512ceb 572 result->on_bytes_received = NULL;
AzureIoTClient 19:2e0811512ceb 573 result->on_bytes_received_context = NULL;
AzureIoTClient 19:2e0811512ceb 574
AzureIoTClient 19:2e0811512ceb 575 result->on_io_open_complete = NULL;
AzureIoTClient 19:2e0811512ceb 576 result->on_io_open_complete_context = NULL;
AzureIoTClient 19:2e0811512ceb 577
AzureIoTClient 19:2e0811512ceb 578 result->on_io_close_complete = NULL;
AzureIoTClient 19:2e0811512ceb 579 result->on_io_close_complete_context = NULL;
AzureIoTClient 19:2e0811512ceb 580
AzureIoTClient 19:2e0811512ceb 581 result->on_io_error = NULL;
AzureIoTClient 19:2e0811512ceb 582 result->on_io_error_context = NULL;
AzureIoTClient 19:2e0811512ceb 583
AzureIoTClient 19:2e0811512ceb 584 result->tlsio_state = TLSIO_STATE_NOT_OPEN;
AzureIoTClient 19:2e0811512ceb 585
AzureIoTClient 19:2e0811512ceb 586 result->ssl_context = wolfSSL_CTX_new(wolfTLSv1_client_method());
AzureIoTClient 19:2e0811512ceb 587 if (result->ssl_context == NULL)
Azure.IoT Build 0:fa2de1b79154 588 {
AzureIoTClient 19:2e0811512ceb 589 LogError("Cannot create the wolfSSL context");
AzureIoTClient 19:2e0811512ceb 590 free(result->hostname);
Azure.IoT Build 0:fa2de1b79154 591 free(result);
Azure.IoT Build 0:fa2de1b79154 592 result = NULL;
Azure.IoT Build 0:fa2de1b79154 593 }
Azure.IoT Build 0:fa2de1b79154 594 else
Azure.IoT Build 0:fa2de1b79154 595 {
AzureIoTClient 19:2e0811512ceb 596 const IO_INTERFACE_DESCRIPTION* socket_io_interface = socketio_get_interface_description();
AzureIoTClient 19:2e0811512ceb 597 if (socket_io_interface == NULL)
Azure.IoT Build 0:fa2de1b79154 598 {
Azure.IoT Build 0:fa2de1b79154 599 wolfSSL_CTX_free(result->ssl_context);
AzureIoTClient 19:2e0811512ceb 600 free(result->hostname);
Azure.IoT Build 0:fa2de1b79154 601 free(result);
Azure.IoT Build 0:fa2de1b79154 602 result = NULL;
Azure.IoT Build 0:fa2de1b79154 603 }
AzureIoTClient 19:2e0811512ceb 604 else
AzureIoTClient 19:2e0811512ceb 605 {
AzureIoTClient 19:2e0811512ceb 606 SOCKETIO_CONFIG socketio_config;
AzureIoTClient 19:2e0811512ceb 607 socketio_config.hostname = result->hostname;
AzureIoTClient 19:2e0811512ceb 608 socketio_config.port = result->port;
AzureIoTClient 19:2e0811512ceb 609 socketio_config.accepted_socket = NULL;
AzureIoTClient 19:2e0811512ceb 610
AzureIoTClient 19:2e0811512ceb 611 result->socket_io = xio_create(socket_io_interface, &socketio_config);
AzureIoTClient 19:2e0811512ceb 612 if (result->socket_io == NULL)
AzureIoTClient 19:2e0811512ceb 613 {
AzureIoTClient 19:2e0811512ceb 614 LogError("Failure connecting to underlying socket_io");
AzureIoTClient 19:2e0811512ceb 615 wolfSSL_CTX_free(result->ssl_context);
AzureIoTClient 19:2e0811512ceb 616 free(result->hostname);
AzureIoTClient 19:2e0811512ceb 617 free(result);
AzureIoTClient 19:2e0811512ceb 618 result = NULL;
AzureIoTClient 19:2e0811512ceb 619 }
AzureIoTClient 19:2e0811512ceb 620 }
Azure.IoT Build 0:fa2de1b79154 621 }
Azure.IoT Build 0:fa2de1b79154 622 }
Azure.IoT Build 0:fa2de1b79154 623 }
Azure.IoT Build 0:fa2de1b79154 624 }
Azure.IoT Build 0:fa2de1b79154 625
Azure.IoT Build 0:fa2de1b79154 626 return result;
Azure.IoT Build 0:fa2de1b79154 627 }
Azure.IoT Build 0:fa2de1b79154 628
Azure.IoT Build 0:fa2de1b79154 629 void tlsio_wolfssl_destroy(CONCRETE_IO_HANDLE tls_io)
Azure.IoT Build 0:fa2de1b79154 630 {
Azure.IoT Build 0:fa2de1b79154 631 if (tls_io != NULL)
Azure.IoT Build 0:fa2de1b79154 632 {
Azure.IoT Build 0:fa2de1b79154 633 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 634 if (tls_io_instance->socket_io_read_bytes != NULL)
Azure.IoT Build 0:fa2de1b79154 635 {
Azure.IoT Build 0:fa2de1b79154 636 free(tls_io_instance->socket_io_read_bytes);
Azure.IoT Build 0:fa2de1b79154 637 }
Azure.IoT Build 0:fa2de1b79154 638
Azure.IoT Build 6:c55b013dfc2a 639 if (tls_io_instance->certificate != NULL)
Azure.IoT Build 6:c55b013dfc2a 640 {
Azure.IoT Build 6:c55b013dfc2a 641 free(tls_io_instance->certificate);
Azure.IoT Build 6:c55b013dfc2a 642 }
AzureIoTClient 15:956c6d205aa7 643 if (tls_io_instance->x509certificate != NULL)
AzureIoTClient 15:956c6d205aa7 644 {
AzureIoTClient 15:956c6d205aa7 645 free(tls_io_instance->x509certificate);
AzureIoTClient 15:956c6d205aa7 646 }
AzureIoTClient 15:956c6d205aa7 647 if (tls_io_instance->x509privatekey != NULL)
AzureIoTClient 15:956c6d205aa7 648 {
AzureIoTClient 15:956c6d205aa7 649 free(tls_io_instance->x509privatekey);
AzureIoTClient 15:956c6d205aa7 650 }
AzureIoTClient 19:2e0811512ceb 651 if (tls_io_instance->hostname != NULL)
AzureIoTClient 19:2e0811512ceb 652 {
AzureIoTClient 19:2e0811512ceb 653 free(tls_io_instance->hostname);
AzureIoTClient 19:2e0811512ceb 654 }
AzureIoTClient 19:2e0811512ceb 655
Azure.IoT Build 6:c55b013dfc2a 656 wolfSSL_CTX_free(tls_io_instance->ssl_context);
Azure.IoT Build 0:fa2de1b79154 657 xio_destroy(tls_io_instance->socket_io);
Azure.IoT Build 0:fa2de1b79154 658 free(tls_io);
Azure.IoT Build 0:fa2de1b79154 659 }
Azure.IoT Build 0:fa2de1b79154 660 }
Azure.IoT Build 0:fa2de1b79154 661
Azure.IoT Build 0:fa2de1b79154 662 int tlsio_wolfssl_open(CONCRETE_IO_HANDLE tls_io, ON_IO_OPEN_COMPLETE on_io_open_complete, void* on_io_open_complete_context, ON_BYTES_RECEIVED on_bytes_received, void* on_bytes_received_context, ON_IO_ERROR on_io_error, void* on_io_error_context)
Azure.IoT Build 0:fa2de1b79154 663 {
Azure.IoT Build 0:fa2de1b79154 664 int result;
Azure.IoT Build 0:fa2de1b79154 665
Azure.IoT Build 0:fa2de1b79154 666 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 667 {
AzureIoTClient 19:2e0811512ceb 668 LogError("NULL tls_io instance");
Azure.IoT Build 0:fa2de1b79154 669 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 670 }
Azure.IoT Build 0:fa2de1b79154 671 else
Azure.IoT Build 0:fa2de1b79154 672 {
Azure.IoT Build 0:fa2de1b79154 673 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 674
Azure.IoT Build 0:fa2de1b79154 675 if (tls_io_instance->tlsio_state != TLSIO_STATE_NOT_OPEN)
Azure.IoT Build 0:fa2de1b79154 676 {
Azure.IoT Build 6:c55b013dfc2a 677 LogError("Invalid state encountered.");
Azure.IoT Build 0:fa2de1b79154 678 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 679 }
Azure.IoT Build 0:fa2de1b79154 680 else
Azure.IoT Build 0:fa2de1b79154 681 {
Azure.IoT Build 0:fa2de1b79154 682 tls_io_instance->on_bytes_received = on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 683 tls_io_instance->on_bytes_received_context = on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 684
Azure.IoT Build 0:fa2de1b79154 685 tls_io_instance->on_io_open_complete = on_io_open_complete;
Azure.IoT Build 0:fa2de1b79154 686 tls_io_instance->on_io_open_complete_context = on_io_open_complete_context;
Azure.IoT Build 0:fa2de1b79154 687
Azure.IoT Build 0:fa2de1b79154 688 tls_io_instance->on_io_error = on_io_error;
Azure.IoT Build 0:fa2de1b79154 689 tls_io_instance->on_io_error_context = on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 690
Azure.IoT Build 0:fa2de1b79154 691 tls_io_instance->tlsio_state = TLSIO_STATE_OPENING_UNDERLYING_IO;
Azure.IoT Build 0:fa2de1b79154 692
Azure.IoT Build 6:c55b013dfc2a 693 if (create_wolfssl_instance(tls_io_instance) != 0)
Azure.IoT Build 6:c55b013dfc2a 694 {
AzureIoTClient 19:2e0811512ceb 695 LogError("Cannot create wolfssl instance.");
Azure.IoT Build 6:c55b013dfc2a 696 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 6:c55b013dfc2a 697 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 698 }
Azure.IoT Build 6:c55b013dfc2a 699 else if (xio_open(tls_io_instance->socket_io, on_underlying_io_open_complete, tls_io_instance, on_underlying_io_bytes_received, tls_io_instance, on_underlying_io_error, tls_io_instance) != 0)
Azure.IoT Build 0:fa2de1b79154 700 {
AzureIoTClient 19:2e0811512ceb 701 LogError("Cannot open the underlying IO.");
Azure.IoT Build 0:fa2de1b79154 702 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 0:fa2de1b79154 703 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 704 }
Azure.IoT Build 0:fa2de1b79154 705 else
Azure.IoT Build 0:fa2de1b79154 706 {
Azure.IoT Build 6:c55b013dfc2a 707 // The state can get changed in the on_underlying_io_open_complete
AzureIoTClient 15:956c6d205aa7 708 if (tls_io_instance->tlsio_state != TLSIO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 709 {
Azure.IoT Build 6:c55b013dfc2a 710 LogError("Failed to connect to server. The certificates may not be correct.");
Azure.IoT Build 0:fa2de1b79154 711 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 712 }
Azure.IoT Build 0:fa2de1b79154 713 else
Azure.IoT Build 0:fa2de1b79154 714 {
AzureIoTClient 15:956c6d205aa7 715 result = 0;
Azure.IoT Build 0:fa2de1b79154 716 }
Azure.IoT Build 0:fa2de1b79154 717 }
Azure.IoT Build 0:fa2de1b79154 718 }
Azure.IoT Build 0:fa2de1b79154 719 }
Azure.IoT Build 0:fa2de1b79154 720
Azure.IoT Build 0:fa2de1b79154 721 return result;
Azure.IoT Build 0:fa2de1b79154 722 }
Azure.IoT Build 0:fa2de1b79154 723
Azure.IoT Build 0:fa2de1b79154 724 int tlsio_wolfssl_close(CONCRETE_IO_HANDLE tls_io, ON_IO_CLOSE_COMPLETE on_io_close_complete, void* callback_context)
Azure.IoT Build 0:fa2de1b79154 725 {
Azure.IoT Build 0:fa2de1b79154 726 int result = 0;
Azure.IoT Build 0:fa2de1b79154 727
Azure.IoT Build 0:fa2de1b79154 728 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 729 {
AzureIoTClient 19:2e0811512ceb 730 LogError("NULL tls_io handle.");
Azure.IoT Build 0:fa2de1b79154 731 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 732 }
Azure.IoT Build 0:fa2de1b79154 733 else
Azure.IoT Build 0:fa2de1b79154 734 {
Azure.IoT Build 0:fa2de1b79154 735 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 736
Azure.IoT Build 0:fa2de1b79154 737 if ((tls_io_instance->tlsio_state == TLSIO_STATE_NOT_OPEN) ||
Azure.IoT Build 0:fa2de1b79154 738 (tls_io_instance->tlsio_state == TLSIO_STATE_CLOSING))
Azure.IoT Build 0:fa2de1b79154 739 {
AzureIoTClient 19:2e0811512ceb 740 LogError("Close called while not open.");
Azure.IoT Build 0:fa2de1b79154 741 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 742 }
Azure.IoT Build 0:fa2de1b79154 743 else
Azure.IoT Build 0:fa2de1b79154 744 {
Azure.IoT Build 0:fa2de1b79154 745 tls_io_instance->tlsio_state = TLSIO_STATE_CLOSING;
Azure.IoT Build 0:fa2de1b79154 746 tls_io_instance->on_io_close_complete = on_io_close_complete;
Azure.IoT Build 0:fa2de1b79154 747 tls_io_instance->on_io_close_complete_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 748
Azure.IoT Build 0:fa2de1b79154 749 if (xio_close(tls_io_instance->socket_io, on_underlying_io_close_complete, tls_io_instance) != 0)
Azure.IoT Build 0:fa2de1b79154 750 {
AzureIoTClient 19:2e0811512ceb 751 LogError("xio_close failed.");
Azure.IoT Build 0:fa2de1b79154 752 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 753 }
Azure.IoT Build 0:fa2de1b79154 754 else
Azure.IoT Build 0:fa2de1b79154 755 {
Azure.IoT Build 6:c55b013dfc2a 756 destroy_wolfssl_instance(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 757 result = 0;
Azure.IoT Build 0:fa2de1b79154 758 }
Azure.IoT Build 0:fa2de1b79154 759 }
Azure.IoT Build 0:fa2de1b79154 760 }
Azure.IoT Build 0:fa2de1b79154 761
Azure.IoT Build 0:fa2de1b79154 762 return result;
Azure.IoT Build 0:fa2de1b79154 763 }
Azure.IoT Build 0:fa2de1b79154 764
Azure.IoT Build 0:fa2de1b79154 765 int tlsio_wolfssl_send(CONCRETE_IO_HANDLE tls_io, const void* buffer, size_t size, ON_SEND_COMPLETE on_send_complete, void* callback_context)
Azure.IoT Build 0:fa2de1b79154 766 {
Azure.IoT Build 0:fa2de1b79154 767 int result;
Azure.IoT Build 0:fa2de1b79154 768
Azure.IoT Build 0:fa2de1b79154 769 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 770 {
AzureIoTClient 19:2e0811512ceb 771 LogError("NULL tls_io handle");
Azure.IoT Build 0:fa2de1b79154 772 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 773 }
Azure.IoT Build 0:fa2de1b79154 774 else
Azure.IoT Build 0:fa2de1b79154 775 {
Azure.IoT Build 0:fa2de1b79154 776 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 777
Azure.IoT Build 0:fa2de1b79154 778 if (tls_io_instance->tlsio_state != TLSIO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 779 {
AzureIoTClient 19:2e0811512ceb 780 LogError("send called while not open");
Azure.IoT Build 0:fa2de1b79154 781 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 782 }
Azure.IoT Build 0:fa2de1b79154 783 else
Azure.IoT Build 0:fa2de1b79154 784 {
Azure.IoT Build 0:fa2de1b79154 785 tls_io_instance->on_send_complete = on_send_complete;
Azure.IoT Build 0:fa2de1b79154 786 tls_io_instance->on_send_complete_callback_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 787
Azure.IoT Build 0:fa2de1b79154 788 int res = wolfSSL_write(tls_io_instance->ssl, buffer, size);
AzureIoTClient 15:956c6d205aa7 789 if ((res < 0) || ((size_t)res != size)) // Best way I can think of to safely compare an int to a size_t
Azure.IoT Build 0:fa2de1b79154 790 {
AzureIoTClient 19:2e0811512ceb 791 LogError("Error writing data through WolfSSL");
Azure.IoT Build 0:fa2de1b79154 792 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 793 }
Azure.IoT Build 0:fa2de1b79154 794 else
Azure.IoT Build 0:fa2de1b79154 795 {
Azure.IoT Build 0:fa2de1b79154 796 result = 0;
Azure.IoT Build 0:fa2de1b79154 797 }
Azure.IoT Build 0:fa2de1b79154 798 }
Azure.IoT Build 0:fa2de1b79154 799 }
Azure.IoT Build 0:fa2de1b79154 800
Azure.IoT Build 0:fa2de1b79154 801 return result;
Azure.IoT Build 0:fa2de1b79154 802 }
Azure.IoT Build 0:fa2de1b79154 803
Azure.IoT Build 0:fa2de1b79154 804 void tlsio_wolfssl_dowork(CONCRETE_IO_HANDLE tls_io)
Azure.IoT Build 0:fa2de1b79154 805 {
AzureIoTClient 19:2e0811512ceb 806 if (tls_io == NULL)
AzureIoTClient 19:2e0811512ceb 807 {
AzureIoTClient 19:2e0811512ceb 808 LogError("NULL tls_io");
AzureIoTClient 19:2e0811512ceb 809 }
AzureIoTClient 19:2e0811512ceb 810 else
Azure.IoT Build 0:fa2de1b79154 811 {
Azure.IoT Build 0:fa2de1b79154 812 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 813
Azure.IoT Build 0:fa2de1b79154 814 if ((tls_io_instance->tlsio_state != TLSIO_STATE_NOT_OPEN) &&
Azure.IoT Build 0:fa2de1b79154 815 (tls_io_instance->tlsio_state != TLSIO_STATE_ERROR))
Azure.IoT Build 0:fa2de1b79154 816 {
Azure.IoT Build 0:fa2de1b79154 817 decode_ssl_received_bytes(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 818 xio_dowork(tls_io_instance->socket_io);
Azure.IoT Build 0:fa2de1b79154 819 }
Azure.IoT Build 0:fa2de1b79154 820 }
Azure.IoT Build 0:fa2de1b79154 821 }
Azure.IoT Build 0:fa2de1b79154 822
Azure.IoT Build 0:fa2de1b79154 823 const IO_INTERFACE_DESCRIPTION* tlsio_wolfssl_get_interface_description(void)
Azure.IoT Build 0:fa2de1b79154 824 {
Azure.IoT Build 0:fa2de1b79154 825 return &tlsio_wolfssl_interface_description;
Azure.IoT Build 0:fa2de1b79154 826 }
Azure.IoT Build 0:fa2de1b79154 827
AzureIoTClient 15:956c6d205aa7 828 static int process_option(char** destination, const char* name, const char* value)
AzureIoTClient 15:956c6d205aa7 829 {
AzureIoTClient 15:956c6d205aa7 830 int result;
AzureIoTClient 15:956c6d205aa7 831 if (*destination != NULL)
AzureIoTClient 15:956c6d205aa7 832 {
AzureIoTClient 15:956c6d205aa7 833 free(*destination);
AzureIoTClient 15:956c6d205aa7 834 *destination = NULL;
AzureIoTClient 15:956c6d205aa7 835 }
AzureIoTClient 15:956c6d205aa7 836 if (mallocAndStrcpy_s(destination, value) != 0)
AzureIoTClient 15:956c6d205aa7 837 {
AzureIoTClient 15:956c6d205aa7 838 LogError("unable to process option %s",name);
AzureIoTClient 15:956c6d205aa7 839 result = __LINE__;
AzureIoTClient 15:956c6d205aa7 840 }
AzureIoTClient 15:956c6d205aa7 841 else
AzureIoTClient 15:956c6d205aa7 842 {
AzureIoTClient 15:956c6d205aa7 843 result = 0;
AzureIoTClient 15:956c6d205aa7 844 }
AzureIoTClient 15:956c6d205aa7 845 return result;
AzureIoTClient 19:2e0811512ceb 846 }
AzureIoTClient 15:956c6d205aa7 847
Azure.IoT Build 0:fa2de1b79154 848 int tlsio_wolfssl_setoption(CONCRETE_IO_HANDLE tls_io, const char* optionName, const void* value)
Azure.IoT Build 0:fa2de1b79154 849 {
Azure.IoT Build 0:fa2de1b79154 850 int result;
Azure.IoT Build 0:fa2de1b79154 851
Azure.IoT Build 0:fa2de1b79154 852 if (tls_io == NULL || optionName == NULL)
Azure.IoT Build 0:fa2de1b79154 853 {
AzureIoTClient 19:2e0811512ceb 854 LogError("Bad arguments, tls_io = %p, optionName = %p", tls_io, optionName);
Azure.IoT Build 0:fa2de1b79154 855 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 856 }
Azure.IoT Build 0:fa2de1b79154 857 else
Azure.IoT Build 0:fa2de1b79154 858 {
Azure.IoT Build 0:fa2de1b79154 859 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 860
Azure.IoT Build 0:fa2de1b79154 861 if (strcmp("TrustedCerts", optionName) == 0)
Azure.IoT Build 0:fa2de1b79154 862 {
AzureIoTClient 15:956c6d205aa7 863 result = process_option(&tls_io_instance->certificate, optionName, value);
AzureIoTClient 15:956c6d205aa7 864 }
AzureIoTClient 15:956c6d205aa7 865 else if (strcmp(SU_OPTION_X509_CERT, optionName) == 0)
AzureIoTClient 15:956c6d205aa7 866 {
AzureIoTClient 15:956c6d205aa7 867 result = process_option(&tls_io_instance->x509certificate, optionName, value);
AzureIoTClient 15:956c6d205aa7 868 }
AzureIoTClient 15:956c6d205aa7 869 else if (strcmp(SU_OPTION_X509_PRIVATE_KEY, optionName) == 0)
AzureIoTClient 15:956c6d205aa7 870 {
AzureIoTClient 15:956c6d205aa7 871 result = process_option(&tls_io_instance->x509privatekey, optionName, value);
AzureIoTClient 15:956c6d205aa7 872 }
AzureIoTClient 15:956c6d205aa7 873 else
AzureIoTClient 15:956c6d205aa7 874 {
AzureIoTClient 15:956c6d205aa7 875 if (tls_io_instance->socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 876 {
AzureIoTClient 19:2e0811512ceb 877 LogError("NULL underlying IO handle");
Azure.IoT Build 0:fa2de1b79154 878 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 879 }
Azure.IoT Build 0:fa2de1b79154 880 else
Azure.IoT Build 0:fa2de1b79154 881 {
AzureIoTClient 15:956c6d205aa7 882 result = xio_setoption(tls_io_instance->socket_io, optionName, value);
Azure.IoT Build 0:fa2de1b79154 883 }
Azure.IoT Build 0:fa2de1b79154 884 }
Azure.IoT Build 0:fa2de1b79154 885 }
Azure.IoT Build 0:fa2de1b79154 886
Azure.IoT Build 0:fa2de1b79154 887 return result;
AzureIoTClient 10:1be0bc9a9deb 888 }