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 */