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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
|
#ifndef AKFS
#define AKFS
#include <stdbool.h>
#include <stddef.h>
/**
* This struct represents a HEX output of the SHA-512 algorithm.
*
*/
typedef struct {
/**
* The array below has size of 8, which can store the 128 characters into
* 16 digit length variables.
*
* While 512bits/8bits=64bytes, into converting to characters, we use 2bytes
* per one digit, which gives us the 128 characters.
*
*/
long unsigned int sum[8];
} sha512sum;
/**
* This struct describes explicitly the structure of a root_hash. It is the root
* of a hash merkle tree. Note, that this structure can be used for roots and
* branches. Possibly, the name will change to something more generic in the
* future.
* Another note is that instead of approaching this as left and right, as seen
* in other codebases, we do a head-tail naming. That's because of the BASH
* implementation that you can find at lib/_ak_fs.
*
*/
typedef struct {
/**
* Hash of the thing
*/
sha512sum root;
/**
* Hash of head
*/
sha512sum head;
/**
* Hash of tail
*/
sha512sum tail;
} root_hash;
/**
* This is the current structure of an akfs_map. Due to potential short-comings
* of it, akfs_map_v4 was introduced. Versions v1 and v2 won't be appearing in
* this header file, since they were long abandoned. Version v0, on the other
* hand, is what is called now as a root_hash. Refer to it for more.
*
*/
typedef struct {
/**
* Original file's hash
*
*/
sha512sum oh;
/**
* Original file's name
*
*/
char filename[256];
/**
* Root hash
*
*/
sha512sum rh;
/**
* Map hash
*
*/
sha512sum mh;
/**
* Should be "level.1.map" at all times
*
*/
char *root_name;
} akfs_map_v3;
/**
* This is a proposed structure for akfs_map. It is called after its version.
* Previous versions have been mostly abandoned, except v3 which is where v4
* was derived from. See akfs_map_v3 for more.
*
*/
typedef struct {
/**
* Original file's hash
*
*/
sha512sum oh;
/**
* Original filename's AKFS maphash
*
*/
sha512sum fn;
/**
* Root hash
*
*/
sha512sum rh;
/**
* Map hash
*
*/
sha512sum mh;
} akfs_map_v4;
/**
* Gets maps_dir
* return char*
*/
const char* ak_fs_maps_v3_get_dir();
/**
* Experimental
*/
char* ak_fs_return_hash_path(const char*);
/**
* Experimental
*/
char* ak_fs_return_hash_dir(const char*);
/**
* Verify that string looks like a SHA512 hash
*
* param char* string to be checked
* returns boolean
*/
bool ak_fs_verify_input_is_hash(const char*);
/**
* Unused
*/
int ak_fs_create_dir_for_hash(const char*);
/**
* Converts string hash to struct
* @param char* Hash as string
* @param sha512sum* Pointer to a sha512sum
* @returns int Status of exit
*/
int ak_fs_sha512sum_string_to_struct(const char*, sha512sum*);
/**
* Returns struct from string hash
* @param char* Hash as string
* @returns sha512sum* Pointer to a sha512sum
*/
sha512sum* ak_fs_sha512sum_from_string(char*);
/**
* Converts hash struct to string
*/
void ak_fs_sha512sum_struct_to_string(const sha512sum*, char*);
/**
* Opens a map file to an akfs_map_v3 struct
*/
int ak_fs_map_v3_open_from_file(akfs_map_v3*);
/**
* Prints filenames from a map_store
*/
void ak_fs_print_filenames_from_map_store(akfs_map_v3**, size_t);
/**
* Unused
*/
int ak_fs_map_v3_to_file(akfs_map_v3);
/**
* Unused
*/
int ak_fs_convert_map_v3_string_to_struct(const char *, size_t, akfs_map_v3*);
/**
* Unused
*/
void ak_fs_map_v3_print_map_hash(akfs_map_v3*);
/**
* Unused
*/
void ak_fs_map_v3_print_original_hash(akfs_map_v3*);
/**
* Unused
*/
void ak_fs_map_v3_print_root_hash(akfs_map_v3*);
/**
* Unused
*/
void ak_fs_map_v3_print_filename(akfs_map_v3*);
/**
* Unused
*/
void ak_fs_maps_v3_print_filenames(akfs_map_v3**, size_t);
void ak_fs_map_v3_print_as_json(akfs_map_v3*);
/**
* Unused
*/
void ak_fs_map_v3_print(akfs_map_v3*);
/**
* Takes an array of sha512sums (maps) and puts it in an array of maps (v3)
*/
int ak_fs_map_v3_resolve_maps(akfs_map_v3**, size_t);
/**
* Unused
*/
void ak_fs_print_available_maps(sha512sum**, size_t);
/**
* Unused
*/
void ak_fs_maps_v3_print(akfs_map_v3**, size_t);
/**
* Reads maps_dir and outputs it in an array of sha512sum
*/
void ak_fs_prepare_available_maps(sha512sum**, size_t);
/**
* Unused
*/
void ak_fs_get_available_maps_from_fs(sha512sum**, size_t);
/**
* Unused
*/
void ak_fs_print_map_all_avail(sha512sum**, size_t);
/**
* Unused
*/
char* ak_fs_sha512sum_struct_read_as_string(const sha512sum *);
/**
* Unused
*/
void ak_fs_init_string(char *, size_t );
/**
* Unused
*/
bool ak_fs_sha512sum_compare(const sha512sum*, const sha512sum*);
/**
* Unused
*/
bool ak_fs_sha512sum_is_null(const sha512sum*);
/**
* Unused
*/
void ak_fs_sha512sum_init(sha512sum*);
/**
* Unused
*/
void ak_fs_sha512sum_init_avail(sha512sum**, size_t);
/**
* Initialize an akfs_map_v3
*/
void ak_fs_map_v3_init(akfs_map_v3*);
/**
* Initializes an array of akfs_map_v3
*/
void ak_fs_maps_v3_init(akfs_map_v3**, size_t);
/**
* returns: boolean
* param: akfs_map_v3
*/
bool ak_fs_map_v3_is_null(akfs_map_v3*);
/**
* Unused
*/
char* ak_fs_map_v3_get_filename(akfs_map_v3*);
/**
* Unused
*/
sha512sum* ak_fs_map_v3_get_map_hash(akfs_map_v3*);
/**
* Unused
*/
char* ak_fs_map_v3_get_root_hash(akfs_map_v3*);
/**
* Unused
*/
char* ak_fs_map_v3_get_orig_hash(akfs_map_v3*);
/**
* Unused
*/
bool ak_fs_map_v3_compare(akfs_map_v3*, akfs_map_v3*);
/**
* Initializes an array of akfs_map_v4
*/
void ak_fs_init_map_v4_store(akfs_map_v4**, size_t);
/**
* Unused
*/
void ak_fs_map_v4_init(akfs_map_v4*);
/**
* Initializes an array of sha512sum
*/
void ak_fs_init_map_avail(sha512sum**, size_t);
/**
* Unused
*/
bool ak_fs_map_v4_compare(akfs_map_v4*, akfs_map_v4*);
/**
* Unused
*/
bool ak_fs_map_v4_is_null(akfs_map_v4*);
/**
* Unused
*/
char* ak_fs_map_v4_get_filename(akfs_map_v4*);
/**
* Unused
*/
sha512sum* ak_fs_map_v4_get_map_hash(akfs_map_v4*);
/**
* Unused
*/
sha512sum* ak_fs_map_v4_get_root_hash(akfs_map_v4*);
/**
* Unused
*/
sha512sum* ak_fs_map_v4_get_orig_hash(akfs_map_v4*);
/**
* Returns number of files found in maps fs location
*/
size_t ak_fs_maps_v3_found_in_fs();
/**
* Unused
*/
int ak_fs_ls();
/**
* Main function
*/
int ak_fs_main(int, char**);
#endif // AKFS
|