From 4785c095dbfb3630ddf6685f23e3a19c7c804cbc Mon Sep 17 00:00:00 2001
From: William Pitcock <nenolod@dereferenced.org>
Date: Thu, 5 Feb 2015 09:02:00 +0200
Subject: [PATCH] add ircv3 tls-3.1 extension support to s_client

---
 apps/s_client.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/apps/s_client.c b/apps/s_client.c
index 8aee02a..0a28b89 100644
--- a/apps/s_client.c
+++ b/apps/s_client.c
@@ -401,7 +401,7 @@ static void sc_usage(void)
     BIO_printf(bio_err,
                "                 'prot' defines which one to assume.  Currently,\n");
     BIO_printf(bio_err,
-               "                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
+               "                 only \"smtp\", \"pop3\", \"imap\", \"ftp\", \"xmpp\" and \"ircv3\"\n");
     BIO_printf(bio_err, "                 are supported.\n");
 #ifndef OPENSSL_NO_ENGINE
     BIO_printf(bio_err,
@@ -640,7 +640,8 @@ enum {
     PROTO_POP3,
     PROTO_IMAP,
     PROTO_FTP,
-    PROTO_XMPP
+    PROTO_XMPP,
+    PROTO_IRCV3,
 };
 
 int MAIN(int, char **);
@@ -1062,6 +1063,8 @@ int MAIN(int argc, char **argv)
                 starttls_proto = PROTO_FTP;
             else if (strcmp(*argv, "xmpp") == 0)
                 starttls_proto = PROTO_XMPP;
+            else if (strcmp(*argv, "ircv3") == 0)
+                starttls_proto = PROTO_IRCV3;
             else
                 goto bad;
         }
@@ -1646,6 +1649,23 @@ int MAIN(int argc, char **argv)
             goto shut;
         mbuf[0] = 0;
     }
+    if (starttls_proto == PROTO_IRCV3) {
+        int seen = 0;
+        BIO_printf(sbio,"CAP REQ :tls\r\n");
+ 
+        while (!strstr(mbuf,"CAP")) {
+            seen = BIO_read(sbio,mbuf,BUFSIZZ);
+            mbuf[seen] = 0;
+        }
+        if (!strstr(mbuf,"ACK"))
+            goto shut;
+        BIO_printf(sbio,"CAP END\r\nSTARTTLS\r\n");
+        while (!strstr(sbuf, "670")) {
+            seen = BIO_read(sbio,sbuf,BUFSIZZ);
+            sbuf[seen] = 0;
+        }
+        mbuf[0] = 0;
+    }
 
     for (;;) {
         FD_ZERO(&readfds);
-- 
2.2.2