#pragma once
#include <stdint.h>
#include <stdbool.h>
struct wireguard_tunnel;
enum
{
MAX_WIREGUARD_PACKET_SIZE = 65536 + 64,
};
enum result_type
{
WIREGUARD_DONE = 0,
WRITE_TO_NETWORK = 1,
WIREGUARD_ERROR = 2,
WRITE_TO_TUNNEL_IPV4 = 4,
WRITE_TO_TUNNEL_IPV6 = 6,
};
struct wireguard_result
{
enum result_type op;
size_t size;
};
struct stats
{
int64_t time_since_last_handshake;
size_t tx_bytes;
size_t rx_bytes;
float estimated_loss;
int32_t estimated_rtt; uint8_t reserved[56]; };
struct x25519_key
{
uint8_t key[32];
};
struct x25519_key x25519_secret_key();
struct x25519_key x25519_public_key(struct x25519_key private_key);
const char *x25519_key_to_base64(struct x25519_key key);
const char *x25519_key_to_hex(struct x25519_key key);
void x25519_key_to_str_free(const char *key_str);
int check_base64_encoded_x25519_key(const char *key);
bool set_logging_function(void (*log_func)(const char *));
struct wireguard_tunnel *new_tunnel(const char *static_private,
const char *server_static_public,
const char *preshared_key,
uint16_t keep_alive, uint32_t index);
void tunnel_free(struct wireguard_tunnel *);
struct wireguard_result wireguard_write(const struct wireguard_tunnel *tunnel,
const uint8_t *src,
uint32_t src_size,
uint8_t *dst,
uint32_t dst_size);
struct wireguard_result wireguard_read(const struct wireguard_tunnel *tunnel,
const uint8_t *src,
uint32_t src_size,
uint8_t *dst,
uint32_t dst_size);
struct wireguard_result wireguard_tick(const struct wireguard_tunnel *tunnel,
uint8_t *dst,
uint32_t dst_size);
struct wireguard_result wireguard_force_handshake(const struct wireguard_tunnel *tunnel,
uint8_t *dst,
uint32_t dst_size);
struct stats wireguard_stats(const struct wireguard_tunnel *tunnel);