summaryrefslogtreecommitdiff
path: root/src/external.h
blob: e145f917a76cae58173be5e8a07a06746d068e04 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#pragma once
//
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
//

typedef uint8_t byte;

typedef byte ipv4[ 4 ];
typedef byte ipv6[ 16 ];

typedef byte hash[ 32 ];
typedef byte public_key[ 32 ];
typedef byte private_key[ 32 ];
typedef byte signature[ 64 ];

const uint16_t default_port = 8040;

enum client_input {
    // ask server for its information (responds with audit_response)
    audit_server = 0x9a,

    // ask server for a random set of neighbors
    // (input uint8_t neighbor_count, responds with neighbors_info)
    get_neighbors = 0x20,

    // monitor incoming packets
    // (input struct firehose_request, responds with firehose_reply)
    firehose = 0xf1,

    // give a packet to the relay
    // (input struct data_packet, responds with push_packet_result)
    push_packet = 0x88,

    // get a packet from the server
    // (input hash, responds with get_packet_result)
    get_packet = 0x87,

    // register a new neighbor relay to this server
    // (input struct relay_neighbor, responds with register_neighbor_result)
    register_neighbor = 0x73,
};

enum server_reply {
    // pretty self-explanatory.
    error = 0x1,

    // type `struct relay_info`
    audit_response = 0xaf,
    // type `struct relay_neighbor[ neighbor_count ]`
    neighbors_info = 0x43,
    // type `uint64_t new_offset, struct data_packet[ count ]`
    firehose_reply = 0x6c,
    // type `bool result_code`
    push_packet_result = 0x4a,
    // type `struct data_packet`
    get_packet_result = 0x42,
    // type `bool result_code`
    register_neighbor_result = 0x6e,
};

typedef uint8_t get_neighbors_request;

struct firehose_request {
    uint8_t  count;
    uint64_t offset;
};

typedef uint64_t firehose_reply_new_offset;

struct relay_neighbor {
    bool active; // set to 0 to indicate empty quick connect slot

    bool has_ipv4; // whether the neighbor supports ipv4 connection
    bool has_ipv6; // whether the neighbor supports ipv6 connection
    ipv4 v4_addr;  // ipv4 address of the neighbor (if supported)
    ipv6 v6_addr;  // ipv6 address of the neighbor (if supported)
};

struct relay_info {
    // -- version info --
    byte major_version;
    byte minor_version;
    // -- motd --
    byte motd[ 128 ];
    // -- capabilities --
    struct {
        uint16_t retention_hours; // how many hours packets will be retained for
        bool     can_store;       // whether or not the relay is accepting new packets
        byte     leading_zeros;   // relay challenge level
        bool     accepts_plain;   // whether or not the relay accepts unencrypted packets
    } capabilities;
    // -- statistics --
    struct {
        uint16_t              neighbors;          // current neighboring relay count for this relay
        uint64_t              held_packets;       // how many packets the relay is holding
        struct relay_neighbor quick_connect[ 4 ]; // four best neighbors for quick connection
    } statistics;
};

// do not change
#define MAX_RECIPIENTS 32

struct data_packet {
    // nonce + hash for PoW
    uint32_t nonce;
    hash     hash;

    // content inside to be nonce + hashed
    struct {
        bool       encrypted;          // whether the contents is encrypted or plaintext
        uint64_t   created_time_ms;    // unix timestamp for creation time in milliseconds
        public_key author;             // message author
        public_key author_signing_pub; // message signing pubkey
        uint8_t    recipient_count;    // number of recipients. leave as 0 for public.
        public_key recipients[ 32 ];   // up to 32 recipients for packet
        byte       data[ 65536 ];      // packet data
        signature  signature;          // data signature
    } contents;
};

const size_t CONTENTS_SIZE = 1 + 8 + 32 + 32 + 1 + (32 * MAX_RECIPIENTS) + 65536 + 64;
const size_t PACKET_SIZE   = 4 + 32 + (CONTENTS_SIZE);