cyassl re-port with cellular comms, PSK test

Dependencies:   VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src

Committer:
ashleymills
Date:
Fri Apr 26 16:59:36 2013 +0000
Revision:
1:b211d97b0068
Parent:
0:e979170e02e7
nothing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:e979170e02e7 1 #define __DEBUG__ 4 //Maximum verbosity
ashleymills 0:e979170e02e7 2 #ifndef __MODULE__
ashleymills 0:e979170e02e7 3 #define __MODULE__ "main.cpp"
ashleymills 0:e979170e02e7 4 #endif
ashleymills 0:e979170e02e7 5
ashleymills 0:e979170e02e7 6
ashleymills 0:e979170e02e7 7 #define DEBUG_CYASSL 1
ashleymills 0:e979170e02e7 8
ashleymills 0:e979170e02e7 9 #include "mbed.h"
ashleymills 0:e979170e02e7 10 #include "rtos.h"
ashleymills 0:e979170e02e7 11 #include "ssl.h"
ashleymills 0:e979170e02e7 12 #include "VodafoneUSBModem.h"
ashleymills 0:e979170e02e7 13 #include "socket.h"
ashleymills 0:e979170e02e7 14
ashleymills 0:e979170e02e7 15
ashleymills 0:e979170e02e7 16 #define APN_PAYG
ashleymills 0:e979170e02e7 17
ashleymills 0:e979170e02e7 18 #ifdef APN_GDSP
ashleymills 0:e979170e02e7 19 #define APN "ppinternetd.gdsp"
ashleymills 0:e979170e02e7 20 #define APN_USERNAME ""
ashleymills 0:e979170e02e7 21 #define APN_PASSWORD ""
ashleymills 0:e979170e02e7 22 #endif
ashleymills 0:e979170e02e7 23
ashleymills 0:e979170e02e7 24 #ifdef APN_CONTRACT
ashleymills 0:e979170e02e7 25 #define APN "internet"
ashleymills 0:e979170e02e7 26 #define APN_USERNAME "web"
ashleymills 0:e979170e02e7 27 #define APN_PASSWORD "web"
ashleymills 0:e979170e02e7 28 #endif
ashleymills 0:e979170e02e7 29
ashleymills 0:e979170e02e7 30 #ifdef APN_PAYG
ashleymills 0:e979170e02e7 31 #define APN "smart"
ashleymills 0:e979170e02e7 32 #define APN_USERNAME "web"
ashleymills 0:e979170e02e7 33 #define APN_PASSWORD "web"
ashleymills 0:e979170e02e7 34 #endif
ashleymills 0:e979170e02e7 35
ashleymills 0:e979170e02e7 36 static INLINE unsigned int my_psk_client_cb(CYASSL* ssl, const char* hint,
ashleymills 0:e979170e02e7 37 char* identity, unsigned int id_max_len, unsigned char* key,
ashleymills 0:e979170e02e7 38 unsigned int key_max_len)
ashleymills 0:e979170e02e7 39 {
ashleymills 0:e979170e02e7 40 (void)ssl;
ashleymills 0:e979170e02e7 41 (void)hint;
ashleymills 0:e979170e02e7 42 (void)key_max_len;
ashleymills 0:e979170e02e7 43
ashleymills 0:e979170e02e7 44 /* identity is OpenSSL testing default for openssl s_client, keep same */
ashleymills 0:e979170e02e7 45 strncpy(identity, "Client_identity", id_max_len);
ashleymills 0:e979170e02e7 46
ashleymills 0:e979170e02e7 47
ashleymills 0:e979170e02e7 48 /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using
ashleymills 0:e979170e02e7 49 unsigned binary */
ashleymills 0:e979170e02e7 50 key[0] = 26;
ashleymills 0:e979170e02e7 51 key[1] = 43;
ashleymills 0:e979170e02e7 52 key[2] = 60;
ashleymills 0:e979170e02e7 53 key[3] = 77;
ashleymills 0:e979170e02e7 54
ashleymills 0:e979170e02e7 55 return 4; /* length of key in octets or 0 for error */
ashleymills 0:e979170e02e7 56 }
ashleymills 0:e979170e02e7 57
ashleymills 0:e979170e02e7 58
ashleymills 0:e979170e02e7 59 static INLINE unsigned int my_psk_server_cb(CYASSL* ssl, const char* identity,
ashleymills 0:e979170e02e7 60 unsigned char* key, unsigned int key_max_len)
ashleymills 0:e979170e02e7 61 {
ashleymills 0:e979170e02e7 62 (void)ssl;
ashleymills 0:e979170e02e7 63 (void)key_max_len;
ashleymills 0:e979170e02e7 64
ashleymills 0:e979170e02e7 65 /* identity is OpenSSL testing default for openssl s_client, keep same */
ashleymills 0:e979170e02e7 66 if (strncmp(identity, "Client_identity", 15) != 0)
ashleymills 0:e979170e02e7 67 return 0;
ashleymills 0:e979170e02e7 68
ashleymills 0:e979170e02e7 69 /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using
ashleymills 0:e979170e02e7 70 unsigned binary */
ashleymills 0:e979170e02e7 71 key[0] = 26;
ashleymills 0:e979170e02e7 72 key[1] = 43;
ashleymills 0:e979170e02e7 73 key[2] = 60;
ashleymills 0:e979170e02e7 74 key[3] = 77;
ashleymills 0:e979170e02e7 75
ashleymills 0:e979170e02e7 76 return 4; /* length of key in octets or 0 for error */
ashleymills 0:e979170e02e7 77 }
ashleymills 0:e979170e02e7 78
ashleymills 0:e979170e02e7 79 bool connectToSocket(char *ipAddress, int port, int *sockfd) {
ashleymills 0:e979170e02e7 80 *sockfd = -1;
ashleymills 0:e979170e02e7 81 // create the socket
ashleymills 0:e979170e02e7 82 if((*sockfd=socket(AF_INET,SOCK_STREAM,0))<0) {
ashleymills 0:e979170e02e7 83 DBG("Error opening socket");
ashleymills 0:e979170e02e7 84 return false;
ashleymills 0:e979170e02e7 85 }
ashleymills 0:e979170e02e7 86
ashleymills 0:e979170e02e7 87 // create the socket address
ashleymills 0:e979170e02e7 88 sockaddr_in serverAddress;
ashleymills 0:e979170e02e7 89 std::memset(&serverAddress, 0, sizeof(struct sockaddr_in));
ashleymills 0:e979170e02e7 90 serverAddress.sin_addr.s_addr = inet_addr(ipAddress);
ashleymills 0:e979170e02e7 91 serverAddress.sin_family = AF_INET;
ashleymills 0:e979170e02e7 92 serverAddress.sin_port = htons(port);
ashleymills 0:e979170e02e7 93
ashleymills 0:e979170e02e7 94 // do socket connect
ashleymills 0:e979170e02e7 95 //LOG("Connecting socket to %s:%d", inet_ntoa(serverAddress.sin_addr), ntohs(serverAddress.sin_port));
ashleymills 0:e979170e02e7 96 if(connect(*sockfd, (const struct sockaddr *)&serverAddress, sizeof(serverAddress))<0) {
ashleymills 0:e979170e02e7 97 ::close(*sockfd);
ashleymills 0:e979170e02e7 98 DBG("Could not connect");
ashleymills 0:e979170e02e7 99 return false;
ashleymills 0:e979170e02e7 100 }
ashleymills 0:e979170e02e7 101 return true;
ashleymills 0:e979170e02e7 102 }
ashleymills 0:e979170e02e7 103
ashleymills 0:e979170e02e7 104
ashleymills 0:e979170e02e7 105 DigitalOut myled(LED1);
ashleymills 0:e979170e02e7 106
ashleymills 0:e979170e02e7 107
ashleymills 0:e979170e02e7 108 //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-----";
ashleymills 0:e979170e02e7 109
ashleymills 0:e979170e02e7 110 int main() {
ashleymills 0:e979170e02e7 111 DBG_INIT();
ashleymills 0:e979170e02e7 112 DBG_SET_SPEED(115200);
ashleymills 0:e979170e02e7 113 DBG_SET_NEWLINE("\r\n");
ashleymills 0:e979170e02e7 114
ashleymills 0:e979170e02e7 115 // init modem
ashleymills 0:e979170e02e7 116 VodafoneUSBModem modem;
ashleymills 0:e979170e02e7 117
ashleymills 0:e979170e02e7 118 // set SSL method to SSL v3 (TLS v1.2)
ashleymills 0:e979170e02e7 119 //CyaSSLv23_client_method();
ashleymills 0:e979170e02e7 120
ashleymills 0:e979170e02e7 121 CyaSSL_Init();// Initialize CyaSSL
ashleymills 0:e979170e02e7 122 if(CyaSSL_Debugging_ON()==0) {
ashleymills 0:e979170e02e7 123 DBG("CyaSSL debugging enabled");
ashleymills 0:e979170e02e7 124 } else {
ashleymills 0:e979170e02e7 125 DBG("CyaSSL debugging not compiled in");
ashleymills 0:e979170e02e7 126 }
ashleymills 0:e979170e02e7 127
ashleymills 0:e979170e02e7 128
ashleymills 0:e979170e02e7 129 // setup certificates for server authentication
ashleymills 0:e979170e02e7 130 CYASSL_CTX* ctx = CyaSSL_CTX_new(CyaSSLv23_client_method());
ashleymills 0:e979170e02e7 131 if(ctx == NULL){
ashleymills 0:e979170e02e7 132 DBG("CyaSSL_CTX_new error.\n");
ashleymills 0:e979170e02e7 133 exit(EXIT_FAILURE);
ashleymills 0:e979170e02e7 134 }
ashleymills 0:e979170e02e7 135 DBG("Setup SSL context");
ashleymills 0:e979170e02e7 136
ashleymills 0:e979170e02e7 137
ashleymills 0:e979170e02e7 138 // use pre-shared keys
ashleymills 0:e979170e02e7 139 CyaSSL_CTX_set_psk_client_callback(ctx,my_psk_client_cb);
ashleymills 0:e979170e02e7 140 /*
ashleymills 0:e979170e02e7 141 if(CyaSSL_CTX_load_verify_buffer(ctx, serverCert, strlen((const char*)serverCert),SSL_FILETYPE_PEM)==0) {
ashleymills 0:e979170e02e7 142 DBG("loaded server cert OK");
ashleymills 0:e979170e02e7 143 }*/
ashleymills 0:e979170e02e7 144
ashleymills 0:e979170e02e7 145 // connnect modem to cellular network
ashleymills 0:e979170e02e7 146 DBG("connecting to mobile network");
ashleymills 0:e979170e02e7 147 if(modem.connect(APN,APN_USERNAME,APN_PASSWORD)!=0) {
ashleymills 0:e979170e02e7 148 DBG("Error connecting to mobile network");
ashleymills 0:e979170e02e7 149 }
ashleymills 0:e979170e02e7 150 DBG("Connected to mobile network");
ashleymills 0:e979170e02e7 151
ashleymills 0:e979170e02e7 152
ashleymills 0:e979170e02e7 153 // connect to SSL enabled webserver
ashleymills 0:e979170e02e7 154 int sockfd = NULL;
ashleymills 0:e979170e02e7 155 if(!connectToSocket("176.56.234.81", 11111, &sockfd)) {
ashleymills 0:e979170e02e7 156 DBG("Error connecting to socket");
ashleymills 0:e979170e02e7 157 }
ashleymills 0:e979170e02e7 158 DBG("Connected to non-SSL socket");
ashleymills 0:e979170e02e7 159
ashleymills 0:e979170e02e7 160 // hook into SSL
ashleymills 0:e979170e02e7 161 // Create CYASSL object
ashleymills 0:e979170e02e7 162 CYASSL* ssl;
ashleymills 0:e979170e02e7 163 ssl = CyaSSL_new(ctx);
ashleymills 0:e979170e02e7 164 if(ssl == NULL) {
ashleymills 0:e979170e02e7 165 DBG("CyaSSL_new error.");
ashleymills 0:e979170e02e7 166 exit(EXIT_FAILURE);
ashleymills 0:e979170e02e7 167 }
ashleymills 0:e979170e02e7 168 DBG("CyaSSL_new OK");
ashleymills 0:e979170e02e7 169
ashleymills 0:e979170e02e7 170 // attach to socket
ashleymills 0:e979170e02e7 171 DBG("Attaching CyaSSL to socket");
ashleymills 0:e979170e02e7 172 CyaSSL_set_fd(ssl, sockfd);
ashleymills 0:e979170e02e7 173 DBG("Attached CyaSSL to socket");
ashleymills 0:e979170e02e7 174
ashleymills 0:e979170e02e7 175 DBG("Issuing CyaSSL_connect");
ashleymills 0:e979170e02e7 176 if(CyaSSL_connect(ssl)!=SSL_SUCCESS) {
ashleymills 0:e979170e02e7 177 DBG("CyaSSL_connect failed");
ashleymills 0:e979170e02e7 178 }
ashleymills 0:e979170e02e7 179 DBG("CyaSSL_connect OK");
ashleymills 0:e979170e02e7 180
ashleymills 0:e979170e02e7 181 CyaSSL_write(ssl,"hello",5);
ashleymills 0:e979170e02e7 182
ashleymills 0:e979170e02e7 183 // clean up
ashleymills 0:e979170e02e7 184 CyaSSL_CTX_free(ctx);
ashleymills 0:e979170e02e7 185 CyaSSL_Cleanup();
ashleymills 0:e979170e02e7 186 }
ashleymills 0:e979170e02e7 187