Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Fri Aug 26 12:59:40 2016 -0700
Revision:
10:1be0bc9a9deb
Parent:
6:c55b013dfc2a
Child:
15:956c6d205aa7
1.0.10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 5 #ifdef _CRTDBG_MAP_ALLOC
Azure.IoT Build 0:fa2de1b79154 6 #include <crtdbg.h>
Azure.IoT Build 0:fa2de1b79154 7 #endif
Azure.IoT Build 0:fa2de1b79154 8
Azure.IoT Build 0:fa2de1b79154 9 #include "wolfssl/ssl.h"
Azure.IoT Build 0:fa2de1b79154 10 #include "wolfssl/error-ssl.h"
Azure.IoT Build 0:fa2de1b79154 11 #include <stdio.h>
Azure.IoT Build 0:fa2de1b79154 12 #include <stdbool.h>
Azure.IoT Build 0:fa2de1b79154 13 #include <string.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"
Azure.IoT Build 6:c55b013dfc2a 18 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 19
Azure.IoT Build 0:fa2de1b79154 20 typedef enum TLSIO_STATE_ENUM_TAG
Azure.IoT Build 0:fa2de1b79154 21 {
Azure.IoT Build 0:fa2de1b79154 22 TLSIO_STATE_NOT_OPEN,
Azure.IoT Build 0:fa2de1b79154 23 TLSIO_STATE_OPENING_UNDERLYING_IO,
Azure.IoT Build 0:fa2de1b79154 24 TLSIO_STATE_IN_HANDSHAKE,
Azure.IoT Build 0:fa2de1b79154 25 TLSIO_STATE_OPEN,
Azure.IoT Build 0:fa2de1b79154 26 TLSIO_STATE_CLOSING,
Azure.IoT Build 0:fa2de1b79154 27 TLSIO_STATE_ERROR
Azure.IoT Build 0:fa2de1b79154 28 } TLSIO_STATE_ENUM;
Azure.IoT Build 0:fa2de1b79154 29
Azure.IoT Build 0:fa2de1b79154 30 typedef struct TLS_IO_INSTANCE_TAG
Azure.IoT Build 0:fa2de1b79154 31 {
Azure.IoT Build 0:fa2de1b79154 32 XIO_HANDLE socket_io;
Azure.IoT Build 0:fa2de1b79154 33 ON_BYTES_RECEIVED on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 34 ON_IO_OPEN_COMPLETE on_io_open_complete;
Azure.IoT Build 0:fa2de1b79154 35 ON_IO_CLOSE_COMPLETE on_io_close_complete;
Azure.IoT Build 0:fa2de1b79154 36 ON_IO_ERROR on_io_error;
Azure.IoT Build 0:fa2de1b79154 37 void* on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 38 void* on_io_open_complete_context;
Azure.IoT Build 0:fa2de1b79154 39 void* on_io_close_complete_context;
Azure.IoT Build 0:fa2de1b79154 40 void* on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 41 WOLFSSL* ssl;
Azure.IoT Build 0:fa2de1b79154 42 WOLFSSL_CTX* ssl_context;
Azure.IoT Build 0:fa2de1b79154 43 TLSIO_STATE_ENUM tlsio_state;
Azure.IoT Build 0:fa2de1b79154 44 unsigned char* socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 45 size_t socket_io_read_byte_count;
Azure.IoT Build 0:fa2de1b79154 46 ON_SEND_COMPLETE on_send_complete;
Azure.IoT Build 0:fa2de1b79154 47 void* on_send_complete_callback_context;
Azure.IoT Build 6:c55b013dfc2a 48 char* certificate;
Azure.IoT Build 6:c55b013dfc2a 49 char* hostname;
Azure.IoT Build 6:c55b013dfc2a 50 int port;
Azure.IoT Build 0:fa2de1b79154 51 } TLS_IO_INSTANCE;
Azure.IoT Build 0:fa2de1b79154 52
AzureIoTClient 10:1be0bc9a9deb 53 /*this function will clone an option given by name and value*/
AzureIoTClient 10:1be0bc9a9deb 54 static void* tlsio_wolfssl_CloneOption(const char* name, const void* value)
AzureIoTClient 10:1be0bc9a9deb 55 {
AzureIoTClient 10:1be0bc9a9deb 56 void* result;
AzureIoTClient 10:1be0bc9a9deb 57 if (
AzureIoTClient 10:1be0bc9a9deb 58 (name == NULL) || (value == NULL)
AzureIoTClient 10:1be0bc9a9deb 59 )
AzureIoTClient 10:1be0bc9a9deb 60 {
AzureIoTClient 10:1be0bc9a9deb 61 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 62 }
AzureIoTClient 10:1be0bc9a9deb 63 else
AzureIoTClient 10:1be0bc9a9deb 64 {
AzureIoTClient 10:1be0bc9a9deb 65 if (strcmp(name, "TrustedCerts") == 0)
AzureIoTClient 10:1be0bc9a9deb 66 {
AzureIoTClient 10:1be0bc9a9deb 67 if (mallocAndStrcpy_s((char**)&result, value) != 0)
AzureIoTClient 10:1be0bc9a9deb 68 {
AzureIoTClient 10:1be0bc9a9deb 69 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 70 }
AzureIoTClient 10:1be0bc9a9deb 71 else
AzureIoTClient 10:1be0bc9a9deb 72 {
AzureIoTClient 10:1be0bc9a9deb 73 /*return as is*/
AzureIoTClient 10:1be0bc9a9deb 74 }
AzureIoTClient 10:1be0bc9a9deb 75 }
AzureIoTClient 10:1be0bc9a9deb 76 else
AzureIoTClient 10:1be0bc9a9deb 77 {
AzureIoTClient 10:1be0bc9a9deb 78 /*option is not handled*/
AzureIoTClient 10:1be0bc9a9deb 79 result = NULL;
AzureIoTClient 10:1be0bc9a9deb 80 }
AzureIoTClient 10:1be0bc9a9deb 81 }
AzureIoTClient 10:1be0bc9a9deb 82 return result;
AzureIoTClient 10:1be0bc9a9deb 83 }
AzureIoTClient 10:1be0bc9a9deb 84
AzureIoTClient 10:1be0bc9a9deb 85 /*this function destroys an option previously created*/
AzureIoTClient 10:1be0bc9a9deb 86 static void tlsio_wolfssl_DestroyOption(const char* name, const void* value)
AzureIoTClient 10:1be0bc9a9deb 87 {
AzureIoTClient 10:1be0bc9a9deb 88 /*since all options for this layer are actually string copies., disposing of one is just calling free*/
AzureIoTClient 10:1be0bc9a9deb 89 if ((name != NULL) && (value != NULL))
AzureIoTClient 10:1be0bc9a9deb 90 {
AzureIoTClient 10:1be0bc9a9deb 91 if (strcmp(name, "TrustedCerts") == 0)
AzureIoTClient 10:1be0bc9a9deb 92 {
AzureIoTClient 10:1be0bc9a9deb 93 free((void*)value);
AzureIoTClient 10:1be0bc9a9deb 94 }
AzureIoTClient 10:1be0bc9a9deb 95 else
AzureIoTClient 10:1be0bc9a9deb 96 {
AzureIoTClient 10:1be0bc9a9deb 97 /*option is not handled*/
AzureIoTClient 10:1be0bc9a9deb 98 }
AzureIoTClient 10:1be0bc9a9deb 99 }
AzureIoTClient 10:1be0bc9a9deb 100 }
AzureIoTClient 10:1be0bc9a9deb 101
AzureIoTClient 10:1be0bc9a9deb 102 static OPTIONHANDLER_HANDLE tlsio_wolfssl_retrieveoptions(CONCRETE_IO_HANDLE tls_io)
AzureIoTClient 10:1be0bc9a9deb 103 {
AzureIoTClient 10:1be0bc9a9deb 104 OPTIONHANDLER_HANDLE result;
AzureIoTClient 10:1be0bc9a9deb 105 (void)tls_io;
AzureIoTClient 10:1be0bc9a9deb 106
AzureIoTClient 10:1be0bc9a9deb 107 result = OptionHandler_Create(tlsio_wolfssl_CloneOption, tlsio_wolfssl_DestroyOption, tlsio_wolfssl_setoption);
AzureIoTClient 10:1be0bc9a9deb 108 if (result == NULL)
AzureIoTClient 10:1be0bc9a9deb 109 {
AzureIoTClient 10:1be0bc9a9deb 110 /*return as is*/
AzureIoTClient 10:1be0bc9a9deb 111 }
AzureIoTClient 10:1be0bc9a9deb 112 else
AzureIoTClient 10:1be0bc9a9deb 113 {
AzureIoTClient 10:1be0bc9a9deb 114 /*insert here work to add the options to "result" handle*/
AzureIoTClient 10:1be0bc9a9deb 115 }
AzureIoTClient 10:1be0bc9a9deb 116 return result;
AzureIoTClient 10:1be0bc9a9deb 117 }
AzureIoTClient 10:1be0bc9a9deb 118
Azure.IoT Build 0:fa2de1b79154 119 static const IO_INTERFACE_DESCRIPTION tlsio_wolfssl_interface_description =
Azure.IoT Build 0:fa2de1b79154 120 {
AzureIoTClient 10:1be0bc9a9deb 121 tlsio_wolfssl_retrieveoptions,
Azure.IoT Build 0:fa2de1b79154 122 tlsio_wolfssl_create,
Azure.IoT Build 0:fa2de1b79154 123 tlsio_wolfssl_destroy,
Azure.IoT Build 0:fa2de1b79154 124 tlsio_wolfssl_open,
Azure.IoT Build 0:fa2de1b79154 125 tlsio_wolfssl_close,
Azure.IoT Build 0:fa2de1b79154 126 tlsio_wolfssl_send,
Azure.IoT Build 0:fa2de1b79154 127 tlsio_wolfssl_dowork,
Azure.IoT Build 0:fa2de1b79154 128 tlsio_wolfssl_setoption
Azure.IoT Build 0:fa2de1b79154 129 };
Azure.IoT Build 0:fa2de1b79154 130
Azure.IoT Build 0:fa2de1b79154 131 static void indicate_error(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 0:fa2de1b79154 132 {
Azure.IoT Build 0:fa2de1b79154 133 if (tls_io_instance->on_io_error != NULL)
Azure.IoT Build 0:fa2de1b79154 134 {
Azure.IoT Build 0:fa2de1b79154 135 tls_io_instance->on_io_error(tls_io_instance->on_io_error_context);
Azure.IoT Build 0:fa2de1b79154 136 }
Azure.IoT Build 0:fa2de1b79154 137 }
Azure.IoT Build 0:fa2de1b79154 138
Azure.IoT Build 0:fa2de1b79154 139 static void indicate_open_complete(TLS_IO_INSTANCE* tls_io_instance, IO_OPEN_RESULT open_result)
Azure.IoT Build 0:fa2de1b79154 140 {
Azure.IoT Build 0:fa2de1b79154 141 if (tls_io_instance->on_io_open_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 142 {
Azure.IoT Build 0:fa2de1b79154 143 tls_io_instance->on_io_open_complete(tls_io_instance->on_io_open_complete_context, open_result);
Azure.IoT Build 0:fa2de1b79154 144 }
Azure.IoT Build 0:fa2de1b79154 145 }
Azure.IoT Build 0:fa2de1b79154 146
Azure.IoT Build 0:fa2de1b79154 147 static int decode_ssl_received_bytes(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 0:fa2de1b79154 148 {
Azure.IoT Build 0:fa2de1b79154 149 int result = 0;
Azure.IoT Build 0:fa2de1b79154 150 unsigned char buffer[64];
Azure.IoT Build 0:fa2de1b79154 151
Azure.IoT Build 0:fa2de1b79154 152 int rcv_bytes = 1;
Azure.IoT Build 0:fa2de1b79154 153 while (rcv_bytes > 0)
Azure.IoT Build 0:fa2de1b79154 154 {
Azure.IoT Build 0:fa2de1b79154 155 rcv_bytes = wolfSSL_read(tls_io_instance->ssl, buffer, sizeof(buffer));
Azure.IoT Build 0:fa2de1b79154 156 if (rcv_bytes > 0)
Azure.IoT Build 0:fa2de1b79154 157 {
Azure.IoT Build 0:fa2de1b79154 158 if (tls_io_instance->on_bytes_received != NULL)
Azure.IoT Build 0:fa2de1b79154 159 {
Azure.IoT Build 0:fa2de1b79154 160 tls_io_instance->on_bytes_received(tls_io_instance->on_bytes_received_context, buffer, rcv_bytes);
Azure.IoT Build 0:fa2de1b79154 161 }
Azure.IoT Build 0:fa2de1b79154 162 }
Azure.IoT Build 0:fa2de1b79154 163 }
Azure.IoT Build 0:fa2de1b79154 164
Azure.IoT Build 0:fa2de1b79154 165 return result;
Azure.IoT Build 0:fa2de1b79154 166 }
Azure.IoT Build 0:fa2de1b79154 167
Azure.IoT Build 0:fa2de1b79154 168 static void on_underlying_io_open_complete(void* context, IO_OPEN_RESULT open_result)
Azure.IoT Build 0:fa2de1b79154 169 {
Azure.IoT Build 0:fa2de1b79154 170 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 171
Azure.IoT Build 0:fa2de1b79154 172 if (open_result != IO_OPEN_OK)
Azure.IoT Build 0:fa2de1b79154 173 {
Azure.IoT Build 0:fa2de1b79154 174 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 175 indicate_open_complete(tls_io_instance, IO_OPEN_ERROR);
Azure.IoT Build 0:fa2de1b79154 176 }
Azure.IoT Build 0:fa2de1b79154 177 else
Azure.IoT Build 0:fa2de1b79154 178 {
Azure.IoT Build 0:fa2de1b79154 179 int res;
Azure.IoT Build 0:fa2de1b79154 180 tls_io_instance->tlsio_state = TLSIO_STATE_IN_HANDSHAKE;
Azure.IoT Build 0:fa2de1b79154 181
Azure.IoT Build 0:fa2de1b79154 182 res = wolfSSL_connect(tls_io_instance->ssl);
Azure.IoT Build 0:fa2de1b79154 183 if (res != SSL_SUCCESS)
Azure.IoT Build 0:fa2de1b79154 184 {
Azure.IoT Build 0:fa2de1b79154 185 indicate_open_complete(tls_io_instance, IO_OPEN_ERROR);
Azure.IoT Build 6:c55b013dfc2a 186 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 187 }
Azure.IoT Build 0:fa2de1b79154 188 }
Azure.IoT Build 0:fa2de1b79154 189 }
Azure.IoT Build 0:fa2de1b79154 190
Azure.IoT Build 0:fa2de1b79154 191 static void on_underlying_io_bytes_received(void* context, const unsigned char* buffer, size_t size)
Azure.IoT Build 0:fa2de1b79154 192 {
Azure.IoT Build 0:fa2de1b79154 193 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 194
Azure.IoT Build 0:fa2de1b79154 195 unsigned char* new_socket_io_read_bytes = (unsigned char*)realloc(tls_io_instance->socket_io_read_bytes, tls_io_instance->socket_io_read_byte_count + size);
Azure.IoT Build 0:fa2de1b79154 196 if (new_socket_io_read_bytes == NULL)
Azure.IoT Build 0:fa2de1b79154 197 {
Azure.IoT Build 0:fa2de1b79154 198 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 199 indicate_error(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 200 }
Azure.IoT Build 0:fa2de1b79154 201 else
Azure.IoT Build 0:fa2de1b79154 202 {
Azure.IoT Build 0:fa2de1b79154 203 tls_io_instance->socket_io_read_bytes = new_socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 204 (void)memcpy(tls_io_instance->socket_io_read_bytes + tls_io_instance->socket_io_read_byte_count, buffer, size);
Azure.IoT Build 0:fa2de1b79154 205 tls_io_instance->socket_io_read_byte_count += size;
Azure.IoT Build 0:fa2de1b79154 206 }
Azure.IoT Build 0:fa2de1b79154 207 }
Azure.IoT Build 0:fa2de1b79154 208
Azure.IoT Build 0:fa2de1b79154 209 static void on_underlying_io_error(void* context)
Azure.IoT Build 0:fa2de1b79154 210 {
Azure.IoT Build 0:fa2de1b79154 211 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 212
Azure.IoT Build 0:fa2de1b79154 213 switch (tls_io_instance->tlsio_state)
Azure.IoT Build 0:fa2de1b79154 214 {
Azure.IoT Build 6:c55b013dfc2a 215 default:
Azure.IoT Build 6:c55b013dfc2a 216 case TLSIO_STATE_NOT_OPEN:
Azure.IoT Build 6:c55b013dfc2a 217 case TLSIO_STATE_ERROR:
Azure.IoT Build 6:c55b013dfc2a 218 break;
Azure.IoT Build 0:fa2de1b79154 219
Azure.IoT Build 6:c55b013dfc2a 220 case TLSIO_STATE_OPENING_UNDERLYING_IO:
Azure.IoT Build 6:c55b013dfc2a 221 case TLSIO_STATE_IN_HANDSHAKE:
Azure.IoT Build 6:c55b013dfc2a 222 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 6:c55b013dfc2a 223 indicate_open_complete(tls_io_instance, IO_OPEN_ERROR);
Azure.IoT Build 6:c55b013dfc2a 224 break;
Azure.IoT Build 0:fa2de1b79154 225
Azure.IoT Build 6:c55b013dfc2a 226 case TLSIO_STATE_OPEN:
Azure.IoT Build 6:c55b013dfc2a 227 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 6:c55b013dfc2a 228 indicate_error(tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 229 break;
Azure.IoT Build 0:fa2de1b79154 230 }
Azure.IoT Build 0:fa2de1b79154 231 }
Azure.IoT Build 0:fa2de1b79154 232
Azure.IoT Build 0:fa2de1b79154 233 static void on_underlying_io_close_complete(void* context)
Azure.IoT Build 0:fa2de1b79154 234 {
Azure.IoT Build 0:fa2de1b79154 235 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 236
Azure.IoT Build 0:fa2de1b79154 237 if (tls_io_instance->tlsio_state == TLSIO_STATE_CLOSING)
Azure.IoT Build 0:fa2de1b79154 238 {
Azure.IoT Build 0:fa2de1b79154 239 if (tls_io_instance->on_io_close_complete != NULL)
Azure.IoT Build 0:fa2de1b79154 240 {
Azure.IoT Build 0:fa2de1b79154 241 tls_io_instance->on_io_close_complete(tls_io_instance->on_io_close_complete_context);
Azure.IoT Build 0:fa2de1b79154 242 }
Azure.IoT Build 6:c55b013dfc2a 243 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 0:fa2de1b79154 244 }
Azure.IoT Build 0:fa2de1b79154 245 }
Azure.IoT Build 0:fa2de1b79154 246
Azure.IoT Build 0:fa2de1b79154 247 static int on_io_recv(WOLFSSL *ssl, char *buf, int sz, void *context)
Azure.IoT Build 0:fa2de1b79154 248 {
Azure.IoT Build 0:fa2de1b79154 249 int result;
Azure.IoT Build 0:fa2de1b79154 250 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 251 unsigned char* new_socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 252
Azure.IoT Build 0:fa2de1b79154 253 while (tls_io_instance->socket_io_read_byte_count == 0)
Azure.IoT Build 0:fa2de1b79154 254 {
Azure.IoT Build 0:fa2de1b79154 255 xio_dowork(tls_io_instance->socket_io);
Azure.IoT Build 6:c55b013dfc2a 256 if (tls_io_instance->tlsio_state != TLSIO_STATE_IN_HANDSHAKE)
Azure.IoT Build 0:fa2de1b79154 257 {
Azure.IoT Build 0:fa2de1b79154 258 break;
Azure.IoT Build 0:fa2de1b79154 259 }
Azure.IoT Build 0:fa2de1b79154 260 }
Azure.IoT Build 0:fa2de1b79154 261
Azure.IoT Build 0:fa2de1b79154 262 result = tls_io_instance->socket_io_read_byte_count;
Azure.IoT Build 0:fa2de1b79154 263 if (result > sz)
Azure.IoT Build 0:fa2de1b79154 264 {
Azure.IoT Build 0:fa2de1b79154 265 result = sz;
Azure.IoT Build 0:fa2de1b79154 266 }
Azure.IoT Build 0:fa2de1b79154 267
Azure.IoT Build 0:fa2de1b79154 268 if (result > 0)
Azure.IoT Build 0:fa2de1b79154 269 {
Azure.IoT Build 0:fa2de1b79154 270 (void)memcpy(buf, tls_io_instance->socket_io_read_bytes, result);
Azure.IoT Build 0:fa2de1b79154 271 (void)memmove(tls_io_instance->socket_io_read_bytes, tls_io_instance->socket_io_read_bytes + result, tls_io_instance->socket_io_read_byte_count - result);
Azure.IoT Build 0:fa2de1b79154 272 tls_io_instance->socket_io_read_byte_count -= result;
Azure.IoT Build 0:fa2de1b79154 273 if (tls_io_instance->socket_io_read_byte_count > 0)
Azure.IoT Build 0:fa2de1b79154 274 {
Azure.IoT Build 0:fa2de1b79154 275 new_socket_io_read_bytes = (unsigned char*)realloc(tls_io_instance->socket_io_read_bytes, tls_io_instance->socket_io_read_byte_count);
Azure.IoT Build 0:fa2de1b79154 276 if (new_socket_io_read_bytes != NULL)
Azure.IoT Build 0:fa2de1b79154 277 {
Azure.IoT Build 0:fa2de1b79154 278 tls_io_instance->socket_io_read_bytes = new_socket_io_read_bytes;
Azure.IoT Build 0:fa2de1b79154 279 }
Azure.IoT Build 0:fa2de1b79154 280 }
Azure.IoT Build 0:fa2de1b79154 281 else
Azure.IoT Build 0:fa2de1b79154 282 {
Azure.IoT Build 0:fa2de1b79154 283 free(tls_io_instance->socket_io_read_bytes);
Azure.IoT Build 0:fa2de1b79154 284 tls_io_instance->socket_io_read_bytes = NULL;
Azure.IoT Build 0:fa2de1b79154 285 }
Azure.IoT Build 0:fa2de1b79154 286 }
Azure.IoT Build 0:fa2de1b79154 287
Azure.IoT Build 0:fa2de1b79154 288 if ((result == 0) && (tls_io_instance->tlsio_state == TLSIO_STATE_OPEN))
Azure.IoT Build 0:fa2de1b79154 289 {
Azure.IoT Build 0:fa2de1b79154 290 result = WOLFSSL_CBIO_ERR_WANT_READ;
Azure.IoT Build 0:fa2de1b79154 291 }
Azure.IoT Build 6:c55b013dfc2a 292 else if ((result == 0) && tls_io_instance->tlsio_state == TLSIO_STATE_CLOSING)
Azure.IoT Build 6:c55b013dfc2a 293 {
Azure.IoT Build 6:c55b013dfc2a 294 result = WOLFSSL_CBIO_ERR_CONN_CLOSE;
Azure.IoT Build 6:c55b013dfc2a 295 }
Azure.IoT Build 0:fa2de1b79154 296
Azure.IoT Build 0:fa2de1b79154 297 return result;
Azure.IoT Build 0:fa2de1b79154 298 }
Azure.IoT Build 0:fa2de1b79154 299
Azure.IoT Build 0:fa2de1b79154 300 static int on_io_send(WOLFSSL *ssl, char *buf, int sz, void *context)
Azure.IoT Build 0:fa2de1b79154 301 {
Azure.IoT Build 0:fa2de1b79154 302 int result;
Azure.IoT Build 0:fa2de1b79154 303 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 304
Azure.IoT Build 0:fa2de1b79154 305 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 306 {
Azure.IoT Build 0:fa2de1b79154 307 tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
Azure.IoT Build 0:fa2de1b79154 308 indicate_error(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 309 result = 0;
Azure.IoT Build 0:fa2de1b79154 310 }
Azure.IoT Build 0:fa2de1b79154 311 else
Azure.IoT Build 0:fa2de1b79154 312 {
Azure.IoT Build 0:fa2de1b79154 313 result = sz;
Azure.IoT Build 0:fa2de1b79154 314 }
Azure.IoT Build 0:fa2de1b79154 315
Azure.IoT Build 0:fa2de1b79154 316 return result;
Azure.IoT Build 0:fa2de1b79154 317 }
Azure.IoT Build 0:fa2de1b79154 318
Azure.IoT Build 0:fa2de1b79154 319 static int on_handshake_done(WOLFSSL* ssl, void* context)
Azure.IoT Build 0:fa2de1b79154 320 {
Azure.IoT Build 0:fa2de1b79154 321 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)context;
Azure.IoT Build 0:fa2de1b79154 322 if (tls_io_instance->tlsio_state == TLSIO_STATE_IN_HANDSHAKE)
Azure.IoT Build 0:fa2de1b79154 323 {
Azure.IoT Build 0:fa2de1b79154 324 tls_io_instance->tlsio_state = TLSIO_STATE_OPEN;
Azure.IoT Build 0:fa2de1b79154 325 indicate_open_complete(tls_io_instance, IO_OPEN_OK);
Azure.IoT Build 0:fa2de1b79154 326 }
Azure.IoT Build 0:fa2de1b79154 327
Azure.IoT Build 0:fa2de1b79154 328 return 0;
Azure.IoT Build 0:fa2de1b79154 329 }
Azure.IoT Build 0:fa2de1b79154 330
Azure.IoT Build 6:c55b013dfc2a 331 static int add_certificate_to_store(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 6:c55b013dfc2a 332 {
Azure.IoT Build 6:c55b013dfc2a 333 int result;
Azure.IoT Build 6:c55b013dfc2a 334 if (tls_io_instance->certificate != NULL)
Azure.IoT Build 6:c55b013dfc2a 335 {
Azure.IoT Build 6:c55b013dfc2a 336 int res = wolfSSL_CTX_load_verify_buffer(tls_io_instance->ssl_context, (const unsigned char*)tls_io_instance->certificate, strlen(tls_io_instance->certificate)+1, SSL_FILETYPE_PEM);
Azure.IoT Build 6:c55b013dfc2a 337 if (res != SSL_SUCCESS)
Azure.IoT Build 6:c55b013dfc2a 338 {
Azure.IoT Build 6:c55b013dfc2a 339 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 340 }
Azure.IoT Build 6:c55b013dfc2a 341 else
Azure.IoT Build 6:c55b013dfc2a 342 {
Azure.IoT Build 6:c55b013dfc2a 343 result = 0;
Azure.IoT Build 6:c55b013dfc2a 344 }
Azure.IoT Build 6:c55b013dfc2a 345 }
Azure.IoT Build 6:c55b013dfc2a 346 else
Azure.IoT Build 6:c55b013dfc2a 347 {
Azure.IoT Build 6:c55b013dfc2a 348 result = 0;
Azure.IoT Build 6:c55b013dfc2a 349 }
Azure.IoT Build 6:c55b013dfc2a 350 return result;
Azure.IoT Build 6:c55b013dfc2a 351 }
Azure.IoT Build 6:c55b013dfc2a 352
Azure.IoT Build 6:c55b013dfc2a 353 static int create_wolfssl_instance(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 6:c55b013dfc2a 354 {
Azure.IoT Build 6:c55b013dfc2a 355 int result;
Azure.IoT Build 6:c55b013dfc2a 356
Azure.IoT Build 6:c55b013dfc2a 357 if (add_certificate_to_store(tls_io_instance) != 0)
Azure.IoT Build 6:c55b013dfc2a 358 {
Azure.IoT Build 6:c55b013dfc2a 359 wolfSSL_CTX_free(tls_io_instance->ssl_context);
Azure.IoT Build 6:c55b013dfc2a 360 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 361 }
Azure.IoT Build 6:c55b013dfc2a 362 else
Azure.IoT Build 6:c55b013dfc2a 363 {
Azure.IoT Build 6:c55b013dfc2a 364 tls_io_instance->ssl = wolfSSL_new(tls_io_instance->ssl_context);
Azure.IoT Build 6:c55b013dfc2a 365 if (tls_io_instance->ssl == NULL)
Azure.IoT Build 6:c55b013dfc2a 366 {
Azure.IoT Build 6:c55b013dfc2a 367 wolfSSL_CTX_free(tls_io_instance->ssl_context);
Azure.IoT Build 6:c55b013dfc2a 368 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 369 }
Azure.IoT Build 6:c55b013dfc2a 370 else
Azure.IoT Build 6:c55b013dfc2a 371 {
Azure.IoT Build 6:c55b013dfc2a 372 tls_io_instance->socket_io_read_bytes = NULL;
Azure.IoT Build 6:c55b013dfc2a 373 tls_io_instance->socket_io_read_byte_count = 0;
Azure.IoT Build 6:c55b013dfc2a 374 tls_io_instance->on_send_complete = NULL;
Azure.IoT Build 6:c55b013dfc2a 375 tls_io_instance->on_send_complete_callback_context = NULL;
Azure.IoT Build 6:c55b013dfc2a 376
Azure.IoT Build 6:c55b013dfc2a 377 wolfSSL_set_using_nonblock(tls_io_instance->ssl, 1);
Azure.IoT Build 6:c55b013dfc2a 378 wolfSSL_SetIOSend(tls_io_instance->ssl_context, on_io_send);
Azure.IoT Build 6:c55b013dfc2a 379 wolfSSL_SetIORecv(tls_io_instance->ssl_context, on_io_recv);
Azure.IoT Build 6:c55b013dfc2a 380 wolfSSL_SetHsDoneCb(tls_io_instance->ssl, on_handshake_done, tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 381 wolfSSL_SetIOWriteCtx(tls_io_instance->ssl, tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 382 wolfSSL_SetIOReadCtx(tls_io_instance->ssl, tls_io_instance);
Azure.IoT Build 6:c55b013dfc2a 383
Azure.IoT Build 6:c55b013dfc2a 384 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 6:c55b013dfc2a 385 result = 0;
Azure.IoT Build 6:c55b013dfc2a 386 }
Azure.IoT Build 6:c55b013dfc2a 387 }
Azure.IoT Build 6:c55b013dfc2a 388 return result;
Azure.IoT Build 6:c55b013dfc2a 389 }
Azure.IoT Build 6:c55b013dfc2a 390
Azure.IoT Build 6:c55b013dfc2a 391 static void destroy_wolfssl_instance(TLS_IO_INSTANCE* tls_io_instance)
Azure.IoT Build 6:c55b013dfc2a 392 {
Azure.IoT Build 6:c55b013dfc2a 393 wolfSSL_free(tls_io_instance->ssl);
Azure.IoT Build 6:c55b013dfc2a 394 }
Azure.IoT Build 6:c55b013dfc2a 395
Azure.IoT Build 0:fa2de1b79154 396 int tlsio_wolfssl_init(void)
Azure.IoT Build 0:fa2de1b79154 397 {
Azure.IoT Build 0:fa2de1b79154 398 (void)wolfSSL_library_init();
Azure.IoT Build 0:fa2de1b79154 399 wolfSSL_load_error_strings();
Azure.IoT Build 0:fa2de1b79154 400
Azure.IoT Build 0:fa2de1b79154 401 return 0;
Azure.IoT Build 0:fa2de1b79154 402 }
Azure.IoT Build 0:fa2de1b79154 403
Azure.IoT Build 0:fa2de1b79154 404 void tlsio_wolfssl_deinit(void)
Azure.IoT Build 0:fa2de1b79154 405 {
Azure.IoT Build 0:fa2de1b79154 406 }
Azure.IoT Build 0:fa2de1b79154 407
Azure.IoT Build 6:c55b013dfc2a 408 CONCRETE_IO_HANDLE tlsio_wolfssl_create(void* io_create_parameters)
Azure.IoT Build 0:fa2de1b79154 409 {
Azure.IoT Build 0:fa2de1b79154 410 TLSIO_CONFIG* tls_io_config = io_create_parameters;
Azure.IoT Build 0:fa2de1b79154 411 TLS_IO_INSTANCE* result;
Azure.IoT Build 0:fa2de1b79154 412
Azure.IoT Build 0:fa2de1b79154 413 if (tls_io_config == NULL)
Azure.IoT Build 0:fa2de1b79154 414 {
Azure.IoT Build 0:fa2de1b79154 415 result = NULL;
Azure.IoT Build 0:fa2de1b79154 416 }
Azure.IoT Build 0:fa2de1b79154 417 else
Azure.IoT Build 0:fa2de1b79154 418 {
Azure.IoT Build 6:c55b013dfc2a 419 result = (TLS_IO_INSTANCE*)malloc(sizeof(TLS_IO_INSTANCE));
Azure.IoT Build 0:fa2de1b79154 420 if (result != NULL)
Azure.IoT Build 0:fa2de1b79154 421 {
Azure.IoT Build 6:c55b013dfc2a 422 memset(result, 0, sizeof(TLS_IO_INSTANCE));
Azure.IoT Build 6:c55b013dfc2a 423 mallocAndStrcpy_s(&result->hostname, tls_io_config->hostname);
Azure.IoT Build 6:c55b013dfc2a 424 result->port = tls_io_config->port;
Azure.IoT Build 0:fa2de1b79154 425
Azure.IoT Build 6:c55b013dfc2a 426 result->socket_io_read_bytes = 0;
Azure.IoT Build 6:c55b013dfc2a 427 result->socket_io_read_byte_count = 0;
Azure.IoT Build 6:c55b013dfc2a 428 result->socket_io = NULL;
Azure.IoT Build 6:c55b013dfc2a 429
Azure.IoT Build 6:c55b013dfc2a 430 result->ssl = NULL;
Azure.IoT Build 6:c55b013dfc2a 431 result->ssl_context = NULL;
Azure.IoT Build 6:c55b013dfc2a 432 result->certificate = NULL;
Azure.IoT Build 0:fa2de1b79154 433
Azure.IoT Build 0:fa2de1b79154 434 result->on_bytes_received = NULL;
Azure.IoT Build 0:fa2de1b79154 435 result->on_bytes_received_context = NULL;
Azure.IoT Build 0:fa2de1b79154 436
Azure.IoT Build 0:fa2de1b79154 437 result->on_io_open_complete = NULL;
Azure.IoT Build 0:fa2de1b79154 438 result->on_io_open_complete_context = NULL;
Azure.IoT Build 0:fa2de1b79154 439
Azure.IoT Build 0:fa2de1b79154 440 result->on_io_close_complete = NULL;
Azure.IoT Build 0:fa2de1b79154 441 result->on_io_close_complete_context = NULL;
Azure.IoT Build 0:fa2de1b79154 442
Azure.IoT Build 0:fa2de1b79154 443 result->on_io_error = NULL;
Azure.IoT Build 0:fa2de1b79154 444 result->on_io_error_context = NULL;
Azure.IoT Build 0:fa2de1b79154 445
Azure.IoT Build 6:c55b013dfc2a 446 result->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 0:fa2de1b79154 447
Azure.IoT Build 0:fa2de1b79154 448 result->ssl_context = wolfSSL_CTX_new(wolfTLSv1_client_method());
Azure.IoT Build 0:fa2de1b79154 449 if (result->ssl_context == NULL)
Azure.IoT Build 0:fa2de1b79154 450 {
Azure.IoT Build 0:fa2de1b79154 451 free(result);
Azure.IoT Build 0:fa2de1b79154 452 result = NULL;
Azure.IoT Build 0:fa2de1b79154 453 }
Azure.IoT Build 0:fa2de1b79154 454 else
Azure.IoT Build 0:fa2de1b79154 455 {
Azure.IoT Build 0:fa2de1b79154 456 const IO_INTERFACE_DESCRIPTION* socket_io_interface = socketio_get_interface_description();
Azure.IoT Build 0:fa2de1b79154 457 if (socket_io_interface == NULL)
Azure.IoT Build 0:fa2de1b79154 458 {
Azure.IoT Build 0:fa2de1b79154 459 wolfSSL_CTX_free(result->ssl_context);
Azure.IoT Build 0:fa2de1b79154 460 free(result);
Azure.IoT Build 0:fa2de1b79154 461 result = NULL;
Azure.IoT Build 0:fa2de1b79154 462 }
Azure.IoT Build 0:fa2de1b79154 463 else
Azure.IoT Build 0:fa2de1b79154 464 {
Azure.IoT Build 6:c55b013dfc2a 465 SOCKETIO_CONFIG socketio_config;
Azure.IoT Build 6:c55b013dfc2a 466 socketio_config.hostname = result->hostname;
Azure.IoT Build 6:c55b013dfc2a 467 socketio_config.port = result->port;
Azure.IoT Build 6:c55b013dfc2a 468 socketio_config.accepted_socket = NULL;
Azure.IoT Build 6:c55b013dfc2a 469
Azure.IoT Build 6:c55b013dfc2a 470 result->socket_io = xio_create(socket_io_interface, &socketio_config);
Azure.IoT Build 0:fa2de1b79154 471 if (result->socket_io == NULL)
Azure.IoT Build 0:fa2de1b79154 472 {
Azure.IoT Build 6:c55b013dfc2a 473 LogError("Failure connecting to underlying socket_io");
Azure.IoT Build 0:fa2de1b79154 474 wolfSSL_CTX_free(result->ssl_context);
Azure.IoT Build 0:fa2de1b79154 475 free(result);
Azure.IoT Build 0:fa2de1b79154 476 result = NULL;
Azure.IoT Build 0:fa2de1b79154 477 }
Azure.IoT Build 0:fa2de1b79154 478 }
Azure.IoT Build 0:fa2de1b79154 479 }
Azure.IoT Build 6:c55b013dfc2a 480
Azure.IoT Build 6:c55b013dfc2a 481
Azure.IoT Build 0:fa2de1b79154 482 }
Azure.IoT Build 0:fa2de1b79154 483 }
Azure.IoT Build 0:fa2de1b79154 484
Azure.IoT Build 0:fa2de1b79154 485 return result;
Azure.IoT Build 0:fa2de1b79154 486 }
Azure.IoT Build 0:fa2de1b79154 487
Azure.IoT Build 0:fa2de1b79154 488 void tlsio_wolfssl_destroy(CONCRETE_IO_HANDLE tls_io)
Azure.IoT Build 0:fa2de1b79154 489 {
Azure.IoT Build 0:fa2de1b79154 490 if (tls_io != NULL)
Azure.IoT Build 0:fa2de1b79154 491 {
Azure.IoT Build 0:fa2de1b79154 492 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 493 if (tls_io_instance->socket_io_read_bytes != NULL)
Azure.IoT Build 0:fa2de1b79154 494 {
Azure.IoT Build 0:fa2de1b79154 495 free(tls_io_instance->socket_io_read_bytes);
Azure.IoT Build 0:fa2de1b79154 496 }
Azure.IoT Build 0:fa2de1b79154 497
Azure.IoT Build 6:c55b013dfc2a 498 if (tls_io_instance->certificate != NULL)
Azure.IoT Build 6:c55b013dfc2a 499 {
Azure.IoT Build 6:c55b013dfc2a 500 free(tls_io_instance->certificate);
Azure.IoT Build 6:c55b013dfc2a 501 tls_io_instance->certificate = NULL;
Azure.IoT Build 6:c55b013dfc2a 502 }
Azure.IoT Build 6:c55b013dfc2a 503 wolfSSL_CTX_free(tls_io_instance->ssl_context);
Azure.IoT Build 0:fa2de1b79154 504 xio_destroy(tls_io_instance->socket_io);
Azure.IoT Build 0:fa2de1b79154 505 free(tls_io);
Azure.IoT Build 0:fa2de1b79154 506 }
Azure.IoT Build 0:fa2de1b79154 507 }
Azure.IoT Build 0:fa2de1b79154 508
Azure.IoT Build 0:fa2de1b79154 509 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 510 {
Azure.IoT Build 0:fa2de1b79154 511 int result;
Azure.IoT Build 0:fa2de1b79154 512
Azure.IoT Build 0:fa2de1b79154 513 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 514 {
Azure.IoT Build 0:fa2de1b79154 515 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 516 }
Azure.IoT Build 0:fa2de1b79154 517 else
Azure.IoT Build 0:fa2de1b79154 518 {
Azure.IoT Build 0:fa2de1b79154 519 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 520
Azure.IoT Build 0:fa2de1b79154 521 if (tls_io_instance->tlsio_state != TLSIO_STATE_NOT_OPEN)
Azure.IoT Build 0:fa2de1b79154 522 {
Azure.IoT Build 6:c55b013dfc2a 523 LogError("Invalid state encountered.");
Azure.IoT Build 0:fa2de1b79154 524 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 525 }
Azure.IoT Build 0:fa2de1b79154 526 else
Azure.IoT Build 0:fa2de1b79154 527 {
Azure.IoT Build 0:fa2de1b79154 528 tls_io_instance->on_bytes_received = on_bytes_received;
Azure.IoT Build 0:fa2de1b79154 529 tls_io_instance->on_bytes_received_context = on_bytes_received_context;
Azure.IoT Build 0:fa2de1b79154 530
Azure.IoT Build 0:fa2de1b79154 531 tls_io_instance->on_io_open_complete = on_io_open_complete;
Azure.IoT Build 0:fa2de1b79154 532 tls_io_instance->on_io_open_complete_context = on_io_open_complete_context;
Azure.IoT Build 0:fa2de1b79154 533
Azure.IoT Build 0:fa2de1b79154 534 tls_io_instance->on_io_error = on_io_error;
Azure.IoT Build 0:fa2de1b79154 535 tls_io_instance->on_io_error_context = on_io_error_context;
Azure.IoT Build 0:fa2de1b79154 536
Azure.IoT Build 0:fa2de1b79154 537 tls_io_instance->tlsio_state = TLSIO_STATE_OPENING_UNDERLYING_IO;
Azure.IoT Build 0:fa2de1b79154 538
Azure.IoT Build 6:c55b013dfc2a 539 if (create_wolfssl_instance(tls_io_instance) != 0)
Azure.IoT Build 6:c55b013dfc2a 540 {
Azure.IoT Build 6:c55b013dfc2a 541 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 6:c55b013dfc2a 542 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 543 }
Azure.IoT Build 6:c55b013dfc2a 544 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 545 {
Azure.IoT Build 0:fa2de1b79154 546 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 0:fa2de1b79154 547 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 548 }
Azure.IoT Build 0:fa2de1b79154 549 else
Azure.IoT Build 0:fa2de1b79154 550 {
Azure.IoT Build 6:c55b013dfc2a 551 // The state can get changed in the on_underlying_io_open_complete
Azure.IoT Build 6:c55b013dfc2a 552 if (tls_io_instance->tlsio_state == TLSIO_STATE_ERROR)
Azure.IoT Build 0:fa2de1b79154 553 {
Azure.IoT Build 6:c55b013dfc2a 554 LogError("Failed to connect to server. The certificates may not be correct.");
Azure.IoT Build 0:fa2de1b79154 555 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 556 }
Azure.IoT Build 0:fa2de1b79154 557 else
Azure.IoT Build 0:fa2de1b79154 558 {
Azure.IoT Build 6:c55b013dfc2a 559 int res;
Azure.IoT Build 6:c55b013dfc2a 560 tls_io_instance->tlsio_state = TLSIO_STATE_IN_HANDSHAKE;
Azure.IoT Build 6:c55b013dfc2a 561 res = wolfSSL_connect(tls_io_instance->ssl);
Azure.IoT Build 6:c55b013dfc2a 562 if (res != SSL_SUCCESS)
Azure.IoT Build 6:c55b013dfc2a 563 {
Azure.IoT Build 6:c55b013dfc2a 564 LogError("Failed to connect to server.");
Azure.IoT Build 6:c55b013dfc2a 565 tls_io_instance->tlsio_state = TLSIO_STATE_NOT_OPEN;
Azure.IoT Build 6:c55b013dfc2a 566 result = __LINE__;
Azure.IoT Build 6:c55b013dfc2a 567 }
Azure.IoT Build 6:c55b013dfc2a 568 else
Azure.IoT Build 6:c55b013dfc2a 569 {
Azure.IoT Build 6:c55b013dfc2a 570 result = 0;
Azure.IoT Build 6:c55b013dfc2a 571 }
Azure.IoT Build 0:fa2de1b79154 572 }
Azure.IoT Build 0:fa2de1b79154 573 }
Azure.IoT Build 0:fa2de1b79154 574 }
Azure.IoT Build 0:fa2de1b79154 575 }
Azure.IoT Build 0:fa2de1b79154 576
Azure.IoT Build 0:fa2de1b79154 577 return result;
Azure.IoT Build 0:fa2de1b79154 578 }
Azure.IoT Build 0:fa2de1b79154 579
Azure.IoT Build 0:fa2de1b79154 580 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 581 {
Azure.IoT Build 0:fa2de1b79154 582 int result = 0;
Azure.IoT Build 0:fa2de1b79154 583
Azure.IoT Build 0:fa2de1b79154 584 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 585 {
Azure.IoT Build 0:fa2de1b79154 586 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 587 }
Azure.IoT Build 0:fa2de1b79154 588 else
Azure.IoT Build 0:fa2de1b79154 589 {
Azure.IoT Build 0:fa2de1b79154 590 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 591
Azure.IoT Build 0:fa2de1b79154 592 if ((tls_io_instance->tlsio_state == TLSIO_STATE_NOT_OPEN) ||
Azure.IoT Build 0:fa2de1b79154 593 (tls_io_instance->tlsio_state == TLSIO_STATE_CLOSING))
Azure.IoT Build 0:fa2de1b79154 594 {
Azure.IoT Build 0:fa2de1b79154 595 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 596 }
Azure.IoT Build 0:fa2de1b79154 597 else
Azure.IoT Build 0:fa2de1b79154 598 {
Azure.IoT Build 0:fa2de1b79154 599 tls_io_instance->tlsio_state = TLSIO_STATE_CLOSING;
Azure.IoT Build 0:fa2de1b79154 600 tls_io_instance->on_io_close_complete = on_io_close_complete;
Azure.IoT Build 0:fa2de1b79154 601 tls_io_instance->on_io_close_complete_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 602
Azure.IoT Build 0:fa2de1b79154 603 if (xio_close(tls_io_instance->socket_io, on_underlying_io_close_complete, tls_io_instance) != 0)
Azure.IoT Build 0:fa2de1b79154 604 {
Azure.IoT Build 0:fa2de1b79154 605 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 606 }
Azure.IoT Build 0:fa2de1b79154 607 else
Azure.IoT Build 0:fa2de1b79154 608 {
Azure.IoT Build 6:c55b013dfc2a 609 destroy_wolfssl_instance(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 610 result = 0;
Azure.IoT Build 0:fa2de1b79154 611 }
Azure.IoT Build 0:fa2de1b79154 612 }
Azure.IoT Build 0:fa2de1b79154 613 }
Azure.IoT Build 0:fa2de1b79154 614
Azure.IoT Build 0:fa2de1b79154 615 return result;
Azure.IoT Build 0:fa2de1b79154 616 }
Azure.IoT Build 0:fa2de1b79154 617
Azure.IoT Build 0:fa2de1b79154 618 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 619 {
Azure.IoT Build 0:fa2de1b79154 620 int result;
Azure.IoT Build 0:fa2de1b79154 621
Azure.IoT Build 0:fa2de1b79154 622 if (tls_io == NULL)
Azure.IoT Build 0:fa2de1b79154 623 {
Azure.IoT Build 0:fa2de1b79154 624 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 625 }
Azure.IoT Build 0:fa2de1b79154 626 else
Azure.IoT Build 0:fa2de1b79154 627 {
Azure.IoT Build 0:fa2de1b79154 628 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 629
Azure.IoT Build 0:fa2de1b79154 630 if (tls_io_instance->tlsio_state != TLSIO_STATE_OPEN)
Azure.IoT Build 0:fa2de1b79154 631 {
Azure.IoT Build 0:fa2de1b79154 632 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 633 }
Azure.IoT Build 0:fa2de1b79154 634 else
Azure.IoT Build 0:fa2de1b79154 635 {
Azure.IoT Build 0:fa2de1b79154 636 tls_io_instance->on_send_complete = on_send_complete;
Azure.IoT Build 0:fa2de1b79154 637 tls_io_instance->on_send_complete_callback_context = callback_context;
Azure.IoT Build 0:fa2de1b79154 638
Azure.IoT Build 0:fa2de1b79154 639 int res = wolfSSL_write(tls_io_instance->ssl, buffer, size);
Azure.IoT Build 0:fa2de1b79154 640 if (res != size)
Azure.IoT Build 0:fa2de1b79154 641 {
Azure.IoT Build 0:fa2de1b79154 642 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 643 }
Azure.IoT Build 0:fa2de1b79154 644 else
Azure.IoT Build 0:fa2de1b79154 645 {
Azure.IoT Build 0:fa2de1b79154 646 result = 0;
Azure.IoT Build 0:fa2de1b79154 647 }
Azure.IoT Build 0:fa2de1b79154 648 }
Azure.IoT Build 0:fa2de1b79154 649 }
Azure.IoT Build 0:fa2de1b79154 650
Azure.IoT Build 0:fa2de1b79154 651 return result;
Azure.IoT Build 0:fa2de1b79154 652 }
Azure.IoT Build 0:fa2de1b79154 653
Azure.IoT Build 0:fa2de1b79154 654 void tlsio_wolfssl_dowork(CONCRETE_IO_HANDLE tls_io)
Azure.IoT Build 0:fa2de1b79154 655 {
Azure.IoT Build 0:fa2de1b79154 656 if (tls_io != NULL)
Azure.IoT Build 0:fa2de1b79154 657 {
Azure.IoT Build 0:fa2de1b79154 658 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 659
Azure.IoT Build 0:fa2de1b79154 660 if ((tls_io_instance->tlsio_state != TLSIO_STATE_NOT_OPEN) &&
Azure.IoT Build 0:fa2de1b79154 661 (tls_io_instance->tlsio_state != TLSIO_STATE_ERROR))
Azure.IoT Build 0:fa2de1b79154 662 {
Azure.IoT Build 0:fa2de1b79154 663 decode_ssl_received_bytes(tls_io_instance);
Azure.IoT Build 0:fa2de1b79154 664 xio_dowork(tls_io_instance->socket_io);
Azure.IoT Build 0:fa2de1b79154 665 }
Azure.IoT Build 0:fa2de1b79154 666 }
Azure.IoT Build 0:fa2de1b79154 667 }
Azure.IoT Build 0:fa2de1b79154 668
Azure.IoT Build 0:fa2de1b79154 669 const IO_INTERFACE_DESCRIPTION* tlsio_wolfssl_get_interface_description(void)
Azure.IoT Build 0:fa2de1b79154 670 {
Azure.IoT Build 0:fa2de1b79154 671 return &tlsio_wolfssl_interface_description;
Azure.IoT Build 0:fa2de1b79154 672 }
Azure.IoT Build 0:fa2de1b79154 673
Azure.IoT Build 0:fa2de1b79154 674 int tlsio_wolfssl_setoption(CONCRETE_IO_HANDLE tls_io, const char* optionName, const void* value)
Azure.IoT Build 0:fa2de1b79154 675 {
Azure.IoT Build 0:fa2de1b79154 676 int result;
Azure.IoT Build 0:fa2de1b79154 677
Azure.IoT Build 0:fa2de1b79154 678 if (tls_io == NULL || optionName == NULL)
Azure.IoT Build 0:fa2de1b79154 679 {
Azure.IoT Build 0:fa2de1b79154 680 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 681 }
Azure.IoT Build 0:fa2de1b79154 682 else
Azure.IoT Build 0:fa2de1b79154 683 {
Azure.IoT Build 0:fa2de1b79154 684 TLS_IO_INSTANCE* tls_io_instance = (TLS_IO_INSTANCE*)tls_io;
Azure.IoT Build 0:fa2de1b79154 685
Azure.IoT Build 0:fa2de1b79154 686 if (strcmp("TrustedCerts", optionName) == 0)
Azure.IoT Build 0:fa2de1b79154 687 {
Azure.IoT Build 6:c55b013dfc2a 688 const char* cert = (const char*)value;
Azure.IoT Build 6:c55b013dfc2a 689 if (tls_io_instance->certificate != NULL)
Azure.IoT Build 6:c55b013dfc2a 690 {
Azure.IoT Build 6:c55b013dfc2a 691 // Free the memory if it has been previously allocated
Azure.IoT Build 6:c55b013dfc2a 692 free(tls_io_instance->certificate);
Azure.IoT Build 6:c55b013dfc2a 693 }
Azure.IoT Build 6:c55b013dfc2a 694
Azure.IoT Build 6:c55b013dfc2a 695 // Store the certificate
Azure.IoT Build 6:c55b013dfc2a 696 size_t len = strlen(cert);
Azure.IoT Build 6:c55b013dfc2a 697 tls_io_instance->certificate = (const char*)malloc(len+1);
Azure.IoT Build 6:c55b013dfc2a 698 if (tls_io_instance->certificate == NULL)
Azure.IoT Build 0:fa2de1b79154 699 {
Azure.IoT Build 0:fa2de1b79154 700 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 701 }
Azure.IoT Build 0:fa2de1b79154 702 else
Azure.IoT Build 0:fa2de1b79154 703 {
Azure.IoT Build 6:c55b013dfc2a 704 (void)strcpy(tls_io_instance->certificate, cert);
Azure.IoT Build 0:fa2de1b79154 705 result = 0;
Azure.IoT Build 0:fa2de1b79154 706 }
Azure.IoT Build 0:fa2de1b79154 707 }
AzureIoTClient 1:9190c0f4d23a 708 else if (tls_io_instance->socket_io == NULL)
AzureIoTClient 1:9190c0f4d23a 709 {
AzureIoTClient 1:9190c0f4d23a 710 result = __LINE__;
AzureIoTClient 1:9190c0f4d23a 711 }
Azure.IoT Build 0:fa2de1b79154 712 else
Azure.IoT Build 0:fa2de1b79154 713 {
Azure.IoT Build 0:fa2de1b79154 714 result = xio_setoption(tls_io_instance->socket_io, optionName, value);
Azure.IoT Build 0:fa2de1b79154 715 }
Azure.IoT Build 0:fa2de1b79154 716 }
Azure.IoT Build 0:fa2de1b79154 717
Azure.IoT Build 0:fa2de1b79154 718 return result;
AzureIoTClient 10:1be0bc9a9deb 719 }