liberasurecode 1.8.0
Erasure Code API library
Loading...
Searching...
No Matches
shss.c
Go to the documentation of this file.
1/*
2 * Copyright(c) 2015 NTT corp. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice, this
11 * list of conditions and the following disclaimer in the documentation and/or
12 * other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY
13 * THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
14 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
15 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
17 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
18 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE,
19 * DATA, OR PROFITS;OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
20 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
21 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 *
24 * liberasurecode shss backend
25 *
26 * Please contact us if you are insterested in the NTT backend (welcome!):
27 * Kota Tsuyuzaki <tsuyuzaki.kota@lab.ntt.co.jp>
28 *
29 * vi: set noai tw=79 ts=4 sw=4:
30 */
31
32#include <stdio.h>
33#include <stdlib.h>
34
35#include "erasurecode.h"
36#include "erasurecode_helpers.h"
37#include "erasurecode_helpers_ext.h"
38#include "erasurecode_backend.h"
39
40/* Forward declarations */
41struct ec_backend_common backend_shss;
42
43typedef int (*shss_encode_func)(char **, size_t, int, int, int, int, long long *);
44typedef int (*shss_decode_func)(char **, size_t, int *, int, int, int, int, int, long long *);
45typedef int (*shss_reconstruct_func)(char **, size_t, int *, int, int *, int, int, int, int, int, long long *);
46
48 /* calls required for init */
52
53 /* fields needed to hold state */
54 int k;
55 int m;
56 int n;
57 int w;
59};
60
61#define SHSS_LIB_VER_STR "1.0"
62#define SHSS_LIB_NAME "shss"
63#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
64#define SHSS_SO_NAME "libshss" LIBERASURECODE_SO_SUFFIX ".dylib"
65#else
66#define SHSS_SO_NAME "libshss" LIBERASURECODE_SO_SUFFIX ".so.1"
67#endif
68#define DEFAULT_W 128
69#define METADATA 32
70
71static int shss_encode(void *desc, char **data, char **parity,
72 int blocksize)
73{
74 int i;
75 int ret = 0;
76 int priv_bitnum = 128; // privacy bit number 0 or 128(default) or 256
77 int chksum = 0; // chksum 0 or 64
78 char **encoded;
79 long long einfo;
80 struct shss_descriptor *xdesc =
81 (struct shss_descriptor *) desc;
82
83 if (xdesc->aes_bit_length != -1) {
84 priv_bitnum = xdesc->aes_bit_length;
85 }
86
87 encoded = alloca(sizeof(char*)*xdesc->n);
88
89 for (i = 0; i<xdesc->k; i++) encoded[i] = (char*)data[i];
90 for (i = 0; i<xdesc->m; i++) encoded[i+xdesc->k] = (char*)parity[i];
91
92 ret = xdesc->ssencode((char**)encoded, (size_t)blocksize,
93 xdesc->k, xdesc->m, priv_bitnum, chksum, &einfo);
94
95 if (ret > 0) {
96 return -ret;
97 }
98
99 return 0;
100}
101
102static int shss_decode(void *desc, char **data, char **parity,
103 int *missing_idxs, int blocksize)
104{
105 int i;
106 int missing_size = 0;
107 int ret = 0;
108 int priv_bitnum = 128; // privacy bit number 0 or 128(default) or 256
109 int chksum = 0; // chksum 0 or 64
110 char **decoded;
111 long long einfo;
112 struct shss_descriptor *xdesc =
113 (struct shss_descriptor *) desc;
114
115 if (xdesc->aes_bit_length != -1) {
116 priv_bitnum = xdesc->aes_bit_length;
117 }
118
119 decoded = alloca(sizeof(char*)*xdesc->n);
120
121 for (i = 0; i<xdesc->k; i++) decoded[i] = (char*)data[i];
122 for (i = 0; i<xdesc->m; i++) decoded[i+xdesc->k] = (char*)parity[i];
123 for (i = 0; i<xdesc->n; i++) {
124 if (i == missing_idxs[missing_size]) {
125 missing_size++;
126 }
127 }
128
129 ret = xdesc->ssdecode((char**)decoded, (size_t)blocksize, missing_idxs, missing_size,
130 xdesc->k, xdesc->m, priv_bitnum, chksum, &einfo);
131
132 if (ret > 0) {
133 return -ret;
134 }
135
136 return 0;
137}
138
139static int shss_reconstruct(void *desc, char **data, char **parity,
140 int *missing_idxs, int destination_idx, int blocksize)
141{
142 int i;
143 int missing_size = 0;
144 int ret = 0;
145 int priv_bitnum = 128; // privacy bit number 0 or 128(default) or 256
146 int chksum = 0; // chksum 0 or 64
147 int dst_size = 1;
148 char **reconstructed;
149 long long einfo;
150 struct shss_descriptor *xdesc =
151 (struct shss_descriptor *) desc;
152
153 if (xdesc->aes_bit_length != -1) {
154 priv_bitnum = xdesc->aes_bit_length;
155 }
156
157 reconstructed = alloca(sizeof(char*)*xdesc->n);
158
159 for (i = 0; i<xdesc->k; i++) reconstructed[i] = (char*)data[i];
160 for (i = 0; i<xdesc->m; i++) reconstructed[i+xdesc->k] = (char*)parity[i];
161 for (i = 0; i<xdesc->n; i++) {
162 if (i == missing_idxs[missing_size]) {
163 missing_size++;
164 }
165 }
166
167 ret = xdesc->ssreconst((char**)reconstructed, (size_t)blocksize,
168 &destination_idx, dst_size, missing_idxs, missing_size, xdesc->k,
169 xdesc->m, priv_bitnum, chksum, &einfo);
170
171 if (ret > 0) {
172 return -ret;
173 }
174
175 return 0;
176}
177
178static int shss_fragments_needed(void *desc, int *missing_idxs,
179 int *fragments_to_exclude, int *fragments_needed)
180{
181 struct shss_descriptor *xdesc =
182 (struct shss_descriptor *) desc;
183 struct ec_bm exclude_bm = NEW_BM, missing_bm = NEW_BM;
184 convert_list_to_bitmap(fragments_to_exclude, &exclude_bm);
185 convert_list_to_bitmap(missing_idxs, &missing_bm);
186 bm_combine_or(&exclude_bm, &missing_bm);
187 int i;
188 int j = 0;
189 int ret = -101;
190
191 for (i = 0; i < xdesc->n; i++) {
192 if (!bm_get_value(&missing_bm, i)) {
193 fragments_needed[j] = i;
194 j++;
195 }
196 if (j == xdesc->k) {
197 ret = 0;
198 fragments_needed[j] = -1;
199 break;
200 }
201 }
202
203 return ret;
204}
205
210static int shss_element_size(void* desc)
211{
212 return DEFAULT_W;
213}
214
215static void * shss_init(struct ec_backend_args *args, void *backend_sohandle)
216{
217 struct shss_descriptor *desc = NULL;
218
219 desc = (struct shss_descriptor *)
220 malloc(sizeof(struct shss_descriptor));
221 if (NULL == desc) {
222 return NULL;
223 }
224
225 desc->k = args->uargs.k;
226 desc->m = args->uargs.m;
227 desc->n = args->uargs.k + args->uargs.m;
228 desc->w = DEFAULT_W;
229 args->uargs.w = DEFAULT_W;
230
231 /* Sample on how to pass extra args to the backend */
232 // TODO: Need discussion how to pass extra args.
233 // tentatively we could pass with priv_args2 as the bit_length
234 int *priv = (int *)args->uargs.priv_args2;
235 if(priv != NULL){
236 desc->aes_bit_length = priv[0]; // AES bit number
237 }else{
238 desc->aes_bit_length = 128;
239 }
240
241 union {
242 shss_encode_func encodep;
243 shss_decode_func decodep;
245 void *vptr;
246 } func_handle;
247
248 func_handle.vptr = NULL;
249 func_handle.vptr = dlsym(backend_sohandle, "ssencode");
250 desc->ssencode = func_handle.encodep;
251 if (NULL == desc->ssencode) {
252 goto error;
253 }
254
255 func_handle.vptr = NULL;
256 func_handle.vptr = dlsym(backend_sohandle, "ssdecode");
257 desc->ssdecode = func_handle.decodep;
258 if (NULL == desc->ssdecode) {
259 goto error;
260 }
261
262 func_handle.vptr = NULL;
263 func_handle.vptr = dlsym(backend_sohandle, "ssreconst");
264 desc->ssreconst = func_handle.reconp;
265 if (NULL == desc->ssreconst) {
266 goto error;
267 }
268
269 return desc;
270
271error:
272 free(desc);
273
274 return NULL;
275}
276
277static int shss_exit(void *desc)
278{
279 if (desc != NULL) {
280 free(desc);
281 }
282 return 0;
283}
284
285static bool shss_is_compatible_with(uint32_t version) {
286 return version == backend_shss.ec_backend_version;
287}
288
289static size_t shss_get_backend_metadata_size(void *desc, int blocksize) {
290 return METADATA;
291}
292
293static struct ec_backend_op_stubs shss_op_stubs = {
294 .INIT = shss_init,
295 .EXIT = shss_exit,
296 .ISSYSTEMATIC = 0,
297 .ENCODE = shss_encode,
298 .DECODE = shss_decode,
299 .FRAGSNEEDED = shss_fragments_needed,
300 .RECONSTRUCT = shss_reconstruct,
301 .ELEMENTSIZE = shss_element_size,
302 .ISCOMPATIBLEWITH = shss_is_compatible_with,
303 .GETMETADATASIZE = shss_get_backend_metadata_size,
304 .GETENCODEOFFSET = get_encode_offset_zero,
305};
306
307__attribute__ ((visibility ("internal")))
308struct ec_backend_common backend_shss = {
309 .id = EC_BACKEND_SHSS,
310 .name = SHSS_LIB_NAME,
311 .soname = SHSS_SO_NAME,
312 .soversion = SHSS_LIB_VER_STR,
313 .ops = &shss_op_stubs,
314};
#define METADATA
Definition: shss.c:69
struct ec_backend_common backend_shss
Definition: shss.c:41
#define SHSS_LIB_VER_STR
Definition: shss.c:61
static int shss_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
Definition: shss.c:102
int(* shss_decode_func)(char **, size_t, int *, int, int, int, int, int, long long *)
Definition: shss.c:44
static int shss_fragments_needed(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
Definition: shss.c:178
static int shss_encode(void *desc, char **data, char **parity, int blocksize)
Definition: shss.c:71
#define SHSS_SO_NAME
Definition: shss.c:66
int(* shss_reconstruct_func)(char **, size_t, int *, int, int *, int, int, int, int, int, long long *)
Definition: shss.c:45
int(* shss_encode_func)(char **, size_t, int, int, int, int, long long *)
Definition: shss.c:43
static int shss_exit(void *desc)
Definition: shss.c:277
static void * shss_init(struct ec_backend_args *args, void *backend_sohandle)
Definition: shss.c:215
static bool shss_is_compatible_with(uint32_t version)
Definition: shss.c:285
__attribute__((visibility("internal")))
Definition: shss.c:307
static int shss_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
Definition: shss.c:139
static size_t shss_get_backend_metadata_size(void *desc, int blocksize)
Definition: shss.c:289
#define SHSS_LIB_NAME
Definition: shss.c:62
#define DEFAULT_W
Definition: shss.c:68
static int shss_element_size(void *desc)
Return the element-size, which is the number of bits stored on a given device, per codeword.
Definition: shss.c:210
static struct ec_backend_op_stubs shss_op_stubs
Definition: shss.c:293
shss_decode_func ssdecode
Definition: shss.c:50
int aes_bit_length
Definition: shss.c:58
shss_reconstruct_func ssreconst
Definition: shss.c:51
shss_encode_func ssencode
Definition: shss.c:49