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