Using CyaSSL library, which is included by default with MTSAS library.

Dependencies:   FP MQTTPacket

Fork of MQTTS by Vivek Ratna Kansakar

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?

UserRevisionLine numberNew 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