Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of azure_c_shared_utility by
wolfssl_connection.cpp@0:fa2de1b79154, 2016-04-08 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
