Using CyaSSL library, which is included by default with MTSAS library.
Dependencies: FP MQTTPacket
Fork of MQTTS by
MQTTSocket.h@49:8a88045f2b79, 2017-05-25 (annotated)
- Committer:
- vivekratna
- Date:
- Thu May 25 10:10:36 2017 +0000
- Revision:
- 49:8a88045f2b79
- Parent:
- 48:4e7679e7ff94
Latest update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
icraggs | 31:a51dd239b78e | 1 | #if !defined(MQTTSOCKET_H) |
icraggs | 31:a51dd239b78e | 2 | #define MQTTSOCKET_H |
icraggs | 31:a51dd239b78e | 3 | |
vivekratna | 47:a696ce982cde | 4 | #define NO_FILESYSTEM |
vivekratna | 47:a696ce982cde | 5 | |
icraggs | 43:21da1f744243 | 6 | #include "MQTTmbed.h" |
icraggs | 31:a51dd239b78e | 7 | #include "TCPSocketConnection.h" |
vivekratna | 48:4e7679e7ff94 | 8 | #include "ssl.h" |
vivekratna | 48:4e7679e7ff94 | 9 | |
vivekratna | 48:4e7679e7ff94 | 10 | #define MAX_URL_HOSTNAME_LENGTH 128 |
vivekratna | 48:4e7679e7ff94 | 11 | #define MAX_URL_PATH_LENGTH 128 |
vivekratna | 48:4e7679e7ff94 | 12 | |
vivekratna | 48:4e7679e7ff94 | 13 | //Debug is disabled by default |
vivekratna | 48:4e7679e7ff94 | 14 | #if 0 |
vivekratna | 48:4e7679e7ff94 | 15 | //Enable debug |
vivekratna | 48:4e7679e7ff94 | 16 | #include <cstdio> |
vivekratna | 48:4e7679e7ff94 | 17 | #define DBG(x, ...) std::printf("[HTTPClient : DBG]"x"\r\n", ##__VA_ARGS__); |
vivekratna | 48:4e7679e7ff94 | 18 | #define WARN(x, ...) std::printf("[HTTPClient : WARN]"x"\r\n", ##__VA_ARGS__); |
vivekratna | 48:4e7679e7ff94 | 19 | #define ERR(x, ...) std::printf("[HTTPClient : ERR]"x"\r\n", ##__VA_ARGS__); |
vivekratna | 48:4e7679e7ff94 | 20 | |
vivekratna | 48:4e7679e7ff94 | 21 | #else |
vivekratna | 48:4e7679e7ff94 | 22 | //Disable debug |
vivekratna | 48:4e7679e7ff94 | 23 | #define DBG(x, ...) |
vivekratna | 48:4e7679e7ff94 | 24 | #define WARN(x, ...) |
vivekratna | 48:4e7679e7ff94 | 25 | #define ERR(x, ...) |
wolfSSL | 45:6c023c2ab095 | 26 | |
vivekratna | 48:4e7679e7ff94 | 27 | #endif |
vivekratna | 48:4e7679e7ff94 | 28 | |
vivekratna | 48:4e7679e7ff94 | 29 | static TCPSocketConnection* m_sock; |
vivekratna | 48:4e7679e7ff94 | 30 | #define CHUNK_SIZE 256 |
vivekratna | 48:4e7679e7ff94 | 31 | #define SEND_BUF_SIZE 1024 |
vivekratna | 48:4e7679e7ff94 | 32 | static char send_buf[SEND_BUF_SIZE] ; |
vivekratna | 48:4e7679e7ff94 | 33 | static char *send_buf_p = NULL; |
vivekratna | 48:4e7679e7ff94 | 34 | |
vivekratna | 48:4e7679e7ff94 | 35 | static int SocketReceive(CYASSL* ssl, char *buf, int sz, void *ctx) |
wolfSSL | 45:6c023c2ab095 | 36 | { |
vivekratna | 48:4e7679e7ff94 | 37 | int n ; |
vivekratna | 48:4e7679e7ff94 | 38 | int i ; |
vivekratna | 48:4e7679e7ff94 | 39 | #define RECV_RETRY 3 |
vivekratna | 48:4e7679e7ff94 | 40 | |
vivekratna | 48:4e7679e7ff94 | 41 | for(i=0; i<RECV_RETRY; i++) { |
vivekratna | 48:4e7679e7ff94 | 42 | n = m_sock->receive(buf, sz) ; |
vivekratna | 48:4e7679e7ff94 | 43 | if(n >= 0)return n ; |
vivekratna | 48:4e7679e7ff94 | 44 | wait(0.2) ; |
vivekratna | 48:4e7679e7ff94 | 45 | } |
vivekratna | 48:4e7679e7ff94 | 46 | ERR("SocketReceive:%d/%d\n", n, sz) ; |
vivekratna | 48:4e7679e7ff94 | 47 | return n ; |
wolfSSL | 45:6c023c2ab095 | 48 | } |
wolfSSL | 45:6c023c2ab095 | 49 | |
vivekratna | 48:4e7679e7ff94 | 50 | static int SocketSend(CYASSL* ssl, char *buf, int sz, void *ctx) |
wolfSSL | 45:6c023c2ab095 | 51 | { |
vivekratna | 48:4e7679e7ff94 | 52 | int n ; |
vivekratna | 48:4e7679e7ff94 | 53 | |
vivekratna | 48:4e7679e7ff94 | 54 | wait(0.1); |
vivekratna | 48:4e7679e7ff94 | 55 | n = m_sock->send(buf, sz); |
vivekratna | 48:4e7679e7ff94 | 56 | if(n > 0) { |
vivekratna | 48:4e7679e7ff94 | 57 | wait(0.3); |
vivekratna | 48:4e7679e7ff94 | 58 | return n; |
vivekratna | 48:4e7679e7ff94 | 59 | } else { |
vivekratna | 48:4e7679e7ff94 | 60 | ERR("SocketSend:%d/%d\n", n, sz); |
vivekratna | 48:4e7679e7ff94 | 61 | } |
vivekratna | 48:4e7679e7ff94 | 62 | return n; |
wolfSSL | 45:6c023c2ab095 | 63 | } |
icraggs | 31:a51dd239b78e | 64 | |
icraggs | 31:a51dd239b78e | 65 | class MQTTSocket |
icraggs | 31:a51dd239b78e | 66 | { |
wolfSSL | 45:6c023c2ab095 | 67 | public: |
vivekratna | 48:4e7679e7ff94 | 68 | MQTTSocket() |
vivekratna | 48:4e7679e7ff94 | 69 | { |
vivekratna | 48:4e7679e7ff94 | 70 | m_sock = &_m_sock; |
vivekratna | 48:4e7679e7ff94 | 71 | //CyaSSL_Debugging_ON() ; //Turn on if the CyaSSL library isn't working, turns on debug printf's |
vivekratna | 48:4e7679e7ff94 | 72 | |
vivekratna | 48:4e7679e7ff94 | 73 | peerMethod = VERIFY_NONE; |
vivekratna | 48:4e7679e7ff94 | 74 | ctx = 0 ; |
vivekratna | 48:4e7679e7ff94 | 75 | ssl = 0 ; |
vivekratna | 48:4e7679e7ff94 | 76 | SSLver = 3 ; |
vivekratna | 48:4e7679e7ff94 | 77 | certificates = NULL; |
vivekratna | 48:4e7679e7ff94 | 78 | redirect_url = NULL ; |
vivekratna | 48:4e7679e7ff94 | 79 | redirect = 0 ; |
vivekratna | 48:4e7679e7ff94 | 80 | header = NULL ; |
vivekratna | 48:4e7679e7ff94 | 81 | } |
vivekratna | 48:4e7679e7ff94 | 82 | |
wolfSSL | 46:d8968fcc21b8 | 83 | int connect(char* hostname, int port, const char *certName = NULL, int timeout=1000) |
icraggs | 31:a51dd239b78e | 84 | { |
wolfSSL | 45:6c023c2ab095 | 85 | |
vivekratna | 48:4e7679e7ff94 | 86 | m_sock->set_blocking(false, timeout); // 1 second Timeout |
wolfSSL | 46:d8968fcc21b8 | 87 | isTLS = certName == NULL ? false : true ; |
vivekratna | 48:4e7679e7ff94 | 88 | int ret = m_sock->connect(hostname, port); |
wolfSSL | 45:6c023c2ab095 | 89 | if((ret == 0) && isTLS) { |
vivekratna | 48:4e7679e7ff94 | 90 | return tls_connect(certName) ; |
wolfSSL | 45:6c023c2ab095 | 91 | } else return ret ; |
icraggs | 31:a51dd239b78e | 92 | } |
vivekratna | 48:4e7679e7ff94 | 93 | |
icraggs | 36:2f1ada427e56 | 94 | int read(unsigned char* buffer, int len, int timeout) |
icraggs | 31:a51dd239b78e | 95 | { |
vivekratna | 48:4e7679e7ff94 | 96 | m_sock->set_blocking(false, timeout); |
wolfSSL | 45:6c023c2ab095 | 97 | return isTLS ? |
vivekratna | 48:4e7679e7ff94 | 98 | CyaSSL_read(ssl, (char*)buffer, len) : |
vivekratna | 48:4e7679e7ff94 | 99 | m_sock->receive((char *)buffer, len) ; |
icraggs | 31:a51dd239b78e | 100 | } |
vivekratna | 48:4e7679e7ff94 | 101 | |
icraggs | 36:2f1ada427e56 | 102 | int write(unsigned char* buffer, int len, int timeout) |
icraggs | 31:a51dd239b78e | 103 | { |
vivekratna | 48:4e7679e7ff94 | 104 | m_sock->set_blocking(false, timeout); |
wolfSSL | 45:6c023c2ab095 | 105 | return isTLS ? |
vivekratna | 48:4e7679e7ff94 | 106 | CyaSSL_write(ssl, (char*)buffer, len) : |
vivekratna | 48:4e7679e7ff94 | 107 | m_sock->send((char *)buffer, len) ; |
icraggs | 31:a51dd239b78e | 108 | } |
vivekratna | 48:4e7679e7ff94 | 109 | |
icraggs | 31:a51dd239b78e | 110 | int disconnect() |
icraggs | 31:a51dd239b78e | 111 | { |
wolfSSL | 45:6c023c2ab095 | 112 | if(isTLS) { |
vivekratna | 48:4e7679e7ff94 | 113 | CyaSSL_free(ssl); |
vivekratna | 48:4e7679e7ff94 | 114 | CyaSSL_CTX_free(ctx); |
vivekratna | 48:4e7679e7ff94 | 115 | CyaSSL_Cleanup(); |
wolfSSL | 45:6c023c2ab095 | 116 | } |
vivekratna | 48:4e7679e7ff94 | 117 | return m_sock->close(); |
icraggs | 31:a51dd239b78e | 118 | } |
wolfSSL | 46:d8968fcc21b8 | 119 | |
icraggs | 31:a51dd239b78e | 120 | private: |
icraggs | 31:a51dd239b78e | 121 | |
vivekratna | 48:4e7679e7ff94 | 122 | // TCPSocketConnection m_sock; |
wolfSSL | 45:6c023c2ab095 | 123 | bool isTLS ; |
vivekratna | 48:4e7679e7ff94 | 124 | // WOLFSSL_CTX* ctx; |
vivekratna | 48:4e7679e7ff94 | 125 | // WOLFSSL* ssl; |
vivekratna | 48:4e7679e7ff94 | 126 | |
vivekratna | 48:4e7679e7ff94 | 127 | //Parameters |
vivekratna | 48:4e7679e7ff94 | 128 | TCPSocketConnection _m_sock; |
vivekratna | 48:4e7679e7ff94 | 129 | |
vivekratna | 48:4e7679e7ff94 | 130 | int m_timeout; |
vivekratna | 48:4e7679e7ff94 | 131 | |
vivekratna | 48:4e7679e7ff94 | 132 | const char* m_basicAuthUser; |
vivekratna | 48:4e7679e7ff94 | 133 | const char* m_basicAuthPassword; |
vivekratna | 48:4e7679e7ff94 | 134 | int m_httpResponseCode; |
vivekratna | 48:4e7679e7ff94 | 135 | |
vivekratna | 48:4e7679e7ff94 | 136 | const char * header ; |
vivekratna | 48:4e7679e7ff94 | 137 | char * redirect_url ; |
vivekratna | 48:4e7679e7ff94 | 138 | int redirect_url_size ; |
vivekratna | 48:4e7679e7ff94 | 139 | int redirect ; |
vivekratna | 48:4e7679e7ff94 | 140 | |
vivekratna | 48:4e7679e7ff94 | 141 | /* for CyaSSL */ |
vivekratna | 48:4e7679e7ff94 | 142 | const char* certificates; //CA certificates |
vivekratna | 48:4e7679e7ff94 | 143 | SSLMethod peerMethod; |
vivekratna | 48:4e7679e7ff94 | 144 | int SSLver ; |
vivekratna | 48:4e7679e7ff94 | 145 | uint16_t port; |
vivekratna | 48:4e7679e7ff94 | 146 | struct CYASSL_CTX* ctx ; |
vivekratna | 48:4e7679e7ff94 | 147 | struct CYASSL * ssl ; |
vivekratna | 48:4e7679e7ff94 | 148 | |
vivekratna | 48:4e7679e7ff94 | 149 | int tls_connect(const char *certName) |
wolfSSL | 45:6c023c2ab095 | 150 | { |
wolfSSL | 45:6c023c2ab095 | 151 | /* create and initiLize WOLFSSL_CTX structure */ |
vivekratna | 48:4e7679e7ff94 | 152 | if ((ctx = CyaSSL_CTX_new(CyaTLSv1_2_client_method())) == NULL) { |
wolfSSL | 45:6c023c2ab095 | 153 | printf("SSL_CTX_new error.\n"); |
wolfSSL | 45:6c023c2ab095 | 154 | return EXIT_FAILURE; |
wolfSSL | 45:6c023c2ab095 | 155 | } |
wolfSSL | 46:d8968fcc21b8 | 156 | if(*certName == '\0'){ |
vivekratna | 48:4e7679e7ff94 | 157 | CyaSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); |
wolfSSL | 46:d8968fcc21b8 | 158 | } else { |
vivekratna | 48:4e7679e7ff94 | 159 | if (CyaSSL_CTX_load_verify_buffer(ctx, (const unsigned char*)certName, strlen(certName), SSL_FILETYPE_PEM) != SSL_SUCCESS) |
wolfSSL | 46:d8968fcc21b8 | 160 | printf("can't load ca file\n"); |
wolfSSL | 46:d8968fcc21b8 | 161 | } |
wolfSSL | 45:6c023c2ab095 | 162 | |
vivekratna | 48:4e7679e7ff94 | 163 | CyaSSL_SetIORecv(ctx, SocketReceive) ; |
vivekratna | 48:4e7679e7ff94 | 164 | CyaSSL_SetIOSend(ctx, SocketSend) ; |
vivekratna | 48:4e7679e7ff94 | 165 | |
vivekratna | 48:4e7679e7ff94 | 166 | if ((ssl = CyaSSL_new(ctx)) == NULL) { |
vivekratna | 48:4e7679e7ff94 | 167 | printf("CyaSSL_new error.\n"); |
wolfSSL | 45:6c023c2ab095 | 168 | return EXIT_FAILURE; |
wolfSSL | 45:6c023c2ab095 | 169 | } |
wolfSSL | 45:6c023c2ab095 | 170 | |
vivekratna | 48:4e7679e7ff94 | 171 | CyaSSL_SetIOReadCtx(ssl, (void *)m_sock) ; |
vivekratna | 48:4e7679e7ff94 | 172 | CyaSSL_SetIOWriteCtx(ssl, (void *)m_sock) ; |
wolfSSL | 45:6c023c2ab095 | 173 | |
vivekratna | 48:4e7679e7ff94 | 174 | if (CyaSSL_connect(ssl) != SSL_SUCCESS) { |
vivekratna | 48:4e7679e7ff94 | 175 | char data[32]; |
vivekratna | 48:4e7679e7ff94 | 176 | printf("TLS Connect error, %s\n", CyaSSL_ERR_error_string(CyaSSL_get_error(ssl, 0), data)); |
wolfSSL | 45:6c023c2ab095 | 177 | return EXIT_FAILURE; |
wolfSSL | 45:6c023c2ab095 | 178 | } else { |
vivekratna | 47:a696ce982cde | 179 | logInfo("SSL Successs."); |
wolfSSL | 45:6c023c2ab095 | 180 | return 0 ; |
wolfSSL | 45:6c023c2ab095 | 181 | } |
wolfSSL | 45:6c023c2ab095 | 182 | } |
icraggs | 31:a51dd239b78e | 183 | }; |
icraggs | 31:a51dd239b78e | 184 | |
icraggs | 31:a51dd239b78e | 185 | |
icraggs | 31:a51dd239b78e | 186 | |
icraggs | 31:a51dd239b78e | 187 | #endif |