master uint/magnolia / source / mcproto / internal.h
 1#ifndef MCPROTO_INTERNAL_H
 2#define MCPROTO_INTERNAL_H
 3
 4#include <stddef.h>
 5
 6#include <bearssl.h>
 7
 8#include "mcproto/mcproto.h"
 9
10#define MC_MAX_PACKET_SIZE (16u * 1024u * 1024u)
11#define MC_MAX_STRING_SIZE 32767u
12
13typedef struct {
14	u8*    data;
15	size_t size;
16	size_t capacity;
17	/* read offset used by bufread funcs, writes always append at size */
18	size_t cursor;
19} MCBuffer;
20
21typedef struct {
22	br_aes_ct_cbcenc_keys key;
23	u8                    state[16];
24} MCCipher;
25
26struct MCClient {
27	int      socket_fd;
28	char     host[256];
29	u16      port;
30	char     username[17];
31	char     uuid[37];
32	i32      compression_threshold;
33	int      encrypted;
34	MCCipher read_cipher;
35	MCCipher write_cipher;
36};
37
38void mc_set_error(char* error, size_t error_size, const char* fmt, ...);
39
40void bufinit(MCBuffer* buffer);
41void buffree(MCBuffer* buffer);
42int  bufreserve(MCBuffer* buffer, size_t extra);
43int  bufwrite(MCBuffer* buffer, const void* data, size_t size);
44int  bufwrite_u8(MCBuffer* buffer, u8 value);
45int  bufwrite_u16(MCBuffer* buffer, u16 value);
46int  bufwrite_i32(MCBuffer* buffer, i32 value);
47int  bufwrite_i64(MCBuffer* buffer, i64 value);
48int  bufwrite_f32(MCBuffer* buffer, float value);
49int  bufwrite_f64(MCBuffer* buffer, double value);
50int  bufwrite_varint(MCBuffer* buffer, i32 value);
51int  bufwrite_string(MCBuffer* buffer, const char* value);
52
53int bufread(MCBuffer* buffer, void* out, size_t size);
54int bufread_u8(MCBuffer* buffer, u8* value);
55int bufread_u16(MCBuffer* buffer, u16* value);
56int bufread_i32(MCBuffer* buffer, i32* value);
57int bufread_i64(MCBuffer* buffer, i64* value);
58int bufread_f32(MCBuffer* buffer, float* value);
59int bufread_f64(MCBuffer* buffer, double* value);
60int bufread_varint(MCBuffer* buffer, i32* value);
61int bufread_string(MCBuffer* buffer, char* value, size_t value_size);
62int bufread_bytes(MCBuffer* buffer, const u8** value, size_t* size);
63
64void mc_cipher_init(MCCipher* cipher, const u8 key[16]);
65void mc_cipher_encrypt(MCCipher* cipher, u8* data, size_t size);
66void mc_cipher_decrypt(MCCipher* cipher, u8* data, size_t size);
67int  mc_rsa_encrypt(const u8* public_key, size_t public_key_size, const u8* message,
68                    size_t message_size, u8** encrypted, size_t* encrypted_size, char* error,
69                    size_t error_size);
70void mc_server_hash(const char* server_id, const u8 shared_secret[16], const u8* public_key,
71                    size_t public_key_size, char output[42]);
72int  mc_join_server(const MCAccount* account, const char* server_id, const u8 shared_secret[16],
73                    const u8* public_key, size_t public_key_size, char* error, size_t error_size);
74
75#endif /* MCPROTO_INTERNAL_H */