/* 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_2_VERSION,	"DTLS 1.2"},
	{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"},
	{TLSEXT_TYPE_padding, "padding"}
};

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)"},
	{26, "brainpoolP256r1"},
	{27, "brainpoolP384r1"},
	{28, "brainpoolP512r1"},
	{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 ssl_trace_tbl ssl_crypto_tbl[] = {
	{TLS1_RT_CRYPTO_PREMASTER,	"Premaster Secret"},
	{TLS1_RT_CRYPTO_CLIENT_RANDOM,	"Client Random"},
	{TLS1_RT_CRYPTO_SERVER_RANDOM,	"Server Random"},
	{TLS1_RT_CRYPTO_MASTER,		"Master Secret"},
	{TLS1_RT_CRYPTO_MAC|TLS1_RT_CRYPTO_WRITE,	"Write Mac Secret"},
	{TLS1_RT_CRYPTO_MAC|TLS1_RT_CRYPTO_READ, 	"Read Mac Secret"},
	{TLS1_RT_CRYPTO_KEY|TLS1_RT_CRYPTO_WRITE,	"Write Key"},
	{TLS1_RT_CRYPTO_KEY|TLS1_RT_CRYPTO_READ, 	"Read Key"},
	{TLS1_RT_CRYPTO_IV|TLS1_RT_CRYPTO_WRITE,	"Write IV"},
	{TLS1_RT_CRYPTO_IV|TLS1_RT_CRYPTO_READ, 	"Read IV"},
	{TLS1_RT_CRYPTO_FIXED_IV|TLS1_RT_CRYPTO_WRITE,	"Write IV (fixed part)"},
	{TLS1_RT_CRYPTO_FIXED_IV|TLS1_RT_CRYPTO_READ, 	"Read IV (fixed part)"}
};

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 (SSL_USE_SIGALGS(s))
		{
		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, SSL *ssl, 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 (SSL_IS_DTLS(ssl))
		{
		if (!ssl_print_hexbuf(bio, indent, "cookie", 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 dtls_print_hello_vfyrequest(BIO *bio, int indent,
				const unsigned char *msg, size_t msglen)
	{
	if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen))
		return 0;
	if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &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_kDHd)
		{
		*pname = "dh_dss";
		return SSL_kDHd;
		}
	if (alg_k & SSL_kKRB5)
		{
		*pname = "krb5";
		return SSL_kKRB5;
		}
	if (alg_k & SSL_kDHE)
		{
		*pname = "DHE";
		return SSL_kDHE;
		}
	if (alg_k & SSL_kECDHE)
		{
		*pname = "ECDHE";
		return SSL_kECDHE;
		}
	if (alg_k & SSL_kECDHr)
		{
		*pname = "ECDH RSA";
		return SSL_kECDHr;
		}
	if (alg_k & SSL_kECDHe)
		{
		*pname = "ECDH ECDSA";
		return SSL_kECDHe;
		}
	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 (TLS1_get_version(ssl) == SSL3_VERSION)
			{
			ssl_print_hex(bio, indent + 2,
						"EncyptedPreMasterSecret",
						msg, msglen);
			}
		else
			{
			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_kDHE:
		if (!ssl_print_hexbuf(bio, indent + 2, "dh_Yc", 2,
								&msg, &msglen))
			return 0;
		break;

	case SSL_kECDHr:
	case SSL_kECDHe:
		if (msglen == 0)
			{
			BIO_indent(bio, indent + 2, 80);
			BIO_puts(bio, "implicit\n");
			break;
			}
	case SSL_kECDHE:
		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:
	case SSL_kECDHr:
	case SSL_kECDHe:
		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_kDHE:
		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_kECDHE:
		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 (!SSL_USE_SIGALGS(s))
		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, "<UNPARSEABLE 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 (SSL_IS_DTLS(ssl))
		{
		if (msglen < 8)
			return 0;
		BIO_indent(bio, indent, 80);
		BIO_printf(bio, "message_seq=%d, fragment_offset=%d, "
				"fragment_length=%d\n",
				(msg[0] << 8) | msg[1],
				(msg[2] << 16) | (msg[3] << 8) | msg[4],
				(msg[5] << 16) | (msg[6] << 8) | msg[7]);
		msg += 8;
		msglen -= 8;
		}
	if (msglen < hlen)
		return 0;
	switch(htype)
		{
	case SSL3_MT_CLIENT_HELLO:
		if (!ssl_print_client_hello(bio, ssl, indent + 2, msg, msglen))
			return 0;
		break;

	case DTLS1_MT_HELLO_VERIFY_REQUEST:
		if (!dtls_print_hello_vfyrequest(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;
	}

const char *SSL_CIPHER_standard_name(const SSL_CIPHER *c)
	{
	if (c->algorithm_ssl & SSL_SSLV2)
		return NULL;
	return ssl_trace_str(c->id & 0xFFFF, ssl_ciphers_tbl);
	}

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;

	if (write_p == 2)
		{
		BIO_puts(bio, "Session ");
		ssl_print_hex(bio, 0,
				ssl_trace_str(content_type, ssl_crypto_tbl),
				msg, msglen);
		return;
		}
	switch (content_type)
		{
	case SSL3_RT_HEADER:
		{
		int hvers = msg[1] << 8 | msg[2];
		BIO_puts(bio, write_p ? "Sent" : "Received");
		BIO_printf(bio, " Record\nHeader:\n  Version = %s (0x%x)\n",
				ssl_trace_str(hvers, ssl_version_tbl), hvers);
		if (SSL_IS_DTLS(ssl))
			{
			BIO_printf(bio,
				"  epoch=%d, sequence_number=%04x%04x%04x\n",
					(msg[3] << 8 | msg[4]),
					(msg[5] << 8 | msg[6]),
					(msg[7] << 8 | msg[8]),
					(msg[9] << 8 | msg[10]));
#if 0
			/* Just print handshake type so we can see what is
			 * going on during fragmentation.
			 */
			BIO_printf(bio, "(%s)\n",
				ssl_trace_str(msg[msglen], ssl_handshake_tbl));
#endif
			}

		BIO_printf(bio, "  Content Type = %s (%d)\n  Length = %d",
				ssl_trace_str(msg[0], ssl_content_tbl), msg[0],
				msg[msglen - 2] << 8 | msg[msglen - 1]);
		}
		break;
	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
