Ethereal-dev: [Ethereal-dev] [PATCH] ssl decrypt debug code
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Paolo Abeni <paolo.abeni@xxxxxxxx>
Date: Thu, 09 Feb 2006 10:58:40 +0100
Hi all, I worked a bit trying to handling better the debug messages generated by the ssl decrypt code. The attached patch add a preference to disable/enable to stderr/file the debug messages. The whole debug infrastructure can be disabled at compile time undefining the macro SSL_DECRYPT_DEBUG. I find it very useful to get detailed information on the ongoing decryption process, to track subtle key-related issue, but I don't know if this is the preferred way to fix the thing, so any suggestion is really appreciated :-) Best Regards, Paolo -- Email.it, the professional e-mail, gratis per te: http://www.email.it/f Sponsor: Prestiti e Finanziamenti con un semplice click, scopri subito se sei finanziabile cliccando qui Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=2910&d=9-2
Index: gtk/ssl-dlg.c
===================================================================
--- gtk/ssl-dlg.c (revision 17224)
+++ gtk/ssl-dlg.c (working copy)
@@ -141,8 +141,6 @@
SslDecryptedRecord* rec;
int proto_ssl = (int) ssl;
StringInfo* data = p_get_proto_data(pinfo->fd, proto_ssl);
- /*ssl_debug_printf("ssl_queue_packet_data: pinfo %p proto_ssl %d data %p\n",
- pinfo, proto_ssl, data);*/
/* skip packet without decrypted data payload*/
if (!data)
@@ -169,8 +167,6 @@
rec->data = data;
follow_info->ssl_decrypted_data = g_list_append(
follow_info->ssl_decrypted_data,rec);
- /*ssl_debug_printf("ssl_queue_packet_data: ssl_decrypted_data %p data len %d\n",
- follow_info->ssl_decrypted_data, data->data_len);*/
return 0;
}
@@ -482,7 +478,6 @@
for (cur = follow_info->ssl_decrypted_data; cur; cur = g_list_next(cur))
if (cur->data)
{
- /*ssl_debug_printf("follow_destroy_cb: freeing chunk %p\n", cur->data);*/
g_free(cur->data);
cur->data = NULL;
}
@@ -588,9 +583,6 @@
iplen = (follow_info->is_ipv6) ? 16 : 4;
- /*ssl_debug_printf("follow_read_stream: iplen %d list %p\n", iplen,
- follow_info->ssl_decrypted_data);*/
-
for (cur = follow_info->ssl_decrypted_data; cur; cur = g_list_next(cur)) {
SslDecryptedRecord* rec = cur->data;
skip = FALSE;
@@ -611,9 +603,6 @@
size_t nchars = rec->data->data_len;
char* buffer = (char*) rec->data->data;
- /*ssl_debug_printf("follow_read_stream: chunk len %d is_server %d\n",
- nchars, rec->is_server);*/
-
switch (follow_info->show_type) {
case SHOW_ASCII:
Index: epan/dissectors/packet-ssl-utils.c
===================================================================
--- epan/dissectors/packet-ssl-utils.c (revision 17224)
+++ epan/dissectors/packet-ssl-utils.c (working copy)
@@ -201,8 +201,9 @@
/* build up a mpi rappresentation for encrypted data */
rc = gcry_mpi_scan(&encr_mpi, GCRYMPI_FMT_USG,encr_data, encr_len, &encr_len);
if (rc != 0 ) {
- ssl_debug_printf("pcry_private_decrypt: can't convert encr_data to mpi (size %d):%s\n",
- len, gcry_strerror(rc));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: can't convert encr_data to mpi (size %d):%s\n",
+ len, gcry_strerror(rc));
return 0;
}
@@ -210,8 +211,9 @@
/* put the data into a simple list */
rc = gcry_sexp_build(&s_data, NULL, "(enc-val(rsa(a%m)))", encr_mpi);
if (rc != 0) {
- ssl_debug_printf("pcry_private_decrypt: can't build encr_sexp:%s \n",
- gcry_strerror(rc));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: can't build encr_sexp:%s \n",
+ gcry_strerror(rc));
return 0;
}
@@ -220,8 +222,9 @@
gcry_sexp_release(s_data);
if (rc != 0)
{
- ssl_debug_printf("pcry_private_decrypt: can't decrypt key:%s\n",
- gcry_strerror(rc));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: can't decrypt key:%s\n",
+ gcry_strerror(rc));
goto out;
}
@@ -231,16 +234,18 @@
/* compute size requested for plaintext buffer */
decr_len = len;
if (gcry_mpi_print(GCRYMPI_FMT_USG, NULL, decr_len, &decr_len, text) != 0) {
- ssl_debug_printf("pcry_private_decrypt: can't compute decr size:%s\n",
- gcry_strerror(rc));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: can't compute decr size:%s\n",
+ gcry_strerror(rc));
decr_len = 0;
goto out;
}
/* sanity check on out buffer */
if (decr_len > len) {
- ssl_debug_printf("pcry_private_decrypt: decrypted data is too long ?!? (%d max %d)\n",
- decr_len, len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: decrypted data is too long ?!? (%d max %d)\n",
+ decr_len, len);
return 0;
}
@@ -248,8 +253,9 @@
decr_data_ptr = encr_data;
if (gcry_mpi_print( GCRYMPI_FMT_USG, decr_data_ptr, decr_len, &decr_len,
text) != 0) {
- ssl_debug_printf("pcry_private_decrypt: can't print decr data to mpi (size %d):%s\n",
- decr_len, gcry_strerror(rc));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: can't print decr data to mpi (size %d):%s\n",
+ decr_len, gcry_strerror(rc));
g_free(decr_data_ptr);
decr_len = 0;
goto out;
@@ -264,9 +270,12 @@
}
}
- ssl_debug_printf("pcry_private_decrypt: stripping %d bytes, decr_len %d\n",
- rc, decr_len);
- ssl_print_data("decypted_unstrip_pre_master", decr_data_ptr, decr_len);
+ if (ssl_debug_enabled())
+ {
+ ssl_debug_printf("pcry_private_decrypt: stripping %d bytes, decr_len %d\n",
+ rc, decr_len);
+ ssl_print_data("decypted_unstrip_pre_master", decr_data_ptr, decr_len);
+ }
g_memmove(decr_data_ptr, &decr_data_ptr[rc], decr_len - rc);
decr_len -= rc;
@@ -278,8 +287,9 @@
/* sanity check on out buffer */
if (decr_len > len) {
- ssl_debug_printf("pcry_private_decrypt: decrypted data is too long ?!? (%d max %d)\n",
- decr_len, len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: decrypted data is too long ?!? (%d max %d)\n",
+ decr_len, len);
return 0;
}
@@ -287,8 +297,9 @@
decr_data_ptr = encr_data;
if (gcry_mpi_print( GCRYMPI_FMT_USG, decr_data_ptr, decr_len, &decr_len,
text) != 0) {
- ssl_debug_printf("pcry_private_decrypt: can't print decr data to mpi (size %d):%s\n",
- decr_len, gcry_strerror(rc));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("pcry_private_decrypt: can't print decr data to mpi (size %d):%s\n",
+ decr_len, gcry_strerror(rc));
return 0;
}
@@ -301,9 +312,12 @@
}
}
- ssl_debug_printf("pcry_private_decrypt: stripping %d bytes, decr_len %d\n",
- rc, decr_len);
- ssl_print_data("decypted_unstrip_pre_master", decr_data_ptr, decr_len);
+ if (ssl_debug_enabled())
+ {
+ ssl_debug_printf("pcry_private_decrypt: stripping %d bytes, decr_len %d\n",
+ rc, decr_len);
+ ssl_print_data("decypted_unstrip_pre_master", decr_data_ptr, decr_len);
+ }
g_memmove(decr_data_ptr, &decr_data_ptr[rc], decr_len - rc);
decr_len -= rc;
#endif /* SSL_FAST */
@@ -413,8 +427,11 @@
SSL_HMAC hm;
memset(&hm, 0, sizeof(hm));
- ssl_print_string("tls_hash: hash secret", secret);
- ssl_print_string("tls_hash: hash seed", seed);
+ if (ssl_debug_enabled())
+ {
+ ssl_print_string("tls_hash: hash secret", secret);
+ ssl_print_string("tls_hash: hash seed", seed);
+ }
A=seed->data;
A_l=seed->data_len;
@@ -436,7 +453,8 @@
}
ssl_hmac_cleanup(&hm);
- ssl_print_string("hash out", out);
+ if (ssl_debug_enabled())
+ ssl_print_string("hash out", out);
return (0);
}
@@ -473,10 +491,13 @@
memcpy(s1.data,secret->data,s_l);
memcpy(s2.data,secret->data + (secret->data_len - s_l),s_l);
- ssl_debug_printf("tls_prf: tls_hash(md5 secret_len %d seed_len %d )\n", s1.data_len, seed.data_len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("tls_prf: tls_hash(md5 secret_len %d seed_len %d )\n",
+ s1.data_len, seed.data_len);
if(tls_hash(&s1,&seed,ssl_get_digest_by_name("MD5"),&md5_out) != 0)
goto free_all;
- ssl_debug_printf("tls_prf: tls_hash(sha)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("tls_prf: tls_hash(sha)\n");
if(tls_hash(&s2,&seed,ssl_get_digest_by_name("SHA1"),&sha_out) != 0)
goto free_all;
@@ -484,7 +505,8 @@
out->data[i]=md5_out.data[i] ^ sha_out.data[i];
r =0;
- ssl_print_string("PRF out",out);
+ if (ssl_debug_enabled())
+ ssl_print_string("PRF out",out);
free_all:
free(s2.data);
free_s1:
@@ -511,7 +533,8 @@
ssl_md5_final(tmp,&md5);
memcpy(out->data,tmp,out->data_len);
- ssl_print_string("export iv", out);
+ if (ssl_debug_enabled())
+ ssl_print_string("export iv", out);
return(0);
}
@@ -539,7 +562,8 @@
int tocpy;
i++;
- ssl_debug_printf("ssl3_prf: sha1_update(%d)\n",i);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl3_prf: sha1_update(%d)\n",i);
/* A, BB, CCC, ... */
for(j=0;j<i;j++){
buf[j]=64+i;
@@ -562,7 +586,8 @@
ssl_sha_init(&sha);
- ssl_debug_printf("ssl3_prf: md5_update(%d)\n",i);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl3_prf: md5_update(%d)\n",i);
ssl_md5_update(&md5,secret->data,secret->data_len);
ssl_md5_update(&md5,buf,20);
ssl_md5_final(outbuf,&md5);
@@ -583,12 +608,15 @@
/* Find the SSLeay cipher */
if(cipher_suite->enc!=ENC_NULL) {
- ssl_debug_printf("ssl_create_decoder CIPHER: %s\n", ciphers[cipher_suite->enc-0x30]);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_create_decoder CIPHER: %s\n",
+ ciphers[cipher_suite->enc-0x30]);
ciph=ssl_get_cipher_by_name(ciphers[cipher_suite->enc-0x30]);
}
if (ciph == 0) {
- ssl_debug_printf("ssl_create_decoder can't find cipher %s\n",
- ciphers[cipher_suite->enc-0x30]);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_create_decoder can't find cipher %s\n",
+ ciphers[cipher_suite->enc-0x30]);
return -1;
}
@@ -599,12 +627,14 @@
ssl_data_set(&dec->mac_key, mk, cipher_suite->dig_len);
if (ssl_cipher_init(&dec->evp,ciph,sk,iv,cipher_suite->mode) < 0) {
- ssl_debug_printf("ssl_create_decoder: can't create cipher id:%d mode:%d\n",
- ciph, cipher_suite->mode);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_create_decoder: can't create cipher id:%d mode:%d\n",
+ ciph, cipher_suite->mode);
return -1;
}
- ssl_debug_printf("decoder initialized (digest len %d)\n", cipher_suite->dig_len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decoder initialized (digest len %d)\n", cipher_suite->dig_len);
return 0;
}
@@ -619,14 +649,17 @@
/* if master_key is not yet generate, create it now*/
if (!(ssl_session->state & SSL_MASTER_SECRET)) {
- ssl_debug_printf("ssl_generate_keyring_material:PRF(pre_master_secret)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material:PRF(pre_master_secret)\n");
if (PRF(ssl_session,&ssl_session->pre_master_secret,"master secret",
&ssl_session->client_random,
&ssl_session->server_random, &ssl_session->master_secret)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate master_secret\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate master_secret\n");
return -1;
}
- ssl_print_string("master secret",&ssl_session->master_secret);
+ if (ssl_debug_enabled())
+ ssl_print_string("master secret",&ssl_session->master_secret);
}
/* Compute the key block. First figure out how much data we need*/
@@ -638,17 +671,21 @@
key_block.data_len = needed;
key_block.data = g_malloc(needed);
if (!key_block.data) {
- ssl_debug_printf("ssl_generate_keyring_material can't allacate key_block\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't allacate key_block\n");
return -1;
}
- ssl_debug_printf("ssl_generate_keyring_material sess key generation\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material sess key generation\n");
if (PRF(ssl_session,&ssl_session->master_secret,"key expansion",
&ssl_session->server_random,&ssl_session->client_random,
&key_block)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate key_block\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate key_block\n");
goto fail;
}
- ssl_print_string("key expansion", &key_block);
+ if (ssl_debug_enabled())
+ ssl_print_string("key expansion", &key_block);
ptr=key_block.data;
c_mk=ptr; ptr+=ssl_session->cipher_suite.dig_len;
@@ -672,8 +709,10 @@
/* We only have room for MAX_BLOCK_SIZE bytes IVs, but that's
all we should need. This is a sanity check */
if(ssl_session->cipher_suite.block>MAX_BLOCK_SIZE) {
- ssl_debug_printf("ssl_generate_keyring_material cipher suite block must be at most %d nut is %d\n",
- MAX_BLOCK_SIZE, ssl_session->cipher_suite.block);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material cipher "
+ "suite block must be at most %d nut is %d\n",
+ MAX_BLOCK_SIZE, ssl_session->cipher_suite.block);
goto fail;
}
@@ -683,16 +722,20 @@
iv_s.data_len = ssl_session->cipher_suite.block;
if(ssl_session->version_netorder==SSLV3_VERSION){
- ssl_debug_printf("ssl_generate_keyring_material ssl3_generate_export_iv\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material ssl3_generate_export_iv\n");
if (ssl3_generate_export_iv(&ssl_session->client_random,
&ssl_session->server_random,&iv_c)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate sslv3 client iv\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate sslv3 client iv\n");
goto fail;
}
- ssl_debug_printf("ssl_generate_keyring_material ssl3_generate_export_iv(2)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material ssl3_generate_export_iv(2)\n");
if (ssl3_generate_export_iv(&ssl_session->server_random,
&ssl_session->client_random,&iv_s)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate sslv3 server iv\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate sslv3 server iv\n");
goto fail;
}
}
@@ -708,11 +751,13 @@
iv_block.data = _iv_block;
iv_block.data_len = ssl_session->cipher_suite.block*2;
- ssl_debug_printf("ssl_generate_keyring_material prf(iv_block)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material prf(iv_block)\n");
if(PRF(ssl_session,&key_null, "IV block",
&ssl_session->client_random,
&ssl_session->server_random,&iv_block)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate tls31 iv block\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate tls31 iv block\n");
goto fail;
}
@@ -728,7 +773,8 @@
if (ssl_session->version_netorder==SSLV3_VERSION){
SSL_MD5_CTX md5;
- ssl_debug_printf("ssl_generate_keyring_material MD5(client_random)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material MD5(client_random)\n");
ssl_md5_init(&md5);
ssl_md5_update(&md5,c_wk,ssl_session->cipher_suite.eff_bits/8);
ssl_md5_update(&md5,ssl_session->client_random.data,
@@ -739,7 +785,8 @@
c_wk=_key_c;
ssl_md5_init(&md5);
- ssl_debug_printf("ssl_generate_keyring_material MD5(server_random)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material MD5(server_random)\n");
ssl_md5_update(&md5,s_wk,ssl_session->cipher_suite.eff_bits/8);
ssl_md5_update(&md5,ssl_session->server_random.data,
ssl_session->server_random.data_len);
@@ -756,22 +803,26 @@
k.data = c_wk;
k.data_len = ssl_session->cipher_suite.eff_bits/8;
- ssl_debug_printf("ssl_generate_keyring_material PRF(key_c)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material PRF(key_c)\n");
if (PRF(ssl_session,&k,"client write key",
&ssl_session->client_random,
&ssl_session->server_random, &key_c)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate tll31 server key \n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate tll31 server key \n");
goto fail;
}
c_wk=_key_c;
k.data = s_wk;
k.data_len = ssl_session->cipher_suite.eff_bits/8;
- ssl_debug_printf("ssl_generate_keyring_material PRF(key_s)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material PRF(key_s)\n");
if(PRF(ssl_session,&k,"server write key",
&ssl_session->client_random,
&ssl_session->server_random, &key_s)) {
- ssl_debug_printf("ssl_generate_keyring_material can't generate tll31 client key \n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't generate tll31 client key \n");
goto fail;
}
s_wk=_key_s;
@@ -779,31 +830,37 @@
}
/* show key material info */
- ssl_print_data("Client MAC key",c_mk,ssl_session->cipher_suite.dig_len);
- ssl_print_data("Server MAC key",s_mk,ssl_session->cipher_suite.dig_len);
- ssl_print_data("Client Write key",c_wk,ssl_session->cipher_suite.bits/8);
- ssl_print_data("Server Write key",s_wk,ssl_session->cipher_suite.bits/8);
-
- if(ssl_session->cipher_suite.block>1) {
- ssl_print_data("Client Write IV",c_iv,ssl_session->cipher_suite.block);
- ssl_print_data("Server Write IV",s_iv,ssl_session->cipher_suite.block);
+ if (ssl_debug_enabled())
+ {
+ ssl_print_data("Client MAC key",c_mk,ssl_session->cipher_suite.dig_len);
+ ssl_print_data("Server MAC key",s_mk,ssl_session->cipher_suite.dig_len);
+ ssl_print_data("Client Write key",c_wk,ssl_session->cipher_suite.bits/8);
+ ssl_print_data("Server Write key",s_wk,ssl_session->cipher_suite.bits/8);
+ if(ssl_session->cipher_suite.block>1) {
+ ssl_print_data("Client Write IV",c_iv,ssl_session->cipher_suite.block);
+ ssl_print_data("Server Write IV",s_iv,ssl_session->cipher_suite.block);
+ }
+ else {
+ ssl_print_data("Client Write IV",c_iv,8);
+ ssl_print_data("Server Write IV",s_iv,8);
+ }
+ ssl_debug_printf("ssl_generate_keyring_material ssl_create_decoder(client)\n");
}
- else {
- ssl_print_data("Client Write IV",c_iv,8);
- ssl_print_data("Server Write IV",s_iv,8);
- }
+
/* create both client and server ciphers*/
- ssl_debug_printf("ssl_generate_keyring_material ssl_create_decoder(client)\n");
if (ssl_create_decoder(&ssl_session->client,
&ssl_session->cipher_suite,c_mk,c_wk,c_iv)) {
- ssl_debug_printf("ssl_generate_keyring_material can't init client decoder\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't init client decoder\n");
goto fail;
}
- ssl_debug_printf("ssl_generate_keyring_material ssl_create_decoder(server)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material ssl_create_decoder(server)\n");
if (ssl_create_decoder(&ssl_session->server,
&ssl_session->cipher_suite,s_mk,s_wk,s_iv)) {
- ssl_debug_printf("ssl_generate_keyring_material can't init client decoder\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material can't init client decoder\n");
goto fail;
}
@@ -822,35 +879,42 @@
int i;
if(ssl_session->cipher_suite.kex!=KEX_RSA) {
- ssl_debug_printf("ssl_decrypt_pre_master_secret key %d diferent from KEX_RSA(%d)\n",
- ssl_session->cipher_suite.kex, KEX_RSA);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_pre_master_secret key %d diferent from KEX_RSA(%d)\n",
+ ssl_session->cipher_suite.kex, KEX_RSA);
return(-1);
}
#if 0
/* can't find any place where ephemeral_rsa is set ...*/
if(d->ephemeral_rsa) {
- ssl_debug_printf("ssl_decrypt_pre_master_secret ephimeral RSA\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_pre_master_secret ephimeral RSA\n");
return(-1);
}
#endif
/* with tls key loading will fail if not rsa type, so no need to check*/
- ssl_print_string("pre master encrypted",entrypted_pre_master);
- ssl_debug_printf("ssl_decrypt_pre_master_secret:RSA_private_decrypt\n");
+ if (ssl_debug_enabled())
+ {
+ ssl_print_string("pre master encrypted",entrypted_pre_master);
+ ssl_debug_printf("ssl_decrypt_pre_master_secret:RSA_private_decrypt\n");
+ }
i=ssl_private_decrypt(entrypted_pre_master->data_len,
entrypted_pre_master->data, pk);
if (i!=48) {
- ssl_debug_printf("ssl_decrypt_pre_master_secret wrong "
- "pre_master_secret lenght (%d, expected %d)\n", i, 48);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_pre_master_secret wrong "
+ "pre_master_secret lenght (%d, expected %d)\n", i, 48);
return -1;
}
/* the decrypted data has been written into the pre_master key buffer */
ssl_session->pre_master_secret.data = entrypted_pre_master->data;
ssl_session->pre_master_secret.data_len=48;
- ssl_print_string("pre master secret",&ssl_session->pre_master_secret);
+ if (ssl_debug_enabled())
+ ssl_print_string("pre master secret",&ssl_session->pre_master_secret);
/* Remove the master secret if it was there.
This force keying material regeneration in
@@ -886,8 +950,9 @@
memset(&hm, 0, sizeof(hm));
md=ssl_get_digest_by_name(digests[decoder->cipher_suite->dig-0x40]);
- ssl_debug_printf("tls_check_mac mac type:%s md %d\n",
- digests[decoder->cipher_suite->dig-0x40], md);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("tls_check_mac mac type:%s md %d\n",
+ digests[decoder->cipher_suite->dig-0x40], md);
ssl_hmac_init(&hm,decoder->mac_key.data,decoder->mac_key.data_len,md);
@@ -909,7 +974,8 @@
ssl_hmac_update(&hm,data,datalen);
ssl_hmac_final(&hm,buf,&l);
- ssl_print_data("Mac", buf, l);
+ if (ssl_debug_enabled())
+ ssl_print_data("Mac", buf, l);
if(memcmp(mac,buf,l))
return -1;
@@ -931,11 +997,13 @@
/* get cipher used for digest comptuation */
md=ssl_get_digest_by_name(digests[decoder->cipher_suite->dig-0x40]);
- ssl_debug_printf("ssl3_check_mac digest%s md %d\n",
- digests[decoder->cipher_suite->dig-0x40], md);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl3_check_mac digest%s md %d\n",
+ digests[decoder->cipher_suite->dig-0x40], md);
memset(&mc, 0, sizeof(mc));
ssl_md_init(&mc,md);
- ssl_debug_printf("ssl3_check_mac memory digest %p\n",mc);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl3_check_mac memory digest %p\n",mc);
/* do hash computation on data && padding */
ssl_md_update(&mc,decoder->mac_key.data,decoder->mac_key.data_len);
@@ -980,50 +1048,62 @@
int pad, worklen;
guint8 *mac;
- ssl_debug_printf("ssl_decrypt_record ciphertext len %d\n", inl);
- ssl_print_data("Ciphertext",in, inl);
+ if (ssl_debug_enabled())
+ {
+ ssl_debug_printf("ssl_decrypt_record ciphertext len %d\n", inl);
+ ssl_print_data("Ciphertext",in, inl);
+ }
/* First decrypt*/
if ((pad = ssl_cipher_decrypt(&decoder->evp,out,*outl,in,inl))!= 0)
- ssl_debug_printf("ssl_decrypt_record: %s %s\n", gcry_strsource (pad),
- gcry_strerror (pad));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record: %s %s\n", gcry_strsource (pad),
+ gcry_strerror (pad));
- ssl_print_data("Plaintext",out,inl);
+ if (ssl_debug_enabled())
+ ssl_print_data("Plaintext",out,inl);
worklen=inl;
/* Now strip off the padding*/
if(decoder->cipher_suite->block!=1){
pad=out[inl-1];
worklen-=(pad+1);
- ssl_debug_printf("ssl_decrypt_record found padding %d final len %d\n",
- pad, *outl);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record found padding %d final len %d\n",
+ pad, *outl);
}
/* And the MAC */
worklen-=decoder->cipher_suite->dig_len;
if (worklen < 0)
{
- ssl_debug_printf("ssl_decrypt_record wrong record len/padding outlen %d\n work %d\n",*outl, worklen);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record wrong record len/padding outlen %d\n work %d\n",
+ *outl, worklen);
return -1;
}
mac=out+worklen;
- /*ssl_print_data("Record data",out,*outl);*/
/* Now check the MAC */
- ssl_debug_printf("checking mac (len %d, version %X, ct %d)\n", worklen,ssl->version_netorder, ct);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("checking mac (len %d, version %X, ct %d)\n",
+ worklen,ssl->version_netorder, ct);
if(ssl->version_netorder==0x300){
if(ssl3_check_mac(decoder,ct,out,worklen,mac) < 0) {
- ssl_debug_printf("ssl_decrypt_record: mac falied\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record: mac falied\n");
return -1;
}
}
else{
if(tls_check_mac(decoder,ct,ssl->version_netorder,out,worklen,mac)< 0) {
- ssl_debug_printf("ssl_decrypt_record: mac falied\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record: mac falied\n");
return -1;
}
}
- ssl_debug_printf("ssl_decrypt_record: mac ok\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record: mac ok\n");
*outl = worklen;
return(0);
}
@@ -1035,7 +1115,8 @@
{
const char* str = gnutls_check_version(NULL);
- ssl_debug_printf("ssl_get_version: %s\n", str);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_get_version: %s\n", str);
sscanf(str, "%d.%d.%d", major, minor, patch);
}
@@ -1065,47 +1146,55 @@
/* compute file size and load all file contents into a datum buffer*/
if (fseek(fp, 0, SEEK_END) < 0) {
- ssl_debug_printf("ssl_load_key: can't fseek file\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't fseek file\n");
return NULL;
}
if ((size = ftell(fp)) < 0) {
- ssl_debug_printf("ssl_load_key: can't ftell file\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't ftell file\n");
return NULL;
}
if (fseek(fp, 0, SEEK_SET) < 0) {
- ssl_debug_printf("ssl_load_key: can't refseek file\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't refseek file\n");
return NULL;
}
key.data = g_malloc(size);
key.size = size;
bytes = fread(key.data, 1, key.size, fp);
if (bytes < key.size) {
- ssl_debug_printf("ssl_load_key: can't read from file %d bytes, got %d\n",
- key.size, bytes);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't read from file %d bytes, got %d\n",
+ key.size, bytes);
return NULL;
}
/* import PEM data*/
if (gnutls_x509_privkey_import(priv_key, &key, GNUTLS_X509_FMT_PEM)!=0) {
- ssl_debug_printf("ssl_load_key: can't import pem data\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't import pem data\n");
return NULL;
}
- free(key.data);
+ g_free(key.data);
/* RSA get parameter */
if (gnutls_x509_privkey_export_rsa_raw(priv_key, &m, &e, &d, &p, &q, &u) != 0) {
- ssl_debug_printf("ssl_load_key: can't export rsa param (is a rsa private key file ?!?)\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't export rsa param (is a rsa private key file ?!?)\n");
return NULL;
}
/* convert each rsa parameter to mpi format*/
if (gcry_mpi_scan( &rsa_params[0], GCRYMPI_FMT_USG, m.data, m.size, &tmp_size) !=0) {
- ssl_debug_printf("ssl_load_key: can't convert m rsa param to int (size %d)\n", m.size);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't convert m rsa param to int (size %d)\n", m.size);
return NULL;
}
if (gcry_mpi_scan( &rsa_params[1], GCRYMPI_FMT_USG, e.data, e.size, &tmp_size) != 0) {
- ssl_debug_printf("ssl_load_key: can't convert e rsa param to int (size %d)\n", e.size);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't convert e rsa param to int (size %d)\n", e.size);
return NULL;
}
@@ -1114,22 +1203,26 @@
* our 'p' must be equal to 'q' as provided from openssl and viceversa
*/
if (gcry_mpi_scan( &rsa_params[2], GCRYMPI_FMT_USG, d.data, d.size, &tmp_size) !=0) {
- ssl_debug_printf("ssl_load_key: can't convert d rsa param to int (size %d)\n", d.size);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't convert d rsa param to int (size %d)\n", d.size);
return NULL;
}
if (gcry_mpi_scan( &rsa_params[3], GCRYMPI_FMT_USG, q.data, q.size, &tmp_size) !=0) {
- ssl_debug_printf("ssl_load_key: can't convert q rsa param to int (size %d)\n", q.size);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't convert q rsa param to int (size %d)\n", q.size);
return NULL;
}
if (gcry_mpi_scan( &rsa_params[4], GCRYMPI_FMT_USG, p.data, p.size, &tmp_size) !=0) {
- ssl_debug_printf("ssl_load_key: can't convert p rsa param to int (size %d)\n", p.size);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't convert p rsa param to int (size %d)\n", p.size);
return NULL;
}
if (gcry_mpi_scan( &rsa_params[5], GCRYMPI_FMT_USG, u.data, u.size, &tmp_size) !=0) {
- ssl_debug_printf("ssl_load_key: can't convert u rsa param to int (size %d)\n", m.size);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't convert u rsa param to int (size %d)\n", m.size);
return NULL;
}
@@ -1139,7 +1232,8 @@
if ((major <= 1) && (minor <= 0) && (patch <=13))
{
gcry_mpi_t tmp;
- ssl_debug_printf("ssl_load_key: swapping p and q parametes\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: swapping p and q parametes\n");
tmp = rsa_params[4];
rsa_params[4] = rsa_params[3];
rsa_params[3] = tmp;
@@ -1149,7 +1243,8 @@
"(private-key(rsa((n%m)(e%m)(d%m)(p%m)(q%m)(u%m))))", rsa_params[0],
rsa_params[1], rsa_params[2], rsa_params[3], rsa_params[4],
rsa_params[5]) != 0) {
- ssl_debug_printf("ssl_load_key: can't built rsa private key s-exp\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: can't built rsa private key s-exp\n");
return NULL;
}
@@ -1176,22 +1271,10 @@
#endif
}
-#ifdef SSL_DECRYPT_DEBUG
-static FILE* myout=NULL;
-#endif
void
ssl_lib_init(void)
{
gnutls_global_init();
-
-#ifdef SSL_DECRYPT_DEBUG
-#ifdef _WIN32
- /* we don't have standard I/O file available, open a log */
- myout = fopen("ssl-decrypt.txt","w");
- if (!myout)
-#endif /* _WIN32 */
- myout = stderr;
-#endif /* SSL_DECRYPT_DEBUG */
}
#else /* HAVE_LIBGNUTLS */
@@ -1204,7 +1287,8 @@
SSL_PRIVATE_KEY*
ssl_load_key(FILE* fp)
{
- ssl_debug_printf("ssl_load_key: impossible without glutls. fp %p\n",fp);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_load_key: impossible without glutls. fp %p\n",fp);
return NULL;
}
@@ -1216,23 +1300,26 @@
int
ssl_find_cipher(int num,SslCipherSuite* cs)
{
- ssl_debug_printf("ssl_find_cipher: dummy without glutls. num %d cs %p\n",
- num,cs);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_find_cipher: dummy without glutls. num %d cs %p\n",
+ num,cs);
return 0;
}
int
ssl_generate_keyring_material(SslDecryptSession*ssl)
{
- ssl_debug_printf("ssl_generate_keyring_material: impossible without glutls. ssl %p\n",
- ssl);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_generate_keyring_material: impossible without glutls. ssl %p\n",
+ ssl);
return 0;
}
int
ssl_decrypt_pre_master_secret(SslDecryptSession* ssl_session,
StringInfo* entrypted_pre_master, SSL_PRIVATE_KEY *pk)
{
- ssl_debug_printf("ssl_decrypt_pre_master_secret: impossible without glutls."
- " ssl %p entrypted_pre_master %p pk %p\n", ssl_session,
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_pre_master_secret: impossible without glutls."
+ " ssl %p entrypted_pre_master %p pk %p\n", ssl_session,
entrypted_pre_master, pk);
return 0;
}
@@ -1241,9 +1328,10 @@
ssl_decrypt_record(SslDecryptSession*ssl,SslDecoder* decoder, int ct,
const unsigned char* in, int inl,unsigned char*out,int* outl)
{
- ssl_debug_printf("ssl_decrypt_record: impossible without gnutls. ssl %p"
- "decoder %p ct %d, in %p inl %d out %p outl %p\n", ssl, decoder, ct,
- in, inl, out, outl);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_decrypt_record: impossible without gnutls. ssl %p"
+ "decoder %p ct %d, in %p inl %d out %p outl %p\n", ssl, decoder, ct,
+ in, inl, out, outl);
return 0;
}
@@ -1253,8 +1341,9 @@
void
ssl_session_init(SslDecryptSession* ssl_session)
{
- ssl_debug_printf("ssl_session_init: initializing ptr %p size %lu\n",
- ssl_session, (unsigned long)sizeof(SslDecryptSession));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_session_init: initializing ptr %p size %lu\n",
+ ssl_session, (unsigned long)sizeof(SslDecryptSession));
ssl_session->master_secret.data = ssl_session->_master_secret;
ssl_session->session_id.data = ssl_session->_session_id;
@@ -1263,42 +1352,62 @@
ssl_session->master_secret.data_len = 48;
}
-#ifdef SSL_DECRYPT_DEBUG
+FILE* ssl_debug_file=NULL;
+
void
+ssl_set_debug(char* name)
+{
+#ifdef SSL_DECRYPT_DEBUG
+ int use_stderr = (strcmp(name, SSL_DEBUG_USE_STDERR) == 0);
+ static int debug_file_must_be_closed = 0;
+ if (debug_file_must_be_closed)
+ fclose(ssl_debug_file);
+ if (use_stderr)
+ ssl_debug_file = stderr;
+ else if (strcmp(name, "") ==0)
+ ssl_debug_file = NULL;
+ else
+ ssl_debug_file = fopen(name, "w");
+ if (!use_stderr && ssl_debug_file)
+ debug_file_must_be_closed = 1;
+#endif /* SSL_DECRYPT_DEBUG */
+}
+
+void
ssl_debug_printf(const char* fmt, ...)
{
va_list ap;
int ret=0;
va_start(ap, fmt);
- ret += vfprintf(myout, fmt, ap);
+ ret += vfprintf(ssl_debug_file, fmt, ap);
va_end(ap);
- fflush(myout);
+ fflush(ssl_debug_file);
}
void
ssl_print_text_data(const char* name, const unsigned char* data, int len)
{
int i;
- fprintf(myout,"%s: ",name);
+ fprintf(ssl_debug_file,"%s: ",name);
for (i=0; i< len; i++) {
- fprintf(myout,"%c",data[i]);
+ fprintf(ssl_debug_file,"%c",data[i]);
}
- fprintf(myout,"\n");
- fflush(myout);
+ fprintf(ssl_debug_file,"\n");
+ fflush(ssl_debug_file);
}
void
ssl_print_data(const char* name, const unsigned char* data, int len)
{
int i;
- fprintf(myout,"%s[%d]:\n",name, len);
+ fprintf(ssl_debug_file,"%s[%d]:\n",name, len);
for (i=0; i< len; i++) {
if ((i>0) && (i%16 == 0))
- fprintf(myout,"\n");
- fprintf(myout,"%.2x ",data[i]&255);
+ fprintf(ssl_debug_file,"\n");
+ fprintf(ssl_debug_file,"%.2x ",data[i]&255);
}
- fprintf(myout,"\n");
- fflush(myout);
+ fprintf(ssl_debug_file,"\n");
+ fflush(ssl_debug_file);
}
void
@@ -1306,4 +1415,3 @@
{
ssl_print_data(name, data->data, data->data_len);
}
-#endif /* SSL_DECRYPT_DEBUG */
Index: epan/dissectors/packet-ssl-utils.h
===================================================================
--- epan/dissectors/packet-ssl-utils.h (revision 17224)
+++ epan/dissectors/packet-ssl-utils.h (working copy)
@@ -38,6 +38,7 @@
/* #define SSL_FAST 1 */
#define SSL_DECRYPT_DEBUG
+#define SSL_DEBUG_USE_STDERR "-"
#define SSL_CIPHER_CTX gcry_cipher_hd_t
#ifdef SSL_FAST
@@ -201,8 +202,24 @@
extern int
ssl_decrypt_record(SslDecryptSession*ssl,SslDecoder* decoder, int ct,
const unsigned char* in, int inl,unsigned char*out,int* outl);
+
+/* Controll ssl debug outout
+ @param name file name where debug is log to, an empty file name disable debug
+ and SSL_DEBUG_USE_STDERR cause to log to stderr */
+void
+ssl_set_debug(char* name);
+
#ifdef SSL_DECRYPT_DEBUG
+static inline int ssl_debug_enabled(void)
+{
+ extern FILE* ssl_debug_file;
+ return ssl_debug_file != NULL;
+}
+#else
+static inline int ssl_debug_enabled(void) { return 0;}
+#endif /* SSL_DECRYPT_DEBUG */
+
extern void
ssl_debug_printf(const char* fmt,...) GNUC_FORMAT_CHECK(printf,1,2);
extern void
@@ -211,16 +228,5 @@
ssl_print_string(const char* name, const StringInfo* data);
extern void
ssl_print_text_data(const char* name, const unsigned char* data, int len);
-#else
-/* No debug: nullify debug operation*/
-static inline void GNUC_FORMAT_CHECK(printf,1,2)
-ssl_debug_printf(const char* fmt _U_,...)
-{
-}
-#define ssl_print_data(a, b, c)
-#define ssl_print_string(a, b)
-#define ssl_print_text_data(a, b, c)
#endif
-
-#endif
Index: epan/dissectors/packet-ssl.c
===================================================================
--- epan/dissectors/packet-ssl.c (revision 17224)
+++ epan/dissectors/packet-ssl.c (working copy)
@@ -219,6 +219,7 @@
static char* ssl_keys_list = NULL;
static char* ssl_ports_list = NULL;
+static char* ssl_debug_file_name = NULL;
typedef struct _SslService {
address addr;
@@ -306,8 +307,9 @@
assoc->decrypted_port = ctport;
assoc->handle = dissector_get_port_handle(tcp_dissectors, ctport);
- ssl_debug_printf("ssl_association_add port %d ctport %d info %s handle %p\n",
- port, ctport, info, assoc->handle);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_association_add port %d ctport %d info %s handle %p\n",
+ port, ctport, info, assoc->handle);
dissector_add("tcp.port", port, ssl_handle);
g_tree_insert(ssl_associations, (gpointer)port, assoc);
@@ -323,7 +325,8 @@
SslAssociation* ssl_association_find(unsigned int port)
{
register SslAssociation* ret = g_tree_lookup(ssl_associations, (gpointer)port);
- ssl_debug_printf("ssl_association_find: port %d found %p\n", port, ret);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_association_find: port %d found %p\n", port, ret);
return ret;
}
@@ -332,8 +335,9 @@
gpointer data, gpointer user_data _U_)
{
SslAssociation* assoc = (SslAssociation*) data;
- ssl_debug_printf("ssl_association_remove_handle removing ptr %p handle %p\n",
- data, assoc->handle);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_association_remove_handle removing ptr %p handle %p\n",
+ data, assoc->handle);
if (assoc->handle)
dissector_delete("tcp.port", assoc->ssl_port, assoc->handle);
g_free(data);
@@ -343,7 +347,8 @@
static inline int ssl_packet_from_server(unsigned int port)
{
register int ret = ssl_association_find(port) != 0;
- ssl_debug_printf("ssl_packet_from_server: is from server %d\n", ret);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_packet_from_server: is from server %d\n", ret);
return ret;
}
@@ -383,7 +388,8 @@
char* start = strdup(ssl_keys_list);
char* tmp = start;
- ssl_debug_printf("ssl_init keys string %s\n", start);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init keys string %s\n", start);
do {
char* addr, *port, *filename;
unsigned char* ip;
@@ -400,11 +406,13 @@
}
/* for each entry split ip, port, filename with ':' separator */
- ssl_debug_printf("ssl_init found host entry %s\n", addr);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init found host entry %s\n", addr);
port = strchr(addr, ':');
if (!port)
{
- ssl_debug_printf("ssl_init entry malformed can't find port in %s\n", addr);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init entry malformed can't find port in %s\n", addr);
break;
}
*port = 0;
@@ -413,7 +421,8 @@
filename = strchr(port,':');
if (!filename)
{
- ssl_debug_printf("ssl_init entry malformed can't find filename in %s\n", port);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init entry malformed can't find filename in %s\n", port);
break;
}
*filename=0;
@@ -426,8 +435,9 @@
service->addr.data = ip = ((unsigned char*)service) + sizeof(SslService);
sscanf(addr, "%hhu.%hhu.%hhu.%hhu", &ip[0], &ip[1], &ip[2], &ip[3]);
service->port = atoi(port);
- ssl_debug_printf("ssl_init addr %hhu.%hhu.%hhu.%hhu port %d filename %s\n",
- ip[0], ip[1], ip[2], ip[3], service->port, filename);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init addr %hhu.%hhu.%hhu.%hhu port %d filename %s\n",
+ ip[0], ip[1], ip[2], ip[3], service->port, filename);
/* try to load pen file*/
fp = fopen(filename, "rb");
@@ -444,8 +454,9 @@
}
fclose(fp);
- ssl_debug_printf("ssl_init private key file %s successfully loaded\n",
- filename);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init private key file %s successfully loaded\n",
+ filename);
g_hash_table_insert(ssl_key_hash, service, private_key);
} while (end != NULL);
@@ -459,7 +470,8 @@
char* start = strdup(ssl_ports_list);
char* tmp = start;
- ssl_debug_printf("ssl_init ports string %s\n", start);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init ports string %s\n", start);
do {
char* port, *ctport, *info;
unsigned int portn, ctportn;
@@ -473,7 +485,8 @@
}
/* for each entry split ip, port, filename with ':' separator */
- ssl_debug_printf("ssl_init found port entry %s\n", port);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init found port entry %s\n", port);
ctport = strchr(port, ':');
if (!ctport)
break;
@@ -492,11 +505,14 @@
if (!portn || !ctportn)
break;
- ssl_debug_printf("ssl_init adding dissector to port %d (ct port %d)\n", portn, ctportn);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_init adding dissector to port %d (ct port %d)\n", portn, ctportn);
ssl_association_add(portn, ctportn, info);
} while (end != NULL);
free(tmp);
}
+
+ ssl_set_debug(ssl_debug_file_name);
/* [re] add ssl dissection to defaults ports */
ssl_association_add(443, 80, "Hypertext transfer protocol");
@@ -518,20 +534,25 @@
ssl_data_set(session_id, ssl->session_id.data, ssl->session_id.data_len);
ssl_data_set(master_secret, ssl->master_secret.data, ssl->master_secret.data_len);
g_hash_table_insert(ssl_session_hash, session_id, master_secret);
- ssl_print_string("ssl_save_session stored session id", session_id);
- ssl_print_string("ssl_save_session stored master secret", master_secret);
+ if (ssl_debug_enabled())
+ {
+ ssl_print_string("ssl_save_session stored session id", session_id);
+ ssl_print_string("ssl_save_session stored master secret", master_secret);
+ }
}
static void ssl_restore_session(SslDecryptSession* ssl)
{
StringInfo* ms = g_hash_table_lookup(ssl_session_hash, &ssl->session_id);
if (!ms) {
- ssl_debug_printf("ssl_restore_session can't find stored session\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_restore_session can't find stored session\n");
return;
}
ssl_data_set(&ssl->master_secret, ms->data, ms->data_len);
ssl->state |= SSL_MASTER_SECRET;
- ssl_debug_printf("ssl_restore_session master key retrived\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("ssl_restore_session master key retrived\n");
}
/* The TCP port to associate with by default */
@@ -1215,10 +1236,10 @@
dummy.addr = pinfo->net_dst;
dummy.port = pinfo->destport;
}
- ssl_debug_printf("dissect_ssl server %hhd.%hhd.%hhd.%hhd:%d\n",
- dummy.addr.data[0],
- dummy.addr.data[1],dummy.addr.data[2],
- dummy.addr.data[3],dummy.port);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl server %hhd.%hhd.%hhd.%hhd:%d\n",
+ dummy.addr.data[0],dummy.addr.data[1],dummy.addr.data[2],
+ dummy.addr.data[3],dummy.port);
/* try to retrive private key for this service. Do it now 'cause pinfo
* is not always available
@@ -1226,7 +1247,8 @@
* and thus decryption never engaged*/
ssl_session->private_key = g_hash_table_lookup(ssl_key_hash, &dummy);
if (!ssl_session->private_key)
- ssl_debug_printf("dissect_ssl can't find private key for this server!\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl can't find private key for this server!\n");
}
conv_version= & ssl_session->version;
@@ -1381,27 +1403,32 @@
/* if we can decrypt and decryption have success
* add decrypted data to this packet info*/
- ssl_debug_printf("decrypt_ssl3_record: app_data len %d ssl state %X\n",
- record_length, ssl->state);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: app_data len %d ssl state %X\n",
+ record_length, ssl->state);
if (!(ssl->state & SSL_HAVE_SESSION_KEY)) {
- ssl_debug_printf("decrypt_ssl3_record: no session key\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: no session key\n");
return ;
}
/* retrive decoder for this packet direction*/
if ((direction = ssl_packet_from_server(pinfo->srcport)) != 0) {
- ssl_debug_printf("decrypt_ssl3_record: using server decoder\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: using server decoder\n");
decoder = &ssl->server;
}
else {
- ssl_debug_printf("decrypt_ssl3_record: using client decoder\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: using client decoder\n");
decoder = &ssl->client;
}
/* ensure we have enough storage space for decrypted data */
if (record_length > ssl_decrypted_data.data_len)
{
- ssl_debug_printf("decrypt_ssl3_record: allocating %d bytes"
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: allocating %d bytes"
" for decrypt data (old len %d)\n",
record_length + 32, ssl_decrypted_data.data_len);
ssl_decrypted_data.data = g_realloc(ssl_decrypted_data.data,
@@ -1420,8 +1447,9 @@
StringInfo* data = p_get_proto_data(pinfo->fd, proto_ssl);
if (!data)
{
- ssl_debug_printf("decrypt_ssl3_record: allocating app_data %d "
- "bytes for app data\n", len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: allocating app_data %d "
+ "bytes for app data\n", len);
/* first app data record: allocate and put packet data*/
data = se_alloc(sizeof(StringInfo));
data->data = se_alloc(len);
@@ -1431,9 +1459,10 @@
else {
unsigned char* store;
/* update previus record*/
- ssl_debug_printf("decrypt_ssl3_record: reallocating app_data "
- "%d bytes for app data (total %d appdata bytes)\n",
- len, data->data_len + len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: reallocating app_data "
+ "%d bytes for app data (total %d appdata bytes)\n",
+ len, data->data_len + len);
store = se_alloc(data->data_len + len);
memcpy(store, data->data, data->data_len);
memcpy(&store[data->data_len], ssl_decrypted_data.data, len);
@@ -1444,11 +1473,13 @@
data->data = store;
/* data ptr is changed, so remove old one and re-add the new one*/
- ssl_debug_printf("decrypt_ssl3_record: removing old app_data ptr\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: removing old app_data ptr\n");
p_remove_proto_data(pinfo->fd, proto_ssl);
}
- ssl_debug_printf("decrypt_ssl3_record: setting decrypted app_data ptr %p\n",data);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("decrypt_ssl3_record: setting decrypted app_data ptr %p\n",data);
p_add_proto_data(pinfo->fd, proto_ssl, data);
}
}
@@ -1652,7 +1683,8 @@
/*
* now dissect the next layer
*/
- ssl_debug_printf("dissect_ssl3_record: content_type %d\n",content_type);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_record: content_type %d\n",content_type);
/* PAOLO try to decrypt each record (we must keep ciphers "in sync")
* store plain text only for app data */
@@ -1709,7 +1741,8 @@
tvbuff_t* new_tvb;
/* try to dissect decrypted data*/
- ssl_debug_printf("dissect_ssl3_record decrypted len %d\n", decrypted->data_len);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_record decrypted len %d\n", decrypted->data_len);
/* create new tvbuff for the decrypted data */
new_tvb = tvb_new_real_data(decrypted->data,
@@ -1719,9 +1752,12 @@
/* find out a dissector using server port*/
if (association && association->handle) {
- ssl_debug_printf("dissect_ssl3_record found association %p\n", association);
- ssl_print_text_data("decrypted app data",decrypted->data,
- decrypted->data_len);
+ if (ssl_debug_enabled())
+ {
+ ssl_debug_printf("dissect_ssl3_record found association %p\n", association);
+ ssl_print_text_data("decrypted app data",decrypted->data,
+ decrypted->data_len);
+ }
call_dissector(association->handle, new_tvb, pinfo, ssl_record_tree);
}
@@ -1893,8 +1929,9 @@
msg_type_str = match_strval(msg_type, ssl_31_handshake_type);
length = tvb_get_ntoh24(tvb, offset + 1);
- ssl_debug_printf("dissect_ssl3_handshake iteration %d type %d offset %d lenght %d "
- "bytes, remaning %d \n", first_iteration, msg_type, offset, length, record_length);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake iteration %d type %d offset %d lenght %d "
+ "bytes, remaning %d \n", first_iteration, msg_type, offset, length, record_length);
if (!msg_type_str && !first_iteration)
{
/* only dissect / report messages if they're
@@ -2012,12 +2049,14 @@
break;
/* check for required session data */
- ssl_debug_printf("dissect_ssl3_handshake found SSL_HND_CLIENT_KEY_EXCHG state %X\n",
- ssl->state);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake found SSL_HND_CLIENT_KEY_EXCHG state %X\n",
+ ssl->state);
if ((ssl->state & (SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION)) !=
(SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION)) {
- ssl_debug_printf("dissect_ssl3_handshake not enough data to generate key (required %X)\n",
- (SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake not enough data to generate key (required %X)\n",
+ (SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION));
break;
}
@@ -2028,7 +2067,8 @@
tvb_memcpy(tvb, encrypted_pre_master.data, offset+2, length-2);
if (!ssl->private_key) {
- ssl_debug_printf("dissect_ssl3_handshake can't find private key\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake can't find private key\n");
break;
}
@@ -2036,16 +2076,19 @@
* will be used for master secret store*/
ret = ssl_decrypt_pre_master_secret(ssl, &encrypted_pre_master, ssl->private_key);
if (ret < 0) {
- ssl_debug_printf("dissect_ssl3_handshake can't decrypt pre master secret\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake can't decrypt pre master secret\n");
break;
}
if (ssl_generate_keyring_material(ssl)<0) {
- ssl_debug_printf("dissect_ssl3_handshake can't generate keyring material\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake can't generate keyring material\n");
break;
}
ssl->state |= SSL_HAVE_SESSION_KEY;
ssl_save_session(ssl);
- ssl_debug_printf("dissect_ssl3_handshake session keys succesfully generated\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_handshake session keys succesfully generated\n");
}
break;
@@ -2088,8 +2131,9 @@
ssl->state |= SSL_SERVER_RANDOM;
else
ssl->state |= SSL_CLIENT_RANDOM;
- ssl_debug_printf("dissect_ssl3_hnd_hello_common found random state %X\n",
- ssl->state);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_hnd_hello_common found random state %X\n",
+ ssl->state);
session_id_length = tvb_get_guint8(tvb, offset + 32);
/* check stored session id info */
@@ -2351,27 +2395,33 @@
/* store selected cipher suite for decryption */
ssl->cipher = tvb_get_ntohs(tvb, offset);
if (ssl_find_cipher(ssl->cipher,&ssl->cipher_suite) < 0) {
- ssl_debug_printf("dissect_ssl3_hnd_srv_hello can't find cipher suite %X\n", ssl->cipher);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_hnd_srv_hello can't find cipher suite %X\n",
+ ssl->cipher);
goto no_cipher;
}
ssl->state |= SSL_CIPHER;
- ssl_debug_printf("dissect_ssl3_hnd_srv_hello found cipher %X, state %X\n",
- ssl->cipher, ssl->state);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_hnd_srv_hello found cipher %X, state %X\n",
+ ssl->cipher, ssl->state);
/* if we have restored a session now we can have enought material
* to build session key, check it out*/
if ((ssl->state &
(SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION|SSL_MASTER_SECRET)) !=
(SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION|SSL_MASTER_SECRET)) {
- ssl_debug_printf("dissect_ssl3_hnd_srv_hello not enough data to generate key (required %X)\n",
- (SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION|SSL_MASTER_SECRET));
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_hnd_srv_hello not enough data to generate key (required %X)\n",
+ (SSL_CIPHER|SSL_CLIENT_RANDOM|SSL_SERVER_RANDOM|SSL_VERSION|SSL_MASTER_SECRET));
goto no_cipher;
}
- ssl_debug_printf("dissect_ssl3_hnd_srv_hello trying to generate keys\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_hnd_srv_hello trying to generate keys\n");
if (ssl_generate_keyring_material(ssl)<0) {
- ssl_debug_printf("dissect_ssl3_hnd_srv_hello can't generate keyring material\n");
+ if (ssl_debug_enabled())
+ ssl_debug_printf("dissect_ssl3_hnd_srv_hello can't generate keyring material\n");
goto no_cipher;
}
ssl->state |= SSL_HAVE_SESSION_KEY;
@@ -2994,8 +3044,9 @@
challenge */
int max = challenge_length > 32? 32: challenge_length;
- ssl_debug_printf("client random len: %d padded to 32\n",
- challenge_length);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("client random len: %d padded to 32\n",
+ challenge_length);
/* client random is padded with zero and 'right' aligned */
memset(ssl->client_random.data, 0, 32 - max);
@@ -4277,14 +4328,14 @@
proto_register_subtree_array(ett, array_length(ett));
{
- module_t *ssl_module = prefs_register_protocol(proto_ssl, ssl_parse);
- prefs_register_bool_preference(ssl_module,
+ module_t *ssl_module = prefs_register_protocol(proto_ssl, ssl_parse);
+ prefs_register_bool_preference(ssl_module,
"desegment_ssl_records",
"Reassemble SSL records spanning multiple TCP segments",
"Whether the SSL dissector should reassemble SSL records spanning multiple TCP segments. "
"To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
&ssl_desegment);
- prefs_register_string_preference(ssl_module, "keys_list", "RSA keys list",
+ prefs_register_string_preference(ssl_module, "keys_list", "RSA keys list",
"comma separated list of private RSA keys used for SSL decryption; "
"each list entry must be in the form of <ip>:<port>:<key_file_name>"
"<key_file_name> is the local file name of the RSA private key used by the specified server\n",
@@ -4294,6 +4345,11 @@
"each list entry must be in the form of <port>:<clear-text-port>"
"<clear-text-port> is the port numbert associated with the protocol tunneled over SSL for this port\n",
(const char **)&ssl_ports_list);
+ prefs_register_string_preference(ssl_module, "debug", "debug file",
+ "file name where verbose debug is log into; use no file name to"
+ "disable debug, or '-' to log onto standard error. Enabling debug"
+ "will show down dissection. Debug file will be rewritten\n",
+ (const char **)&ssl_debug_file_name);
}
register_dissector("ssl", dissect_ssl, proto_ssl);
@@ -4301,8 +4357,9 @@
register_init_routine(ssl_init);
ssl_lib_init();
ssl_tap = register_tap("ssl");
- ssl_debug_printf("proto_register_ssl: registered tap %s:%d\n",
- "ssl", ssl_tap);
+ if (ssl_debug_enabled())
+ ssl_debug_printf("proto_register_ssl: registered tap %s:%d\n",
+ "ssl", ssl_tap);
}
/* If this dissector uses sub-dissector registration add a registration
- Follow-Ups:
- Re: [Ethereal-dev] [PATCH] ssl decrypt debug code
- From: Joerg Mayer
- Re: [Ethereal-dev] [PATCH] ssl decrypt debug code
- References:
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Ulf Lamping
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Paolo Abeni
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Guy Harris
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Joerg Mayer
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Thomas Anders
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Guy Harris
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Paolo Abeni
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Michael Tuexen
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Thomas Anders
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Michael Tuexen
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Joerg Mayer
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Michael Tuexen
- Re: [Ethereal-dev] external plugin and exported symbols
- From: Paolo Abeni
- Re: [Ethereal-dev] external plugin and exported symbols
- Prev by Date: Re: [Ethereal-dev] Lua for windows, need help
- Next by Date: Re: [Ethereal-dev] Patch: Netflow v9 MPLS aware
- Previous by thread: Re: [Ethereal-dev] external plugin and exported symbols
- Next by thread: Re: [Ethereal-dev] [PATCH] ssl decrypt debug code
- Index(es):





