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
|
/*
* Forward error correction based on Vandermonde matrices
*
* (C) 1997-1998 Luigi Rizzo (luigi@iet.unipi.it)
* (C) 2009,2017,2021 Jack Lloyd
*
* Distributed under the terms given in license.txt
*/
#ifndef BOTAN_ZFEC_H_
#define BOTAN_ZFEC_H_
#include <botan/types.h>
#include <string>
#include <map>
#include <vector>
#include <functional>
namespace Botan {
/**
* A forward error correction code compatible with the zfec
* library (https://github.com/tahoe-lafs/zfec)
*
* This algorithm is *not constant time* and is likely succeptible to
* side channels. Do not use this class to encode information that
* should be kept secret. (If nothing else, because the first K shares
* are simply the original input!)
*/
class BOTAN_PUBLIC_API(3,0) ZFEC
{
public:
typedef std::function<void (size_t, const uint8_t[], size_t)> output_cb_t;
/**
* FEC constructor
* @param K the number of shares needed for recovery
* @param N the number of shares generated
*/
ZFEC(size_t K, size_t n);
size_t recovery_threshold() const { return m_K; }
size_t generated_shares() const { return m_N; }
std::string provider() const;
/**
* @param input the data to FEC
* @param size the length in bytes of input
* @param output_cb the output callback
*/
void encode(
const uint8_t input[], size_t size,
output_cb_t output_cb)
const;
/**
* @param shares exactly K shares of data to FEC
* @param share_size the length in bytes of each share
* @param output_cb the output callback
*/
void encode_shares(
const std::vector<const uint8_t*>& shares,
size_t share_size,
output_cb_t output_cb)
const;
/**
* @param shares map of share id to share contents
* @param share_size size in bytes of each share
* @param output_cb the output callback
*/
void decode_shares(
const std::map<size_t, const uint8_t*>& shares,
size_t share_size,
output_cb_t output_cb)
const;
private:
static void addmul(uint8_t z[], const uint8_t x[], uint8_t y, size_t size);
#if defined(BOTAN_HAS_ZFEC_SSE2)
static size_t addmul_sse2(uint8_t z[], const uint8_t x[], uint8_t y, size_t size);
#endif
#if defined(BOTAN_HAS_ZFEC_VPERM)
static size_t addmul_vperm(uint8_t z[], const uint8_t x[], uint8_t y, size_t size);
#endif
const size_t m_K, m_N;
std::vector<uint8_t> m_enc_matrix;
};
}
#endif
|