/**
 * @file tls_protocol.h
 * @author Mike Scott
 * @brief TLS 1.3 main client-side protocol functions
 *
 */
// Main TLS 1.3 Protocol

#ifndef TLS_PROTOCOL_H
#define TLS_PROTOCOL_H

#include "tls_keys_calc.h"
#include "tls_cert_chain.h"
#include "tls_client_recv.h"
#include "tls_client_send.h"
#include "tls_tickets.h"
#include "tls_logger.h"

/** @brief initialise a TLS 1.3 session structure
 *
    @param client the socket connection to the Server
    @param hostname the host name (URL) of the server
    @return an initialised TLS1.3 session structure
 */
extern TLS_session TLS13_start(Socket *client,char *hostname);

/** @brief terminate a session structure
 *
    @param session the session structure
 */
extern void TLS13_end(TLS_session *session);


/** @brief stop sending - send CLOSE_NOTIFY and DISCONNECT
 *
    @param session the session structure
 */
extern void TLS13_stop(TLS_session *session);


/** @brief TLS 1.3 forge connection
 *
    @param session an initialised TLS session structure
    @param EARLY some early data to be transmitted
    @return false for failure, true for success
 */
extern bool TLS13_connect(TLS_session *session,octad *EARLY);

/**    @brief TLS 1.3 send data
 *
    @param session an initialised TLS session structure
    @param DATA some data to be transmitted
 */
extern void TLS13_send(TLS_session *session,octad *DATA);

/** @brief TLS 1.3 receive data
 *
    @param session an initialised TLS session structure
    @param DATA that has been received
    @return 0 for time-out, negative for error, or length of data successfully received
 */
extern int TLS13_recv(TLS_session *session,octad *DATA);

/** @brief TLS 1.3 receive data and check for liveness of connection
 *
    @param session an initialised TLS session structure
    @param DATA that has been received
    @return 0 for time-out, negative for error, or length of data successfully received
 */
extern int TLS13_recv_and_check(TLS_session *session,octad *DATA);


/** @brief TLS 1.3 end session, delete keys, clean up buffers
 *
    @param session an initialised TLS session structure
 */
extern void TLS13_clean(TLS_session *session);
#endif