blob: aa6efc33a78b5c89c151366d82b984e7d98eb4f3 (
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
|
#pragma once
//
#include <stdbool.h>
#include <stddef.h>
#include <stdint.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 ];
typedef byte recipient[ 64 ];
const uint16_t default_port = 8040;
#include "req_res_codes.h"
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.
recipient 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 + (64 * MAX_RECIPIENTS) + 65536 + 64;
const size_t PACKET_SIZE = 4 + 32 + (CONTENTS_SIZE);
|