/* * tls_api.h * * TLS API for TCP/IP protocol stacks * * Copyright 2017 MZ Automation GmbH * * Abstraction layer for different TLS implementations * * Implementation connects the TLS API layer with the socket API layer * and performs all TLS tasks like handshake, encryption/decryption. * */ #ifndef SRC_TLS_TLS_API_H_ #define SRC_TLS_TLS_API_H_ #include "hal_socket.h" #ifdef __cplusplus extern "C" { #endif typedef struct sTLSConfiguration* TLSConfiguration; typedef struct sTLSSocket* TLSSocket; /** * \brief Create a new \ref TLSConfiguration object to represent TLS configuration and certificates * * \return the new TLS configuration */ TLSConfiguration TLSConfiguration_create(void); /* will be called by stack automatically when appropriate */ void TLSConfiguration_setClientMode(TLSConfiguration self); /** * \brief Enables the validation of the certificate trust chain (enabled by default) * * \param value true to enable chain validation, false to disable */ void TLSConfiguration_setChainValidation(TLSConfiguration self, bool value); /** * \brief Set if only known certificates are accepted. * * If set to true only known certificates are accepted. Connections with unknown certificates * are rejected even if they are signed by a trusted authority. * * \param value true to enable setting, false otherwise */ void TLSConfiguration_setAllowOnlyKnownCertificates(TLSConfiguration self, bool value); /** * \brief Set own certificate (identity) from a byte buffer * * \param certificate the certificate buffer * \param certLen the lenght of the certificate * * \return true, when the certificate was set, false otherwise (e.g. unknown certificate format) */ bool TLSConfiguration_setOwnCertificate(TLSConfiguration self, uint8_t* certificate, int certLen); /** * \brief Set own certificate (identity) from a certificate file * * \param filename of the certificate file * * \return true, when the certificate was set, false otherwise (e.g. unknown certificate format) */ bool TLSConfiguration_setOwnCertificateFromFile(TLSConfiguration self, const char* filename); bool TLSConfiguration_setOwnKey(TLSConfiguration self, uint8_t* key, int keyLen, const char* keyPassword); bool TLSConfiguration_setOwnKeyFromFile(TLSConfiguration self, const char* filename, const char* keyPassword); bool TLSConfiguration_addAllowedCertificate(TLSConfiguration self, uint8_t* certifcate, int certLen); bool TLSConfiguration_addAllowedCertificateFromFile(TLSConfiguration self, const char* filename); bool TLSConfiguration_addCACertificate(TLSConfiguration self, uint8_t* certifcate, int certLen); bool TLSConfiguration_addCACertificateFromFile(TLSConfiguration self, const char* filename); /** * \brief Set the renegotiation timeout. * * After the timeout elapsed a TLS session renegotiation has to occur. * * \param timeInMs session renegotiation timeout in milliseconds */ void TLSConfiguration_setRenegotiationTime(TLSConfiguration self, int timeInMs); void TLSConfiguration_destroy(TLSConfiguration self); TLSSocket TLSSocket_create(Socket socket, TLSConfiguration configuration, bool storeClientCert); /** * \brief Perform a new TLS handshake/session renegotiation */ bool TLSSocket_performHandshake(TLSSocket self); /** * \brief Access the certificate used by the peer * * \param[out] certSize the size of the certificate in bytes * * \return the certificate byte buffer */ uint8_t* TLSSocket_getPeerCertificate(TLSSocket self, int* certSize); /** * \brief read from socket to local buffer (non-blocking) * * The function shall return immediately if no data is available. In this case * the function returns 0. If an error happens the function shall return -1. * * Implementation of this function is MANDATORY * * NOTE: The behaviour of this function changed with version 0.8! * * \param self the client, connection or server socket instance * \param buf the buffer where the read bytes are copied to * \param size the maximum number of bytes to read (size of the provided buffer) * * \return the number of bytes read or -1 if an error occurred */ int TLSSocket_read(TLSSocket self, uint8_t* buf, int size); /** * \brief send a message through the socket * * Implementation of this function is MANDATORY * * \param self client, connection or server socket instance * * \return number of bytes transmitted of -1 in case of an error */ int TLSSocket_write(TLSSocket self, uint8_t* buf, int size); /** * \brief Close the TLS socket and release all resources */ void TLSSocket_close(TLSSocket self); #ifdef __cplusplus } #endif #endif /* SRC_TLS_TLS_API_H_ */