From 4c89b62c2f9a856804207184e2d464cb1c6473b8 Mon Sep 17 00:00:00 2001 From: nils-ohlmeier Date: Fri, 10 Nov 2006 08:43:14 +0000 Subject: [PATCH] more gnutls debug code git-svn-id: http://svn.berlios.de/svnroot/repos/sipsak/trunk@416 75b5f7c7-cfd4-0310-b54c-e118b2c5249a (cherry picked from commit c77a4d79951742f63003b90f380e12c951215b2c) (cherry picked from commit 374478471ea89efa5b6e3b850174cab3529544c7) --- transport.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++- transport.h | 2 + 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/transport.c b/transport.c index a5705ac..654eb20 100644 --- a/transport.c +++ b/transport.c @@ -112,7 +112,82 @@ int rawsock; #ifdef WITH_TLS_TRANSP # ifdef USE_GNUTLS -//extern void print_x509_certificate_info(session); +void check_alert(gnutls_session_t session, int ret) { + int last_alert; + + if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED || + ret == GNUTLS_E_FATAL_ALERT_RECEIVED) { + last_alert = gnutls_alert_get(session); + printf("Received TLS alert: '%d': %s\n", last_alert, + gnutls_alert_get_name(last_alert)); + } +} + +static const char *bin2hex(const void *bin, size_t bin_size) { + static char printable[110]; + const unsigned char *_bin = bin; + char *print; + size_t i; + + if (bin_size > 50) { + bin_size = 50; + } + + print = printable; + for (i=0; i < bin_size; i++) { + sprintf(print, "%.2x ", _bin[i]); + print += 2; + } + + return printable; +} + +void print_x509_certificate_info(gnutls_session_t session) { + char serial[40]; + char dn[128]; + size_t size; + unsigned int algo, bits; + time_t expiration_time, activation_time; + const gnutls_datum_t *cert_list; + int cert_list_size = 0; + gnutls_x509_crt_t cert; + + // check if we got a X.509 cert + if (gnutls_certificate_type_get(session) != GNUTLS_CRT_X509) { + printf("TLS session did not received a X.509 certificate\n"); + return; + } + + cert_list = gnutls_certificate_get_peers(session, &cert_list_size); + printf("Peer provided %d certificate(s)\n", cert_list_size); + + if (cert_list_size > 0) { + // print only informations about the first cert + gnutls_x509_crt_init(&cert); + gnutls_x509_crt_import(cert, &cert_list[0], GNUTLS_X509_FMT_DER); + printf("Certificate info:\n"); + expiration_time = gnutls_x509_crt_get_expiration_time(cert); + activation_time = gnutls_x509_crt_get_activation_time(cert); + printf("\tCertificate is valid since: %s", ctime(&activation_time)); + printf("\tCertificate expires: %s", ctime(&expiration_time)); + // print the serial number of the certificate + size = sizeof(serial); + gnutls_x509_crt_get_serial(cert, serial, &size); + printf("\tCertificate serail number: %s\n", bin2hex(serial, size)); + // extract public key algorithm + algo = gnutls_x509_crt_get_pk_algorithm(cert, &bits); + printf("\tCertificate public key: %s\n", gnutls_pk_algorithm_get_name(algo)); + // print version of x509 cert + printf("\tCertificate version: #%d\n", gnutls_x509_crt_get_version(cert)); + size = sizeof(dn); + gnutls_x509_crt_get_dn(cert, dn, &size); + printf("\tDN: %s\n", dn); + size = sizeof(dn); + gnutls_x509_crt_get_issuer_dn(cert, dn, &size); + printf("\tIssuer's DN: %s\n", dn); + gnutls_x509_crt_deinit(cert); + } +} void gnutls_session_info(gnutls_session_t session) { const char *tmp; @@ -142,7 +217,7 @@ void gnutls_session_info(gnutls_session_t session) { gnutls_dh_get_prime_bits(session)); } // print certificate informations if available - //print_x509_certificate_info(session); + print_x509_certificate_info(session); break; default: printf("UNKNOWN GNUTLS authentication type!!!\n"); @@ -342,6 +417,27 @@ void create_sockets(struct sipsak_con_data *cd) { } } +void close_sockets(struct sipsak_con_data *cd) { + if (transport == SIP_UDP_TRANSPORT) { + } + else { +#ifdef WITH_TLS_TRANSP + if (transport == SIP_TLS_TRANSPORT) { +# ifdef USE_GNUTLS + gnutls_bye(tls_session, GNUTLS_SHUT_RDWR); +# else /* USE_GNUTLS */ +# ifdef USE_OPENSSL +# endif /* USE_OPENSSL */ +# endif /* USE_GNUTLS */ + } +#endif /* WITH_TLS_TRANSP */ + shutdown(cd->csock, SHUT_RDWR); + } +#ifdef DEBUG + printf("sockets closed\n"); +#endif +} + void send_message(char* mes, struct sipsak_con_data *cd, struct sipsak_counter *sc, struct sipsak_sr_time *srt) { struct timezone tz; @@ -821,6 +917,9 @@ int set_target(struct sockaddr_in *adr, unsigned long target, int port, int sock #ifdef DEBUG else { printf("*** TLS Handshake was completed!\n"); +#ifdef DEBUG + gnutls_session_info(tls_session); +#endif } #endif # else /* USE_GNUTLS */ diff --git a/transport.h b/transport.h index 199fa6d..e087853 100644 --- a/transport.h +++ b/transport.h @@ -72,6 +72,8 @@ struct sipsak_delay { void create_sockets(struct sipsak_con_data *cd); +void close_sockets(struct sipsak_con_data *cd); + void send_message(char* mes, struct sipsak_con_data *cd, struct sipsak_counter *sc, struct sipsak_sr_time *srt);