Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Tue Jan 30 08:23:35 2018 -0800
Revision:
39:05674f3c9d9d
Parent:
38:ed9c888e5e12
Child:
40:3f3af6cd8a01
1.1.31

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