1bels.h(3) Library Functions Manual bels.h(3)
2
3
4
6 bels.h - Алгоритмы СТБ 34.101.60 (bels)
7
8
10 #include 'bee2/defs.h'
11
12
13 Функции
14 err_t belsStdM (octet m[], size_t len, size_t num)
15 Загрузка стандартного открытого ключа
16 err_t belsValM (const octet m[], size_t len)
17 Проверка открытого ключа
18 err_t belsGenM0 (octet m0[], size_t len, gen_i ang, void *ang_state)
19 Генерация общего открытого ключа
20 err_t belsGenMi (octet mi[], size_t len, const octet m0[], gen_i ang,
21 void *ang_state)
22 Генерация открытых ключей пользователей
23 err_t belsGenMid (octet mid[], size_t len, const octet m0[], const
24 octet id[], size_t id_len)
25 Генерация открытого ключа пользователя по идентификатору
26 err_t belsShare (octet si[], size_t count, size_t threshold, size_t
27 len, const octet s[], const octet m0[], const octet mi[], gen_i
28 rng, void *rng_state)
29 Разделение секрета
30 err_t belsShare2 (octet si[], size_t count, size_t threshold, size_t
31 len, const octet s[], gen_i rng, void *rng_state)
32 Разделение секрета на стандартных открытых ключах
33 err_t belsShare3 (octet si[], size_t count, size_t threshold, size_t
34 len, const octet s[])
35 Детерминированное разделение секрета на стандартных открытых ключах
36 err_t belsRecover (octet s[], size_t count, size_t len, const octet
37 si[], const octet m0[], const octet mi[])
38 Восстановление секрета
39 err_t belsRecover2 (octet s[], size_t count, size_t len, const octet
40 si[])
41 Восстановление секрета на стандартных открытых ключах
42
44 Реализованы алгоритмы СТБ 34.101.60 (bels). При ссылках на алгоритмы
45 подразумеваются разделы СТБ 34.101.60-2013, в которых эти алгоритмы
46 определены.
47
48 Алгоритмы предназначены для разделения секрета из len октетов, где len
49 = 16, 24 или 32. При разделении секрета используются открытые ключи mi,
50 которые также состоят из len октетов. Открытый ключ m0 является общим,
51 а остальные открытые ключи связаны с конкретными пользователями.
52
53 Число неприводимых многочленов:
54 l = 128, 256: (2^l - 2^{l/2}) / l;
55 l = 192: (2^192 - 2^96 - 2^64 + 2^27) / l.
56
57 Таким образом, случайный многочлен степени l окажется неприводимым с
58 вероятностью, близкой к 1/l.
59
60 Если проверить k * l случайных многочленов, то ни один из них не
61 окажется неприводимым с вероятностью, близкой к
62 p = (1 - 1/l)^{k * l} ≈ e^{-k}.
63 В реализации
64 k = B_PER_IMPOSSIBLE * 3 / 4 > B_PER_IMPOSSIBLE * \log(2)
65 и поэтому p < 2^{-B_PER_IMPOSSIBLE}.
66
67 В функции belsGenM0() неуспех при k * l попытках генерации
68 интерпретируется как нарушение ожидаемых свойств ang с возвратом кода
69 ошибки ERR_BAD_ANG.
70
71 Генерация открытых ключей пользователей основана на вспомогательном
72 алгоритме BuildIrred, описанном в 6.3. В этом алгоритме входной
73 многочлен u интерпретируется как элемент поля E = F_2[x]/(f0(x)), где
74 f0(x) = x^l + m0(x) -- неприводимый многочлен степени l. Алгоритм
75 BuildIrred возвращает минимальный многочлен f элемента u. Многочлен f
76 либо неприводим, либо f == 1. Если deg f = l, то генерация завершена --
77 открытый ключ определяется по f.
78
79 Каждый неприводимый многочлен степени l является минимальным
80 многочленом для l различных элементов поля. Поэтому вероятность того,
81 что f будет
82 иметь степень l близка к
83 (1 - 2^{-l/2}) [l = 128, 256]
84 (1 - 2^{-96} - ...) [l = 192].
85
86 В функциях belsGenMi(), belsGenMid() предпринимается
87 k = \max(3, B_PER_IMPOSSIBLE * 2 / l)
88 попытки генерации f. Ситуация, когда все попытки завершены с ошибкой,
89 считается невозможной и интерпретируется как неверные входные данные
90 (общему открытому ключу m0 соответствует многочлен f0, который не
91 является неприводимым) с возвратом кода ошибки ERR_BAD_PUBKEY.
92
93 Ожидается [ERR_BAD_INPUT]
94 Все входные указатели действительны.
95
96 Регулярность
97 todo
98
100 err_t belsGenM0 (octet m0[], size_t len, gen_i ang, void * ang_state)
101 Генерируется общий открытый ключ [len]m0. При генерации используется
102 генератор ang и его состояние ang_state.
103
104 Ожидается [ERR_BAD_INPUT]
105 len == 16 || len == 24 || len == 32.
106
107 Ожидается [ERR_BAD_ANG]
108 Генератор ang выдает неповторяющиеся ключи-кандидаты.
109
110 Возвращает
111 ERR_OK, если ключ успешно сгенерирован, и код ошибки в противном
112 случае.
113
114 Прим.
115 Реализован алгоритм bels-genm0.
116
117 Аргументы
118 m0 общий открытый ключ
119 len длина ключа в октетах
120 ang генератор произвольных чисел
121 ang_state состояние генератора
122
123 err_t belsGenMi (octet mi[], size_t len, const octet m0[], gen_i ang, void
124 * ang_state)
125 По общему открытому ключу [len]m0 октетов генерируется открытый ключ
126 [len]mi пользователя. При генерации используется генератор ang и его
127 состояние ang_state.
128
129 Ожидается [ERR_BAD_INPUT]
130 len == 16 || len == 24 || len == 32.
131
132 Ожидается [ERR_BAD_PUBKEY]
133 Ключ m0 корректен.
134
135 Ожидается [ERR_BAD_ANG]
136 Генератор ang корректен и выдает неповторяющиеся ключи-кандидаты.
137
138 Возвращает
139 ERR_OK, если ключи успешно сгенерированы, и код ошибки в противном
140 случае.
141
142 Прим.
143 Частично реализован алгоритм bels-genmi. Для генерации набора
144 открытых ключей следует вызвать функцию несколько раз и проверить
145 различие полученных ключей.
146
147 Аргументы
148 mi открытый ключ пользователя
149 len длина ключей в октетах
150 m0 общий открытый ключ
151 ang генератор произвольных чисел
152 ang_state состояние генератора
153
154 err_t belsGenMid (octet mid[], size_t len, const octet m0[], const octet
155 id[], size_t id_len)
156 По общему открытому ключу [len]m0 и идентификатору [id_len]id октетов
157 генерируется открытый ключ [len]mid пользователя с идентификатором
158 [id_len]id.
159
160 Ожидается [ERR_BAD_INPUT]
161 len == 16 || len == 24 || len == 32.
162
163 Ожидается [ERR_BAD_PUBKEY]
164 Ключ m0 корректен.
165
166 Возвращает
167 ERR_OK, если ключ успешно сгенерирован, и код ошибки в противном
168 случае.
169
170 Прим.
171 Реализован алгоритм genmid.
172
173 Аргументы
174 mid открытый ключ пользователя
175 len длина ключей в октетах
176 m0 общий открытый ключ
177 id идентификатор
178 id_len длина идентификаторa в октетах
179
180 err_t belsRecover (octet s[], size_t count, size_t len, const octet si[],
181 const octet m0[], const octet mi[])
182 Секрет [len]s восстанавливается по count частичным секретам из массива
183 [count * len]si. При восстановлении используется общий открытый ключ
184 [len]m0 и открытые ключи пользователей из массива [count * len]mi.
185 Частичные секреты и открытые ключи размещаются в массивах si, mi
186 последовательными блоками из len октетов.
187
188 Ожидается [ERR_BAD_INPUT]
189 len == 16 || len == 24 || len == 32.
190
191 Ожидается [ERR_BAD_PUBKEY]
192 Открытые ключи m0, mi корректны и отличаются друг от друга.
193
194 Возвращает
195 ERR_OK, если секрет успешно восстановлен, и код ошибки в противном
196 случае.
197
198 Прим.
199 Реализован алгоритм bels-recover. Успешное восстановление не
200 означает, что секрет будет совпадать с первоначально разделенным.
201 Этого, например, не произойдет, если число частичных секретов
202 меньше порога, использованого при разделении.
203
204 Аргументы
205 s восстановленный секрет
206 count число пользователей
207 len длина секретов в октетах
208 si частичные секреты
209 m0 общий открытый ключ
210 mi открытые ключи пользователей
211
212 err_t belsRecover2 (octet s[], size_t count, size_t len, const octet si[])
213 Секрет [len]s восстанавливается по count частичным секретам из массива
214 [count * len]si. При восстановлении используется стандартные открытые
215 ключи belsStdM(m, len, i). Частичные секреты размещаются в массиве si
216 последовательными блоками из len + 1 октетов. Первый октет блока задает
217 номер открытого ключа.
218
219 Ожидается [ERR_BAD_INPUT]
220 len == 16 || len == 24 || len == 32.
221
222 Ожидается [ERR_BAD_PUBKEY]
223 Номера открытых ключей, указанные в первых октетах частичных
224 секретов, принадлежат интервалу {1, 2, ..., 16} и отличаются друг
225 от друга.
226
227 Возвращает
228 ERR_OK, если секрет успешно восстановлен, и код ошибки в противном
229 случае.
230
231 Прим.
232 Реализован алгоритм bels-recover. Успешное восстановление не
233 означает, что секрет будет совпадать с первоначально разделенным.
234 Этого, например, не произойдет, если число частичных секретов
235 меньше порога, использованого при разделении.
236
237 Аргументы
238 s восстановленный секрет
239 count число пользователей
240 len длина секретов в октетах
241 si частичные секреты
242
243 err_t belsShare (octet si[], size_t count, size_t threshold, size_t len,
244 const octet s[], const octet m0[], const octet mi[], gen_i rng, void *
245 rng_state)
246 Секрет [len]s разделяется с порогом threshold на count частичных
247 секретов, которые записываются в массив [count * len]si. При разделении
248 используется общий открытый ключ [len]m0 и открытые ключи пользователей
249 из массива [count * len]mi. Секреты и ключи размещаются в массивах si,
250 mi последовательными блоками из len октетов: первый блок соответствует
251 первому пользователю, второй -- второму и т.д. При разделении секрета
252 используется генератор rng и его состояние rng_state.
253
254 Ожидается [ERR_BAD_INPUT]
255
256
257 • len == 16 || len == 24 || len == 32;
258
259 • 0 < threshold <= count.
260
261 Ожидается [ERR_BAD_PUBKEY]
262 Открытые ключи m0, mi корректны и отличаются друг от друга.
263
264 Ожидается [ERR_BAD_RNG]
265 Генератор rng (с состоянием rng_state) корректен.
266
267 Ожидается
268 Генератор rng является криптографически стойким.
269
270 Возвращает
271 ERR_OK, если секрет успешно разделен, и код ошибки в противном
272 случае.
273
274 Прим.
275 Реализован алгоритм bels-share.
276
277 Аргументы
278 si частичные секреты
279 count число пользователей
280 threshold пороговое число
281 len длина секрета в октетах
282 s секрет
283 m0 общий открытый ключ
284 mi открытые ключи пользователей
285 rng генератор случайных чисел
286 rng_state состояние генератора
287
288 err_t belsShare2 (octet si[], size_t count, size_t threshold, size_t len,
289 const octet s[], gen_i rng, void * rng_state)
290 Секрет [len]s разделяется с порогом threshold на count частичных
291 секретов, которые записываются в массив [count * (len + 1)]si. При
292 разделении используются стандартные открытые ключи belsStdM(m, len, i),
293 i = 0, 1, ..., count. Частичные секреты размещается в массиве si
294 последовательными блоками из len + 1 октетов: первый блок соответствует
295 первому пользователю, второй -- второму и т.д. В первом октете блока
296 указывается его номер (от 1 до count). При разделении секрета
297 используется генератор rng и его состояние rng_state.
298
299 Ожидается [ERR_BAD_INPUT]
300
301
302 • len == 16 || len == 24 || len == 32;
303
304 • 0 < threshold <= count < = 16.
305
306 Ожидается [ERR_BAD_RNG]
307 Генератор rng (с состоянием rng_state) корректен.
308
309 Ожидается
310 Генератор rng является криптографически стойким.
311
312 Возвращает
313 ERR_OK, если секрет успешно разделен, и код ошибки в противном
314 случае.
315
316 Прим.
317 Реализован алгоритм bels-share.
318
319 Аргументы
320 si частичные секреты
321 count число пользователей
322 threshold пороговое число
323 len длина секрета в октетах
324 s секрет
325 rng генератор случайных чисел
326 rng_state состояние генератора
327
328 err_t belsShare3 (octet si[], size_t count, size_t threshold, size_t len,
329 const octet s[])
330 Секрет [len]s разделяется с порогом threshold на count частичных
331 секретов, которые записываются в массив [count * (len + 1)]si. При
332 разделении используется стандартные открытые ключи belsStdM(m, len, i),
333 i = 0, 1, ..., count. Секреты размещается в массиве si
334 последовательными блоками из len + 1 октетов. В первом октете блока
335 указывается его номер (от 1 до count). Одноразовый ключ, который
336 используется при разделении секрета, строится по разделяемому ключу с
337 помощью (экспериментального) детерминированного алгоритма bels-genk.
338
339 Ожидается [ERR_BAD_INPUT]
340
341
342 • len == 16 || len == 24 || len == 32;
343
344 • 0 < threshold <= count <= 16.
345
346 Возвращает
347 ERR_OK, если секрет успешно разделен, и код ошибки в противном
348 случае.
349
350 Прим.
351 Реализован алгоритм bels-share.
352
353 Предупреждения
354 Экспериментальный режим.
355
356 Аргументы
357 si частичные секреты
358 count число пользователей
359 threshold пороговое число
360 len длина секрета в октетах
361 s секрет
362
363 err_t belsStdM (octet m[], size_t len, size_t num)
364 Загружается стандартный открытый ключ [len]m. Загружается либо общий
365 открытый ключ из таблицы A.1 (при num == 0), либо открытый ключ
366 пользователя номер num одной из таблиц A.2, A.3, A.4.
367
368 Ожидается [ERR_BAD_INPUT]
369
370
371 • len == 16 || len == 24 || len == 32;
372
373 • 0 <= num <= 16.
374
375 Возвращает
376 ERR_OK, если ключ успешно загружен, и код ошибки в противном
377 случае.
378
379 Аргументы
380 m открытый ключ
381 len длина ключа в октетах
382 num номер ключа
383
384 err_t belsValM (const octet m[], size_t len)
385 Проверяется корректность открытого ключа [len]m.
386
387 Ожидается [ERR_BAD_INPUT]
388 len == 16 || len == 24 || len == 32.
389
390 Возвращает
391 ERR_OK, если ключ корректен, и код ошибки в противном случае.
392
393 Аргументы
394 m открытый ключ
395 len длина ключа в октетах
396
398 Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.
399
400
401
402Библиотека Bee2 Ср 19 Июл 2023 00:00:00 bels.h(3)