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

Dependencies:   FP MQTTPacket

Fork of MQTTS by Vivek Ratna Kansakar

Revision:
48:4e7679e7ff94
Parent:
47:a696ce982cde
Child:
49:8a88045f2b79
--- a/MQTTSocket.h	Tue Jan 31 09:37:15 2017 +0000
+++ b/MQTTSocket.h	Fri May 19 05:32:26 2017 +0000
@@ -5,93 +5,176 @@
 
 #include "MQTTmbed.h"
 #include "TCPSocketConnection.h"
-#include "wolfssl/ssl.h"
-#include "wolfssl/wolfcrypt/error-crypt.h"
+#include "ssl.h"
+// #include "Cyassl/Cyacrypt/error-crypt.h"
+
+#define MAX_URL_HOSTNAME_LENGTH 128
+#define MAX_URL_PATH_LENGTH     128
+
+//Debug is disabled by default
+#if 0
+//Enable debug
+#include <cstdio>
+#define DBG(x, ...) std::printf("[HTTPClient : DBG]"x"\r\n", ##__VA_ARGS__);
+#define WARN(x, ...) std::printf("[HTTPClient : WARN]"x"\r\n", ##__VA_ARGS__);
+#define ERR(x, ...) std::printf("[HTTPClient : ERR]"x"\r\n", ##__VA_ARGS__);
+
+#else
+//Disable debug
+#define DBG(x, ...)
+#define WARN(x, ...)
+#define ERR(x, ...)
 
-static int SocketReceive(WOLFSSL* ssl, char *buf, int sz, void *sock)
+#endif
+
+static  TCPSocketConnection* m_sock;
+#define CHUNK_SIZE    256
+#define SEND_BUF_SIZE 1024
+static char send_buf[SEND_BUF_SIZE] ;
+static char *send_buf_p = NULL;
+
+static int SocketReceive(CYASSL* ssl, char *buf, int sz, void *ctx)
 {
-    return ((TCPSocketConnection *)sock)->receive(buf, sz) ;
+    int n ;
+    int i ;
+#define RECV_RETRY 3
+
+    for(i=0; i<RECV_RETRY; i++) {
+        n = m_sock->receive(buf, sz) ;
+        if(n >= 0)return n  ;
+        wait(0.2) ;
+    }
+    ERR("SocketReceive:%d/%d\n", n, sz)  ;
+    return n ;
 }
 
-static int SocketSend(WOLFSSL* ssl, char *buf, int sz, void *sock)
+static int SocketSend(CYASSL* ssl, char *buf, int sz, void *ctx)
 {
-    return ((TCPSocketConnection *)sock)->send(buf, sz);
+    int n ;
+
+    wait(0.1);
+    n = m_sock->send(buf, sz);
+    if(n > 0) {
+        wait(0.3);
+        return n;
+    } else {
+    ERR("SocketSend:%d/%d\n", n, sz);
+    }
+    return n;
 }
 
 class MQTTSocket
 {
 public:
+    MQTTSocket()
+    {
+        m_sock = &_m_sock;
+        //CyaSSL_Debugging_ON() ;   //Turn on if the CyaSSL library isn't working, turns on debug printf's
+
+        peerMethod = VERIFY_NONE;
+        ctx = 0 ;
+        ssl = 0 ;
+        SSLver = 3 ;
+        certificates = NULL;
+        redirect_url = NULL ;
+        redirect = 0 ;
+        header = NULL ;
+    }
+
     int connect(char* hostname, int port,  const char *certName = NULL, int timeout=1000)
     {
 
-        mysock.set_blocking(false, timeout);    // 1 second Timeout
+        m_sock->set_blocking(false, timeout);    // 1 second Timeout
         isTLS = certName == NULL ? false : true ;
-        int ret = mysock.connect(hostname, port);
+        int ret = m_sock->connect(hostname, port);
         if((ret == 0) && isTLS) {
-            return tls_connect(&mysock, certName) ;
+            return tls_connect(certName) ;
         } else return ret ;
     }
-    
+
     int read(unsigned char* buffer, int len, int timeout)
     {
-        mysock.set_blocking(false, timeout);
+        m_sock->set_blocking(false, timeout);
         return isTLS ?
-               wolfSSL_read(ssl, (char*)buffer, len) :
-               mysock.receive((char *)buffer, len) ;
+               CyaSSL_read(ssl, (char*)buffer, len) :
+               m_sock->receive((char *)buffer, len) ;
     }
-    
+
     int write(unsigned char* buffer, int len, int timeout)
     {
-        mysock.set_blocking(false, timeout);
+        m_sock->set_blocking(false, timeout);
         return isTLS ?
-               wolfSSL_write(ssl, (char*)buffer, len) :
-               mysock.send((char *)buffer, len) ;
+               CyaSSL_write(ssl, (char*)buffer, len) :
+               m_sock->send((char *)buffer, len) ;
     }
-    
+
     int disconnect()
     {
         if(isTLS) {
-            wolfSSL_free(ssl);
-            wolfSSL_CTX_free(ctx);
-            wolfSSL_Cleanup();
+            CyaSSL_free(ssl);
+            CyaSSL_CTX_free(ctx);
+            CyaSSL_Cleanup();
         }
-        return mysock.close();
+        return m_sock->close();
     }
 
 private:
 
-    TCPSocketConnection mysock;
+    // TCPSocketConnection m_sock;
     bool  isTLS ;
-    WOLFSSL_CTX* ctx;
-    WOLFSSL*     ssl;
-    
-    int tls_connect(TCPSocketConnection *sock, const char *certName)
+    // WOLFSSL_CTX* ctx;
+    // WOLFSSL*     ssl;
+
+    //Parameters
+    TCPSocketConnection _m_sock;
+
+    int m_timeout;
+
+    const char* m_basicAuthUser;
+    const char* m_basicAuthPassword;
+    int m_httpResponseCode;
+
+    const char * header ;
+    char * redirect_url ;
+    int    redirect_url_size ;
+    int    redirect ;
+
+    /* for CyaSSL */
+    const char* certificates; //CA certificates
+    SSLMethod peerMethod;
+    int    SSLver ;
+    uint16_t port;
+    struct CYASSL_CTX* ctx ;
+    struct CYASSL    * ssl ;
+
+    int tls_connect(const char *certName)
     {
         /* create and initiLize WOLFSSL_CTX structure */
-        if ((ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL) {
+        if ((ctx = CyaSSL_CTX_new(CyaTLSv1_2_client_method())) == NULL) {
             printf("SSL_CTX_new error.\n");
             return EXIT_FAILURE;
         }
         if(*certName == '\0'){
-            wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);
+            CyaSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);
         } else {
-            if (wolfSSL_CTX_load_verify_buffer(ctx, (const unsigned char*)certName, strlen(certName), SSL_FILETYPE_PEM) != SSL_SUCCESS)
+            if (CyaSSL_CTX_load_verify_buffer(ctx, (const unsigned char*)certName, strlen(certName), SSL_FILETYPE_PEM) != SSL_SUCCESS)
                 printf("can't load ca file\n");
         }
-        
-        wolfSSL_SetIORecv(ctx, SocketReceive) ;
-        wolfSSL_SetIOSend(ctx, SocketSend) ;
 
-        if ((ssl = wolfSSL_new(ctx)) == NULL) {
-            printf("wolfSSL_new error.\n");
+        CyaSSL_SetIORecv(ctx, SocketReceive) ;
+        CyaSSL_SetIOSend(ctx, SocketSend) ;
+
+        if ((ssl = CyaSSL_new(ctx)) == NULL) {
+            printf("CyaSSL_new error.\n");
             return EXIT_FAILURE;
         }
 
-        wolfSSL_SetIOReadCtx(ssl, (void *)sock) ;
-        wolfSSL_SetIOWriteCtx(ssl, (void *)sock) ;
+        CyaSSL_SetIOReadCtx(ssl, (void *)m_sock) ;
+        CyaSSL_SetIOWriteCtx(ssl, (void *)m_sock) ;
 
-        if (wolfSSL_connect(ssl) != SSL_SUCCESS) {
-            printf("TLS Connect error, %s\n", wc_GetErrorString(wolfSSL_get_error(ssl, 0)));
+        if (CyaSSL_connect(ssl) != SSL_SUCCESS) {
+            char data[32];
+            printf("TLS Connect error, %s\n", CyaSSL_ERR_error_string(CyaSSL_get_error(ssl, 0), data));
             return EXIT_FAILURE;
         } else {
             logInfo("SSL Successs.");