/*
 *  MbedTLS SSL context deserializer from base64 code
 *
 *  Copyright (C) 2006-2020, ARM Limited, All Rights Reserved
 *  SPDX-License-Identifier: Apache-2.0
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may
 *  not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *  This file is part of mbed TLS (https://tls.mbed.org)
 */

#if !defined(MBEDTLS_CONFIG_FILE)
#include "mbedtls/config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif

#include <stdio.h>
#include <stdlib.h>

#if !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_ERROR_C)
int main( void )
{
    printf("MBEDTLS_X509_CRT_PARSE_C and/or MBEDTLS_ERROR_C not defined.\n");
    return( 0 );
}
#else

#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE 1
#endif

#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <time.h>
#include "mbedtls/ssl.h"
#include "mbedtls/error.h"
#include "mbedtls/base64.h"
#include "mbedtls/md.h"
#include "mbedtls/md_internal.h"
#include "mbedtls/x509_crt.h"
#include "mbedtls/ssl_ciphersuites.h"

/*
 * This program version
 */
#define PROG_NAME "ssl_context_info"
#define VER_MAJOR 0
#define VER_MINOR 1

/*
 * Flags copied from the Mbed TLS library.
 */
#define SESSION_CONFIG_TIME_BIT          ( 1 << 0 )
#define SESSION_CONFIG_CRT_BIT           ( 1 << 1 )
#define SESSION_CONFIG_CLIENT_TICKET_BIT ( 1 << 2 )
#define SESSION_CONFIG_MFL_BIT           ( 1 << 3 )
#define SESSION_CONFIG_TRUNC_HMAC_BIT    ( 1 << 4 )
#define SESSION_CONFIG_ETM_BIT           ( 1 << 5 )
#define SESSION_CONFIG_TICKET_BIT        ( 1 << 6 )

#define CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT    ( 1 << 0 )
#define CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT     ( 1 << 1 )
#define CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT      ( 1 << 2 )
#define CONTEXT_CONFIG_ALPN_BIT                  ( 1 << 3 )

#define TRANSFORM_RANDBYTE_LEN  64

/*
 * Minimum and maximum number of bytes for specific data: context, sessions,
 * certificates, tickets and buffers in the program. The context and session
 * size values have been calculated based on the 'print_deserialized_ssl_context()'
 * and 'print_deserialized_ssl_session()' content.
 */
#define MIN_CONTEXT_LEN     84
#define MIN_SESSION_LEN     88

#define MAX_CONTEXT_LEN     875     /* without session data */
#define MAX_SESSION_LEN     109     /* without certificate and ticket data */
#define MAX_CERTIFICATE_LEN ( ( 1 << 24 ) - 1 )
#define MAX_TICKET_LEN      ( ( 1 << 24 ) - 1 )

#define MIN_SERIALIZED_DATA ( MIN_CONTEXT_LEN + MIN_SESSION_LEN )
#define MAX_SERIALIZED_DATA ( MAX_CONTEXT_LEN + MAX_SESSION_LEN + \
                              MAX_CERTIFICATE_LEN + MAX_TICKET_LEN )

#define MIN_BASE64_LEN      ( MIN_SERIALIZED_DATA * 4 / 3 )
#define MAX_BASE64_LEN      ( MAX_SERIALIZED_DATA * 4 / 3 + 3 )

/*
 * A macro that prevents from reading out of the ssl buffer range.
 */
#define CHECK_SSL_END( LEN )            \
do                                      \
{                                       \
    if( end - ssl < (int)( LEN ) )      \
    {                                   \
        printf_err( "%s", buf_ln_err ); \
        return;                         \
    }                                   \
} while( 0 )

/*
 * Global values
 */
FILE *b64_file = NULL;                  /* file with base64 codes to deserialize */
char conf_keep_peer_certificate = 1;    /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE from mbedTLS configuration */
char conf_dtls_proto = 1;               /* MBEDTLS_SSL_PROTO_DTLS from mbedTLS configuration */
char debug = 0;                         /* flag for debug messages */
const char alloc_err[] = "Cannot allocate memory\n";
const char buf_ln_err[] = "Buffer does not have enough data to complete the parsing\n";

/*
 * Basic printing functions
 */
void print_version( )
{
    printf( "%s v%d.%d\n", PROG_NAME, VER_MAJOR, VER_MINOR );
}

void print_usage( )
{
    print_version();
    printf( "\nThis program is used to deserialize an Mbed TLS SSL session from the base64 code provided\n"
            "in the text file. The program can deserialize many codes from one file, but they must be\n"
            "separated, e.g. by a newline.\n\n" );
    printf(
        "Usage:\n"
        "\t-f path            - Path to the file with base64 code\n"
        "\t-v                 - Show version\n"
        "\t-h                 - Show this usage\n"
        "\t-d                 - Print more information\n"
        "\t--keep-peer-cert=0 - Use this option if you know that the Mbed TLS library\n"
        "\t                     has been compiled with the MBEDTLS_SSL_KEEP_PEER_CERTIFICATE\n"
        "\t                     flag. You can also use it if there are some problems with reading\n"
        "\t                     the information about certificate\n"
        "\t--dtls-protocol=0  - Use this option if you know that the Mbed TLS library\n"
        "\t                     has been compiled without the MBEDTLS_SSL_PROTO_DTLS flag\n"
        "\n"
    );
}

void printf_dbg( const char *str, ... )
{
    if( debug )
    {
        va_list args;
        va_start( args, str );
        printf( "debug: " );
        vprintf( str, args );
        fflush( stdout );
        va_end( args );
    }
}

void printf_err( const char *str, ... )
{
    va_list args;
    va_start( args, str );
    fflush( stdout );
    fprintf( stderr, "ERROR: " );
    vfprintf( stderr, str, args );
    fflush( stderr );
    va_end( args );
}

/*
 * Exit from the program in case of error
 */
void error_exit()
{
    if( NULL != b64_file )
    {
        fclose( b64_file );
    }
    exit( -1 );
}

/*
 * This function takes the input arguments of this program
 */
void parse_arguments( int argc, char *argv[] )
{
    int i = 1;

    if( argc < 2 )
    {
        print_usage();
        error_exit();
    }

    while( i < argc )
    {
        if( strcmp( argv[i], "-d" ) == 0 )
        {
            debug = 1;
        }
        else if( strcmp( argv[i], "-h" ) == 0 )
        {
            print_usage();
        }
        else if( strcmp( argv[i], "-v" ) == 0 )
        {
            print_version();
        }
        else if( strcmp( argv[i], "-f" ) == 0 )
        {
            if( ++i >= argc )
            {
                printf_err( "File path is empty\n" );
                error_exit();
            }

            if( ( b64_file = fopen( argv[i], "r" ) ) == NULL )
            {
                printf_err( "Cannot find file \"%s\"\n", argv[i] );
                error_exit();
            }
        }
        else if( strcmp( argv[i], "--keep-peer-cert=0" ) == 0 )
        {
            conf_keep_peer_certificate = 0;
        }
        else if( strcmp( argv[i], "--dtls-protocol=0" ) == 0 )
        {
            conf_dtls_proto = 0;
        }
        else
        {
            print_usage();
            error_exit();
        }

        i++;
    }
}

/*
 * This function prints base64 code to the stdout
 */
void print_b64( const uint8_t *b, size_t len )
{
    size_t i = 0;
    const uint8_t *end = b + len;
    printf("\t");
    while( b < end )
    {
        if( ++i > 75 )
        {
            printf( "\n\t" );
            i = 0;
        }
        printf( "%c", *b++ );
    }
    printf( "\n" );
    fflush( stdout );
}

/*
 * This function prints hex code from the buffer to the stdout.
 *
 * /p b         buffer with data to print
 * /p len       number of bytes to print
 * /p in_line   number of bytes in one line
 * /p prefix    prefix for the new lines
 */
void print_hex( const uint8_t *b, size_t len,
                const size_t in_line, const char *prefix )
{
    size_t i = 0;
    const uint8_t *end = b + len;

    if( prefix == NULL )
    {
        prefix = "";
    }

    while( b < end )
    {
        if( ++i > in_line )
        {
            printf( "\n%s", prefix );
            i = 1;
        }
        printf( "%02X ", (uint8_t) *b++ );
    }
    printf("\n");
    fflush(stdout);
}

/*
 *  Print the value of time_t in format e.g. 2020-01-23 13:05:59
 */
void print_time( const time_t *time )
{
    char buf[20];
    struct tm *t = gmtime( time );
    static const char format[] = "%Y-%m-%d %H:%M:%S";
    if( NULL != t )
    {
        strftime( buf, sizeof( buf ), format, t );
        printf( "%s\n", buf );
    }
    else
    {
        printf( "unknown\n" );
    }
}

/*
 * Print the input string if the bit is set in the value
 */
void print_if_bit( const char *str, int bit, int val )
{
    if( bit & val )
    {
        printf( "\t%s\n", str );
    }
}

/*
 * Return pointer to hardcoded "enabled" or "disabled" depending on the input value
 */
const char * get_enabled_str( int is_en )
{
    return ( is_en ) ? "enabled" : "disabled";
}

/*
 * Return pointer to hardcoded MFL string value depending on the MFL code at the input
 */
const char * get_mfl_str( int mfl_code )
{
    switch( mfl_code )
    {
        case MBEDTLS_SSL_MAX_FRAG_LEN_NONE:
            return "none";
        case MBEDTLS_SSL_MAX_FRAG_LEN_512:
            return "512";
        case MBEDTLS_SSL_MAX_FRAG_LEN_1024:
            return "1024";
        case MBEDTLS_SSL_MAX_FRAG_LEN_2048:
            return "2048";
        case MBEDTLS_SSL_MAX_FRAG_LEN_4096:
            return "4096";
        default:
            return "error";
    }
}

/*
 * Read next base64 code from the 'b64_file'. The 'b64_file' must be opened
 * previously. After each call to this function, the internal file position
 * indicator of the global b64_file is advanced.
 *
 * Note - This function checks the size of the input buffer and if necessary,
 *        increases it to the maximum MAX_BASE64_LEN
 *
 * /p b64       pointer to the pointer of the buffer for input data
 * /p max_len   pointer to the current buffer capacity. It can be changed if
 *              the buffer needs to be increased
 *
 * \retval      number of bytes written in to the b64 buffer or 0 in case no more
 *              data was found
 */
size_t read_next_b64_code( uint8_t **b64, size_t *max_len )
{
    int valid_balance = 0;  /* balance between valid and invalid characters */
    size_t len = 0;
    char pad = 0;
    char c = 0;

    while( EOF != c )
    {
        char c_valid = 0;

        c = (char) fgetc( b64_file );

        if( pad > 0 )
        {
            if( c == '=' && pad == 1 )
            {
                c_valid = 1;
                pad = 2;
            }
        }
        else if( ( c >= 'A' && c <= 'Z' ) ||
                 ( c >= 'a' && c <= 'z' ) ||
                 ( c >= '0' && c <= '9' ) ||
                   c == '+' || c == '/' )
        {
            c_valid = 1;
        }
        else if( c == '=' )
        {
            c_valid = 1;
            pad = 1;
        }
        else if( c == '-' )
        {
            c = '+';
            c_valid = 1;
        }
        else if( c == '_' )
        {
            c = '/';
            c_valid = 1;
        }

        if( c_valid )
        {
            /* A string of characters that could be a base64 code. */
            valid_balance++;

            if( len < *max_len )
            {
                ( *b64 )[ len++ ] = c;
            }
            else if( *max_len < MAX_BASE64_LEN )
            {
                /* Current buffer is too small, but can be resized. */
                void *ptr;
                size_t new_size = ( MAX_BASE64_LEN - 4096 > *max_len ) ?
                                  *max_len + 4096 : MAX_BASE64_LEN;

                ptr = realloc( *b64, new_size );
                if( NULL == ptr )
                {
                    printf_err( alloc_err );
                    return 0;
                }
                *b64 = ptr;
                *max_len = new_size;
                ( *b64 )[ len++ ] = c;
            }
            else
            {
                /* Too much data so it will be treated as invalid */
                len++;
            }
        }
        else if( len > 0 )
        {
            /* End of a string that could be a base64 code, but need to check
             * that the length of the characters is correct. */

            valid_balance--;

            if( len < MIN_CONTEXT_LEN )
            {
                printf_dbg( "The code found is too small to be a SSL context.\n" );
                len = pad = 0;
            }
            else if( len > *max_len )
            {
                printf_err( "The code found is too large by %u bytes.\n", len - *max_len );
                len = pad = 0;
            }
            else if( len % 4 != 0 )
            {
                printf_err( "The length of the base64 code found should be a multiple of 4.\n" );
                len = pad = 0;
            }
            else
            {
                /* Base64 code with valid character length. */
                return len;
            }
        }
        else
        {
            valid_balance--;
        }

        /* Detection of potentially wrong file format like: binary, zip, ISO, etc. */
        if( valid_balance < -100 )
        {
            printf_err( "Too many bad symbols detected. File check aborted.\n" );
            return 0;
        }
    }

    printf_dbg( "End of file\n" );
    return 0;
}

/*
 * This function deserializes and prints to the stdout all obtained information
 * about the certificates from provided data.
 *
 * /p ssl   pointer to serialized certificate
 * /p len   number of bytes in the buffer
*/
void print_deserialized_ssl_cert( const uint8_t *ssl, uint32_t len )
{
    enum { STRLEN = 4096 };
    mbedtls_x509_crt crt;
    int ret;
    char str[STRLEN];

    printf( "\nCertificate:\n" );

    mbedtls_x509_crt_init( &crt );
    ret = mbedtls_x509_crt_parse_der( &crt, ssl, len );
    if( 0 != ret )
    {
        mbedtls_strerror( ret, str, STRLEN );
        printf_err( "Invalid format of X.509 - %s\n", str );
        printf( "Cannot deserialize:\n\t" );
        print_hex( ssl, len, 25, "\t" );
    }
    else
    {
        mbedtls_x509_crt *current = &crt;

        while( current != NULL )
        {
            ret = mbedtls_x509_crt_info( str, STRLEN, "\t", current );
            if( 0 > ret )
            {
                mbedtls_strerror( ret, str, STRLEN );
                printf_err( "Cannot write to the output - %s\n", str );
            }
            else
            {
                printf( "%s", str );
            }

            current = current->next;

            if( current )
            {
                printf( "\n" );
            }

        }
    }

   mbedtls_x509_crt_free( &crt );
}

/*
 * This function deserializes and prints to the stdout all obtained information
 * about the session from provided data. This function was built based on
 * mbedtls_ssl_session_load(). mbedtls_ssl_session_load() could not be used
 * due to dependencies on the mbedTLS configuration.
 *
 * The data structure in the buffer:
 *  uint64 start_time;
 *  uint8 ciphersuite[2];        // defined by the standard
 *  uint8 compression;           // 0 or 1
 *  uint8 session_id_len;        // at most 32
 *  opaque session_id[32];
 *  opaque master[48];           // fixed length in the standard
 *  uint32 verify_result;
 *  opaque peer_cert<0..2^24-1>; // length 0 means no peer cert
 *  opaque ticket<0..2^24-1>;    // length 0 means no ticket
 *  uint32 ticket_lifetime;
 *  uint8 mfl_code;              // up to 255 according to standard
 *  uint8 trunc_hmac;            // 0 or 1
 *  uint8 encrypt_then_mac;      // 0 or 1
 *
 * /p ssl               pointer to serialized session
 * /p len               number of bytes in the buffer
 * /p session_cfg_flag  session configuration flags
 */
void print_deserialized_ssl_session( const uint8_t *ssl, uint32_t len,
                                     int session_cfg_flag )
{
    const struct mbedtls_ssl_ciphersuite_t * ciphersuite_info;
    int ciphersuite_id;
    uint32_t cert_len, ticket_len;
    uint32_t verify_result, ticket_lifetime;
    const uint8_t *end = ssl + len;

    printf( "\nSession info:\n" );

    if( session_cfg_flag & SESSION_CONFIG_TIME_BIT )
    {
        uint64_t start;
        CHECK_SSL_END( 8 );
        start = ( (uint64_t) ssl[0] << 56 ) |
                ( (uint64_t) ssl[1] << 48 ) |
                ( (uint64_t) ssl[2] << 40 ) |
                ( (uint64_t) ssl[3] << 32 ) |
                ( (uint64_t) ssl[4] << 24 ) |
                ( (uint64_t) ssl[5] << 16 ) |
                ( (uint64_t) ssl[6] <<  8 ) |
                ( (uint64_t) ssl[7] );
        ssl += 8;
        printf( "\tstart time     : " );
        print_time( (time_t*) &start );
    }

    CHECK_SSL_END( 2 );
    ciphersuite_id = ( (int) ssl[0] << 8 ) | (int) ssl[1];
    printf_dbg( "Ciphersuite ID: %d\n", ciphersuite_id );
    ssl += 2;

    ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );
    if( ciphersuite_info == NULL )
    {
        printf_err( "Cannot find ciphersuite info\n" );
    }
    else
    {
        const mbedtls_cipher_info_t *cipher_info;
        const mbedtls_md_info_t *md_info;

        printf( "\tciphersuite    : %s\n", ciphersuite_info->name );
        printf( "\tcipher flags   : 0x%02X\n", ciphersuite_info->flags );

        cipher_info = mbedtls_cipher_info_from_type( ciphersuite_info->cipher );
        if( cipher_info == NULL )
        {
            printf_err( "Cannot find cipher info\n" );
        }
        else
        {
            printf( "\tcipher         : %s\n", cipher_info->name );
        }

        md_info = mbedtls_md_info_from_type( ciphersuite_info->mac );
        if( md_info == NULL )
        {
            printf_err( "Cannot find Message-Digest info\n" );
        }
        else
        {
            printf( "\tMessage-Digest : %s\n", md_info->name );
        }
    }

    CHECK_SSL_END( 1 );
    printf( "\tcompression    : %s\n", get_enabled_str( *ssl++ ) );

    /* Note - Here we can get session ID length from serialized data, but we
     * use hardcoded 32-bytes length. This approach was taken from
     * 'mbedtls_ssl_session_load()'. */
    CHECK_SSL_END( 1 + 32 );
    printf_dbg( "Session id length: %u\n", (uint32_t) *ssl++ );
    printf( "\tsession ID     : ");
    print_hex( ssl, 32, 16, "\t                 " );
    ssl += 32;

    printf( "\tmaster secret  : ");
    CHECK_SSL_END( 48 );
    print_hex( ssl, 48, 16, "\t                 " );
    ssl += 48;

    CHECK_SSL_END( 4 );
    verify_result = ( (uint32_t) ssl[0] << 24 ) |
                    ( (uint32_t) ssl[1] << 16 ) |
                    ( (uint32_t) ssl[2] <<  8 ) |
                    ( (uint32_t) ssl[3] );
    ssl += 4;
    printf( "\tverify result  : 0x%08X\n", verify_result );

    if( SESSION_CONFIG_CRT_BIT & session_cfg_flag )
    {
        if( conf_keep_peer_certificate )
        {
            CHECK_SSL_END( 3 );
            cert_len = ( (uint32_t) ssl[0] << 16 ) |
                       ( (uint32_t) ssl[1] <<  8 ) |
                       ( (uint32_t) ssl[2] );
            ssl += 3;
            printf_dbg( "Certificate length: %u\n", cert_len );

            if( cert_len > 0 )
            {
                CHECK_SSL_END( cert_len );
                print_deserialized_ssl_cert( ssl, cert_len );
                ssl += cert_len;
            }
        }
        else
        {
            printf( "\tPeer digest    : " );

            CHECK_SSL_END( 1 );
            switch( (mbedtls_md_type_t) *ssl++ )
            {
                case MBEDTLS_MD_NONE:
                    printf( "none\n" );
                    break;
                case MBEDTLS_MD_MD2:
                    printf( "MD2\n" );
                    break;
                case MBEDTLS_MD_MD4:
                    printf( "MD4\n" );
                    break;
                case MBEDTLS_MD_MD5:
                    printf( "MD5\n" );
                    break;
                case MBEDTLS_MD_SHA1:
                    printf( "SHA1\n" );
                    break;
                case MBEDTLS_MD_SHA224:
                    printf( "SHA224\n" );
                    break;
                case MBEDTLS_MD_SHA256:
                    printf( "SHA256\n" );
                    break;
                case MBEDTLS_MD_SHA384:
                    printf( "SHA384\n" );
                    break;
                case MBEDTLS_MD_SHA512:
                    printf( "SHA512\n" );
                    break;
                case MBEDTLS_MD_RIPEMD160:
                    printf( "RIPEMD160\n" );
                    break;
                default:
                    printf( "undefined or erroneous\n" );
                    break;
            }

            CHECK_SSL_END( 1 );
            cert_len  = (uint32_t) *ssl++;
            printf_dbg( "Message-Digest length: %u\n", cert_len );

            if( cert_len > 0 )
            {
                printf( "\tPeer digest cert : " );
                CHECK_SSL_END( cert_len );
                print_hex( ssl, cert_len, 16, "\t                   " );
                ssl += cert_len;
            }
        }
    }

    if( SESSION_CONFIG_CLIENT_TICKET_BIT & session_cfg_flag )
    {
        printf( "\nTicket:\n" );

        CHECK_SSL_END( 3 );
        ticket_len = ( (uint32_t) ssl[0] << 16 ) |
                     ( (uint32_t) ssl[1] <<  8 ) |
                     ( (uint32_t) ssl[2] );
        ssl += 3;
        printf_dbg( "Ticket length: %u\n", ticket_len );

        if( ticket_len > 0 )
        {
            printf( "\t" );
            CHECK_SSL_END( ticket_len );
            print_hex( ssl, ticket_len, 22, "\t" );
            ssl += ticket_len;
            printf( "\n" );
        }

        CHECK_SSL_END( 4 );
        ticket_lifetime = ( (uint32_t) ssl[0] << 24 ) |
                          ( (uint32_t) ssl[1] << 16 ) |
                          ( (uint32_t) ssl[2] <<  8 ) |
                          ( (uint32_t) ssl[3] );
        ssl += 4;
        printf( "\tlifetime : %u sec.\n", ticket_lifetime );
    }

    if( ssl < end )
    {
        printf( "\nSession others:\n" );
    }

    if( SESSION_CONFIG_MFL_BIT & session_cfg_flag )
    {
        CHECK_SSL_END( 1 );
        printf( "\tMFL                      : %s\n", get_mfl_str( *ssl++ ) );
    }

    if( SESSION_CONFIG_TRUNC_HMAC_BIT & session_cfg_flag )
    {
        CHECK_SSL_END( 1 );
        printf( "\tnegotiate truncated HMAC : %s\n", get_enabled_str( *ssl++ ) );
    }

    if( SESSION_CONFIG_ETM_BIT & session_cfg_flag )
    {
        CHECK_SSL_END( 1 );
        printf( "\tEncrypt-then-MAC         : %s\n", get_enabled_str( *ssl++ ) );
    }

    if( 0 != ( end - ssl ) )
    {
        printf_err( "%i bytes left to analyze from session\n", (int32_t)( end - ssl ) );
    }
}

/*
 * This function deserializes and prints to the stdout all obtained information
 * about the context from provided data. This function was built based on
 * mbedtls_ssl_context_load(). mbedtls_ssl_context_load() could not be used
 * due to dependencies on the mbedTLS configuration and the configuration of
 * the context when serialization was created.
 *
 * The data structure in the buffer:
 *  // header
 *  uint8 version[3];
 *  uint8 configuration[5];
 *  // session sub-structure
 *  uint32_t session_len;
 *  opaque session<1..2^32-1>;  // see mbedtls_ssl_session_save()
 *  // transform sub-structure
 *  uint8 random[64];           // ServerHello.random+ClientHello.random
 *  uint8 in_cid_len;
 *  uint8 in_cid<0..2^8-1>      // Connection ID: expected incoming value
 *  uint8 out_cid_len;
 *  uint8 out_cid<0..2^8-1>     // Connection ID: outgoing value to use
 *  // fields from ssl_context
 *  uint32 badmac_seen;         // DTLS: number of records with failing MAC
 *  uint64 in_window_top;       // DTLS: last validated record seq_num
 *  uint64 in_window;           // DTLS: bitmask for replay protection
 *  uint8 disable_datagram_packing; // DTLS: only one record per datagram
 *  uint64 cur_out_ctr;         // Record layer: outgoing sequence number
 *  uint16 mtu;                 // DTLS: path mtu (max outgoing fragment size)
 *  uint8 alpn_chosen_len;
 *  uint8 alpn_chosen<0..2^8-1> // ALPN: negotiated application protocol
 *
 * /p ssl   pointer to serialized session
 * /p len   number of bytes in the buffer
 */
void print_deserialized_ssl_context( const uint8_t *ssl, size_t len )
{
    const uint8_t *end = ssl + len;
    uint32_t session_len;
    int session_cfg_flag;
    int context_cfg_flag;

    printf( "\nMbed TLS version:\n" );

    CHECK_SSL_END( 3 + 2 + 3 );

    printf( "\tmajor    %u\n", (uint32_t) *ssl++ );
    printf( "\tminor    %u\n", (uint32_t) *ssl++ );
    printf( "\tpath     %u\n", (uint32_t) *ssl++ );

    printf( "\nEnabled session and context configuration:\n" );

    session_cfg_flag = ( (int) ssl[0] << 8 ) | ( (int) ssl[1] );
    ssl += 2;

    context_cfg_flag = ( (int) ssl[0] << 16 ) |
                       ( (int) ssl[1] <<  8 ) |
                       ( (int) ssl[2] ) ;
    ssl += 3;

    printf_dbg( "Session config flags 0x%04X\n", session_cfg_flag );
    printf_dbg( "Context config flags 0x%06X\n", context_cfg_flag );

    print_if_bit( "MBEDTLS_HAVE_TIME", SESSION_CONFIG_TIME_BIT, session_cfg_flag );
    print_if_bit( "MBEDTLS_X509_CRT_PARSE_C", SESSION_CONFIG_CRT_BIT, session_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH", SESSION_CONFIG_MFL_BIT, session_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_TRUNCATED_HMAC", SESSION_CONFIG_TRUNC_HMAC_BIT, session_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_ENCRYPT_THEN_MAC", SESSION_CONFIG_ETM_BIT, session_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_SESSION_TICKETS", SESSION_CONFIG_TICKET_BIT, session_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_SESSION_TICKETS and client", SESSION_CONFIG_CLIENT_TICKET_BIT, session_cfg_flag );

    print_if_bit( "MBEDTLS_SSL_DTLS_CONNECTION_ID", CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT, context_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_DTLS_BADMAC_LIMIT", CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT, context_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_DTLS_ANTI_REPLAY", CONTEXT_CONFIG_DTLS_ANTI_REPLAY_BIT, context_cfg_flag );
    print_if_bit( "MBEDTLS_SSL_ALPN", CONTEXT_CONFIG_ALPN_BIT, context_cfg_flag );

    CHECK_SSL_END( 4 );
    session_len = ( (uint32_t) ssl[0] << 24 ) |
                  ( (uint32_t) ssl[1] << 16 ) |
                  ( (uint32_t) ssl[2] <<  8 ) |
                  ( (uint32_t) ssl[3] );
    ssl += 4;
    printf_dbg( "Session length %u\n", session_len );

    CHECK_SSL_END( session_len );
    print_deserialized_ssl_session( ssl, session_len, session_cfg_flag );
    ssl += session_len;

    printf( "\nRandom bytes:\n\t");

    CHECK_SSL_END( TRANSFORM_RANDBYTE_LEN );
    print_hex( ssl, TRANSFORM_RANDBYTE_LEN, 22, "\t" );
    ssl += TRANSFORM_RANDBYTE_LEN;

    printf( "\nContext others:\n" );

    if( CONTEXT_CONFIG_DTLS_CONNECTION_ID_BIT & context_cfg_flag )
    {
        uint8_t cid_len;

        CHECK_SSL_END( 1 );
        cid_len = *ssl++;
        printf_dbg( "In CID length %u\n", (uint32_t) cid_len );

        printf( "\tin CID                             : " );
        if( cid_len > 0 )
        {
            CHECK_SSL_END( cid_len );
            print_hex( ssl, cid_len, 20, "\t" );
            ssl += cid_len;
        }
        else
        {
            printf( "none\n" );
        }

        CHECK_SSL_END( 1 );
        cid_len = *ssl++;
        printf_dbg( "Out CID length %u\n", (uint32_t) cid_len );

        printf( "\tout CID                            : " );
        if( cid_len > 0 )
        {
            CHECK_SSL_END( cid_len );
            print_hex( ssl, cid_len, 20, "\t" );
            ssl += cid_len;
        }
        else
        {
            printf( "none\n" );
        }
    }

    if( CONTEXT_CONFIG_DTLS_BADMAC_LIMIT_BIT & context_cfg_flag )
    {
        uint32_t badmac_seen;

        CHECK_SSL_END( 4 );
        badmac_seen = ( (uint32_t) ssl[0] << 24 ) |
                      ( (uint32_t) ssl[1] << 16 ) |
                      ( (uint32_t) ssl[2] <<  8 ) |
                      ( (uint32_t) ssl[3] );
        ssl += 4;
        printf( "\tbad MAC seen number                : %u\n", badmac_seen );

        /* value 'in_window_top' from mbedtls_ssl_context */
        printf( "\tlast validated record sequence no. : " );
        CHECK_SSL_END( 8 );
        print_hex( ssl, 8, 20, "" );
        ssl += 8;

        /* value 'in_window' from mbedtls_ssl_context */
        printf( "\tbitmask for replay detection       : " );
        CHECK_SSL_END( 8 );
        print_hex( ssl, 8, 20, "" );
        ssl += 8;
    }

    if( conf_dtls_proto )
    {
        CHECK_SSL_END( 1 );
        printf( "\tDTLS datagram packing              : %s\n",
                get_enabled_str( ! ( *ssl++ ) ) );
    }

    /* value 'cur_out_ctr' from mbedtls_ssl_context */
    printf( "\toutgoing record sequence no.       : ");
    CHECK_SSL_END( 8 );
    print_hex( ssl, 8, 20, "" );
    ssl += 8;

    if( conf_dtls_proto )
    {
        uint16_t mtu;
        CHECK_SSL_END( 2 );
        mtu = ( ssl[0] << 8 ) | ssl[1];
        ssl += 2;
        printf( "\tMTU                                : %u\n", mtu );
    }


    if( CONTEXT_CONFIG_ALPN_BIT & context_cfg_flag )
    {
        uint8_t alpn_len;

        CHECK_SSL_END( 1 );
        alpn_len = *ssl++;
        printf_dbg( "ALPN length %u\n", (uint32_t) alpn_len );

        printf( "\tALPN negotiation                   : " );
        CHECK_SSL_END( alpn_len );
        if( alpn_len > 0 )
        {
            if( strlen( (const char*) ssl ) == alpn_len )
            {
                printf( "%s\n", ssl );
            }
            else
            {
                printf( "\n" );
                printf_err( "\tALPN negotiation is incorrect\n" );
            }
            ssl += alpn_len;
        }
        else
        {
            printf( "not selected\n" );
        }
    }

    if( 0 != ( end - ssl ) )
    {
        printf_err( "%i bytes left to analyze from context\n", (int32_t)( end - ssl ) );
    }
    printf( "\n" );
}

int main( int argc, char *argv[] )
{
    enum { SSL_INIT_LEN = 4096 };

    uint32_t b64_counter = 0;
    uint8_t *b64_buf = NULL;
    uint8_t *ssl_buf = NULL;
    size_t b64_max_len = SSL_INIT_LEN;
    size_t ssl_max_len = SSL_INIT_LEN;
    size_t ssl_len = 0;

     /* The 'b64_file' is opened when parsing arguments to check that the
      * file name is correct */
    parse_arguments( argc, argv );

    if( NULL != b64_file )
    {
        b64_buf = malloc( SSL_INIT_LEN );
        ssl_buf = malloc( SSL_INIT_LEN );

        if( NULL == b64_buf || NULL == ssl_buf )
        {
            printf_err( alloc_err );
            fclose( b64_file );
            b64_file = NULL;
        }
    }

    while( NULL != b64_file )
    {
        size_t b64_len = read_next_b64_code( &b64_buf, &b64_max_len );
        if( b64_len > 0)
        {
            int ret;
            size_t ssl_required_len = b64_len * 3 / 4 + 1;

            /* Allocate more memory if necessary. */
            if( ssl_required_len > ssl_max_len )
            {
                void *ptr = realloc( ssl_buf, ssl_required_len );
                if( NULL == ptr )
                {
                    printf_err( alloc_err );
                    fclose( b64_file );
                    b64_file = NULL;
                    break;
                }
                ssl_buf = ptr;
                ssl_max_len = ssl_required_len;
            }

            printf( "\nDeserializing number %u:\n",  ++b64_counter );

            printf( "\nBase64 code:\n" );
            print_b64( b64_buf, b64_len );

            ret = mbedtls_base64_decode( ssl_buf, ssl_max_len, &ssl_len, b64_buf, b64_len );
            if( ret != 0)
            {
                mbedtls_strerror( ret, (char*) b64_buf, b64_max_len );
                printf_err( "base64 code cannot be decoded - %s\n", b64_buf );
                continue;
            }

            if( debug )
            {
                printf( "\nDecoded data in hex:\n\t");
                print_hex( ssl_buf, ssl_len, 25, "\t" );
            }

            print_deserialized_ssl_context( ssl_buf, ssl_len );

        }
        else
        {
            fclose( b64_file );
            b64_file = NULL;
        }
    }

    free( b64_buf );
    free( ssl_buf );

    if( b64_counter > 0 )
    {
        printf_dbg( "Finished. Found %u base64 codes\n", b64_counter );
    }
    else
    {
        printf( "Finished. No valid base64 code found\n" );
    }

    return 0;
}

#endif /* MBEDTLS_X509_CRT_PARSE_C */
