/*
 *  MbedTLS SSL context deserializer from base64 code
 *
 *  Copyright The Mbed TLS Contributors
 *  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.
 */

#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;
    int c = 0;

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

        c = 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 */
