master uint/magnolia / source / net / mc_internal.h
 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 */