Azure IoT / azure_c_shared_utility

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
Azure.IoT Build
Date:
Fri Apr 08 12:01:36 2016 -0700
Revision:
0:fa2de1b79154
Child:
1:9190c0f4d23a
1.0.4

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 <memory.h>
Azure.IoT Build 0:fa2de1b79154 5 #include <time.h>
Azure.IoT Build 0:fa2de1b79154 6 #include "wolfssl/ssl.h"
Azure.IoT Build 0:fa2de1b79154 7 #include "wolfssl_connection.h"
Azure.IoT Build 0:fa2de1b79154 8 #include "azure_c_shared_utility/iot_logging.h"
Azure.IoT Build 0:fa2de1b79154 9
Azure.IoT Build 0:fa2de1b79154 10 static timeval receiveTimeout = {0,1};
Azure.IoT Build 0:fa2de1b79154 11 static timeval sendTimeout = {0,1};
Azure.IoT Build 0:fa2de1b79154 12
Azure.IoT Build 0:fa2de1b79154 13
Azure.IoT Build 0:fa2de1b79154 14 WolfSSLConnection::WolfSSLConnection()
Azure.IoT Build 0:fa2de1b79154 15 {
Azure.IoT Build 0:fa2de1b79154 16 wolfSSL_Init();
Azure.IoT Build 0:fa2de1b79154 17
Azure.IoT Build 0:fa2de1b79154 18 WOLFSSL_METHOD* method = wolfTLSv1_2_client_method();
Azure.IoT Build 0:fa2de1b79154 19 if(method != NULL)
Azure.IoT Build 0:fa2de1b79154 20 {
Azure.IoT Build 0:fa2de1b79154 21 sslContext = wolfSSL_CTX_new(method);
Azure.IoT Build 0:fa2de1b79154 22 }
Azure.IoT Build 0:fa2de1b79154 23 else
Azure.IoT Build 0:fa2de1b79154 24 {
Azure.IoT Build 0:fa2de1b79154 25 sslContext = NULL;
Azure.IoT Build 0:fa2de1b79154 26 }
Azure.IoT Build 0:fa2de1b79154 27
Azure.IoT Build 0:fa2de1b79154 28 isConnected = false;
Azure.IoT Build 0:fa2de1b79154 29 }
Azure.IoT Build 0:fa2de1b79154 30
Azure.IoT Build 0:fa2de1b79154 31 WolfSSLConnection::~WolfSSLConnection()
Azure.IoT Build 0:fa2de1b79154 32 {
Azure.IoT Build 0:fa2de1b79154 33 if (sslContext != NULL)
Azure.IoT Build 0:fa2de1b79154 34 {
Azure.IoT Build 0:fa2de1b79154 35 wolfSSL_CTX_free(sslContext);
Azure.IoT Build 0:fa2de1b79154 36 sslContext = NULL;
Azure.IoT Build 0:fa2de1b79154 37 }
Azure.IoT Build 0:fa2de1b79154 38
Azure.IoT Build 0:fa2de1b79154 39 wolfSSL_Cleanup();
Azure.IoT Build 0:fa2de1b79154 40 }
Azure.IoT Build 0:fa2de1b79154 41
Azure.IoT Build 0:fa2de1b79154 42 static int receiveCallback(WOLFSSL* ssl, char *buf, int sz, void *ctx)
Azure.IoT Build 0:fa2de1b79154 43 {
Azure.IoT Build 0:fa2de1b79154 44 int fd = *(int*)ctx;
Azure.IoT Build 0:fa2de1b79154 45 int result;
Azure.IoT Build 0:fa2de1b79154 46
Azure.IoT Build 0:fa2de1b79154 47 (void)ssl;
Azure.IoT Build 0:fa2de1b79154 48
Azure.IoT Build 0:fa2de1b79154 49 fd_set rfds;
Azure.IoT Build 0:fa2de1b79154 50 FD_ZERO(&rfds);
Azure.IoT Build 0:fa2de1b79154 51 FD_SET(fd, &rfds);
Azure.IoT Build 0:fa2de1b79154 52
Azure.IoT Build 0:fa2de1b79154 53 if (lwip_select(FD_SETSIZE, &rfds, NULL, NULL, &receiveTimeout) < 0)
Azure.IoT Build 0:fa2de1b79154 54 {
Azure.IoT Build 0:fa2de1b79154 55 result = -1;
Azure.IoT Build 0:fa2de1b79154 56 }
Azure.IoT Build 0:fa2de1b79154 57 else
Azure.IoT Build 0:fa2de1b79154 58 {
Azure.IoT Build 0:fa2de1b79154 59 result = lwip_recv(fd, buf, sz, 0);
Azure.IoT Build 0:fa2de1b79154 60 }
Azure.IoT Build 0:fa2de1b79154 61
Azure.IoT Build 0:fa2de1b79154 62 return result;
Azure.IoT Build 0:fa2de1b79154 63 }
Azure.IoT Build 0:fa2de1b79154 64
Azure.IoT Build 0:fa2de1b79154 65 static int sendCallback(WOLFSSL* ssl, char *buf, int sz, void *ctx)
Azure.IoT Build 0:fa2de1b79154 66 {
Azure.IoT Build 0:fa2de1b79154 67 int fd = *(int*)ctx;
Azure.IoT Build 0:fa2de1b79154 68 int result;
Azure.IoT Build 0:fa2de1b79154 69
Azure.IoT Build 0:fa2de1b79154 70 (void)ssl;
Azure.IoT Build 0:fa2de1b79154 71
Azure.IoT Build 0:fa2de1b79154 72 fd_set wfds;
Azure.IoT Build 0:fa2de1b79154 73 FD_ZERO(&wfds);
Azure.IoT Build 0:fa2de1b79154 74 FD_SET(fd, &wfds);
Azure.IoT Build 0:fa2de1b79154 75
Azure.IoT Build 0:fa2de1b79154 76 if (lwip_select(FD_SETSIZE, NULL, &wfds, NULL, &sendTimeout) < 0)
Azure.IoT Build 0:fa2de1b79154 77 {
Azure.IoT Build 0:fa2de1b79154 78 return -1;
Azure.IoT Build 0:fa2de1b79154 79 }
Azure.IoT Build 0:fa2de1b79154 80 else
Azure.IoT Build 0:fa2de1b79154 81 {
Azure.IoT Build 0:fa2de1b79154 82 result = lwip_send(fd, buf, sz, 0);
Azure.IoT Build 0:fa2de1b79154 83 }
Azure.IoT Build 0:fa2de1b79154 84
Azure.IoT Build 0:fa2de1b79154 85 return result;
Azure.IoT Build 0:fa2de1b79154 86 }
Azure.IoT Build 0:fa2de1b79154 87
Azure.IoT Build 0:fa2de1b79154 88 int WolfSSLConnection::connect(const char* host, const int port)
Azure.IoT Build 0:fa2de1b79154 89 {
Azure.IoT Build 0:fa2de1b79154 90 int result;
Azure.IoT Build 0:fa2de1b79154 91
Azure.IoT Build 0:fa2de1b79154 92 if(sslContext == NULL)
Azure.IoT Build 0:fa2de1b79154 93 {
Azure.IoT Build 0:fa2de1b79154 94 LogError("NULL SSL context\r\n");
Azure.IoT Build 0:fa2de1b79154 95 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 96 }
Azure.IoT Build 0:fa2de1b79154 97 else
Azure.IoT Build 0:fa2de1b79154 98 {
Azure.IoT Build 0:fa2de1b79154 99 if (init_socket(SOCK_STREAM) < 0)
Azure.IoT Build 0:fa2de1b79154 100 {
Azure.IoT Build 0:fa2de1b79154 101 LogError("init_socket failed\r\n");
Azure.IoT Build 0:fa2de1b79154 102 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 103 }
Azure.IoT Build 0:fa2de1b79154 104 else
Azure.IoT Build 0:fa2de1b79154 105 {
Azure.IoT Build 0:fa2de1b79154 106 if (set_address(host, port) != 0)
Azure.IoT Build 0:fa2de1b79154 107 {
Azure.IoT Build 0:fa2de1b79154 108 LogError("set_address failed\r\n");
Azure.IoT Build 0:fa2de1b79154 109 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 110 }
Azure.IoT Build 0:fa2de1b79154 111 else if (lwip_connect(_sock_fd, (const struct sockaddr *) &_remoteHost, sizeof(_remoteHost)) < 0)
Azure.IoT Build 0:fa2de1b79154 112 {
Azure.IoT Build 0:fa2de1b79154 113 close();
Azure.IoT Build 0:fa2de1b79154 114 LogError("lwip_connect failed\r\n");
Azure.IoT Build 0:fa2de1b79154 115 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 116 }
Azure.IoT Build 0:fa2de1b79154 117 else
Azure.IoT Build 0:fa2de1b79154 118 {
Azure.IoT Build 0:fa2de1b79154 119 wolfSSL_SetIOSend(sslContext, &sendCallback);
Azure.IoT Build 0:fa2de1b79154 120 wolfSSL_SetIORecv(sslContext, &receiveCallback);
Azure.IoT Build 0:fa2de1b79154 121
Azure.IoT Build 0:fa2de1b79154 122 ssl = wolfSSL_new(sslContext);
Azure.IoT Build 0:fa2de1b79154 123 if(ssl == NULL)
Azure.IoT Build 0:fa2de1b79154 124 {
Azure.IoT Build 0:fa2de1b79154 125 LogError("wolfssl new error\r\n");
Azure.IoT Build 0:fa2de1b79154 126 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 127 }
Azure.IoT Build 0:fa2de1b79154 128 else
Azure.IoT Build 0:fa2de1b79154 129 {
Azure.IoT Build 0:fa2de1b79154 130 wolfSSL_set_fd(ssl, _sock_fd);
Azure.IoT Build 0:fa2de1b79154 131
Azure.IoT Build 0:fa2de1b79154 132 result = wolfSSL_connect(ssl);
Azure.IoT Build 0:fa2de1b79154 133 if (result != SSL_SUCCESS)
Azure.IoT Build 0:fa2de1b79154 134 {
Azure.IoT Build 0:fa2de1b79154 135 LogError("wolfssl connect error=%d\r\n", result);
Azure.IoT Build 0:fa2de1b79154 136 result = __LINE__;
Azure.IoT Build 0:fa2de1b79154 137 }
Azure.IoT Build 0:fa2de1b79154 138 else
Azure.IoT Build 0:fa2de1b79154 139 {
Azure.IoT Build 0:fa2de1b79154 140 result = 0;
Azure.IoT Build 0:fa2de1b79154 141 isConnected = true;
Azure.IoT Build 0:fa2de1b79154 142 }
Azure.IoT Build 0:fa2de1b79154 143 }
Azure.IoT Build 0:fa2de1b79154 144 }
Azure.IoT Build 0:fa2de1b79154 145 }
Azure.IoT Build 0:fa2de1b79154 146 }
Azure.IoT Build 0:fa2de1b79154 147
Azure.IoT Build 0:fa2de1b79154 148 return result;
Azure.IoT Build 0:fa2de1b79154 149 };
Azure.IoT Build 0:fa2de1b79154 150
Azure.IoT Build 0:fa2de1b79154 151 bool WolfSSLConnection::is_connected(void)
Azure.IoT Build 0:fa2de1b79154 152 {
Azure.IoT Build 0:fa2de1b79154 153 return isConnected;
Azure.IoT Build 0:fa2de1b79154 154 }
Azure.IoT Build 0:fa2de1b79154 155
Azure.IoT Build 0:fa2de1b79154 156 int WolfSSLConnection::send(char* data, int length)
Azure.IoT Build 0:fa2de1b79154 157 {
Azure.IoT Build 0:fa2de1b79154 158 int result;
Azure.IoT Build 0:fa2de1b79154 159
Azure.IoT Build 0:fa2de1b79154 160 if (!isConnected)
Azure.IoT Build 0:fa2de1b79154 161 {
Azure.IoT Build 0:fa2de1b79154 162 result = 0;
Azure.IoT Build 0:fa2de1b79154 163 }
Azure.IoT Build 0:fa2de1b79154 164 else
Azure.IoT Build 0:fa2de1b79154 165 {
Azure.IoT Build 0:fa2de1b79154 166 result = wolfSSL_write(ssl, data, length);
Azure.IoT Build 0:fa2de1b79154 167 }
Azure.IoT Build 0:fa2de1b79154 168
Azure.IoT Build 0:fa2de1b79154 169 return result;
Azure.IoT Build 0:fa2de1b79154 170 }
Azure.IoT Build 0:fa2de1b79154 171
Azure.IoT Build 0:fa2de1b79154 172 int WolfSSLConnection::send_all(char* data, int length)
Azure.IoT Build 0:fa2de1b79154 173 {
Azure.IoT Build 0:fa2de1b79154 174 return send(data, length);
Azure.IoT Build 0:fa2de1b79154 175 }
Azure.IoT Build 0:fa2de1b79154 176
Azure.IoT Build 0:fa2de1b79154 177 int WolfSSLConnection::receive(char* data, int length)
Azure.IoT Build 0:fa2de1b79154 178 {
Azure.IoT Build 0:fa2de1b79154 179 int result;
Azure.IoT Build 0:fa2de1b79154 180
Azure.IoT Build 0:fa2de1b79154 181 if (!isConnected)
Azure.IoT Build 0:fa2de1b79154 182 {
Azure.IoT Build 0:fa2de1b79154 183 result = 0;
Azure.IoT Build 0:fa2de1b79154 184 }
Azure.IoT Build 0:fa2de1b79154 185 else
Azure.IoT Build 0:fa2de1b79154 186 {
Azure.IoT Build 0:fa2de1b79154 187 result = wolfSSL_read(ssl, data, length);
Azure.IoT Build 0:fa2de1b79154 188 }
Azure.IoT Build 0:fa2de1b79154 189
Azure.IoT Build 0:fa2de1b79154 190 return result;
Azure.IoT Build 0:fa2de1b79154 191 }
Azure.IoT Build 0:fa2de1b79154 192
Azure.IoT Build 0:fa2de1b79154 193 int WolfSSLConnection::receive_all(char* data, int length)
Azure.IoT Build 0:fa2de1b79154 194 {
Azure.IoT Build 0:fa2de1b79154 195 return receive(data, length);
Azure.IoT Build 0:fa2de1b79154 196 }
Azure.IoT Build 0:fa2de1b79154 197
Azure.IoT Build 0:fa2de1b79154 198 bool WolfSSLConnection::close(bool shutdown)
Azure.IoT Build 0:fa2de1b79154 199 {
Azure.IoT Build 0:fa2de1b79154 200 bool result;
Azure.IoT Build 0:fa2de1b79154 201
Azure.IoT Build 0:fa2de1b79154 202 if (!isConnected)
Azure.IoT Build 0:fa2de1b79154 203 {
Azure.IoT Build 0:fa2de1b79154 204 result = true;
Azure.IoT Build 0:fa2de1b79154 205 }
Azure.IoT Build 0:fa2de1b79154 206 else
Azure.IoT Build 0:fa2de1b79154 207 {
Azure.IoT Build 0:fa2de1b79154 208 isConnected = false;
Azure.IoT Build 0:fa2de1b79154 209
Azure.IoT Build 0:fa2de1b79154 210 wolfSSL_CTX_free(sslContext);
Azure.IoT Build 0:fa2de1b79154 211 result = Socket::close(shutdown) == 0;
Azure.IoT Build 0:fa2de1b79154 212 }
Azure.IoT Build 0:fa2de1b79154 213
Azure.IoT Build 0:fa2de1b79154 214 return result;
Azure.IoT Build 0:fa2de1b79154 215 }
Azure.IoT Build 0:fa2de1b79154 216
Azure.IoT Build 0:fa2de1b79154 217 bool WolfSSLConnection::load_certificate(const unsigned char* certificate, size_t size)
Azure.IoT Build 0:fa2de1b79154 218 {
Azure.IoT Build 0:fa2de1b79154 219 bool result;
Azure.IoT Build 0:fa2de1b79154 220
Azure.IoT Build 0:fa2de1b79154 221 if (sslContext == NULL)
Azure.IoT Build 0:fa2de1b79154 222 {
Azure.IoT Build 0:fa2de1b79154 223 LogError("NULL SSL context\r\n");
Azure.IoT Build 0:fa2de1b79154 224 result = false;
Azure.IoT Build 0:fa2de1b79154 225 }
Azure.IoT Build 0:fa2de1b79154 226 else
Azure.IoT Build 0:fa2de1b79154 227 {
Azure.IoT Build 0:fa2de1b79154 228 result = (wolfSSL_CTX_load_verify_buffer(sslContext,(unsigned char*)certificate, size, SSL_FILETYPE_PEM) == SSL_SUCCESS);
Azure.IoT Build 0:fa2de1b79154 229 }
Azure.IoT Build 0:fa2de1b79154 230
Azure.IoT Build 0:fa2de1b79154 231 return result;
Azure.IoT Build 0:fa2de1b79154 232 }