121 lines
3.6 KiB
C
121 lines
3.6 KiB
C
#ifndef __MBEDSOCK_H__
|
|
#define __MBEDSOCK_H__
|
|
|
|
#include "mbedtls/ssl.h"
|
|
#include "mbedtls/entropy.h"
|
|
#include "mbedtls/net_sockets.h"
|
|
#include "mbedtls/ctr_drbg.h"
|
|
|
|
#include <stdbool.h>
|
|
#include <pthread.h>
|
|
|
|
#define SSL_PERS "moxxmpp_socket"
|
|
#define SSL_PERS_LEN sizeof(SSL_PERS)/sizeof(char)
|
|
|
|
/*
|
|
* The context for the sockets. This must be created once and is shared between all
|
|
* sockets.
|
|
*/
|
|
struct mbedsock_ctx {
|
|
mbedtls_entropy_context entropy;
|
|
mbedtls_ctr_drbg_context ctr_drbg;
|
|
mbedtls_x509_crt chain;
|
|
};
|
|
|
|
/*
|
|
* The data for the socket.
|
|
*/
|
|
struct mbedsock {
|
|
mbedtls_ssl_context ssl;
|
|
mbedtls_ssl_config conf;
|
|
mbedtls_net_context server_fd;
|
|
|
|
// The thread the socket runs in
|
|
pthread_t thread;
|
|
|
|
// The callback function when the read loop is running
|
|
void (*read_cb)(int);
|
|
|
|
// Indicates whether the socket is secured using TLS (true) or not (false).
|
|
bool secure;
|
|
};
|
|
|
|
/*
|
|
* Create a new mbedsock_ctx context and write it to @ctx. @capath is the path
|
|
* to the directory containing the system's .crt root CA files.
|
|
*
|
|
* Returns true if everything went well; something non-zero on errors.
|
|
*/
|
|
int mbedsock_ctx_new(struct mbedsock_ctx *ctx, const char *capath);
|
|
struct mbedsock_ctx *mbedsock_ctx_new_ex(const char *capath);
|
|
|
|
/*
|
|
* Create a new socket using the context @ctx and writes it to @sock. Returns zero
|
|
* on success; something non-zero on error.
|
|
*/
|
|
int mbedsock_new(struct mbedsock_ctx *ctx, struct mbedsock *sock);
|
|
struct mbedsock *mbedsock_new_ex(struct mbedsock_ctx *ctx);
|
|
|
|
/*
|
|
* Free the resources used by @sock.
|
|
*/
|
|
void mbedsock_free(struct mbedsock *sock);
|
|
void mbedsock_free_ex(struct mbedsock *sock);
|
|
|
|
/*
|
|
* Free the resources used by @ctx.
|
|
*/
|
|
void mbedsock_ctx_free(struct mbedsock_ctx *ctx);
|
|
void mbedsock_ctx_free_ex(struct mbedsock_ctx *ctx);
|
|
|
|
/*
|
|
* Performs the TLS handshake and upgrades the connection @sock to a secured one.
|
|
* If @alpn is not NULL, then its value will be used for TLS ALPN. If @sni is not NULL,
|
|
* then its value will be used for Server Name Indication.
|
|
*
|
|
* Returns 0 on success; something non-zero on failure.
|
|
*/
|
|
int mbedsock_do_handshake(struct mbedsock *sock, const char *alpn, const char *sni);
|
|
|
|
/*
|
|
* Use socket @sock to to connect to @host:@port and immediately call
|
|
* mbedsock_do_handshake. @alpn and @sni are used for mbedsock_do_handshake.
|
|
*
|
|
* Returns 0 on success; something non-zero on failure.
|
|
*/
|
|
int mbedsock_connect_secure(struct mbedsock *sock, const char *host, const char *port, const char *alpn, const char *sni);
|
|
|
|
/*
|
|
* Use socket @sock to to connect to @host:@port. The socket is not secured on success.
|
|
*
|
|
* Returns 0 on success; something non-zero on failure.
|
|
*/
|
|
int mbedsock_connect(struct mbedsock *sock, const char *host, const char *port);
|
|
|
|
/*
|
|
* Write @data - @len being the amount of bytes in data to read - to @sock. The function
|
|
* uses @sock's secure attribute to decide whether to use TLS or not.
|
|
*
|
|
* Returns the amount of bytes written on success. The documentation for
|
|
* mbedtls_ssl_write and mbedtls_net_send apply for the return value. Returns -1
|
|
* if an error occurred.
|
|
*/
|
|
int mbedsock_write(struct mbedsock *sock, const unsigned char *data, int len);
|
|
|
|
/*
|
|
* Read data from @sock into @buf. @len is the size of the buffer.
|
|
*
|
|
* Returns the amount of bytes read on success. The documentation for
|
|
* mbedtls_ssl_read and mbedtls_net_recv apply for the return value. Returns -1
|
|
* if an error occurred.
|
|
*/
|
|
int mbedsock_read(struct mbedsock *sock, unsigned char *buf, int len);
|
|
|
|
bool mbedsock_is_secure(struct mbedsock *sock);
|
|
|
|
void mbedsock_set_read_cb(struct mbedsock *sock, void (*read_cb)(int));
|
|
|
|
int mbedsock_run_read_loop(struct mbedsock *sock, unsigned char *buf, int len);
|
|
|
|
#endif // __MBEDSOCK_H__
|