1 /* Copyright (c) 2014, Daniel MartÃ
2 * Copyright (c) 2014-2021, The Tor Project, Inc. */
3 /* See LICENSE for licensing information */
7 * @brief Header for consdiff.c
10 #ifndef TOR_CONSDIFF_H
11 #define TOR_CONSDIFF_H
13 #include "core/or/or.h"
15 char *consensus_diff_generate(const char *cons1
, size_t cons1len
,
16 const char *cons2
, size_t cons2len
);
17 char *consensus_diff_apply(const char *consensus
, size_t consensus_len
,
18 const char *diff
, size_t diff_len
);
20 int looks_like_a_consensus_diff(const char *document
, size_t len
);
22 #ifdef CONSDIFF_PRIVATE
23 #include "lib/container/bitarray.h"
27 /** Line type used for constructing consensus diffs. Each of these lines
28 * refers to a chunk of memory allocated elsewhere, and is not necessarily
29 * NUL-terminated: this helps us avoid copies and save memory. */
30 typedef struct cdline_t
{
35 typedef struct consensus_digest_t
{
36 uint8_t sha3_256
[DIGEST256_LEN
];
39 STATIC smartlist_t
*consdiff_gen_diff(const smartlist_t
*cons1
,
40 const smartlist_t
*cons2
,
41 const consensus_digest_t
*digests1
,
42 const consensus_digest_t
*digests2
,
43 struct memarea_t
*area
);
44 STATIC
char *consdiff_apply_diff(const smartlist_t
*cons1
,
45 const smartlist_t
*diff
,
46 const consensus_digest_t
*digests1
);
47 STATIC
int consdiff_get_digests(const smartlist_t
*diff
,
51 /** Data structure to define a slice of a smarltist. */
52 typedef struct smartlist_slice_t
{
54 * Smartlist that this slice is made from.
55 * References the whole original smartlist that the slice was made out of.
57 const smartlist_t
*list
;
58 /** Starting position of the slice in the smartlist. */
60 /** Length of the slice, i.e. the number of elements it holds. */
63 STATIC smartlist_t
*gen_ed_diff(const smartlist_t
*cons1
,
64 const smartlist_t
*cons2
,
65 struct memarea_t
*area
);
66 STATIC smartlist_t
*apply_ed_diff(const smartlist_t
*cons1
,
67 const smartlist_t
*diff
,
69 STATIC
void calc_changes(smartlist_slice_t
*slice1
, smartlist_slice_t
*slice2
,
70 bitarray_t
*changed1
, bitarray_t
*changed2
);
71 STATIC smartlist_slice_t
*smartlist_slice(const smartlist_t
*list
,
73 STATIC
int next_router(const smartlist_t
*cons
, int cur
);
74 STATIC
int *lcs_lengths(const smartlist_slice_t
*slice1
,
75 const smartlist_slice_t
*slice2
,
77 STATIC
void trim_slices(smartlist_slice_t
*slice1
, smartlist_slice_t
*slice2
);
78 STATIC
int base64cmp(const cdline_t
*hash1
, const cdline_t
*hash2
);
79 STATIC
int get_id_hash(const cdline_t
*line
, cdline_t
*hash_out
);
80 STATIC
int is_valid_router_entry(const cdline_t
*line
);
81 STATIC
int smartlist_slice_string_pos(const smartlist_slice_t
*slice
,
82 const cdline_t
*string
);
83 STATIC
void set_changed(bitarray_t
*changed1
, bitarray_t
*changed2
,
84 const smartlist_slice_t
*slice1
,
85 const smartlist_slice_t
*slice2
);
86 STATIC
int consensus_split_lines(smartlist_t
*out
,
87 const char *s
, size_t len
,
88 struct memarea_t
*area
);
89 STATIC
void smartlist_add_linecpy(smartlist_t
*lst
, struct memarea_t
*area
,
91 STATIC
int lines_eq(const cdline_t
*a
, const cdline_t
*b
);
92 STATIC
int line_str_eq(const cdline_t
*a
, const char *b
);
95 consensus_compute_digest
,(const char *cons
, size_t len
,
96 consensus_digest_t
*digest_out
));
98 consensus_compute_digest_as_signed
,(const char *cons
, size_t len
,
99 consensus_digest_t
*digest_out
));
100 MOCK_DECL(STATIC
int,
101 consensus_digest_eq
,(const uint8_t *d1
,
103 #endif /* defined(CONSDIFF_PRIVATE) */
105 #endif /* !defined(TOR_CONSDIFF_H) */