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 Mar 20 10:31:23 2018 -0700
Revision:
42:0cc3c211ad26
Parent:
40:3f3af6cd8a01
Child:
46:fde927ea2e72
1.2.1

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