diff --git a/CHANGES b/CHANGES
index 9bdac62..801b604 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,12 @@
 
  Changes between 1.0.1 and 1.1.0  [xx XXX xxxx]
 
+  *) Initial SSL tracing code. This parses out SSL/TLS records using the
+     message callback and prints the results. Needs compile time option
+     "enable-ssl-trace". New options to s_client and s_server to enable
+     tracing.
+     [Steve Henson]
+
   *) New functions to retrieve certificate signature and signature
      OID NID.
      [Steve Henson]
diff --git a/Configure b/Configure
index f169746..7c9403f 100755
--- a/Configure
+++ b/Configure
@@ -715,6 +715,7 @@
 		 "rfc3779"	  => "default",
 		 "sctp"       => "default",
 		 "shared"         => "default",
+		 "ssl-trace"	  => "default",
 		 "store"	  => "experimental",
 		 "zlib"           => "default",
 		 "zlib-dynamic"   => "default"
diff --git a/apps/s_client.c b/apps/s_client.c
index 556563e..578b541 100644
--- a/apps/s_client.c
+++ b/apps/s_client.c
@@ -217,6 +217,7 @@
 static int audit_proof_cb(SSL *s, void *arg);
 #endif
 static BIO *bio_c_out=NULL;
+static BIO *bio_c_msg=NULL;
 static int c_quiet=0;
 static int c_ign_eof=0;
 
@@ -743,6 +744,15 @@
 #endif
 		else if	(strcmp(*argv,"-msg") == 0)
 			c_msg=1;
+		else if	(strcmp(*argv,"-msgfile") == 0)
+			{
+			if (--argc < 1) goto bad;
+			bio_c_msg = BIO_new_file(*(++argv), "w");
+			}
+#ifndef OPENSSL_NO_SSL_TRACE
+		else if	(strcmp(*argv,"-trace") == 0)
+			c_msg=2;
+#endif
 		else if	(strcmp(*argv,"-showcerts") == 0)
 			c_showcerts=1;
 		else if	(strcmp(*argv,"-nbio_test") == 0)
@@ -1348,8 +1358,13 @@
 		}
 	if (c_msg)
 		{
-		SSL_set_msg_callback(con, msg_cb);
-		SSL_set_msg_callback_arg(con, bio_c_out);
+#ifndef OPENSSL_NO_SSL_TRACE
+		if (c_msg == 2)
+			SSL_set_msg_callback(con, SSL_trace);
+		else
+#endif
+			SSL_set_msg_callback(con, msg_cb);
+		SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
 		}
 #ifndef OPENSSL_NO_TLSEXT
 	if (c_tlsextdebug)
@@ -1926,6 +1941,11 @@
 		BIO_free(bio_c_out);
 		bio_c_out=NULL;
 		}
+	if (bio_c_msg != NULL)
+		{
+		BIO_free(bio_c_msg);
+		bio_c_msg=NULL;
+		}
 	apps_shutdown();
 	OPENSSL_EXIT(ret);
 	}
diff --git a/apps/s_server.c b/apps/s_server.c
index 7881083..0305a26 100644
--- a/apps/s_server.c
+++ b/apps/s_server.c
@@ -288,6 +288,7 @@
 static int www=0;
 
 static BIO *bio_s_out=NULL;
+static BIO *bio_s_msg = NULL;
 static int s_debug=0;
 #ifndef OPENSSL_NO_TLSEXT
 static int s_tlsextdebug=0;
@@ -1207,6 +1208,15 @@
 #endif
 		else if	(strcmp(*argv,"-msg") == 0)
 			{ s_msg=1; }
+		else if	(strcmp(*argv,"-msgfile") == 0)
+			{
+			if (--argc < 1) goto bad;
+			bio_s_msg = BIO_new_file(*(++argv), "w");
+			}
+#ifndef OPENSSL_NO_SSL_TRACE
+		else if	(strcmp(*argv,"-trace") == 0)
+			{ s_msg=2; }
+#endif
 		else if	(strcmp(*argv,"-hack") == 0)
 			{ hack=1; }
 		else if	(strcmp(*argv,"-state") == 0)
@@ -2004,6 +2014,11 @@
         BIO_free(bio_s_out);
 		bio_s_out=NULL;
 		}
+	if (bio_s_msg != NULL)
+		{
+		BIO_free(bio_s_msg);
+		bio_s_msg = NULL;
+		}
 	apps_shutdown();
 	OPENSSL_EXIT(ret);
 	}
@@ -2158,8 +2173,13 @@
 		}
 	if (s_msg)
 		{
-		SSL_set_msg_callback(con, msg_cb);
-		SSL_set_msg_callback_arg(con, bio_s_out);
+#ifndef OPENSSL_NO_SSL_TRACE
+		if (s_msg == 2)
+			SSL_set_msg_callback(con, SSL_trace);
+		else
+#endif
+			SSL_set_msg_callback(con, msg_cb);
+		SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
 		}
 #ifndef OPENSSL_NO_TLSEXT
 	if (s_tlsextdebug)
@@ -2712,8 +2732,13 @@
 		}
 	if (s_msg)
 		{
-		SSL_set_msg_callback(con, msg_cb);
-		SSL_set_msg_callback_arg(con, bio_s_out);
+#ifndef OPENSSL_NO_SSL_TRACE
+		if (s_msg == 2)
+			SSL_set_msg_callback(con, SSL_trace);
+		else
+#endif
+			SSL_set_msg_callback(con, msg_cb);
+		SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
 		}
 
 	for (;;)
diff --git a/ssl/Makefile b/ssl/Makefile
index 63a2f96..4ae661f 100644
--- a/ssl/Makefile
+++ b/ssl/Makefile
@@ -30,7 +30,7 @@
 	ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c \
 	ssl_ciph.c ssl_stat.c ssl_rsa.c \
 	ssl_asn1.c ssl_txt.c ssl_algs.c \
-	bio_ssl.c ssl_err.c kssl.c t1_reneg.c tls_srp.c
+	bio_ssl.c ssl_err.c kssl.c t1_reneg.c tls_srp.c t1_trce.c
 LIBOBJ= \
 	s2_meth.o  s2_srvr.o  s2_clnt.o  s2_lib.o  s2_enc.o s2_pkt.o \
 	s3_meth.o  s3_srvr.o  s3_clnt.o  s3_lib.o  s3_enc.o s3_pkt.o s3_both.o \
@@ -41,7 +41,7 @@
 	ssl_lib.o ssl_err2.o ssl_cert.o ssl_sess.o \
 	ssl_ciph.o ssl_stat.o ssl_rsa.o \
 	ssl_asn1.o ssl_txt.o ssl_algs.o \
-	bio_ssl.o ssl_err.o kssl.o t1_reneg.o tls_srp.o
+	bio_ssl.o ssl_err.o kssl.o t1_reneg.o tls_srp.o t1_trce.o
 
 SRC= $(LIBSRC)
 
diff --git a/ssl/ssl.h b/ssl/ssl.h
index 42bc51e..17bdc5a 100644
--- a/ssl/ssl.h
+++ b/ssl/ssl.h
@@ -2136,6 +2136,11 @@
 void SSL_set_debug(SSL *s, int debug);
 int SSL_cache_hit(SSL *s);
 
+#ifndef OPENSSL_NO_SSL_TRACE
+void SSL_trace(int write_p, int version, int content_type,
+		const void *buf, size_t len, SSL *ssl, void *arg);
+#endif
+
 /* BEGIN ERROR CODES */
 /* The following lines are auto generated by the script mkerr.pl. Any changes
  * made after this point may be overwritten when the script is next run.
diff --git a/ssl/t1_trce.c b/ssl/t1_trce.c
new file mode 100644
index 0000000..4b3331b
--- /dev/null
+++ b/ssl/t1_trce.c
@@ -0,0 +1,1220 @@
+/* ssl/t1_trce.c */
+/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
+ * project.
+ */
+/* ====================================================================
+ * Copyright (c) 2012 The OpenSSL Project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ *    software must display the following acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For written permission, please contact
+ *    licensing@OpenSSL.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ *    nor may "OpenSSL" appear in their names without prior written
+ *    permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by the OpenSSL Project
+ *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ */
+
+#include "ssl_locl.h"
+
+#ifndef OPENSSL_NO_SSL_TRACE
+
+/* Packet trace support for OpenSSL */
+
+typedef struct 
+	{
+	int num;
+	const char *name;
+	} ssl_trace_tbl;
+
+#define ssl_trace_str(val, tbl) \
+	do_ssl_trace_str(val, tbl, sizeof(tbl)/sizeof(ssl_trace_tbl))
+
+#define ssl_trace_list(bio, indent, msg, msglen, value, table) \
+	do_ssl_trace_list(bio, indent, msg, msglen, value, \
+	 table, sizeof(table)/sizeof(ssl_trace_tbl))
+ 
+
+static const char *do_ssl_trace_str(int val, ssl_trace_tbl *tbl, size_t ntbl)
+	{
+	size_t i;
+	for (i = 0; i < ntbl; i++, tbl++)
+		{
+		if (tbl->num == val)
+			return tbl->name;
+		}
+	return "UNKNOWN";
+	}
+
+static int do_ssl_trace_list(BIO *bio, int indent,
+				const unsigned char *msg, size_t msglen,
+				size_t vlen, ssl_trace_tbl *tbl, size_t ntbl)
+	{
+	int val;
+	if (msglen%vlen)
+		return 0;
+	while(msglen)
+		{
+		val = msg[0];
+		if (vlen == 2)
+			val = (val << 8) | msg[1];
+		BIO_indent(bio, indent, 80);
+		BIO_printf(bio, "%s (%d)\n",
+					do_ssl_trace_str(val, tbl, ntbl), val);
+		msg += vlen;
+		msglen -= vlen;
+		}
+	return 1;
+	}
+
+/* Version number */
+
+static ssl_trace_tbl ssl_version_tbl[] = {
+	{SSL2_VERSION,		"SSL 2.0"},
+	{SSL3_VERSION,		"SSL 3.0"},
+	{TLS1_VERSION,		"TLS 1.0"},
+	{TLS1_1_VERSION,	"TLS 1.1"},
+	{TLS1_2_VERSION,	"TLS 1.2"},
+	{DTLS1_VERSION,		"DTLS 1.0"},
+	{DTLS1_BAD_VER,		"DTLS 1.0 (bad)"}
+};
+
+static ssl_trace_tbl ssl_content_tbl[] = {
+	{SSL3_RT_CHANGE_CIPHER_SPEC,	"ChangeCipherSpec"},
+	{SSL3_RT_ALERT,			"Alert"},
+	{SSL3_RT_HANDSHAKE,		"Handshake"},
+	{SSL3_RT_APPLICATION_DATA,	"ApplicationData"},
+	{TLS1_RT_HEARTBEAT,		"HeartBeat"}
+};
+/* Handshake types */
+static ssl_trace_tbl ssl_handshake_tbl[] = {
+	{SSL3_MT_HELLO_REQUEST,		"HelloRequest"},
+	{SSL3_MT_CLIENT_HELLO,		"ClientHello"},
+	{SSL3_MT_SERVER_HELLO,		"ServerHello"},
+	{DTLS1_MT_HELLO_VERIFY_REQUEST, "HelloVerifyRequest"},
+	{SSL3_MT_NEWSESSION_TICKET,	"NewSessionTicket"},
+	{SSL3_MT_CERTIFICATE, 		"Certificate"},
+	{SSL3_MT_SERVER_KEY_EXCHANGE,	"ServerKeyExchange"},
+	{SSL3_MT_CERTIFICATE_REQUEST, 	"CertificateRequest"},
+	{SSL3_MT_CLIENT_KEY_EXCHANGE,	"ClientKeyExchange"},
+	{SSL3_MT_CERTIFICATE_STATUS, 	"CertificateStatus"},
+	{SSL3_MT_SERVER_DONE,		"ServerHelloDone"},
+	{SSL3_MT_CERTIFICATE_VERIFY,	"CertificateVerify"},
+	{SSL3_MT_CLIENT_KEY_EXCHANGE,	"ClientKeyExchange"},
+	{SSL3_MT_FINISHED,		"Finished"},
+	{SSL3_MT_CERTIFICATE_STATUS,	"CertificateStatus"}
+};
+/* Cipher suites */
+static ssl_trace_tbl ssl_ciphers_tbl[] = {
+	{0x0000, "SSL_NULL_WITH_NULL_NULL"},
+	{0x0001, "SSL_RSA_WITH_NULL_MD5"},
+	{0x0002, "SSL_RSA_WITH_NULL_SHA"},
+	{0x0003, "SSL_RSA_EXPORT_WITH_RC4_40_MD5"},
+	{0x0004, "SSL_RSA_WITH_RC4_128_MD5"},
+	{0x0005, "SSL_RSA_WITH_RC4_128_SHA"},
+	{0x0006, "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5"},
+	{0x0007, "SSL_RSA_WITH_IDEA_CBC_SHA"},
+	{0x0008, "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"},
+	{0x0009, "SSL_RSA_WITH_DES_CBC_SHA"},
+	{0x000A, "SSL_RSA_WITH_3DES_EDE_CBC_SHA"},
+	{0x000B, "SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"},
+	{0x000C, "SSL_DH_DSS_WITH_DES_CBC_SHA"},
+	{0x000D, "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA"},
+	{0x000E, "SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"},
+	{0x000F, "SSL_DH_RSA_WITH_DES_CBC_SHA"},
+	{0x0010, "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA"},
+	{0x0011, "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"},
+	{0x0012, "SSL_DHE_DSS_WITH_DES_CBC_SHA"},
+	{0x0013, "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"},
+	{0x0014, "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"},
+	{0x0015, "SSL_DHE_RSA_WITH_DES_CBC_SHA"},
+	{0x0016, "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA"},
+	{0x0017, "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5"},
+	{0x0018, "SSL_DH_anon_WITH_RC4_128_MD5"},
+	{0x0019, "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"},
+	{0x001A, "SSL_DH_anon_WITH_DES_CBC_SHA"},
+	{0x001B, "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA"},
+	{0x001D, "SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA"},
+	{0x001E, "SSL_FORTEZZA_KEA_WITH_RC4_128_SHA"},
+	{0x001F, "TLS_KRB5_WITH_3DES_EDE_CBC_SHA"},
+	{0x0020, "TLS_KRB5_WITH_RC4_128_SHA"},
+	{0x0021, "TLS_KRB5_WITH_IDEA_CBC_SHA"},
+	{0x0022, "TLS_KRB5_WITH_DES_CBC_MD5"},
+	{0x0023, "TLS_KRB5_WITH_3DES_EDE_CBC_MD5"},
+	{0x0024, "TLS_KRB5_WITH_RC4_128_MD5"},
+	{0x0025, "TLS_KRB5_WITH_IDEA_CBC_MD5"},
+	{0x0026, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"},
+	{0x0027, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"},
+	{0x0028, "TLS_KRB5_EXPORT_WITH_RC4_40_SHA"},
+	{0x0029, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"},
+	{0x002A, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"},
+	{0x002B, "TLS_KRB5_EXPORT_WITH_RC4_40_MD5"},
+	{0x002F, "TLS_RSA_WITH_AES_128_CBC_SHA"},
+	{0x0030, "TLS_DH_DSS_WITH_AES_128_CBC_SHA"},
+	{0x0031, "TLS_DH_RSA_WITH_AES_128_CBC_SHA"},
+	{0x0032, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA"},
+	{0x0033, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"},
+	{0x0034, "TLS_DH_anon_WITH_AES_128_CBC_SHA"},
+	{0x0035, "TLS_RSA_WITH_AES_256_CBC_SHA"},
+	{0x0036, "TLS_DH_DSS_WITH_AES_256_CBC_SHA"},
+	{0x0037, "TLS_DH_RSA_WITH_AES_256_CBC_SHA"},
+	{0x0038, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA"},
+	{0x0039, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"},
+	{0x003A, "TLS_DH_anon_WITH_AES_256_CBC_SHA"},
+	{0x003B, "TLS_RSA_WITH_NULL_SHA256"},
+	{0x003C, "TLS_RSA_WITH_AES_128_CBC_SHA256"},
+	{0x003D, "TLS_RSA_WITH_AES_256_CBC_SHA256"},
+	{0x003E, "TLS_DH_DSS_WITH_AES_128_CBC_SHA256"},
+	{0x003F, "TLS_DH_RSA_WITH_AES_128_CBC_SHA256"},
+	{0x0040, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"},
+	{0x0041, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"},
+	{0x0042, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"},
+	{0x0043, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"},
+	{0x0044, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"},
+	{0x0045, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"},
+	{0x0046, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"},
+	{0x0067, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"},
+	{0x0068, "TLS_DH_DSS_WITH_AES_256_CBC_SHA256"},
+	{0x0069, "TLS_DH_RSA_WITH_AES_256_CBC_SHA256"},
+	{0x006A, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"},
+	{0x006B, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"},
+	{0x006C, "TLS_DH_anon_WITH_AES_128_CBC_SHA256"},
+	{0x006D, "TLS_DH_anon_WITH_AES_256_CBC_SHA256"},
+	{0x0084, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"},
+	{0x0085, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"},
+	{0x0086, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"},
+	{0x0087, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"},
+	{0x0088, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"},
+	{0x0089, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"},
+	{0x008A, "TLS_PSK_WITH_RC4_128_SHA"},
+	{0x008B, "TLS_PSK_WITH_3DES_EDE_CBC_SHA"},
+	{0x008C, "TLS_PSK_WITH_AES_128_CBC_SHA"},
+	{0x008D, "TLS_PSK_WITH_AES_256_CBC_SHA"},
+	{0x008E, "TLS_DHE_PSK_WITH_RC4_128_SHA"},
+	{0x008F, "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"},
+	{0x0090, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"},
+	{0x0091, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"},
+	{0x0092, "TLS_RSA_PSK_WITH_RC4_128_SHA"},
+	{0x0093, "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"},
+	{0x0094, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"},
+	{0x0095, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"},
+	{0x0096, "TLS_RSA_WITH_SEED_CBC_SHA"},
+	{0x0097, "TLS_DH_DSS_WITH_SEED_CBC_SHA"},
+	{0x0098, "TLS_DH_RSA_WITH_SEED_CBC_SHA"},
+	{0x0099, "TLS_DHE_DSS_WITH_SEED_CBC_SHA"},
+	{0x009A, "TLS_DHE_RSA_WITH_SEED_CBC_SHA"},
+	{0x009B, "TLS_DH_anon_WITH_SEED_CBC_SHA"},
+	{0x009C, "TLS_RSA_WITH_AES_128_GCM_SHA256"},
+	{0x009D, "TLS_RSA_WITH_AES_256_GCM_SHA384"},
+	{0x009E, "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"},
+	{0x009F, "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"},
+	{0x00A0, "TLS_DH_RSA_WITH_AES_128_GCM_SHA256"},
+	{0x00A1, "TLS_DH_RSA_WITH_AES_256_GCM_SHA384"},
+	{0x00A2, "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"},
+	{0x00A3, "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"},
+	{0x00A4, "TLS_DH_DSS_WITH_AES_128_GCM_SHA256"},
+	{0x00A5, "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"},
+	{0x00A6, "TLS_DH_anon_WITH_AES_128_GCM_SHA256"},
+	{0x00A7, "TLS_DH_anon_WITH_AES_256_GCM_SHA384"},
+	{0x00A8, "TLS_PSK_WITH_AES_128_GCM_SHA256"},
+	{0x00A9, "TLS_PSK_WITH_AES_256_GCM_SHA384"},
+	{0x00AA, "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"},
+	{0x00AB, "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"},
+	{0x00AC, "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"},
+	{0x00AD, "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"},
+	{0x00AE, "TLS_PSK_WITH_AES_128_CBC_SHA256"},
+	{0x00AF, "TLS_PSK_WITH_AES_256_CBC_SHA384"},
+	{0x00B0, "TLS_PSK_WITH_NULL_SHA256"},
+	{0x00B1, "TLS_PSK_WITH_NULL_SHA384"},
+	{0x00B2, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"},
+	{0x00B3, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"},
+	{0x00B4, "TLS_DHE_PSK_WITH_NULL_SHA256"},
+	{0x00B5, "TLS_DHE_PSK_WITH_NULL_SHA384"},
+	{0x00B6, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"},
+	{0x00B7, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"},
+	{0x00B8, "TLS_RSA_PSK_WITH_NULL_SHA256"},
+	{0x00B9, "TLS_RSA_PSK_WITH_NULL_SHA384"},
+	{0x00BA, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
+	{0x00BB, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"},
+	{0x00BC, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
+	{0x00BD, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"},
+	{0x00BE, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
+	{0x00BF, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"},
+	{0x00C0, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
+	{0x00C1, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"},
+	{0x00C2, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
+	{0x00C3, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"},
+	{0x00C4, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
+	{0x00C5, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"},
+	{0x00FF, "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"},
+	{0xC001, "TLS_ECDH_ECDSA_WITH_NULL_SHA"},
+	{0xC002, "TLS_ECDH_ECDSA_WITH_RC4_128_SHA"},
+	{0xC003, "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"},
+	{0xC004, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"},
+	{0xC005, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"},
+	{0xC006, "TLS_ECDHE_ECDSA_WITH_NULL_SHA"},
+	{0xC007, "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"},
+	{0xC008, "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"},
+	{0xC009, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"},
+	{0xC00A, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"},
+	{0xC00B, "TLS_ECDH_RSA_WITH_NULL_SHA"},
+	{0xC00C, "TLS_ECDH_RSA_WITH_RC4_128_SHA"},
+	{0xC00D, "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"},
+	{0xC00E, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"},
+	{0xC00F, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"},
+	{0xC010, "TLS_ECDHE_RSA_WITH_NULL_SHA"},
+	{0xC011, "TLS_ECDHE_RSA_WITH_RC4_128_SHA"},
+	{0xC012, "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"},
+	{0xC013, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"},
+	{0xC014, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"},
+	{0xC015, "TLS_ECDH_anon_WITH_NULL_SHA"},
+	{0xC016, "TLS_ECDH_anon_WITH_RC4_128_SHA"},
+	{0xC017, "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"},
+	{0xC018, "TLS_ECDH_anon_WITH_AES_128_CBC_SHA"},
+	{0xC019, "TLS_ECDH_anon_WITH_AES_256_CBC_SHA"},
+	{0xC01A, "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"},
+	{0xC01B, "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"},
+	{0xC01C, "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"},
+	{0xC01D, "TLS_SRP_SHA_WITH_AES_128_CBC_SHA"},
+	{0xC01E, "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"},
+	{0xC01F, "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"},
+	{0xC020, "TLS_SRP_SHA_WITH_AES_256_CBC_SHA"},
+	{0xC021, "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"},
+	{0xC022, "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"},
+	{0xC023, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"},
+	{0xC024, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"},
+	{0xC025, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"},
+	{0xC026, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"},
+	{0xC027, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
+	{0xC028, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"},
+	{0xC029, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"},
+	{0xC02A, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"},
+	{0xC02B, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"},
+	{0xC02C, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"},
+	{0xC02D, "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"},
+	{0xC02E, "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"},
+	{0xC02F, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"},
+	{0xC030, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"},
+	{0xC031, "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"},
+	{0xC032, "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"},
+	{0xFEFE, "SSL_RSA_FIPS_WITH_DES_CBC_SHA"},
+	{0xFEFF, "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"},
+};
+/* Compression methods */
+static ssl_trace_tbl ssl_comp_tbl[] = {
+	{0x0000, "No Compression"},
+	{0x0001, "Zlib Compression"}
+};
+/* Extensions */
+static ssl_trace_tbl ssl_exts_tbl[] = {
+	{TLSEXT_TYPE_server_name, "server_name"},
+	{TLSEXT_TYPE_max_fragment_length, "max_fragment_length"},
+	{TLSEXT_TYPE_client_certificate_url, "client_certificate_url"},
+	{TLSEXT_TYPE_trusted_ca_keys, "trusted_ca_keys"},
+	{TLSEXT_TYPE_truncated_hmac, "truncated_hmac"},
+	{TLSEXT_TYPE_status_request, "status_request"},
+	{TLSEXT_TYPE_user_mapping, "user_mapping"},
+	{TLSEXT_TYPE_client_authz, "client_authz"},
+	{TLSEXT_TYPE_server_authz, "server_authz"},
+	{TLSEXT_TYPE_cert_type, "cert_type"},
+	{TLSEXT_TYPE_elliptic_curves, "elliptic_curves"},
+	{TLSEXT_TYPE_ec_point_formats, "ec_point_formats"},
+	{TLSEXT_TYPE_srp, "srp"},
+	{TLSEXT_TYPE_signature_algorithms, "signature_algorithms"},
+	{TLSEXT_TYPE_use_srtp, "use_srtp"},
+	{TLSEXT_TYPE_heartbeat, "heartbeat"},
+	{TLSEXT_TYPE_session_ticket, "session_ticket"},
+#ifdef TLSEXT_TYPE_opaque_prf_input
+	{TLSEXT_TYPE_opaque_prf_input, "opaque_prf_input"},
+#endif
+	{TLSEXT_TYPE_renegotiate, "renegotiate"},
+	{TLSEXT_TYPE_next_proto_neg, "next_proto_neg"}
+};
+
+static ssl_trace_tbl ssl_curve_tbl[] = {
+	{1, "sect163k1 (K-163)"},
+	{2, "sect163r1"},
+	{3, "sect163r2 (B-163)"},
+	{4, "sect193r1"},
+	{5, "sect193r2"},
+	{6, "sect233k1 (K-233)"},
+	{7, "sect233r1 (B-233)"},
+	{8, "sect239k1"},
+	{9, "sect283k1 (K-283)"},
+	{10, "sect283r1 (B-283)"},
+	{11, "sect409k1 (K-409)"},
+	{12, "sect409r1 (B-409)"},
+	{13, "sect571k1 (K-571)"},
+	{14, "sect571r1 (B-571)"},
+	{15, "secp160k1"},
+	{16, "secp160r1"},
+	{17, "secp160r2"},
+	{18, "secp192k1"},
+	{19, "secp192r1 (P-192)"},
+	{20, "secp224k1"},
+	{21, "secp224r1 (P-224)"},
+	{22, "secp256k1"},
+	{23, "secp256r1 (P-256)"},
+	{24, "secp384r1 (P-384)"},
+	{25, "secp521r1 (P-521)"},
+	{0xFF01, "arbitrary_explicit_prime_curves"},
+	{0xFF02, "arbitrary_explicit_char2_curves"}
+};
+
+static ssl_trace_tbl ssl_point_tbl[] = {
+	{0, "uncompressed"},
+	{1, "ansiX962_compressed_prime"},
+	{2, "ansiX962_compressed_char2"}
+};
+
+static ssl_trace_tbl ssl_md_tbl[] = {
+	{0, "none"},
+	{1, "md5"},
+	{2, "sha1"},
+	{3, "sha224"},
+	{4, "sha256"},
+	{5, "sha384"},
+	{6, "sha512"}
+};
+
+static ssl_trace_tbl ssl_sig_tbl[] = {
+	{0, "anonymous"},
+	{1, "rsa"},
+	{2, "dsa"},
+	{3, "ecdsa"}
+};
+
+static ssl_trace_tbl ssl_hb_tbl[] = {
+	{1, "peer_allowed_to_send"},
+	{2, "peer_not_allowed_to_send"}
+};
+
+static ssl_trace_tbl ssl_hb_type_tbl[] = {
+	{1, "heartbeat_request"},
+	{2, "heartbeat_response"}
+};
+
+static ssl_trace_tbl ssl_ctype_tbl[] = {
+	{1, "rsa_sign"},
+	{2, "dss_sign"},
+	{3, "rsa_fixed_dh"},
+	{4, "dss_fixed_dh"},
+	{5, "rsa_ephemeral_dh"},
+	{6, "dss_ephemeral_dh"},
+	{20, "fortezza_dms"},
+	{64, "ecdsa_sign"},
+	{65, "rsa_fixed_ecdh"},
+	{66, "ecdsa_fixed_ecdh"}
+};
+
+static void ssl_print_hex(BIO *bio, int indent, const char *name,
+				const unsigned char *msg, size_t msglen)
+	{
+	size_t i;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "%s (len=%d): ", name, (int)msglen);
+	for (i = 0; i < msglen; i++)
+		BIO_printf(bio, "%02X", msg[i]);
+	BIO_puts(bio, "\n");
+	}
+
+static int ssl_print_hexbuf(BIO *bio, int indent,
+				const char *name, size_t nlen,
+				const unsigned char **pmsg, size_t *pmsglen)
+	{
+	size_t blen;
+	const unsigned char *p = *pmsg;
+	if (*pmsglen < nlen)
+		return 0;
+	blen = p[0];
+	if (nlen > 1)
+		blen = (blen << 8)|p[1];
+	if (*pmsglen < nlen + blen)
+		return 0;
+	p += nlen;
+	ssl_print_hex(bio, indent, name, p, blen);
+	*pmsg += blen + nlen;
+	*pmsglen -= blen + nlen;
+	return 1;
+	}
+
+	
+
+static int ssl_print_version(BIO *bio, int indent, const char *name,
+				const unsigned char **pmsg, size_t *pmsglen)
+	{
+	int vers;
+	if (*pmsglen < 2)
+		return 0;
+	vers = ((*pmsg)[0] << 8) | (*pmsg)[1];
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "%s=0x%x (%s)\n",
+				name, vers,
+				ssl_trace_str(vers, ssl_version_tbl));
+	*pmsg += 2;
+	*pmsglen -= 2;
+	return 1;
+	}
+
+static int ssl_print_random(BIO *bio, int indent,
+				const unsigned char **pmsg, size_t *pmsglen)
+	{
+	unsigned int tm;
+	const unsigned char *p = *pmsg;
+	if (*pmsglen < 32)
+		return 0;
+	tm = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
+	p += 4;
+	BIO_indent(bio, indent, 80);
+	BIO_puts(bio, "Random:\n");
+	BIO_indent(bio, indent + 2, 80);
+	BIO_printf(bio, "gmt_unix_time=0x%08X\n", tm);
+	ssl_print_hex(bio, indent + 2, "random_bytes", p, 28);
+	*pmsg += 32;
+	*pmsglen -= 32;
+	return 1;
+	}
+
+static int ssl_print_signature(BIO *bio, int indent, SSL *s,
+				const unsigned char **pmsg, size_t *pmsglen)
+	{
+	if (*pmsglen < 2)
+		return 0;
+	if (TLS1_get_version(s) >= TLS1_2_VERSION)
+		{
+		const unsigned char *p = *pmsg;
+		BIO_indent(bio, indent, 80);
+		BIO_printf(bio, "Signature Algorithm %s+%s (%d+%d)\n",
+				ssl_trace_str(p[0], ssl_md_tbl),
+				ssl_trace_str(p[1], ssl_sig_tbl),
+				p[0], p[1]);
+		*pmsg += 2;
+		*pmsglen -= 2;
+		}
+	return ssl_print_hexbuf(bio, indent, "Signature", 2, pmsg, pmsglen);
+	}
+
+static int ssl_print_extension(BIO *bio, int indent, int server, int extype,
+				const unsigned char *ext, size_t extlen)
+	{
+	size_t xlen;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "extension_type=%s(%d), length=%d\n",
+				ssl_trace_str(extype, ssl_exts_tbl),
+				extype, (int)extlen);
+	switch(extype)
+		{
+	case TLSEXT_TYPE_ec_point_formats:
+		if (extlen < 1)
+			return 0;
+		xlen = ext[0];
+		if (extlen != xlen + 1)
+			return 0;
+		return ssl_trace_list(bio, indent + 2,
+					ext + 1, xlen, 1, ssl_point_tbl);
+
+	case TLSEXT_TYPE_elliptic_curves:
+		if (extlen < 2)
+			return 0;
+		xlen = (ext[0] << 8) | ext[1];
+		if (extlen != xlen + 2)
+			return 0;
+		return ssl_trace_list(bio, indent + 2,
+					ext + 2, xlen, 2, ssl_curve_tbl);
+
+	case TLSEXT_TYPE_signature_algorithms:
+
+		if (extlen < 2)
+			return 0;
+		xlen = (ext[0] << 8) | ext[1];
+		if (extlen != xlen + 2)
+			return 0;
+		if (xlen & 1)
+			return 0;
+		ext += 2;
+		while(xlen > 0)
+			{
+			BIO_indent(bio, indent + 2, 80);
+			BIO_printf(bio, "%s+%s (%d+%d)\n",
+				ssl_trace_str(ext[0], ssl_md_tbl),
+				ssl_trace_str(ext[1], ssl_sig_tbl),
+				ext[0], ext[1]);
+			xlen-= 2;
+			ext+= 2;
+			}
+		break;
+	
+	case TLSEXT_TYPE_renegotiate:
+		if (extlen < 1)
+			return 0;
+		xlen = ext[0];
+		if (xlen + 1 != extlen)
+			return 0;
+		ext++;
+		if (xlen)
+			{
+			if (server)
+				{
+				if (xlen & 1)
+					return 0;
+				xlen >>= 1;
+				}
+			ssl_print_hex(bio, indent + 4, "client_verify_data",
+								ext, xlen);
+			if (server)
+				{
+				ext += xlen;
+				ssl_print_hex(bio, indent + 4,
+							"server_verify_data",
+							ext, xlen);
+				}
+			}
+		else
+			{
+			BIO_indent(bio, indent + 4, 80);
+			BIO_puts(bio, "<EMPTY>\n");
+			}
+		break;
+
+	case TLSEXT_TYPE_heartbeat:
+		if (extlen != 1)
+			return 0;
+		BIO_indent(bio, indent + 2, 80);
+		BIO_printf(bio, "HeartbeatMode: %s\n",
+				ssl_trace_str(ext[0], ssl_hb_tbl));
+		break;
+
+		case TLSEXT_TYPE_session_ticket:
+		if (extlen != 0)
+			ssl_print_hex(bio, indent + 4, "ticket", ext, extlen);
+		break;
+
+	default:
+		BIO_dump_indent(bio, (char *)ext, extlen, indent + 2);
+		}
+	return 1;
+	}
+
+static int ssl_print_extensions(BIO *bio, int indent, int server,
+				const unsigned char *msg, size_t msglen)
+	{
+	size_t extslen;
+	BIO_indent(bio, indent, 80);
+	if (msglen == 0)
+		{
+		BIO_puts(bio, "No Extensions\n");
+		return 1;
+		}
+	extslen = (msg[0] << 8) | msg[1];
+	if (extslen != msglen - 2)
+		return 0;
+	msg += 2;
+	msglen = extslen;
+	BIO_printf(bio, "extensions, length = %d\n", (int)msglen);
+	while (msglen > 0)
+		{
+		int extype;
+		size_t extlen;
+		if (msglen < 4)
+			return 0;
+		extype = (msg[0] << 8) | msg[1];
+		extlen = (msg[2] << 8) | msg[3];
+		if (msglen < extlen + 4)
+			return 0;
+		msg += 4;
+		if (!ssl_print_extension(bio, indent + 2, server,
+							extype, msg, extlen))
+			return 0;
+		msg += extlen;
+		msglen -= extlen + 4;
+		}
+	return 1;
+	}
+
+static int ssl_print_client_hello(BIO *bio, int indent,
+				const unsigned char *msg, size_t msglen)
+	{
+	size_t len;
+	unsigned int cs;
+	if (!ssl_print_version(bio, indent, "client_version", &msg, &msglen))
+		return 0;
+	if (!ssl_print_random(bio, indent, &msg, &msglen))
+		return 0;
+	if (!ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
+		return 0;
+	if (msglen < 2)
+		return 0;
+	len = (msg[0] << 8) | msg[1];
+	msg += 2;
+	msglen -= 2;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "cipher_suites (len=%d)\n", (int)len);
+	if (msglen < len || len & 1)
+		return 0;
+	while(len > 0)
+		{
+		cs = (msg[0] << 8) | msg[1];
+		BIO_indent(bio, indent + 2, 80);
+		BIO_printf(bio, "{0x%02X, 0x%02X} %s\n",
+				msg[0], msg[1],
+				ssl_trace_str(cs, ssl_ciphers_tbl));
+		msg += 2;
+		msglen -= 2;
+		len -= 2;
+		}
+	if (msglen < 1)
+		return 0;
+	len = msg[0];
+	msg++;
+	msglen--;
+	if (msglen < len)
+		return 0;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "compression_methods (len=%d)\n", (int)len);
+	while(len > 0)
+		{
+		BIO_indent(bio, indent + 2, 80);
+		BIO_printf(bio, "%s (0x%02X)\n",
+				ssl_trace_str(msg[0], ssl_comp_tbl),
+				msg[0]);
+		msg++;
+		msglen--;
+		len--;
+		}
+	if (!ssl_print_extensions(bio, indent, 0, msg, msglen))
+		return 0;
+	return 1;
+	}
+
+static int ssl_print_server_hello(BIO *bio, int indent,
+				const unsigned char *msg, size_t msglen)
+	{
+	unsigned int cs;
+	if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen))
+		return 0;
+	if (!ssl_print_random(bio, indent, &msg, &msglen))
+		return 0;
+	if (!ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
+		return 0;
+	if (msglen < 2)
+		return 0;
+	cs = (msg[0] << 8) | msg[1];
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "cipher_suite {0x%02X, 0x%02X} %s\n",
+				msg[0], msg[1],
+				ssl_trace_str(cs, ssl_ciphers_tbl));
+	msg += 2;
+	msglen -= 2;
+	if (msglen < 1)
+		return 0;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "compression_method: %s (0x%02X)\n",
+			ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
+	msg++;
+	msglen--;
+	if (!ssl_print_extensions(bio, indent, 1, msg, msglen))
+		return 0;
+	return 1;
+	}
+
+static int ssl_get_keyex(const char **pname, SSL *ssl)
+	{
+	unsigned long alg_k = ssl->s3->tmp.new_cipher->algorithm_mkey;
+	if (alg_k & SSL_kRSA)
+		{
+		*pname = "rsa";
+		return SSL_kRSA;
+		}
+	if (alg_k & SSL_kDHr)
+		{
+		*pname = "dh_rsa";
+		return SSL_kDHr;
+		}
+	if (alg_k & SSL_kDHr)
+		{
+		*pname = "dh_dss";
+		return SSL_kDHd;
+		}
+	if (alg_k & SSL_kKRB5)
+		{
+		*pname = "krb5";
+		return SSL_kKRB5;
+		}
+	if (alg_k & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
+		{
+		*pname = "edh";
+		return SSL_kEDH;
+		}
+	if (alg_k & (SSL_kEECDH|SSL_kECDHr|SSL_kECDHe))
+		{
+		*pname = "ECDH";
+		return SSL_kEECDH;
+		}
+	if (alg_k & SSL_kPSK)
+		{
+		*pname = "PSK";
+		return SSL_kPSK;
+		}
+	if (alg_k & SSL_kSRP)
+		{
+		*pname = "SRP";
+		return SSL_kSRP;
+		}
+	if (alg_k & SSL_kGOST)
+		{
+		*pname = "GOST";
+		return SSL_kGOST;
+		}
+	*pname = "UNKNOWN";
+	return 0;
+	}
+
+static int ssl_print_client_keyex(BIO *bio, int indent, SSL *ssl,
+				const unsigned char *msg, size_t msglen)
+	{
+	const char *algname;
+	int id;
+	id = ssl_get_keyex(&algname, ssl);
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
+	switch(id)
+		{
+
+	case SSL_kRSA:
+		if (!ssl_print_hexbuf(bio, indent + 2,
+						"EncyptedPreMasterSecret", 2,
+						&msg, &msglen))
+				return 0;
+		break;
+
+		/* Implicit parameters only allowed for static DH */
+	case SSL_kDHd:
+	case SSL_kDHr:
+		if (msglen == 0)
+			{
+			BIO_indent(bio, indent + 2, 80);
+			BIO_puts(bio, "implicit\n");
+			break;
+			}
+	case SSL_kEDH:
+		if (!ssl_print_hexbuf(bio, indent + 2, "dh_Yc", 2,
+								&msg, &msglen))
+			return 0;
+		break;
+
+	case SSL_kEECDH:
+		if (!ssl_print_hexbuf(bio, indent + 2, "ecdh_Yc", 1,
+							&msg, &msglen))
+			return 0;
+		break;
+		}
+
+	return 1;
+	}
+
+static int ssl_print_server_keyex(BIO *bio, int indent, SSL *ssl,
+				const unsigned char *msg, size_t msglen)
+	{
+	const char *algname;
+	int id;
+	id = ssl_get_keyex(&algname, ssl);
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
+	switch(id)
+		{
+		/* Should never happen */
+	case SSL_kDHd:
+	case SSL_kDHr:
+		BIO_indent(bio, indent + 2, 80);
+		BIO_printf(bio, "Unexpected Message\n");
+		break;
+
+	case SSL_kRSA:
+
+		if (!ssl_print_hexbuf(bio, indent + 2, "rsa_modulus", 2,
+						&msg, &msglen))
+			return 0;
+		if (!ssl_print_hexbuf(bio, indent + 2, "rsa_exponent", 2,
+						&msg, &msglen))
+			return 0;
+		break;
+
+	case SSL_kEDH:
+		if (!ssl_print_hexbuf(bio, indent + 2, "dh_p", 2,
+						&msg, &msglen))
+			return 0;
+		if (!ssl_print_hexbuf(bio, indent + 2, "dh_g", 2,
+						&msg, &msglen))
+			return 0;
+		if (!ssl_print_hexbuf(bio, indent + 2, "dh_Ys", 2,
+						&msg, &msglen))
+			return 0;
+		break;
+
+	case SSL_kEECDH:
+		if (msglen < 1)
+			return 0;
+		BIO_indent(bio, indent + 2, 80);
+		if (msg[0] == EXPLICIT_PRIME_CURVE_TYPE)
+			BIO_puts(bio, "explicit_prime\n");
+		else if (msg[0] == EXPLICIT_CHAR2_CURVE_TYPE)
+			BIO_puts(bio, "explicit_char2\n");
+		else if (msg[0] == NAMED_CURVE_TYPE)
+			{
+			int curve;
+			if (msglen < 3)
+				return 0;
+			curve = (msg[1] << 8) | msg[2];
+			BIO_printf(bio, "named_curve: %s (%d)\n",
+					ssl_trace_str(curve, ssl_curve_tbl),
+					curve);
+			msg += 3;
+			msglen -= 3;
+			if (!ssl_print_hexbuf(bio, indent + 2, "point", 1,
+							&msg, &msglen))
+				return 0;
+			}
+		break;
+		}
+	return ssl_print_signature(bio, indent, ssl, &msg, &msglen);
+	}
+
+static int ssl_print_certificate(BIO *bio, int indent, 
+				const unsigned char **pmsg, size_t *pmsglen)
+	{
+	size_t msglen = *pmsglen;
+	size_t clen;
+	X509 *x;
+	const unsigned char *p = *pmsg, *q;
+	if (msglen < 3)
+		return 0;
+	clen = (p[0] << 16) | (p[1] << 8) | p[2];
+	if (msglen < clen + 3)
+		return 0;
+	q = p + 3;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "ASN.1Cert, length=%d", (int)clen);
+	x = d2i_X509(NULL, &q, clen);
+	if (!x)
+		BIO_puts(bio, "<UNPARSEABLE CERTIFICATE>\n");
+	else
+		{
+		BIO_puts(bio, "\n------details-----\n");
+		X509_print_ex(bio, x, XN_FLAG_ONELINE, 0);
+		PEM_write_bio_X509(bio, x);
+		/* Print certificate stuff */
+		BIO_puts(bio, "------------------\n");
+		X509_free(x);
+		}
+	if (q != p + 3 + clen)
+		{
+		BIO_puts(bio, "<TRAILING GARBAGE AFTER CERTIFICATE>\n");
+		}
+	*pmsg += clen + 3;
+	*pmsglen -= clen + 3;
+	return 1;
+	}
+
+static int ssl_print_certificates(BIO *bio, int indent, 
+				const unsigned char *msg, size_t msglen)
+	{
+	size_t clen;
+	if (msglen < 3)
+		return 0;
+	clen = (msg[0] << 16) | (msg[1] << 8) | msg[2];
+	if (msglen != clen + 3)
+		return 0;
+	msg += 3;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "certificate_list, length=%d\n", (int)clen);
+	while (clen > 0)
+		{
+		if (!ssl_print_certificate(bio, indent + 2, &msg, &clen))
+			return 0;
+		}
+	return 1;
+	}
+
+static int ssl_print_cert_request(BIO *bio, int indent, SSL *s,
+				const unsigned char *msg, size_t msglen)
+	{
+	size_t xlen;
+	if (msglen < 1)
+		return 0;
+	xlen = msg[0];
+	if (msglen < xlen + 1)
+		return 0;
+	msg++;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "certificate_types (len=%d)\n", (int)xlen);
+	if (!ssl_trace_list(bio, indent + 2, msg, xlen, 1, ssl_ctype_tbl))
+		return 0;
+	msg += xlen;
+	msglen -= xlen + 1;
+	if (TLS1_get_version(s) < TLS1_2_VERSION)
+		goto skip_sig;
+	if (msglen < 2)
+		return 0;
+	xlen = (msg[0] << 8) | msg[1];
+	if (msglen < xlen + 2 || (xlen & 1))
+		return 0;
+	msg += 2;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "signature_algorithms (len=%d)\n", (int)xlen);
+	while(xlen > 0)
+		{
+		BIO_indent(bio, indent + 2, 80);
+		BIO_printf(bio, "%s+%s (%d+%d)\n",
+				ssl_trace_str(msg[0], ssl_md_tbl),
+				ssl_trace_str(msg[1], ssl_sig_tbl),
+				msg[0], msg[1]);
+		xlen -= 2;
+		msg += 2;
+		}
+	msg += xlen;
+	msglen -= xlen + 2;
+
+	skip_sig:
+	xlen = (msg[0] << 8) | msg[1];
+	BIO_indent(bio, indent, 80);
+	if (msglen < xlen + 2)
+		return 0;
+	msg += 2;
+	msglen -= 2;
+	BIO_printf(bio, "certificate_authorities (len=%d)\n", (int)xlen);
+	while (xlen > 0)
+		{
+		size_t dlen;
+		X509_NAME *nm;
+		const unsigned char *p;
+		if (xlen < 2)
+			return 0;
+		dlen = (msg[0] << 8) | msg[1];
+		if (xlen < dlen + 2)
+			return 0;
+		msg += 2;
+		BIO_indent(bio, indent + 2, 80);
+		BIO_printf(bio, "DistinguishedName (len=%d): ", (int)dlen);
+		p = msg;
+		nm = d2i_X509_NAME(NULL, &p, dlen);
+		if (!nm)
+			{
+			BIO_puts(bio, "<UNPARESABLE DN>\n");
+			}
+		else
+			{
+			X509_NAME_print_ex(bio, nm, 0, XN_FLAG_ONELINE);
+			BIO_puts(bio, "\n");
+			X509_NAME_free(nm);
+			}
+		xlen -= dlen + 2;
+		msg += dlen;
+		}
+	return 1;
+	}
+
+static int ssl_print_ticket(BIO *bio, int indent,
+				const unsigned char *msg, size_t msglen)
+	{
+	unsigned int tick_life;
+	if (msglen == 0)
+		{
+		BIO_indent(bio, indent + 2, 80);
+		BIO_puts(bio, "No Ticket\n");
+		return 1;
+		}
+	if (msglen < 4)
+		return 0;
+	tick_life = (msg[0] << 24) | (msg[1] << 16) | (msg[2] << 8) | msg[3];
+	msglen -= 4;
+	msg += 4;	
+	BIO_indent(bio, indent + 2, 80);
+	BIO_printf(bio, "ticket_lifetime_hint=%u\n", tick_life);
+	if (!ssl_print_hexbuf(bio, indent + 2, "ticket", 2, &msg, &msglen))
+		return 0;
+	if (msglen)
+		return 0;
+	return 1;
+	}
+
+static int ssl_print_handshake(BIO *bio, SSL *ssl,
+				const unsigned char *msg, size_t msglen,
+				int indent)
+	{
+	size_t hlen;
+	unsigned char htype;
+	if (msglen < 4)
+		return 0;
+	htype = msg[0];
+	hlen = (msg[1] << 16) | (msg[2] << 8) | msg[3];
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "%s, Length=%d\n",
+				ssl_trace_str(htype, ssl_handshake_tbl),
+				(int)hlen);
+	msg += 4;
+	msglen -= 4;
+	if (msglen < hlen)
+		return 0;
+	switch(htype)
+		{
+	case SSL3_MT_CLIENT_HELLO:
+		if (!ssl_print_client_hello(bio, indent + 2, msg, msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_SERVER_HELLO:
+		if (!ssl_print_server_hello(bio, indent + 2, msg, msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_SERVER_KEY_EXCHANGE:
+		if (!ssl_print_server_keyex(bio, indent + 2, ssl, msg, msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_CLIENT_KEY_EXCHANGE:
+		if (!ssl_print_client_keyex(bio, indent + 2, ssl, msg, msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_CERTIFICATE:
+		if (!ssl_print_certificates(bio, indent + 2,  msg, msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_CERTIFICATE_VERIFY:
+		if (!ssl_print_signature(bio, indent + 2, ssl, &msg, &msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_CERTIFICATE_REQUEST:
+		if (!ssl_print_cert_request(bio, indent + 2,  ssl, msg, msglen))
+			return 0;
+		break;
+
+	case SSL3_MT_FINISHED:
+		ssl_print_hex(bio, indent + 2, "verify_data", msg, msglen);
+		break;
+
+	case SSL3_MT_SERVER_DONE:
+		if (msglen != 0)
+			ssl_print_hex(bio, indent + 2, "unexpected value",
+								msg, msglen);
+		break;
+
+	case SSL3_MT_NEWSESSION_TICKET:
+		if (!ssl_print_ticket(bio, indent + 2,  msg, msglen))
+			return 0;
+		break;
+		
+	default:
+		BIO_indent(bio, indent + 2, 80);
+		BIO_puts(bio, "Unsupported, hex dump follows:\n");
+		BIO_dump_indent(bio, (char *)msg, msglen, indent + 4);
+		}
+	return 1;
+	}
+
+static int ssl_print_heartbeat(BIO *bio, int indent,
+				const unsigned char *msg, size_t msglen)
+	{
+	if (msglen < 3)
+		return 0;
+	BIO_indent(bio, indent, 80);
+	BIO_printf(bio, "HeartBeatMessageType: %s\n",
+				ssl_trace_str(msg[0], ssl_hb_type_tbl));
+	msg++;
+	msglen--;
+	if (!ssl_print_hexbuf(bio, indent, "payload", 2, &msg, &msglen))
+		return 0;
+	ssl_print_hex(bio, indent, "padding", msg, msglen);
+	return 1;
+	}
+
+void SSL_trace(int write_p, int version, int content_type,
+		const void *buf, size_t msglen, SSL *ssl, void *arg)
+	{
+	const unsigned char *msg = buf;
+	BIO *bio = arg;
+	
+	BIO_printf(bio, "%s Record: Version = %s (0x%x)",
+				write_p ? "Sent" : "Received",
+				ssl_trace_str(version, ssl_version_tbl),
+				version);
+	BIO_printf(bio, " Length=%d\n", (int)msglen);
+	BIO_printf(bio, "  Content Type = %s (%d)\n",
+				ssl_trace_str(content_type, ssl_content_tbl),
+				content_type);
+
+	switch (content_type)
+		{
+	case SSL3_RT_HANDSHAKE:
+		if (!ssl_print_handshake(bio, ssl, msg, msglen, 4))
+			BIO_printf(bio, "Message length parse error!\n");
+		break;
+
+	case SSL3_RT_CHANGE_CIPHER_SPEC:
+		if (msglen == 1 && msg[0] == 1)
+			BIO_puts(bio, "    change_cipher_spec (1)\n");
+		else
+			ssl_print_hex(bio, 4, "unknown value", msg, msglen);
+		break;
+
+	case SSL3_RT_ALERT:
+		if (msglen != 2)
+			BIO_puts(bio, "    Illegal Alert Length\n");
+		else
+			{
+			BIO_printf(bio,"    Level=%s(%d), description=%s(%d)\n",
+					SSL_alert_type_string_long(msg[0] << 8),
+					msg[0],
+					SSL_alert_desc_string_long(msg[1]),
+					msg[1]);
+			}
+	case TLS1_RT_HEARTBEAT:
+		ssl_print_heartbeat(bio, 4, msg, msglen);
+		break;
+
+		}
+
+	BIO_puts(bio, "\n");
+	}
+
+#endif
