Simple SSL client with CyaSSL

Dependencies:   CyaSSL EthernetInterface mbed-rtos mbed

Fork of SimpleClient-TCP-FRDM by wolf SSL

Committer:
wolfSSL
Date:
Mon Dec 08 13:08:09 2014 +0000
Revision:
3:da3988eac4e0
Parent:
2:2e68626be425
Cleaned

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 0:0c584b87ea42 1 #include "mbed.h"
wolfSSL 0:0c584b87ea42 2 #include "EthernetInterface.h"
wolfSSL 0:0c584b87ea42 3
wolfSSL 2:2e68626be425 4 #include <cyassl/ssl.h>
wolfSSL 0:0c584b87ea42 5
wolfSSL 2:2e68626be425 6 #define PORT 443
wolfSSL 0:0c584b87ea42 7
wolfSSL 2:2e68626be425 8 #define err_sys(m) puts(m)
wolfSSL 0:0c584b87ea42 9
wolfSSL 0:0c584b87ea42 10 TCPSocketConnection socket;
wolfSSL 0:0c584b87ea42 11
wolfSSL 0:0c584b87ea42 12 static int SocketReceive(CYASSL* ssl, char *buf, int sz, void *ctx)
wolfSSL 0:0c584b87ea42 13 {
wolfSSL 0:0c584b87ea42 14 int n ;
wolfSSL 0:0c584b87ea42 15 int i ;
wolfSSL 0:0c584b87ea42 16 #define RECV_RETRY 3
wolfSSL 0:0c584b87ea42 17 for(i=0; i<RECV_RETRY; i++) {
wolfSSL 0:0c584b87ea42 18 n = socket.receive(buf, sz) ;
wolfSSL 0:0c584b87ea42 19 if(n >= 0)return n ;
wolfSSL 0:0c584b87ea42 20 }
wolfSSL 0:0c584b87ea42 21 printf("SocketReceive:%d/%d\n", n, sz) ;
wolfSSL 0:0c584b87ea42 22 return n ;
wolfSSL 0:0c584b87ea42 23 }
wolfSSL 0:0c584b87ea42 24
wolfSSL 0:0c584b87ea42 25 static int SocketSend(CYASSL* ssl, char *buf, int sz, void *ctx)
wolfSSL 0:0c584b87ea42 26 {
wolfSSL 0:0c584b87ea42 27 int n ;
wolfSSL 0:0c584b87ea42 28
wolfSSL 0:0c584b87ea42 29 n = socket.send(buf, sz);
wolfSSL 0:0c584b87ea42 30 if(n > 0) {
wolfSSL 0:0c584b87ea42 31 return n ;
wolfSSL 0:0c584b87ea42 32 } else printf("SocketSend:%d/%d\n", n, sz);
wolfSSL 0:0c584b87ea42 33 return n ;
wolfSSL 0:0c584b87ea42 34 }
wolfSSL 2:2e68626be425 35
wolfSSL 0:0c584b87ea42 36
wolfSSL 1:ac91b4f8d818 37 EthernetInterface eth;
wolfSSL 1:ac91b4f8d818 38
wolfSSL 3:da3988eac4e0 39 void net_main(void const *av)
wolfSSL 0:0c584b87ea42 40 {
wolfSSL 1:ac91b4f8d818 41 char server_ip[20] ;
wolfSSL 2:2e68626be425 42
wolfSSL 2:2e68626be425 43 eth.init(); //Use DHCP
wolfSSL 2:2e68626be425 44 printf("===== Simple SSL Client ========\n") ;
wolfSSL 2:2e68626be425 45 while(1) {
wolfSSL 2:2e68626be425 46 if(eth.connect()== 0)break ;
wolfSSL 2:2e68626be425 47 wait(0.1);
wolfSSL 2:2e68626be425 48 }
wolfSSL 2:2e68626be425 49 printf("Client IP: %s\n", eth.getIPAddress());
wolfSSL 2:2e68626be425 50
wolfSSL 0:0c584b87ea42 51 CYASSL_CTX* ctx = 0;
wolfSSL 0:0c584b87ea42 52 CYASSL* ssl = 0;
wolfSSL 0:0c584b87ea42 53
wolfSSL 0:0c584b87ea42 54 CYASSL_METHOD* method = CyaTLSv1_2_client_method();
wolfSSL 3:da3988eac4e0 55 /* CyaSSL_Debugging_ON() ; */
wolfSSL 0:0c584b87ea42 56 /* Initialize CyaSSL Context */
wolfSSL 0:0c584b87ea42 57 ctx = CyaSSL_CTX_new(method);
wolfSSL 0:0c584b87ea42 58 if (ctx == NULL)
wolfSSL 0:0c584b87ea42 59 err_sys("unable to get ctx");
wolfSSL 0:0c584b87ea42 60 CyaSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);
wolfSSL 0:0c584b87ea42 61 CyaSSL_SetIORecv(ctx, SocketReceive) ;
wolfSSL 0:0c584b87ea42 62 CyaSSL_SetIOSend(ctx, SocketSend) ;
wolfSSL 0:0c584b87ea42 63
wolfSSL 0:0c584b87ea42 64 socket.set_blocking(false, 300) ;
wolfSSL 1:ac91b4f8d818 65 printf("Server IP: ") ;
wolfSSL 2:2e68626be425 66 for(int i=0; i<sizeof(server_ip); i++) {
wolfSSL 2:2e68626be425 67 if((server_ip[i] = getchar()) == '\r') {
wolfSSL 2:2e68626be425 68 server_ip[i] = '\0' ;
wolfSSL 2:2e68626be425 69 putchar('\n') ;
wolfSSL 2:2e68626be425 70 break ;
wolfSSL 2:2e68626be425 71 } else putchar(server_ip[i]) ;
wolfSSL 2:2e68626be425 72 }
wolfSSL 2:2e68626be425 73
wolfSSL 1:ac91b4f8d818 74 while (socket.connect(server_ip, PORT) < 0) {
wolfSSL 1:ac91b4f8d818 75 printf("Unable to connect to (%s) on port (%d)\n", server_ip, PORT);
wolfSSL 0:0c584b87ea42 76 wait(1);
wolfSSL 0:0c584b87ea42 77 }
wolfSSL 0:0c584b87ea42 78 printf("TCP Connected\n") ;
wolfSSL 0:0c584b87ea42 79
wolfSSL 0:0c584b87ea42 80 ssl = CyaSSL_new(ctx);
wolfSSL 0:0c584b87ea42 81 if (ssl == NULL)
wolfSSL 0:0c584b87ea42 82 err_sys("unable to get SSL object");
wolfSSL 0:0c584b87ea42 83 if (CyaSSL_connect(ssl) != SSL_SUCCESS) {
wolfSSL 0:0c584b87ea42 84 int err = CyaSSL_get_error(ssl, 0);
wolfSSL 0:0c584b87ea42 85 printf("err = %d, %s\n", err,
wolfSSL 1:ac91b4f8d818 86 CyaSSL_ERR_error_string(err, "\n"));
wolfSSL 0:0c584b87ea42 87 err_sys("SSL Connection Error");
wolfSSL 0:0c584b87ea42 88 }
wolfSSL 0:0c584b87ea42 89 printf("SSL Connected\n") ;
wolfSSL 0:0c584b87ea42 90
wolfSSL 3:da3988eac4e0 91 char msg[] = "GET /congrats.html HTTP/1.0\r\nConnection: Close\r\n\r\n" ;
wolfSSL 0:0c584b87ea42 92 // const char msg[] = "Hello World\r\n" ;
wolfSSL 0:0c584b87ea42 93
wolfSSL 2:2e68626be425 94 if (
wolfSSL 2:2e68626be425 95 CyaSSL_write(ssl, msg, sizeof(msg)-1) != (sizeof(msg)-1))
wolfSSL 2:2e68626be425 96 /*socket.send(msg, sizeof(msg)-1) != (sizeof(msg)-1))*/
wolfSSL 0:0c584b87ea42 97 err_sys("CyaSSL_write failed");
wolfSSL 0:0c584b87ea42 98
wolfSSL 0:0c584b87ea42 99 char buf[1024];
wolfSSL 0:0c584b87ea42 100 int n ;
wolfSSL 1:ac91b4f8d818 101 puts("Server Response:\n") ;
wolfSSL 1:ac91b4f8d818 102 do {
wolfSSL 2:2e68626be425 103 n = CyaSSL_read(ssl, buf, sizeof(buf)-1);
wolfSSL 2:2e68626be425 104 /*socket.receive(buf, sizeof(buf)-1);*/
wolfSSL 1:ac91b4f8d818 105 if (n >= 0) {
wolfSSL 1:ac91b4f8d818 106 buf[n] = 0;
wolfSSL 1:ac91b4f8d818 107 printf("%s", buf);
wolfSSL 3:da3988eac4e0 108 } else break ;
wolfSSL 3:da3988eac4e0 109
wolfSSL 1:ac91b4f8d818 110 } while(n > 0) ;
wolfSSL 1:ac91b4f8d818 111 puts("=== === === ===") ;
wolfSSL 2:2e68626be425 112 CyaSSL_free(ssl) ;
wolfSSL 1:ac91b4f8d818 113 socket.close();
wolfSSL 2:2e68626be425 114 CyaSSL_CTX_free(ctx) ;
wolfSSL 1:ac91b4f8d818 115 eth.disconnect();
wolfSSL 1:ac91b4f8d818 116 }
wolfSSL 3:da3988eac4e0 117
wolfSSL 3:da3988eac4e0 118
wolfSSL 3:da3988eac4e0 119 main()
wolfSSL 3:da3988eac4e0 120 {
wolfSSL 3:da3988eac4e0 121
wolfSSL 3:da3988eac4e0 122 #define STACK_SIZE 20000
wolfSSL 3:da3988eac4e0 123 Thread t(net_main, NULL, osPriorityNormal, STACK_SIZE);
wolfSSL 3:da3988eac4e0 124
wolfSSL 3:da3988eac4e0 125 while (true) {
wolfSSL 3:da3988eac4e0 126 Thread::wait(1000);
wolfSSL 3:da3988eac4e0 127 }
wolfSSL 3:da3988eac4e0 128 }