cyassl re-port with cellular comms, PSK test

Dependencies:   VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #define __DEBUG__ 4 //Maximum verbosity
00002 #ifndef __MODULE__
00003 #define __MODULE__ "main.cpp"
00004 #endif
00005 
00006 
00007 #define DEBUG_CYASSL 1
00008 
00009 #include "mbed.h"
00010 #include "rtos.h"
00011 #include "ssl.h"
00012 #include "VodafoneUSBModem.h"
00013 #include "socket.h"
00014 
00015 
00016 #define APN_PAYG
00017 
00018 #ifdef APN_GDSP
00019    #define APN "ppinternetd.gdsp" 
00020    #define APN_USERNAME ""
00021    #define APN_PASSWORD ""
00022 #endif
00023 
00024 #ifdef APN_CONTRACT
00025    #define APN "internet" 
00026    #define APN_USERNAME "web"
00027    #define APN_PASSWORD "web"
00028 #endif
00029 
00030 #ifdef APN_PAYG
00031    #define APN "smart" 
00032    #define APN_USERNAME "web"
00033    #define APN_PASSWORD "web"
00034 #endif
00035 
00036 static INLINE unsigned int my_psk_client_cb(CYASSL* ssl, const char* hint,
00037         char* identity, unsigned int id_max_len, unsigned char* key,
00038         unsigned int key_max_len)
00039 {
00040     (void)ssl;
00041     (void)hint;
00042     (void)key_max_len;
00043 
00044     /* identity is OpenSSL testing default for openssl s_client, keep same */
00045     strncpy(identity, "Client_identity", id_max_len);
00046 
00047 
00048     /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using
00049        unsigned binary */
00050     key[0] = 26;
00051     key[1] = 43;
00052     key[2] = 60;
00053     key[3] = 77;
00054 
00055     return 4;   /* length of key in octets or 0 for error */
00056 }
00057 
00058 
00059 static INLINE unsigned int my_psk_server_cb(CYASSL* ssl, const char* identity,
00060         unsigned char* key, unsigned int key_max_len)
00061 {
00062     (void)ssl;
00063     (void)key_max_len;
00064 
00065     /* identity is OpenSSL testing default for openssl s_client, keep same */
00066     if (strncmp(identity, "Client_identity", 15) != 0)
00067         return 0;
00068 
00069     /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using
00070        unsigned binary */
00071     key[0] = 26;
00072     key[1] = 43;
00073     key[2] = 60;
00074     key[3] = 77;
00075 
00076     return 4;   /* length of key in octets or 0 for error */
00077 }
00078 
00079 bool connectToSocket(char *ipAddress, int port, int *sockfd) {
00080   *sockfd = -1;
00081   // create the socket
00082   if((*sockfd=socket(AF_INET,SOCK_STREAM,0))<0) {
00083      DBG("Error opening socket");
00084      return false;
00085   }
00086          
00087   // create the socket address
00088   sockaddr_in serverAddress;
00089   std::memset(&serverAddress, 0, sizeof(struct sockaddr_in));
00090   serverAddress.sin_addr.s_addr = inet_addr(ipAddress);
00091   serverAddress.sin_family = AF_INET;
00092   serverAddress.sin_port = htons(port);
00093 
00094   // do socket connect
00095   //LOG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port));
00096   if(connect(*sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress))<0) {
00097      ::close(*sockfd);
00098      DBG("Could not connect");
00099      return false;
00100   }
00101   return true;
00102 }
00103 
00104 
00105 DigitalOut myled(LED1);
00106 
00107 
00108 //const unsigned char *serverCert = "-----BEGIN CERTIFICATE-----\r\nMIIDCjCCAnOgAwIBAgIJAM/U0HS+lzWAMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNV\r\nBAYTAlVLMRAwDgYDVQQIEwdFbmdsYW5kMRAwDgYDVQQHEwdOZXdidXJ5MRAwDgYD\r\nVQQKEwdBc2hsZXlzMQwwCgYDVQQLFANSJkQxDzANBgNVBAMTBkFzaGxleTAeFw0x\r\nMzA0MjYxNTIyNTFaFw0xNDA0MjYxNTIyNTFaMGIxCzAJBgNVBAYTAlVLMRAwDgYD\r\nVQQIEwdFbmdsYW5kMRAwDgYDVQQHEwdOZXdidXJ5MRAwDgYDVQQKEwdBc2hsZXlz\r\nMQwwCgYDVQQLFANSJkQxDzANBgNVBAMTBkFzaGxleTCBnzANBgkqhkiG9w0BAQEF\r\nAAOBjQAwgYkCgYEAwbLJUkH8ESIzW+6/k+ZNwt4fSvm0SsnVrmPgJMaoIghIx+EY\r\nxwjGUl5mdNIaOFyj9It1n+BT1uXIBewMTUdXXMDTHU60i+1Q0NtU2uWHoEj9Jf4T\r\nLyG5Jyuellu8zS4A+D5nTUdhxyZDz27BzHZ3XTod8670Zq2kYwjruE/2u+kCAwEA\r\nAaOBxzCBxDAdBgNVHQ4EFgQUff4ginSFEsol4OxS6MQlCfmtLYowgZQGA1UdIwSB\r\njDCBiYAUff4ginSFEsol4OxS6MQlCfmtLYqhZqRkMGIxCzAJBgNVBAYTAlVLMRAw\r\nDgYDVQQIEwdFbmdsYW5kMRAwDgYDVQQHEwdOZXdidXJ5MRAwDgYDVQQKEwdBc2hs\r\nZXlzMQwwCgYDVQQLFANSJkQxDzANBgNVBAMTBkFzaGxleYIJAM/U0HS+lzWAMAwG\r\nA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEArAQgHKW2FcszoxoQxp//waWV\r\n8d8zA2P2TB6QungJeo7GBys/q5JlyZ+XrpNfcGE52qwwHo68JqD4BhOGd3botyhg\r\nHX2+LXavi/cisqwgmmIKN/WtTKBv6MLNxW79WPhmvbkLIRUdTxaUBlKTFYDmNP02\r\n8o7kKH44sPrPaGOeidU=\r\n-----END CERTIFICATE-----";
00109 
00110 int main() {
00111    DBG_INIT();
00112    DBG_SET_SPEED(115200);
00113    DBG_SET_NEWLINE("\r\n");
00114    
00115    // init modem
00116    VodafoneUSBModem modem;
00117     
00118    // set SSL method to SSL v3 (TLS v1.2)
00119    //CyaSSLv23_client_method();
00120      
00121    CyaSSL_Init();// Initialize CyaSSL
00122    if(CyaSSL_Debugging_ON()==0) {
00123       DBG("CyaSSL debugging enabled");
00124    } else {
00125       DBG("CyaSSL debugging not compiled in");
00126    }
00127    
00128    
00129    // setup certificates for server authentication
00130    CYASSL_CTX* ctx = CyaSSL_CTX_new(CyaSSLv23_client_method());
00131    if(ctx == NULL){
00132       DBG("CyaSSL_CTX_new error.\n");
00133       exit(EXIT_FAILURE);
00134    }
00135    DBG("Setup SSL context");
00136    
00137 
00138    // use pre-shared keys
00139    CyaSSL_CTX_set_psk_client_callback(ctx,my_psk_client_cb);
00140    /*
00141    if(CyaSSL_CTX_load_verify_buffer(ctx, serverCert, strlen((const char*)serverCert),SSL_FILETYPE_PEM)==0) {
00142    DBG("loaded server cert OK");
00143    }*/
00144    
00145    // connnect modem to cellular network
00146    DBG("connecting to mobile network");
00147    if(modem.connect(APN,APN_USERNAME,APN_PASSWORD)!=0) {
00148       DBG("Error connecting to mobile network");
00149    }
00150    DBG("Connected to mobile network");
00151    
00152    
00153    // connect to SSL enabled webserver
00154    int sockfd = NULL;
00155    if(!connectToSocket("176.56.234.81", 11111, &sockfd)) {
00156       DBG("Error connecting to socket");
00157    }
00158    DBG("Connected to non-SSL socket");
00159    
00160    // hook into SSL
00161    // Create CYASSL object
00162    CYASSL* ssl;
00163    ssl = CyaSSL_new(ctx);
00164    if(ssl == NULL) {
00165       DBG("CyaSSL_new error.");
00166       exit(EXIT_FAILURE);
00167    }
00168    DBG("CyaSSL_new OK");
00169    
00170    // attach to socket
00171    DBG("Attaching CyaSSL to socket");
00172    CyaSSL_set_fd(ssl, sockfd);
00173    DBG("Attached CyaSSL to socket");
00174    
00175    DBG("Issuing CyaSSL_connect");
00176    if(CyaSSL_connect(ssl)!=SSL_SUCCESS) {
00177       DBG("CyaSSL_connect failed");
00178    }
00179    DBG("CyaSSL_connect OK");
00180    
00181    CyaSSL_write(ssl,"hello",5);
00182    
00183    // clean up
00184    CyaSSL_CTX_free(ctx);
00185    CyaSSL_Cleanup();  
00186 }
00187