Added support for client certificates (both client-side and server-side, but still...
[BearSSL] / tools / sslio.c
index 64d6c96..7fb73ea 100644 (file)
@@ -35,7 +35,7 @@
 #include <arpa/inet.h>
 #include <unistd.h>
 #include <fcntl.h>
-#include <sys/poll.h>
+#include <poll.h>
 
 #include "brssl.h"
 #include "bearssl.h"
@@ -67,6 +67,14 @@ dump_blob(const char *name, const void *data, size_t len)
 static int
 run_command(br_ssl_engine_context *cc, unsigned char *buf, size_t len)
 {
+       /*
+        * A single static slot for saving session parameters.
+        */
+       static br_ssl_session_parameters slot;
+       static int slot_used = 0;
+
+       size_t u;
+
        if (len < 2 || len > 3) {
                return 0;
        }
@@ -82,8 +90,11 @@ run_command(br_ssl_engine_context *cc, unsigned char *buf, size_t len)
                br_ssl_engine_close(cc);
                return 1;
        case 'R':
-               fprintf(stderr, "renegotiating...\n");
-               br_ssl_engine_renegotiate(cc);
+               if (br_ssl_engine_renegotiate(cc)) {
+                       fprintf(stderr, "renegotiating...\n");
+               } else {
+                       fprintf(stderr, "not renegotiating.\n");
+               }
                return 1;
        case 'F':
                /*
@@ -96,6 +107,28 @@ run_command(br_ssl_engine_context *cc, unsigned char *buf, size_t len)
                fprintf(stderr, "forgetting session...\n");
                br_ssl_client_forget_session((br_ssl_client_context *)cc);
                return 1;
+       case 'S':
+               fprintf(stderr, "saving session parameters...\n");
+               br_ssl_engine_get_session_parameters(cc, &slot);
+               fprintf(stderr, "  id = ");
+               for (u = 0; u < slot.session_id_len; u ++) {
+                       fprintf(stderr, "%02X", slot.session_id[u]);
+               }
+               fprintf(stderr, "\n");
+               slot_used = 1;
+               return 1;
+       case 'P':
+               if (slot_used) {
+                       fprintf(stderr, "restoring session parameters...\n");
+                       fprintf(stderr, "  id = ");
+                       for (u = 0; u < slot.session_id_len; u ++) {
+                               fprintf(stderr, "%02X", slot.session_id[u]);
+                       }
+                       fprintf(stderr, "\n");
+                       br_ssl_engine_set_session_parameters(cc, &slot);
+                       return 1;
+               }
+               return 0;
        default:
                return 0;
        }