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 Jun 26 19:16:17 2018 -0700
Revision:
46:fde927ea2e72
Parent:
42:0cc3c211ad26
Child:
47:e59b74c745bc
1.2.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
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;
AzureIoTClient 40:3f3af6cd8a01 506 tls_io_instance->ssl = wolfSSL_new(tls_io_instance->ssl_context);
AzureIoTClient 40:3f3af6cd8a01 507 if (tls_io_instance->ssl == NULL)
Azure.IoT Build 6:c55b013dfc2a 508 {
AzureIoTClient 19:2e0811512ceb 509 LogError("Failed to add certificates to store");
AzureIoTClient 21:b92006c5b9ff 510 result = __FAILURE__;
Azure.IoT Build 6:c55b013dfc2a 511 }
Azure.IoT Build 6:c55b013dfc2a 512 else
Azure.IoT Build 6:c55b013dfc2a 513 {
AzureIoTClient 40:3f3af6cd8a01 514 tls_io_instance->socket_io_read_bytes = NULL;
AzureIoTClient 40:3f3af6cd8a01 515 tls_io_instance->socket_io_read_byte_count = 0;
AzureIoTClient 40:3f3af6cd8a01 516 tls_io_instance->on_send_complete = NULL;
AzureIoTClient 40:3f3af6cd8a01 517 tls_io_instance->on_send_complete_callback_context = NULL;
AzureIoTClient 42:0cc3c211ad26 518 #ifdef INVALID_DEVID
AzureIoTClient 42:0cc3c211ad26 519 tls_io_instance->wolfssl_device_id = INVALID_DEVID;
AzureIoTClient 42:0cc3c211ad26 520 #endif
AzureIoTClient 40:3f3af6cd8a01 521
AzureIoTClient 40:3f3af6cd8a01 522 wolfSSL_set_using_nonblock(tls_io_instance->ssl, 1);
AzureIoTClient 40:3f3af6cd8a01 523 wolfSSL_SetHsDoneCb(tls_io_instance->ssl, on_handshake_done, tls_io_instance);
AzureIoTClient 40:3f3af6cd8a01 524 wolfSSL_SetIOWriteCtx(tls_io_instance->ssl, tls_io_instance);
AzureIoTClient 40:3f3af6cd8a01 525 wolfSSL_SetIOReadCtx(tls_io_instance->ssl, tls_io_instance);
AzureIoTClient 40:3f3af6cd8a01 526
AzureIoTClient 40:3f3af6cd8a01 527 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
AzureIoTClient 40:3f3af6cd8a01 528 result = 0;
AzureIoTClient 40:3f3af6cd8a01 529 }
AzureIoTClient 40:3f3af6cd8a01 530 return result;
AzureIoTClient 40:3f3af6cd8a01 531 }
Azure.IoT Build 6:c55b013dfc2a 532
AzureIoTClient 40:3f3af6cd8a01 533 static int prepare_wolfssl_open(TLS_IO_INSTANCE* tls_io_instance)
AzureIoTClient 40:3f3af6cd8a01 534 {
AzureIoTClient 40:3f3af6cd8a01 535 int result;
AzureIoTClient 40:3f3af6cd8a01 536 if (add_certificate_to_store(tls_io_instance) != 0)
AzureIoTClient 40:3f3af6cd8a01 537 {
AzureIoTClient 40:3f3af6cd8a01 538 LogError("Failed to add certificates to store");
AzureIoTClient 40:3f3af6cd8a01 539 result = __FAILURE__;
Azure.IoT Build 6:c55b013dfc2a 540 }
AzureIoTClient 40:3f3af6cd8a01 541 /*x509 authentication can only be build before underlying connection is realized*/
AzureIoTClient 40:3f3af6cd8a01 542 else if ((tls_io_instance->x509certificate != NULL) &&
AzureIoTClient 40:3f3af6cd8a01 543 (tls_io_instance->x509privatekey != NULL) &&
AzureIoTClient 40:3f3af6cd8a01 544 (x509_wolfssl_add_credentials(tls_io_instance->ssl, tls_io_instance->x509certificate, tls_io_instance->x509privatekey) != 0))
AzureIoTClient 40:3f3af6cd8a01 545 {
AzureIoTClient 40:3f3af6cd8a01 546 destroy_wolfssl_instance(tls_io_instance);
AzureIoTClient 40:3f3af6cd8a01 547 LogError("unable to use x509 authentication");
AzureIoTClient 40:3f3af6cd8a01 548 result = __FAILURE__;
AzureIoTClient 40:3f3af6cd8a01 549 }
AzureIoTClient 42:0cc3c211ad26 550 #ifdef INVALID_DEVID
AzureIoTClient 42:0cc3c211ad26 551 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 552 {
AzureIoTClient 42:0cc3c211ad26 553 LogError("Failure setting device id");
AzureIoTClient 42:0cc3c211ad26 554 result = __FAILURE__;
AzureIoTClient 42:0cc3c211ad26 555 }
AzureIoTClient 42:0cc3c211ad26 556 #endif
AzureIoTClient 40:3f3af6cd8a01 557 else
AzureIoTClient 40:3f3af6cd8a01 558 {
AzureIoTClient 40:3f3af6cd8a01 559 result = 0;
AzureIoTClient 40:3f3af6cd8a01 560 }
Azure.IoT Build 6:c55b013dfc2a 561 return result;
Azure.IoT Build 6:c55b013dfc2a 562 }
Azure.IoT Build 6:c55b013dfc2a 563
Azure.IoT Build 0:fa2de1b79154 564 int tlsio_wolfssl_init(void)
Azure.IoT Build 0:fa2de1b79154 565 {
Azure.IoT Build 0:fa2de1b79154 566 (void)wolfSSL_library_init();
Azure.IoT Build 0:fa2de1b79154 567 wolfSSL_load_error_strings();
Azure.IoT Build 0:fa2de1b79154 568
Azure.IoT Build 0:fa2de1b79154 569 return 0;
Azure.IoT Build 0:fa2de1b79154 570 }
Azure.IoT Build 0:fa2de1b79154 571
Azure.IoT Build 0:fa2de1b79154 572 void tlsio_wolfssl_deinit(void)
Azure.IoT Build 0:fa2de1b79154 573 {
Azure.IoT Build 0:fa2de1b79154 574 }
AzureIoTClient 31:6a55d47aea41 575
Azure.IoT Build 6:c55b013dfc2a 576 CONCRETE_IO_HANDLE tlsio_wolfssl_create(void* io_create_parameters)
Azure.IoT Build 0:fa2de1b79154 577 {
Azure.IoT Build 0:fa2de1b79154 578 TLS_IO_INSTANCE* result;
Azure.IoT Build 0:fa2de1b79154 579
AzureIoTClient 19:2e0811512ceb 580 if (io_create_parameters == NULL)
Azure.IoT Build 0:fa2de1b79154 581 {
AzureIoTClient 19:2e0811512ceb 582 LogError("NULL io_create_parameters");
Azure.IoT Build 0:fa2de1b79154 583 result = NULL;
Azure.IoT Build 0:fa2de1b79154 584 }
Azure.IoT Build 0:fa2de1b79154 585 else
Azure.IoT Build 0:fa2de1b79154 586 {
AzureIoTClient 19:2e0811512ceb 587 TLSIO_CONFIG* tls_io_config = io_create_parameters;
AzureIoTClient 19:2e0811512ceb 588
Azure.IoT Build 6:c55b013dfc2a 589 result = (TLS_IO_INSTANCE*)malloc(sizeof(TLS_IO_INSTANCE));
AzureIoTClient 22:10640b226104 590 if (result == NULL)
AzureIoTClient 22:10640b226104 591 {
AzureIoTClient 22:10640b226104 592 LogError("Failed allocating memory for the TLS IO instance.");
AzureIoTClient 22:10640b226104 593 }
AzureIoTClient 22:10640b226104 594 else
Azure.IoT Build 0:fa2de1b79154 595 {
AzureIoTClient 22:10640b226104 596 (void)memset(result, 0, sizeof(TLS_IO_INSTANCE));
AzureIoTClient 22:10640b226104 597 result->tlsio_state = TLSIO_STATE_NOT_OPEN;
AzureIoTClient 22:10640b226104 598
AzureIoTClient 22:10640b226104 599 result->ssl_context = wolfSSL_CTX_new(wolfTLSv1_2_client_method());
AzureIoTClient 22:10640b226104 600 if (result->ssl_context == NULL)
Azure.IoT Build 0:fa2de1b79154 601 {
AzureIoTClient 22:10640b226104 602 LogError("Cannot create the wolfSSL context");
Azure.IoT Build 0:fa2de1b79154 603 free(result);
Azure.IoT Build 0:fa2de1b79154 604 result = NULL;
Azure.IoT Build 0:fa2de1b79154 605 }
Azure.IoT Build 0:fa2de1b79154 606 else
Azure.IoT Build 0:fa2de1b79154 607 {
AzureIoTClient 46:fde927ea2e72 608 // Set the recv and send function on the wolfssl context object
AzureIoTClient 46:fde927ea2e72 609 wolfSSL_SetIOSend(result->ssl_context, on_io_send);
AzureIoTClient 46:fde927ea2e72 610 wolfSSL_SetIORecv(result->ssl_context, on_io_recv);
AzureIoTClient 46:fde927ea2e72 611
AzureIoTClient 42:0cc3c211ad26 612 SOCKETIO_CONFIG socketio_config;
AzureIoTClient 22:10640b226104 613 const IO_INTERFACE_DESCRIPTION* underlying_io_interface;
AzureIoTClient 22:10640b226104 614 void* io_interface_parameters;
AzureIoTClient 19:2e0811512ceb 615
AzureIoTClient 22:10640b226104 616 if (tls_io_config->underlying_io_interface != NULL)
AzureIoTClient 22:10640b226104 617 {
AzureIoTClient 22:10640b226104 618 underlying_io_interface = tls_io_config->underlying_io_interface;
AzureIoTClient 22:10640b226104 619 io_interface_parameters = tls_io_config->underlying_io_parameters;
AzureIoTClient 22:10640b226104 620 }
AzureIoTClient 22:10640b226104 621 else
AzureIoTClient 22:10640b226104 622 {
AzureIoTClient 22:10640b226104 623 socketio_config.hostname = tls_io_config->hostname;
AzureIoTClient 22:10640b226104 624 socketio_config.port = tls_io_config->port;
AzureIoTClient 22:10640b226104 625 socketio_config.accepted_socket = NULL;
AzureIoTClient 19:2e0811512ceb 626
AzureIoTClient 22:10640b226104 627 underlying_io_interface = socketio_get_interface_description();
AzureIoTClient 22:10640b226104 628 io_interface_parameters = &socketio_config;
AzureIoTClient 22:10640b226104 629 }
AzureIoTClient 19:2e0811512ceb 630
AzureIoTClient 22:10640b226104 631 if (underlying_io_interface == NULL)
Azure.IoT Build 0:fa2de1b79154 632 {
AzureIoTClient 22:10640b226104 633 LogError("Failed getting socket IO interface description.");
AzureIoTClient 22:10640b226104 634 wolfSSL_CTX_free(result->ssl_context);
Azure.IoT Build 0:fa2de1b79154 635 free(result);
Azure.IoT Build 0:fa2de1b79154 636 result = NULL;
Azure.IoT Build 0:fa2de1b79154 637 }
Azure.IoT Build 0:fa2de1b79154 638 else
Azure.IoT Build 0:fa2de1b79154 639 {
AzureIoTClient 22:10640b226104 640 result->socket_io = xio_create(underlying_io_interface, io_interface_parameters);
AzureIoTClient 22:10640b226104 641 if (result->socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 642 {
AzureIoTClient 22:10640b226104 643 LogError("Failure connecting to underlying socket_io");
Azure.IoT Build 0:fa2de1b79154 644 wolfSSL_CTX_free(result->ssl_context);
Azure.IoT Build 0:fa2de1b79154 645 free(result);
Azure.IoT Build 0:fa2de1b79154 646 result = NULL;
Azure.IoT Build 0:fa2de1b79154 647 }
AzureIoTClient 40:3f3af6cd8a01 648 else if (create_wolfssl_instance(result) != 0)
AzureIoTClient 40:3f3af6cd8a01 649 {
AzureIoTClient 40:3f3af6cd8a01 650 LogError("Failure connecting to underlying socket_io");
AzureIoTClient 40:3f3af6cd8a01 651 wolfSSL_CTX_free(result->ssl_context);
AzureIoTClient 40:3f3af6cd8a01 652 free(result);
AzureIoTClient 40:3f3af6cd8a01 653 result = NULL;
AzureIoTClient 40:3f3af6cd8a01 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
Azure.IoT Build 0:fa2de1b79154 660 return result;
Azure.IoT Build 0:fa2de1b79154 661 }
Azure.IoT Build 0:fa2de1b79154 662
Azure.IoT Build 0:fa2de1b79154 663 void tlsio_wolfssl_destroy(CONCRETE_IO_HANDLE tls_io)
Azure.IoT Build 0:fa2de1b79154 664 {
Azure.IoT Build 0:fa2de1b79154 665 if (tls_io != NULL)
Azure.IoT Build 0:fa2de1b79154 666 {
Azure.IoT Build 0:fa2de1b79154 667 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 668 if (tls_io_instance->socket_io_read_bytes != NULL)
Azure.IoT Build 0:fa2de1b79154 669 {
Azure.IoT Build 0:fa2de1b79154 670 free(tls_io_instance->socket_io_read_bytes);
AzureIoTClient 39:05674f3c9d9d 671 tls_io_instance->socket_io_read_bytes = NULL;
Azure.IoT Build 0:fa2de1b79154 672 }
Azure.IoT Build 6:c55b013dfc2a 673 if (tls_io_instance->certificate != NULL)
Azure.IoT Build 6:c55b013dfc2a 674 {
Azure.IoT Build 6:c55b013dfc2a 675 free(tls_io_instance->certificate);
AzureIoTClient 39:05674f3c9d9d 676 tls_io_instance->certificate = NULL;
Azure.IoT Build 6:c55b013dfc2a 677 }
AzureIoTClient 15:956c6d205aa7 678 if (tls_io_instance->x509certificate != NULL)
AzureIoTClient 15:956c6d205aa7 679 {
AzureIoTClient 15:956c6d205aa7 680 free(tls_io_instance->x509certificate);
AzureIoTClient 39:05674f3c9d9d 681 tls_io_instance->x509certificate = NULL;
AzureIoTClient 15:956c6d205aa7 682 }
AzureIoTClient 15:956c6d205aa7 683 if (tls_io_instance->x509privatekey != NULL)
AzureIoTClient 15:956c6d205aa7 684 {
AzureIoTClient 15:956c6d205aa7 685 free(tls_io_instance->x509privatekey);
AzureIoTClient 39:05674f3c9d9d 686 tls_io_instance->x509privatekey = NULL;
AzureIoTClient 15:956c6d205aa7 687 }
AzureIoTClient 40:3f3af6cd8a01 688 destroy_wolfssl_instance(tls_io_instance);
AzureIoTClient 19:2e0811512ceb 689
Azure.IoT Build 6:c55b013dfc2a 690 wolfSSL_CTX_free(tls_io_instance->ssl_context);
AzureIoTClient 39:05674f3c9d9d 691 tls_io_instance->ssl_context = NULL;
AzureIoTClient 39:05674f3c9d9d 692
Azure.IoT Build 0:fa2de1b79154 693 xio_destroy(tls_io_instance->socket_io);
Azure.IoT Build 0:fa2de1b79154 694 free(tls_io);
Azure.IoT Build 0:fa2de1b79154 695 }
Azure.IoT Build 0:fa2de1b79154 696 }
Azure.IoT Build 0:fa2de1b79154 697
Azure.IoT Build 0:fa2de1b79154 698 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 699 {
Azure.IoT Build 0:fa2de1b79154 700 int result;
Azure.IoT Build 0:fa2de1b79154 701
Azure.IoT Build 0:fa2de1b79154 702 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 703 {
AzureIoTClient 19:2e0811512ceb 704 LogError("NULL tls_io instance");
AzureIoTClient 21:b92006c5b9ff 705 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 706 }
Azure.IoT Build 0:fa2de1b79154 707 else
Azure.IoT Build 0:fa2de1b79154 708 {
Azure.IoT Build 0:fa2de1b79154 709 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 710
Azure.IoT Build 0:fa2de1b79154 711 if (tls_io_instance->tlsio_state != TLSIO_STATE_NOT_OPEN)
Azure.IoT Build 0:fa2de1b79154 712 {
Azure.IoT Build 6:c55b013dfc2a 713 LogError("Invalid state encountered.");
AzureIoTClient 21:b92006c5b9ff 714 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 715 }
Azure.IoT Build 0:fa2de1b79154 716 else
Azure.IoT Build 0:fa2de1b79154 717 {
Azure.IoT Build 0:fa2de1b79154 718 tls_io_instance->on_bytes_received = on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 719 tls_io_instance->on_bytes_received_context = on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 720
Azure.IoT Build 0:fa2de1b79154 721 tls_io_instance->on_io_open_complete = on_io_open_complete;
Azure.IoT Build 0:fa2de1b79154 722 tls_io_instance->on_io_open_complete_context = on_io_open_complete_context;
Azure.IoT Build 0:fa2de1b79154 723
Azure.IoT Build 0:fa2de1b79154 724 tls_io_instance->on_io_error = on_io_error;
Azure.IoT Build 0:fa2de1b79154 725 tls_io_instance->on_io_error_context = on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 726
Azure.IoT Build 0:fa2de1b79154 727 tls_io_instance->tlsio_state = TLSIO_STATE_OPENING_UNDERLYING_IO;
Azure.IoT Build 0:fa2de1b79154 728
AzureIoTClient 40:3f3af6cd8a01 729 if (prepare_wolfssl_open(tls_io_instance) != 0)
Azure.IoT Build 6:c55b013dfc2a 730 {
AzureIoTClient 19:2e0811512ceb 731 LogError("Cannot create wolfssl instance.");
Azure.IoT Build 6:c55b013dfc2a 732 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
AzureIoTClient 21:b92006c5b9ff 733 result = __FAILURE__;
Azure.IoT Build 6:c55b013dfc2a 734 }
Azure.IoT Build 6:c55b013dfc2a 735 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 736 {
AzureIoTClient 19:2e0811512ceb 737 LogError("Cannot open the underlying IO.");
Azure.IoT Build 0:fa2de1b79154 738 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
AzureIoTClient 21:b92006c5b9ff 739 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 740 }
Azure.IoT Build 0:fa2de1b79154 741 else
Azure.IoT Build 0:fa2de1b79154 742 {
Azure.IoT Build 6:c55b013dfc2a 743 // The state can get changed in the on_underlying_io_open_complete
AzureIoTClient 15:956c6d205aa7 744 if (tls_io_instance->tlsio_state != TLSIO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 745 {
Azure.IoT Build 6:c55b013dfc2a 746 LogError("Failed to connect to server. The certificates may not be correct.");
AzureIoTClient 21:b92006c5b9ff 747 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 748 }
Azure.IoT Build 0:fa2de1b79154 749 else
Azure.IoT Build 0:fa2de1b79154 750 {
AzureIoTClient 15:956c6d205aa7 751 result = 0;
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
Azure.IoT Build 0:fa2de1b79154 757 return result;
Azure.IoT Build 0:fa2de1b79154 758 }
Azure.IoT Build 0:fa2de1b79154 759
Azure.IoT Build 0:fa2de1b79154 760 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 761 {
Azure.IoT Build 0:fa2de1b79154 762 int result = 0;
Azure.IoT Build 0:fa2de1b79154 763
Azure.IoT Build 0:fa2de1b79154 764 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 765 {
AzureIoTClient 19:2e0811512ceb 766 LogError("NULL tls_io handle.");
AzureIoTClient 21:b92006c5b9ff 767 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 768 }
Azure.IoT Build 0:fa2de1b79154 769 else
Azure.IoT Build 0:fa2de1b79154 770 {
Azure.IoT Build 0:fa2de1b79154 771 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 772
Azure.IoT Build 0:fa2de1b79154 773 if ((tls_io_instance->tlsio_state == TLSIO_STATE_NOT_OPEN) ||
Azure.IoT Build 0:fa2de1b79154 774 (tls_io_instance->tlsio_state == TLSIO_STATE_CLOSING))
Azure.IoT Build 0:fa2de1b79154 775 {
AzureIoTClient 19:2e0811512ceb 776 LogError("Close called while not open.");
AzureIoTClient 21:b92006c5b9ff 777 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 778 }
Azure.IoT Build 0:fa2de1b79154 779 else
Azure.IoT Build 0:fa2de1b79154 780 {
Azure.IoT Build 0:fa2de1b79154 781 tls_io_instance->tlsio_state = TLSIO_STATE_CLOSING;
Azure.IoT Build 0:fa2de1b79154 782 tls_io_instance->on_io_close_complete = on_io_close_complete;
Azure.IoT Build 0:fa2de1b79154 783 tls_io_instance->on_io_close_complete_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 784
Azure.IoT Build 0:fa2de1b79154 785 if (xio_close(tls_io_instance->socket_io, on_underlying_io_close_complete, tls_io_instance) != 0)
Azure.IoT Build 0:fa2de1b79154 786 {
AzureIoTClient 19:2e0811512ceb 787 LogError("xio_close failed.");
AzureIoTClient 21:b92006c5b9ff 788 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 789 }
Azure.IoT Build 0:fa2de1b79154 790 else
Azure.IoT Build 0:fa2de1b79154 791 {
Azure.IoT Build 0:fa2de1b79154 792 result = 0;
Azure.IoT Build 0:fa2de1b79154 793 }
Azure.IoT Build 0:fa2de1b79154 794 }
Azure.IoT Build 0:fa2de1b79154 795 }
Azure.IoT Build 0:fa2de1b79154 796
Azure.IoT Build 0:fa2de1b79154 797 return result;
Azure.IoT Build 0:fa2de1b79154 798 }
Azure.IoT Build 0:fa2de1b79154 799
Azure.IoT Build 0:fa2de1b79154 800 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 801 {
Azure.IoT Build 0:fa2de1b79154 802 int result;
Azure.IoT Build 0:fa2de1b79154 803
AzureIoTClient 39:05674f3c9d9d 804 if (tls_io == NULL || buffer == NULL || size == 0)
Azure.IoT Build 0:fa2de1b79154 805 {
AzureIoTClient 39:05674f3c9d9d 806 LogError("Invalid parameter specified tls_io: %p, buffer: %p, size: %d", tls_io, buffer, size);
AzureIoTClient 21:b92006c5b9ff 807 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 808 }
Azure.IoT Build 0:fa2de1b79154 809 else
Azure.IoT Build 0:fa2de1b79154 810 {
Azure.IoT Build 0:fa2de1b79154 811 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 812
Azure.IoT Build 0:fa2de1b79154 813 if (tls_io_instance->tlsio_state != TLSIO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 814 {
AzureIoTClient 19:2e0811512ceb 815 LogError("send called while not open");
AzureIoTClient 21:b92006c5b9ff 816 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 817 }
Azure.IoT Build 0:fa2de1b79154 818 else
Azure.IoT Build 0:fa2de1b79154 819 {
Azure.IoT Build 0:fa2de1b79154 820 tls_io_instance->on_send_complete = on_send_complete;
Azure.IoT Build 0:fa2de1b79154 821 tls_io_instance->on_send_complete_callback_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 822
Azure.IoT Build 0:fa2de1b79154 823 int res = wolfSSL_write(tls_io_instance->ssl, buffer, size);
AzureIoTClient 15:956c6d205aa7 824 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 825 {
AzureIoTClient 19:2e0811512ceb 826 LogError("Error writing data through WolfSSL");
AzureIoTClient 21:b92006c5b9ff 827 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 828 }
Azure.IoT Build 0:fa2de1b79154 829 else
Azure.IoT Build 0:fa2de1b79154 830 {
Azure.IoT Build 0:fa2de1b79154 831 result = 0;
Azure.IoT Build 0:fa2de1b79154 832 }
Azure.IoT Build 0:fa2de1b79154 833 }
Azure.IoT Build 0:fa2de1b79154 834 }
Azure.IoT Build 0:fa2de1b79154 835
Azure.IoT Build 0:fa2de1b79154 836 return result;
Azure.IoT Build 0:fa2de1b79154 837 }
Azure.IoT Build 0:fa2de1b79154 838
Azure.IoT Build 0:fa2de1b79154 839 void tlsio_wolfssl_dowork(CONCRETE_IO_HANDLE tls_io)
Azure.IoT Build 0:fa2de1b79154 840 {
AzureIoTClient 19:2e0811512ceb 841 if (tls_io == NULL)
AzureIoTClient 19:2e0811512ceb 842 {
AzureIoTClient 19:2e0811512ceb 843 LogError("NULL tls_io");
AzureIoTClient 19:2e0811512ceb 844 }
AzureIoTClient 19:2e0811512ceb 845 else
Azure.IoT Build 0:fa2de1b79154 846 {
Azure.IoT Build 0:fa2de1b79154 847 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 848
Azure.IoT Build 0:fa2de1b79154 849 if ((tls_io_instance->tlsio_state != TLSIO_STATE_NOT_OPEN) &&
Azure.IoT Build 0:fa2de1b79154 850 (tls_io_instance->tlsio_state != TLSIO_STATE_ERROR))
Azure.IoT Build 0:fa2de1b79154 851 {
Azure.IoT Build 0:fa2de1b79154 852 decode_ssl_received_bytes(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 853 xio_dowork(tls_io_instance->socket_io);
Azure.IoT Build 0:fa2de1b79154 854 }
Azure.IoT Build 0:fa2de1b79154 855 }
Azure.IoT Build 0:fa2de1b79154 856 }
Azure.IoT Build 0:fa2de1b79154 857
Azure.IoT Build 0:fa2de1b79154 858 const IO_INTERFACE_DESCRIPTION* tlsio_wolfssl_get_interface_description(void)
Azure.IoT Build 0:fa2de1b79154 859 {
Azure.IoT Build 0:fa2de1b79154 860 return &tlsio_wolfssl_interface_description;
Azure.IoT Build 0:fa2de1b79154 861 }
Azure.IoT Build 0:fa2de1b79154 862
AzureIoTClient 15:956c6d205aa7 863 static int process_option(char** destination, const char* name, const char* value)
AzureIoTClient 15:956c6d205aa7 864 {
AzureIoTClient 15:956c6d205aa7 865 int result;
AzureIoTClient 15:956c6d205aa7 866 if (*destination != NULL)
AzureIoTClient 15:956c6d205aa7 867 {
AzureIoTClient 15:956c6d205aa7 868 free(*destination);
AzureIoTClient 15:956c6d205aa7 869 *destination = NULL;
AzureIoTClient 15:956c6d205aa7 870 }
AzureIoTClient 15:956c6d205aa7 871 if (mallocAndStrcpy_s(destination, value) != 0)
AzureIoTClient 15:956c6d205aa7 872 {
AzureIoTClient 15:956c6d205aa7 873 LogError("unable to process option %s",name);
AzureIoTClient 21:b92006c5b9ff 874 result = __FAILURE__;
AzureIoTClient 15:956c6d205aa7 875 }
AzureIoTClient 15:956c6d205aa7 876 else
AzureIoTClient 15:956c6d205aa7 877 {
AzureIoTClient 15:956c6d205aa7 878 result = 0;
AzureIoTClient 15:956c6d205aa7 879 }
AzureIoTClient 15:956c6d205aa7 880 return result;
AzureIoTClient 19:2e0811512ceb 881 }
AzureIoTClient 15:956c6d205aa7 882
Azure.IoT Build 0:fa2de1b79154 883 int tlsio_wolfssl_setoption(CONCRETE_IO_HANDLE tls_io, const char* optionName, const void* value)
Azure.IoT Build 0:fa2de1b79154 884 {
Azure.IoT Build 0:fa2de1b79154 885 int result;
Azure.IoT Build 0:fa2de1b79154 886
Azure.IoT Build 0:fa2de1b79154 887 if (tls_io == NULL || optionName == NULL)
Azure.IoT Build 0:fa2de1b79154 888 {
AzureIoTClient 19:2e0811512ceb 889 LogError("Bad arguments, tls_io = %p, optionName = %p", tls_io, optionName);
AzureIoTClient 21:b92006c5b9ff 890 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 891 }
Azure.IoT Build 0:fa2de1b79154 892 else
Azure.IoT Build 0:fa2de1b79154 893 {
Azure.IoT Build 0:fa2de1b79154 894 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 895
AzureIoTClient 38:ed9c888e5e12 896 if (strcmp(OPTION_TRUSTED_CERT, optionName) == 0)
Azure.IoT Build 0:fa2de1b79154 897 {
AzureIoTClient 15:956c6d205aa7 898 result = process_option(&tls_io_instance->certificate, optionName, value);
AzureIoTClient 15:956c6d205aa7 899 }
AzureIoTClient 38:ed9c888e5e12 900 else if (strcmp(SU_OPTION_X509_CERT, optionName) == 0 || strcmp(OPTION_X509_ECC_CERT, optionName) == 0)
AzureIoTClient 15:956c6d205aa7 901 {
AzureIoTClient 15:956c6d205aa7 902 result = process_option(&tls_io_instance->x509certificate, optionName, value);
AzureIoTClient 15:956c6d205aa7 903 }
AzureIoTClient 39:05674f3c9d9d 904 else if (strcmp(SU_OPTION_X509_PRIVATE_KEY, optionName) == 0 || strcmp(OPTION_X509_ECC_KEY, optionName) == 0)
AzureIoTClient 15:956c6d205aa7 905 {
AzureIoTClient 15:956c6d205aa7 906 result = process_option(&tls_io_instance->x509privatekey, optionName, value);
AzureIoTClient 15:956c6d205aa7 907 }
AzureIoTClient 42:0cc3c211ad26 908 #ifdef INVALID_DEVID
AzureIoTClient 42:0cc3c211ad26 909 else if (strcmp(OPTION_WOLFSSL_SET_DEVICE_ID, optionName) == 0)
AzureIoTClient 42:0cc3c211ad26 910 {
AzureIoTClient 42:0cc3c211ad26 911 int device_id = *((int *)value);
AzureIoTClient 42:0cc3c211ad26 912 if (tls_io_instance->ssl != NULL)
AzureIoTClient 42:0cc3c211ad26 913 {
AzureIoTClient 42:0cc3c211ad26 914 if (tls_io_instance->ssl != NULL && wolfSSL_SetDevId(tls_io_instance->ssl, device_id) != WOLFSSL_SUCCESS)
AzureIoTClient 42:0cc3c211ad26 915 {
AzureIoTClient 42:0cc3c211ad26 916 LogError("Failure setting device id on ssl");
AzureIoTClient 42:0cc3c211ad26 917 result = __FAILURE__;
AzureIoTClient 42:0cc3c211ad26 918 }
AzureIoTClient 42:0cc3c211ad26 919 else
AzureIoTClient 42:0cc3c211ad26 920 {
AzureIoTClient 42:0cc3c211ad26 921 result = 0;
AzureIoTClient 42:0cc3c211ad26 922 }
AzureIoTClient 42:0cc3c211ad26 923 }
AzureIoTClient 42:0cc3c211ad26 924 else
AzureIoTClient 42:0cc3c211ad26 925 {
AzureIoTClient 42:0cc3c211ad26 926 // Save the id till we create the ssl object
AzureIoTClient 42:0cc3c211ad26 927 tls_io_instance->wolfssl_device_id = device_id;
AzureIoTClient 42:0cc3c211ad26 928 result = 0;
AzureIoTClient 42:0cc3c211ad26 929 }
AzureIoTClient 42:0cc3c211ad26 930 }
AzureIoTClient 42:0cc3c211ad26 931 #endif
AzureIoTClient 15:956c6d205aa7 932 else
AzureIoTClient 15:956c6d205aa7 933 {
AzureIoTClient 15:956c6d205aa7 934 if (tls_io_instance->socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 935 {
AzureIoTClient 19:2e0811512ceb 936 LogError("NULL underlying IO handle");
AzureIoTClient 21:b92006c5b9ff 937 result = __FAILURE__;
Azure.IoT Build 0:fa2de1b79154 938 }
Azure.IoT Build 0:fa2de1b79154 939 else
Azure.IoT Build 0:fa2de1b79154 940 {
AzureIoTClient 15:956c6d205aa7 941 result = xio_setoption(tls_io_instance->socket_io, optionName, value);
Azure.IoT Build 0:fa2de1b79154 942 }
Azure.IoT Build 0:fa2de1b79154 943 }
Azure.IoT Build 0:fa2de1b79154 944 }
Azure.IoT Build 0:fa2de1b79154 945
Azure.IoT Build 0:fa2de1b79154 946 return result;
AzureIoTClient 10:1be0bc9a9deb 947 }