cyassl re-port with cellular comms, PSK test
Dependencies: VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src
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
Generated on Thu Jul 14 2022 00:25:23 by 1.7.2