GnuTLS: Debug output keying info. OpenSSL: TLS1.2 keying.
authorJeremy Harris <jgh146exb@wizmail.org>
Wed, 16 Jan 2019 15:12:33 +0000 (15:12 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Wed, 16 Jan 2019 15:12:33 +0000 (15:12 +0000)
src/src/tls-gnu.c
src/src/tls-openssl.c

index 6d60409d7a310fb115936fe7a115f2fae0cfed18..199b90d94c114cf0f28862003a12cb5c25fb78af 100644 (file)
@@ -1991,6 +1991,18 @@ return 0;
 #endif
 
 
+static gstring *
+ddump(gnutls_datum_t * d)
+{
+gstring * g = string_get((d->size+1) * 2);
+uschar * s = d->data;
+for (unsigned i = d->size; i > 0; i--, s++)
+  {
+  g = string_catn(g, US "0123456789abcdef" + (*s >> 4), 1);
+  g = string_catn(g, US "0123456789abcdef" + (*s & 0xf), 1);
+  }
+return g;
+}
 
 /* ------------------------------------------------------------------------ */
 /* Exported functions */
@@ -2138,7 +2150,19 @@ if (rc != GNUTLS_E_SUCCESS)
   return FAIL;
   }
 
-DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
+DEBUG(D_tls)
+  {
+  gnutls_datum_t c, s;
+  gstring * gc, * gs;
+  debug_printf("gnutls_handshake was successful\n");
+  debug_printf("%s\n", gnutls_session_get_desc(state->session));
+
+  gnutls_session_get_random(state->session, &c, &s);
+  gnutls_session_get_master_secret(state->session, &s);
+  gc = ddump(&c);
+  gs = ddump(&s);
+  debug_printf("CLIENT_RANDOM %.*s %.*s\n", (int)gc->ptr, gc->s, (int)gs->ptr, gs->s);
+  }
 
 /* Verify after the fact */
 
@@ -2447,7 +2471,19 @@ if (rc != GNUTLS_E_SUCCESS)
   return NULL;
   }
 
-DEBUG(D_tls) debug_printf("gnutls_handshake was successful\n");
+DEBUG(D_tls)
+  {
+  gnutls_datum_t c, s;
+  gstring * gc, * gs;
+  debug_printf("gnutls_handshake was successful\n");
+  debug_printf("%s\n", gnutls_session_get_desc(state->session));
+
+  gnutls_session_get_random(state->session, &c, &s);
+  gnutls_session_get_master_secret(state->session, &s);
+  gc = ddump(&c);
+  gs = ddump(&s);
+  debug_printf("CLIENT_RANDOM %.*s %.*s\n", (int)gc->ptr, gc->s, (int)gs->ptr, gs->s);
+  }
 
 /* Verify late */
 
index 169cf564f3e57a4111ef51be4222addeb4349a21..5353d2ce711c99bc0ebb294cff23610f10fcaf11 100644 (file)
@@ -2302,16 +2302,25 @@ and initialize things. */
 
 peer_cert(server_ssl, &tls_in, peerdn, sizeof(peerdn));
 
-construct_cipher_name(server_ssl, cipherbuf, sizeof(cipherbuf), &tls_in.bits);
-tls_in.cipher = cipherbuf;
-
 DEBUG(D_tls)
   {
   uschar buf[2048];
+  BIO * bp = BIO_new(BIO_s_mem());
+  uschar * s;
+  int len;
+
   if (SSL_get_shared_ciphers(server_ssl, CS buf, sizeof(buf)) != NULL)
     debug_printf("Shared ciphers: %s\n", buf);
+
+  SSL_SESSION_print_keylog(bp, SSL_get_session(server_ssl));
+  len = (int) BIO_get_mem_data(bp, CSS &s);
+  debug_printf("%.*s", len, s);
+  BIO_free(bp);
   }
 
+construct_cipher_name(server_ssl, cipherbuf, sizeof(cipherbuf), &tls_in.bits);
+tls_in.cipher = cipherbuf;
+
 /* Record the certificate we presented */
   {
   X509 * crt = SSL_get_certificate(server_ssl);
@@ -2678,7 +2687,17 @@ if (rc <= 0)
   return NULL;
   }
 
-DEBUG(D_tls) debug_printf("SSL_connect succeeded\n");
+DEBUG(D_tls)
+  {
+  BIO * bp = BIO_new_fp(debug_file, BIO_NOCLOSE);
+  uschar * s;
+  int len;
+  debug_printf("SSL_connect succeeded\n");
+  SSL_SESSION_print_keylog(bp, SSL_get_session(exim_client_ctx->ssl));
+  len = (int) BIO_get_mem_data(bp, CSS &s);
+  debug_printf("%.*s", len, s);
+  BIO_free(bp);
+  }
 
 peer_cert(exim_client_ctx->ssl, tlsp, peerdn, sizeof(peerdn));