1bels.h(3)                  Library Functions Manual                  bels.h(3)
2
3
4

NAME

6       bels.h - Алгоритмы СТБ 34.101.60 (bels)
7
8

SYNOPSIS

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                 Пт 23 Июн 2023                       bels.h(3)
Impressum