2016-05-17 18:18:30 +00:00
|
|
|
/*
|
|
|
|
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
1998-12-21 10:52:47 +00:00
|
|
|
*
|
2016-05-17 18:18:30 +00:00
|
|
|
* Licensed under the OpenSSL license (the "License"). You may not use
|
|
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
|
|
* in the file LICENSE in the source distribution or at
|
|
|
|
* https://www.openssl.org/source/license.html
|
1998-12-21 10:52:47 +00:00
|
|
|
*/
|
2016-05-17 18:18:30 +00:00
|
|
|
|
2006-03-10 23:06:27 +00:00
|
|
|
/* ====================================================================
|
|
|
|
* Copyright 2005 Nokia. All rights reserved.
|
|
|
|
*
|
|
|
|
* The portions of the attached software ("Contribution") is developed by
|
|
|
|
* Nokia Corporation and is licensed pursuant to the OpenSSL open source
|
|
|
|
* license.
|
|
|
|
*
|
|
|
|
* The Contribution, originally written by Mika Kousa and Pasi Eronen of
|
|
|
|
* Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
|
|
|
|
* support (see RFC 4279) to OpenSSL.
|
|
|
|
*
|
|
|
|
* No patent licenses or other rights except those expressly stated in
|
|
|
|
* the OpenSSL open source license shall be deemed granted or received
|
|
|
|
* expressly, by implication, estoppel, or otherwise.
|
|
|
|
*
|
|
|
|
* No assurances are provided by Nokia that the Contribution does not
|
|
|
|
* infringe the patent or other intellectual property rights of any third
|
|
|
|
* party or that the license provides you with all the necessary rights
|
|
|
|
* to make use of the Contribution.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
|
|
|
|
* ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
|
|
|
|
* SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
|
|
|
|
* OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
|
|
|
|
* OTHERWISE.
|
|
|
|
*/
|
1998-12-21 10:52:47 +00:00
|
|
|
|
|
|
|
#include <stdio.h>
|
1999-04-23 22:13:45 +00:00
|
|
|
#include <openssl/buffer.h>
|
1998-12-21 10:52:47 +00:00
|
|
|
#include "ssl_locl.h"
|
|
|
|
|
2015-01-14 20:57:28 +00:00
|
|
|
#ifndef OPENSSL_NO_STDIO
|
2005-03-30 10:26:02 +00:00
|
|
|
int SSL_SESSION_print_fp(FILE *fp, const SSL_SESSION *x)
|
2015-01-22 03:40:55 +00:00
|
|
|
{
|
|
|
|
BIO *b;
|
|
|
|
int ret;
|
1998-12-21 10:52:47 +00:00
|
|
|
|
2015-09-30 18:32:49 +00:00
|
|
|
if ((b = BIO_new(BIO_s_file())) == NULL) {
|
2015-01-22 03:40:55 +00:00
|
|
|
SSLerr(SSL_F_SSL_SESSION_PRINT_FP, ERR_R_BUF_LIB);
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
BIO_set_fp(b, fp, BIO_NOCLOSE);
|
|
|
|
ret = SSL_SESSION_print(b, x);
|
|
|
|
BIO_free(b);
|
|
|
|
return (ret);
|
|
|
|
}
|
1998-12-21 10:52:47 +00:00
|
|
|
#endif
|
|
|
|
|
2005-03-30 10:26:02 +00:00
|
|
|
int SSL_SESSION_print(BIO *bp, const SSL_SESSION *x)
|
2015-01-22 03:40:55 +00:00
|
|
|
{
|
2016-10-04 19:31:19 +00:00
|
|
|
size_t i;
|
2015-01-22 03:40:55 +00:00
|
|
|
const char *s;
|
1998-12-21 10:52:47 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
if (x == NULL)
|
|
|
|
goto err;
|
|
|
|
if (BIO_puts(bp, "SSL-Session:\n") <= 0)
|
|
|
|
goto err;
|
2016-02-07 19:17:07 +00:00
|
|
|
s = ssl_protocol_to_string(x->ssl_version);
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_printf(bp, " Protocol : %s\n", s) <= 0)
|
|
|
|
goto err;
|
1998-12-21 10:56:39 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
if (x->cipher == NULL) {
|
|
|
|
if (((x->cipher_id) & 0xff000000) == 0x02000000) {
|
|
|
|
if (BIO_printf
|
|
|
|
(bp, " Cipher : %06lX\n", x->cipher_id & 0xffffff) <= 0)
|
|
|
|
goto err;
|
|
|
|
} else {
|
|
|
|
if (BIO_printf
|
|
|
|
(bp, " Cipher : %04lX\n", x->cipher_id & 0xffff) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (BIO_printf
|
|
|
|
(bp, " Cipher : %s\n",
|
|
|
|
((x->cipher == NULL) ? "unknown" : x->cipher->name)) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (BIO_puts(bp, " Session-ID: ") <= 0)
|
|
|
|
goto err;
|
|
|
|
for (i = 0; i < x->session_id_length; i++) {
|
|
|
|
if (BIO_printf(bp, "%02X", x->session_id[i]) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (BIO_puts(bp, "\n Session-ID-ctx: ") <= 0)
|
|
|
|
goto err;
|
|
|
|
for (i = 0; i < x->sid_ctx_length; i++) {
|
|
|
|
if (BIO_printf(bp, "%02X", x->sid_ctx[i]) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (BIO_puts(bp, "\n Master-Key: ") <= 0)
|
|
|
|
goto err;
|
2016-10-04 19:31:19 +00:00
|
|
|
for (i = 0; i < x->master_key_length; i++) {
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_printf(bp, "%02X", x->master_key[i]) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
2006-03-10 23:06:27 +00:00
|
|
|
#ifndef OPENSSL_NO_PSK
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_puts(bp, "\n PSK identity: ") <= 0)
|
|
|
|
goto err;
|
|
|
|
if (BIO_printf(bp, "%s", x->psk_identity ? x->psk_identity : "None") <= 0)
|
|
|
|
goto err;
|
|
|
|
if (BIO_puts(bp, "\n PSK identity hint: ") <= 0)
|
|
|
|
goto err;
|
|
|
|
if (BIO_printf
|
|
|
|
(bp, "%s", x->psk_identity_hint ? x->psk_identity_hint : "None") <= 0)
|
|
|
|
goto err;
|
2006-03-10 23:06:27 +00:00
|
|
|
#endif
|
2011-03-12 17:01:19 +00:00
|
|
|
#ifndef OPENSSL_NO_SRP
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_puts(bp, "\n SRP username: ") <= 0)
|
|
|
|
goto err;
|
|
|
|
if (BIO_printf(bp, "%s", x->srp_username ? x->srp_username : "None") <= 0)
|
|
|
|
goto err;
|
2011-03-12 17:01:19 +00:00
|
|
|
#endif
|
2016-12-08 19:18:40 +00:00
|
|
|
if (x->ext.tick_lifetime_hint) {
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_printf(bp,
|
|
|
|
"\n TLS session ticket lifetime hint: %ld (seconds)",
|
2016-12-08 19:18:40 +00:00
|
|
|
x->ext.tick_lifetime_hint) <= 0)
|
2015-01-22 03:40:55 +00:00
|
|
|
goto err;
|
|
|
|
}
|
2016-12-08 19:18:40 +00:00
|
|
|
if (x->ext.tick) {
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_puts(bp, "\n TLS session ticket:\n") <= 0)
|
|
|
|
goto err;
|
2016-10-19 14:11:24 +00:00
|
|
|
/* TODO(size_t): Convert this call */
|
2016-08-05 17:03:17 +00:00
|
|
|
if (BIO_dump_indent
|
2016-12-08 19:18:40 +00:00
|
|
|
(bp, (const char *)x->ext.tick, (int)x->ext.ticklen, 4)
|
2015-01-22 03:40:55 +00:00
|
|
|
<= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
2005-09-30 23:35:33 +00:00
|
|
|
#ifndef OPENSSL_NO_COMP
|
2015-01-22 03:40:55 +00:00
|
|
|
if (x->compress_meth != 0) {
|
|
|
|
SSL_COMP *comp = NULL;
|
Updates to the new SSL compression code
[Eric A. Young, (from changes to C2Net SSLeay, integrated by Mark Cox)]
Fix so that the version number in the master secret, when passed
via RSA, checks that if TLS was proposed, but we roll back to SSLv3
(because the server will not accept higher), that the version number
is 0x03,0x01, not 0x03,0x00
[Eric A. Young, (from changes to C2Net SSLeay, integrated by Mark Cox)]
Submitted by:
Reviewed by:
PR:
1999-02-16 09:22:21 +00:00
|
|
|
|
2015-04-16 05:50:03 +00:00
|
|
|
if (!ssl_cipher_get_evp(x, NULL, NULL, NULL, NULL, &comp, 0))
|
2015-03-06 14:37:17 +00:00
|
|
|
goto err;
|
2015-01-22 03:40:55 +00:00
|
|
|
if (comp == NULL) {
|
2016-08-05 17:03:17 +00:00
|
|
|
if (BIO_printf(bp, "\n Compression: %d", x->compress_meth) <= 0)
|
2015-01-22 03:40:55 +00:00
|
|
|
goto err;
|
|
|
|
} else {
|
2015-05-08 16:05:36 +00:00
|
|
|
if (BIO_printf(bp, "\n Compression: %d (%s)", comp->id,
|
2016-08-05 17:03:17 +00:00
|
|
|
comp->name) <= 0)
|
2015-01-22 03:40:55 +00:00
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
}
|
2005-09-30 23:35:33 +00:00
|
|
|
#endif
|
2015-01-22 03:40:55 +00:00
|
|
|
if (x->time != 0L) {
|
|
|
|
if (BIO_printf(bp, "\n Start Time: %ld", x->time) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (x->timeout != 0L) {
|
|
|
|
if (BIO_printf(bp, "\n Timeout : %ld (sec)", x->timeout) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (BIO_puts(bp, "\n") <= 0)
|
|
|
|
goto err;
|
|
|
|
|
|
|
|
if (BIO_puts(bp, " Verify return code: ") <= 0)
|
|
|
|
goto err;
|
|
|
|
if (BIO_printf(bp, "%ld (%s)\n", x->verify_result,
|
|
|
|
X509_verify_cert_error_string(x->verify_result)) <= 0)
|
|
|
|
goto err;
|
2000-01-09 14:21:40 +00:00
|
|
|
|
2015-01-23 02:45:13 +00:00
|
|
|
if (BIO_printf(bp, " Extended master secret: %s\n",
|
|
|
|
x->flags & SSL_SESS_FLAG_EXTMS ? "yes" : "no") <= 0)
|
|
|
|
goto err;
|
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
return (1);
|
|
|
|
err:
|
|
|
|
return (0);
|
|
|
|
}
|
1998-12-21 10:52:47 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
/*
|
|
|
|
* print session id and master key in NSS keylog format (RSA
|
|
|
|
* Session-ID:<session id> Master-Key:<master key>)
|
|
|
|
*/
|
2014-05-23 23:02:24 +00:00
|
|
|
int SSL_SESSION_print_keylog(BIO *bp, const SSL_SESSION *x)
|
2015-01-22 03:40:55 +00:00
|
|
|
{
|
2016-10-04 19:31:19 +00:00
|
|
|
size_t i;
|
2014-05-23 23:02:24 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
if (x == NULL)
|
|
|
|
goto err;
|
|
|
|
if (x->session_id_length == 0 || x->master_key_length == 0)
|
|
|
|
goto err;
|
2014-05-23 23:02:24 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
/*
|
|
|
|
* the RSA prefix is required by the format's definition although there's
|
2016-03-10 20:34:48 +00:00
|
|
|
* nothing RSA-specific in the output, therefore, we don't have to check if
|
2015-01-22 03:40:55 +00:00
|
|
|
* the cipher suite is based on RSA
|
|
|
|
*/
|
|
|
|
if (BIO_puts(bp, "RSA ") <= 0)
|
|
|
|
goto err;
|
2014-05-23 23:02:24 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_puts(bp, "Session-ID:") <= 0)
|
|
|
|
goto err;
|
|
|
|
for (i = 0; i < x->session_id_length; i++) {
|
|
|
|
if (BIO_printf(bp, "%02X", x->session_id[i]) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (BIO_puts(bp, " Master-Key:") <= 0)
|
|
|
|
goto err;
|
2016-10-04 19:31:19 +00:00
|
|
|
for (i = 0; i < x->master_key_length; i++) {
|
2015-01-22 03:40:55 +00:00
|
|
|
if (BIO_printf(bp, "%02X", x->master_key[i]) <= 0)
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
if (BIO_puts(bp, "\n") <= 0)
|
|
|
|
goto err;
|
2014-05-23 23:02:24 +00:00
|
|
|
|
2015-01-22 03:40:55 +00:00
|
|
|
return (1);
|
|
|
|
err:
|
|
|
|
return (0);
|
|
|
|
}
|