Merge pull request #2809 from hanno-arm/nss_keylog-dev
Add support for NSS key log export to ssl_client2/ssl_server2 for Wireshark debugging
This commit is contained in:
commit
37600837d3
2 changed files with 227 additions and 0 deletions
|
@ -135,6 +135,8 @@ int main( void )
|
||||||
#define DFL_CA_CALLBACK 0
|
#define DFL_CA_CALLBACK 0
|
||||||
#define DFL_EAP_TLS 0
|
#define DFL_EAP_TLS 0
|
||||||
#define DFL_REPRODUCIBLE 0
|
#define DFL_REPRODUCIBLE 0
|
||||||
|
#define DFL_NSS_KEYLOG 0
|
||||||
|
#define DFL_NSS_KEYLOG_FILE NULL
|
||||||
|
|
||||||
#define GET_REQUEST "GET %s HTTP/1.0\r\nExtra-header: "
|
#define GET_REQUEST "GET %s HTTP/1.0\r\nExtra-header: "
|
||||||
#define GET_REQUEST_END "\r\n\r\n"
|
#define GET_REQUEST_END "\r\n\r\n"
|
||||||
|
@ -231,8 +233,15 @@ int main( void )
|
||||||
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
#define USAGE_EAP_TLS \
|
#define USAGE_EAP_TLS \
|
||||||
" eap_tls=%%d default: 0 (disabled)\n"
|
" eap_tls=%%d default: 0 (disabled)\n"
|
||||||
|
#define USAGE_NSS_KEYLOG \
|
||||||
|
" nss_keylog=%%d default: 0 (disabled)\n" \
|
||||||
|
" This cannot be used with eap_tls=1\n"
|
||||||
|
#define USAGE_NSS_KEYLOG_FILE \
|
||||||
|
" nss_keylog_file=%%s\n"
|
||||||
#else
|
#else
|
||||||
#define USAGE_EAP_TLS ""
|
#define USAGE_EAP_TLS ""
|
||||||
|
#define USAGE_NSS_KEYLOG ""
|
||||||
|
#define USAGE_NSS_KEYLOG_FILE ""
|
||||||
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
|
#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)
|
||||||
|
@ -489,6 +498,8 @@ struct options
|
||||||
int etm; /* negotiate encrypt then mac? */
|
int etm; /* negotiate encrypt then mac? */
|
||||||
int context_crt_cb; /* use context-specific CRT verify callback */
|
int context_crt_cb; /* use context-specific CRT verify callback */
|
||||||
int eap_tls; /* derive EAP-TLS keying material? */
|
int eap_tls; /* derive EAP-TLS keying material? */
|
||||||
|
int nss_keylog; /* export NSS key log material */
|
||||||
|
const char *nss_keylog_file; /* NSS key log file */
|
||||||
int cid_enabled; /* whether to use the CID extension or not */
|
int cid_enabled; /* whether to use the CID extension or not */
|
||||||
int cid_enabled_renego; /* whether to use the CID extension or not
|
int cid_enabled_renego; /* whether to use the CID extension or not
|
||||||
* during renegotiation */
|
* during renegotiation */
|
||||||
|
@ -535,6 +546,81 @@ static int eap_tls_key_derivation ( void *p_expkey,
|
||||||
}
|
}
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nss_keylog_export( void *p_expkey,
|
||||||
|
const unsigned char *ms,
|
||||||
|
const unsigned char *kb,
|
||||||
|
size_t maclen,
|
||||||
|
size_t keylen,
|
||||||
|
size_t ivlen,
|
||||||
|
unsigned char client_random[32],
|
||||||
|
unsigned char server_random[32],
|
||||||
|
mbedtls_tls_prf_types tls_prf_type )
|
||||||
|
{
|
||||||
|
char nss_keylog_line[ 200 ];
|
||||||
|
size_t const client_random_len = 32;
|
||||||
|
size_t const master_secret_len = 48;
|
||||||
|
size_t len = 0;
|
||||||
|
size_t j;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
((void) p_expkey);
|
||||||
|
((void) kb);
|
||||||
|
((void) maclen);
|
||||||
|
((void) keylen);
|
||||||
|
((void) ivlen);
|
||||||
|
((void) server_random);
|
||||||
|
((void) tls_prf_type);
|
||||||
|
|
||||||
|
len += sprintf( nss_keylog_line + len,
|
||||||
|
"%s", "CLIENT_RANDOM " );
|
||||||
|
|
||||||
|
for( j = 0; j < client_random_len; j++ )
|
||||||
|
{
|
||||||
|
len += sprintf( nss_keylog_line + len,
|
||||||
|
"%02x", client_random[j] );
|
||||||
|
}
|
||||||
|
|
||||||
|
len += sprintf( nss_keylog_line + len, " " );
|
||||||
|
|
||||||
|
for( j = 0; j < master_secret_len; j++ )
|
||||||
|
{
|
||||||
|
len += sprintf( nss_keylog_line + len,
|
||||||
|
"%02x", ms[j] );
|
||||||
|
}
|
||||||
|
|
||||||
|
len += sprintf( nss_keylog_line + len, "\n" );
|
||||||
|
nss_keylog_line[ len ] = '\0';
|
||||||
|
|
||||||
|
mbedtls_printf( "\n" );
|
||||||
|
mbedtls_printf( "---------------- NSS KEYLOG -----------------\n" );
|
||||||
|
mbedtls_printf( "%s", nss_keylog_line );
|
||||||
|
mbedtls_printf( "---------------------------------------------\n" );
|
||||||
|
|
||||||
|
if( opt.nss_keylog_file != NULL )
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
if( ( f = fopen( opt.nss_keylog_file, "a" ) ) == NULL )
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fwrite( nss_keylog_line, 1, len, f ) != len )
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mbedtls_platform_zeroize( nss_keylog_line,
|
||||||
|
sizeof( nss_keylog_line ) );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void my_debug( void *ctx, int level,
|
static void my_debug( void *ctx, int level,
|
||||||
|
@ -1204,6 +1290,8 @@ int main( int argc, char *argv[] )
|
||||||
opt.serialize = DFL_SERIALIZE;
|
opt.serialize = DFL_SERIALIZE;
|
||||||
opt.eap_tls = DFL_EAP_TLS;
|
opt.eap_tls = DFL_EAP_TLS;
|
||||||
opt.reproducible = DFL_REPRODUCIBLE;
|
opt.reproducible = DFL_REPRODUCIBLE;
|
||||||
|
opt.nss_keylog = DFL_NSS_KEYLOG;
|
||||||
|
opt.nss_keylog_file = DFL_NSS_KEYLOG_FILE;
|
||||||
|
|
||||||
for( i = 1; i < argc; i++ )
|
for( i = 1; i < argc; i++ )
|
||||||
{
|
{
|
||||||
|
@ -1606,10 +1694,26 @@ int main( int argc, char *argv[] )
|
||||||
{
|
{
|
||||||
opt.reproducible = 1;
|
opt.reproducible = 1;
|
||||||
}
|
}
|
||||||
|
else if( strcmp( p, "nss_keylog" ) == 0 )
|
||||||
|
{
|
||||||
|
opt.nss_keylog = atoi( q );
|
||||||
|
if( opt.nss_keylog < 0 || opt.nss_keylog > 1 )
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
else if( strcmp( p, "nss_keylog_file" ) == 0 )
|
||||||
|
{
|
||||||
|
opt.nss_keylog_file = q;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
goto usage;
|
goto usage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( opt.nss_keylog != 0 && opt.eap_tls != 0 )
|
||||||
|
{
|
||||||
|
mbedtls_printf( "Error: eap_tls and nss_keylog options cannot be used together.\n" );
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
|
||||||
/* Event-driven IO is incompatible with the above custom
|
/* Event-driven IO is incompatible with the above custom
|
||||||
* receive and send functions, as the polling builds on
|
* receive and send functions, as the polling builds on
|
||||||
* refers to the underlying net_context. */
|
* refers to the underlying net_context. */
|
||||||
|
@ -2145,8 +2249,16 @@ int main( int argc, char *argv[] )
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
if( opt.eap_tls != 0 )
|
if( opt.eap_tls != 0 )
|
||||||
|
{
|
||||||
mbedtls_ssl_conf_export_keys_ext_cb( &conf, eap_tls_key_derivation,
|
mbedtls_ssl_conf_export_keys_ext_cb( &conf, eap_tls_key_derivation,
|
||||||
&eap_tls_keying );
|
&eap_tls_keying );
|
||||||
|
}
|
||||||
|
else if( opt.nss_keylog != 0 )
|
||||||
|
{
|
||||||
|
mbedtls_ssl_conf_export_keys_ext_cb( &conf,
|
||||||
|
nss_keylog_export,
|
||||||
|
NULL );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
|
#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)
|
||||||
|
|
|
@ -176,6 +176,8 @@ int main( void )
|
||||||
#define DFL_CA_CALLBACK 0
|
#define DFL_CA_CALLBACK 0
|
||||||
#define DFL_EAP_TLS 0
|
#define DFL_EAP_TLS 0
|
||||||
#define DFL_REPRODUCIBLE 0
|
#define DFL_REPRODUCIBLE 0
|
||||||
|
#define DFL_NSS_KEYLOG 0
|
||||||
|
#define DFL_NSS_KEYLOG_FILE NULL
|
||||||
|
|
||||||
#define LONG_RESPONSE "<p>01-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
|
#define LONG_RESPONSE "<p>01-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
|
||||||
"02-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
|
"02-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\r\n" \
|
||||||
|
@ -308,8 +310,15 @@ int main( void )
|
||||||
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
#define USAGE_EAP_TLS \
|
#define USAGE_EAP_TLS \
|
||||||
" eap_tls=%%d default: 0 (disabled)\n"
|
" eap_tls=%%d default: 0 (disabled)\n"
|
||||||
|
#define USAGE_NSS_KEYLOG \
|
||||||
|
" nss_keylog=%%d default: 0 (disabled)\n" \
|
||||||
|
" This cannot be used with eap_tls=1\n"
|
||||||
|
#define USAGE_NSS_KEYLOG_FILE \
|
||||||
|
" nss_keylog_file=%%s\n"
|
||||||
#else
|
#else
|
||||||
#define USAGE_EAP_TLS ""
|
#define USAGE_EAP_TLS ""
|
||||||
|
#define USAGE_NSS_KEYLOG ""
|
||||||
|
#define USAGE_NSS_KEYLOG_FILE ""
|
||||||
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
#endif /* MBEDTLS_SSL_EXPORT_KEYS */
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_CACHE_C)
|
#if defined(MBEDTLS_SSL_CACHE_C)
|
||||||
|
@ -487,6 +496,8 @@ int main( void )
|
||||||
USAGE_TICKETS \
|
USAGE_TICKETS \
|
||||||
USAGE_EAP_TLS \
|
USAGE_EAP_TLS \
|
||||||
USAGE_REPRODUCIBLE \
|
USAGE_REPRODUCIBLE \
|
||||||
|
USAGE_NSS_KEYLOG \
|
||||||
|
USAGE_NSS_KEYLOG_FILE \
|
||||||
USAGE_CACHE \
|
USAGE_CACHE \
|
||||||
USAGE_MAX_FRAG_LEN \
|
USAGE_MAX_FRAG_LEN \
|
||||||
USAGE_TRUNC_HMAC \
|
USAGE_TRUNC_HMAC \
|
||||||
|
@ -598,6 +609,8 @@ struct options
|
||||||
int dgram_packing; /* allow/forbid datagram packing */
|
int dgram_packing; /* allow/forbid datagram packing */
|
||||||
int badmac_limit; /* Limit of records with bad MAC */
|
int badmac_limit; /* Limit of records with bad MAC */
|
||||||
int eap_tls; /* derive EAP-TLS keying material? */
|
int eap_tls; /* derive EAP-TLS keying material? */
|
||||||
|
int nss_keylog; /* export NSS key log material */
|
||||||
|
const char *nss_keylog_file; /* NSS key log file */
|
||||||
int cid_enabled; /* whether to use the CID extension or not */
|
int cid_enabled; /* whether to use the CID extension or not */
|
||||||
int cid_enabled_renego; /* whether to use the CID extension or not
|
int cid_enabled_renego; /* whether to use the CID extension or not
|
||||||
* during renegotiation */
|
* during renegotiation */
|
||||||
|
@ -644,6 +657,82 @@ static int eap_tls_key_derivation ( void *p_expkey,
|
||||||
}
|
}
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nss_keylog_export( void *p_expkey,
|
||||||
|
const unsigned char *ms,
|
||||||
|
const unsigned char *kb,
|
||||||
|
size_t maclen,
|
||||||
|
size_t keylen,
|
||||||
|
size_t ivlen,
|
||||||
|
unsigned char client_random[32],
|
||||||
|
unsigned char server_random[32],
|
||||||
|
mbedtls_tls_prf_types tls_prf_type )
|
||||||
|
{
|
||||||
|
char nss_keylog_line[ 200 ];
|
||||||
|
size_t const client_random_len = 32;
|
||||||
|
size_t const master_secret_len = 48;
|
||||||
|
size_t len = 0;
|
||||||
|
size_t j;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
((void) p_expkey);
|
||||||
|
((void) kb);
|
||||||
|
((void) maclen);
|
||||||
|
((void) keylen);
|
||||||
|
((void) ivlen);
|
||||||
|
((void) server_random);
|
||||||
|
((void) tls_prf_type);
|
||||||
|
|
||||||
|
len += sprintf( nss_keylog_line + len,
|
||||||
|
"%s", "CLIENT_RANDOM " );
|
||||||
|
|
||||||
|
for( j = 0; j < client_random_len; j++ )
|
||||||
|
{
|
||||||
|
len += sprintf( nss_keylog_line + len,
|
||||||
|
"%02x", client_random[j] );
|
||||||
|
}
|
||||||
|
|
||||||
|
len += sprintf( nss_keylog_line + len, " " );
|
||||||
|
|
||||||
|
for( j = 0; j < master_secret_len; j++ )
|
||||||
|
{
|
||||||
|
len += sprintf( nss_keylog_line + len,
|
||||||
|
"%02x", ms[j] );
|
||||||
|
}
|
||||||
|
|
||||||
|
len += sprintf( nss_keylog_line + len, "\n" );
|
||||||
|
nss_keylog_line[ len ] = '\0';
|
||||||
|
|
||||||
|
mbedtls_printf( "\n" );
|
||||||
|
mbedtls_printf( "---------------- NSS KEYLOG -----------------\n" );
|
||||||
|
mbedtls_printf( "%s", nss_keylog_line );
|
||||||
|
mbedtls_printf( "---------------------------------------------\n" );
|
||||||
|
|
||||||
|
if( opt.nss_keylog_file != NULL )
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
if( ( f = fopen( opt.nss_keylog_file, "a" ) ) == NULL )
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( fwrite( nss_keylog_line, 1, len, f ) != len )
|
||||||
|
{
|
||||||
|
ret = -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose( f );
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mbedtls_platform_zeroize( nss_keylog_line,
|
||||||
|
sizeof( nss_keylog_line ) );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void my_debug( void *ctx, int level,
|
static void my_debug( void *ctx, int level,
|
||||||
|
@ -1892,6 +1981,8 @@ int main( int argc, char *argv[] )
|
||||||
opt.serialize = DFL_SERIALIZE;
|
opt.serialize = DFL_SERIALIZE;
|
||||||
opt.eap_tls = DFL_EAP_TLS;
|
opt.eap_tls = DFL_EAP_TLS;
|
||||||
opt.reproducible = DFL_REPRODUCIBLE;
|
opt.reproducible = DFL_REPRODUCIBLE;
|
||||||
|
opt.nss_keylog = DFL_NSS_KEYLOG;
|
||||||
|
opt.nss_keylog_file = DFL_NSS_KEYLOG_FILE;
|
||||||
|
|
||||||
for( i = 1; i < argc; i++ )
|
for( i = 1; i < argc; i++ )
|
||||||
{
|
{
|
||||||
|
@ -2320,10 +2411,26 @@ int main( int argc, char *argv[] )
|
||||||
{
|
{
|
||||||
opt.reproducible = 1;
|
opt.reproducible = 1;
|
||||||
}
|
}
|
||||||
|
else if( strcmp( p, "nss_keylog" ) == 0 )
|
||||||
|
{
|
||||||
|
opt.nss_keylog = atoi( q );
|
||||||
|
if( opt.nss_keylog < 0 || opt.nss_keylog > 1 )
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
else if( strcmp( p, "nss_keylog_file" ) == 0 )
|
||||||
|
{
|
||||||
|
opt.nss_keylog_file = q;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
goto usage;
|
goto usage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( opt.nss_keylog != 0 && opt.eap_tls != 0 )
|
||||||
|
{
|
||||||
|
mbedtls_printf( "Error: eap_tls and nss_keylog options cannot be used together.\n" );
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
|
||||||
/* Event-driven IO is incompatible with the above custom
|
/* Event-driven IO is incompatible with the above custom
|
||||||
* receive and send functions, as the polling builds on
|
* receive and send functions, as the polling builds on
|
||||||
* refers to the underlying net_context. */
|
* refers to the underlying net_context. */
|
||||||
|
@ -2960,8 +3067,16 @@ int main( int argc, char *argv[] )
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
#if defined(MBEDTLS_SSL_EXPORT_KEYS)
|
||||||
if( opt.eap_tls != 0 )
|
if( opt.eap_tls != 0 )
|
||||||
|
{
|
||||||
mbedtls_ssl_conf_export_keys_ext_cb( &conf, eap_tls_key_derivation,
|
mbedtls_ssl_conf_export_keys_ext_cb( &conf, eap_tls_key_derivation,
|
||||||
&eap_tls_keying );
|
&eap_tls_keying );
|
||||||
|
}
|
||||||
|
else if( opt.nss_keylog != 0 )
|
||||||
|
{
|
||||||
|
mbedtls_ssl_conf_export_keys_ext_cb( &conf,
|
||||||
|
nss_keylog_export,
|
||||||
|
NULL );
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_ALPN)
|
#if defined(MBEDTLS_SSL_ALPN)
|
||||||
|
|
Loading…
Reference in a new issue