bels.h - Man Page
Алгоритмы СТБ 34.101.60 (bels)
Synopsis
#include 'bee2/defs.h'
Функции
err_t belsStdM (octet m[], size_t len, size_t num)
Загрузка стандартного открытого ключа
err_t belsValM (const octet m[], size_t len)
Проверка открытого ключа
err_t belsGenM0 (octet m0[], size_t len, gen_i ang, void *ang_state)
Генерация общего открытого ключа
err_t belsGenMi (octet mi[], size_t len, const octet m0[], gen_i ang, void *ang_state)
Генерация открытых ключей пользователей
err_t belsGenMid (octet mid[], size_t len, const octet m0[], const octet id[], size_t id_len)
Генерация открытого ключа пользователя по идентификатору
err_t belsShare (octet si[], size_t count, size_t threshold, size_t len, const octet s[], const octet m0[], const octet mi[], gen_i rng, void *rng_state)
Разделение секрета
err_t belsShare2 (octet si[], size_t count, size_t threshold, size_t len, const octet s[], gen_i rng, void *rng_state)
Разделение секрета на стандартных открытых ключах
err_t belsShare3 (octet si[], size_t count, size_t threshold, size_t len, const octet s[])
Детерминированное разделение секрета на стандартных открытых ключах
err_t belsRecover (octet s[], size_t count, size_t len, const octet si[], const octet m0[], const octet mi[])
Восстановление секрета
err_t belsRecover2 (octet s[], size_t count, size_t len, const octet si[])
Восстановление секрета на стандартных открытых ключах
Подробное описание
Реализованы алгоритмы СТБ 34.101.60 (bels). При ссылках на алгоритмы подразумеваются разделы СТБ 34.101.60-2013, в которых эти алгоритмы определены.
Алгоритмы предназначены для разделения секрета из len октетов, где len = 16, 24 или 32. При разделении секрета используются открытые ключи mi, которые также состоят из len октетов. Открытый ключ m0 является общим, а остальные открытые ключи связаны с конкретными пользователями.
Число неприводимых многочленов:
l = 128, 256: (2^l - 2^{l/2}) / l;
l = 192: (2^192 - 2^96 - 2^64 + 2^27) / l.
Таким образом, случайный многочлен степени l окажется неприводимым с вероятностью, близкой к 1/l.
Если проверить k * l случайных многочленов, то ни один из них не окажется неприводимым с вероятностью, близкой к
p = (1 - 1/l)^{k * l} ≈ e^{-k}.
В реализации
k = B_PER_IMPOSSIBLE * 3 / 4 > B_PER_IMPOSSIBLE * \log (2)
и поэтому p < 2^{-B_PER_IMPOSSIBLE}.
В функции belsGenM0() неуспех при k * l попытках генерации интерпретируется как нарушение ожидаемых свойств ang с возвратом кода ошибки ERR_BAD_ANG.
Генерация открытых ключей пользователей основана на вспомогательном алгоритме BuildIrred, описанном в 6.3. В этом алгоритме входной многочлен u интерпретируется как элемент поля E = F_2[x]/(f0(x)), где f0(x) = x^l + m0(x) -- неприводимый многочлен степени l. Алгоритм BuildIrred возвращает минимальный многочлен f элемента u. Многочлен f либо неприводим, либо f == 1. Если deg f = l, то генерация завершена -- открытый ключ определяется по f.
Каждый неприводимый многочлен степени l является минимальным многочленом для l различных элементов поля. Поэтому вероятность того, что f будет
иметь степень l близка к
(1 - 2^{-l/2}) [l = 128, 256]
(1 - 2^{-96} - ...) [l = 192].
В функциях belsGenMi(), belsGenMid() предпринимается
k = \max (3, B_PER_IMPOSSIBLE * 2 / l)
попытки генерации f. Ситуация, когда все попытки завершены с ошибкой, считается невозможной и интерпретируется как неверные входные данные (общему открытому ключу m0 соответствует многочлен f0, который не является неприводимым) с возвратом кода ошибки ERR_BAD_PUBKEY.
Ожидается [ERR_BAD_INPUT]
Все входные указатели действительны.
- Регулярность
todo
Функции
err_t belsGenM0 (octet m0[], size_t len, gen_i ang, void * ang_state)
Генерируется общий открытый ключ [len]m0. При генерации используется генератор ang и его состояние ang_state.
Ожидается [ERR_BAD_INPUT]
len == 16 || len == 24 || len == 32.
Ожидается [ERR_BAD_ANG]
Генератор ang выдает неповторяющиеся ключи-кандидаты.
- Возвращает
ERR_OK, если ключ успешно сгенерирован, и код ошибки в противном случае.
Прим.
Реализован алгоритм bels-genm0.
- Аргументы
m0 общий открытый ключ
len длина ключа в октетах
ang генератор произвольных чисел
ang_state [in,out] состояние генератора
err_t belsGenMi (octet mi[], size_t len, const octet m0[], gen_i ang, void * ang_state)
По общему открытому ключу [len]m0 октетов генерируется открытый ключ [len]mi пользователя. При генерации используется генератор ang и его состояние ang_state.
Ожидается [ERR_BAD_INPUT]
len == 16 || len == 24 || len == 32.
Ожидается [ERR_BAD_PUBKEY]
Ключ m0 корректен.
Ожидается [ERR_BAD_ANG]
Генератор ang корректен и выдает неповторяющиеся ключи-кандидаты.
- Возвращает
ERR_OK, если ключи успешно сгенерированы, и код ошибки в противном случае.
Прим.
Частично реализован алгоритм bels-genmi. Для генерации набора открытых ключей следует вызвать функцию несколько раз и проверить различие полученных ключей.
- Аргументы
mi открытый ключ пользователя
len длина ключей в октетах
m0 общий открытый ключ
ang генератор произвольных чисел
ang_state [in,out] состояние генератора
err_t belsGenMid (octet mid[], size_t len, const octet m0[], const octet id[], size_t id_len)
По общему открытому ключу [len]m0 и идентификатору [id_len]id октетов генерируется открытый ключ [len]mid пользователя с идентификатором [id_len]id.
Ожидается [ERR_BAD_INPUT]
len == 16 || len == 24 || len == 32.
Ожидается [ERR_BAD_PUBKEY]
Ключ m0 корректен.
- Возвращает
ERR_OK, если ключ успешно сгенерирован, и код ошибки в противном случае.
Прим.
Реализован алгоритм genmid.
- Аргументы
mid открытый ключ пользователя
len длина ключей в октетах
m0 общий открытый ключ
id идентификатор
id_len длина идентификаторa в октетах
err_t belsRecover (octet s[], size_t count, size_t len, const octet si[], const octet m0[], const octet mi[])
Секрет [len]s восстанавливается по count частичным секретам из массива [count * len]si. При восстановлении используется общий открытый ключ [len]m0 и открытые ключи пользователей из массива [count * len]mi. Частичные секреты и открытые ключи размещаются в массивах si, mi последовательными блоками из len октетов.
Ожидается [ERR_BAD_INPUT]
len == 16 || len == 24 || len == 32.
Ожидается [ERR_BAD_PUBKEY]
Открытые ключи m0, mi корректны и отличаются друг от друга.
- Возвращает
ERR_OK, если секрет успешно восстановлен, и код ошибки в противном случае.
Прим.
Реализован алгоритм bels-recover. Успешное восстановление не означает, что секрет будет совпадать с первоначально разделенным. Этого, например, не произойдет, если число частичных секретов меньше порога, использованого при разделении.
- Аргументы
s восстановленный секрет
count число пользователей
len длина секретов в октетах
si частичные секреты
m0 общий открытый ключ
mi открытые ключи пользователей
err_t belsRecover2 (octet s[], size_t count, size_t len, const octet si[])
Секрет [len]s восстанавливается по count частичным секретам из массива [count * len]si. При восстановлении используется стандартные открытые ключи belsStdM(m, len, i). Частичные секреты размещаются в массиве si последовательными блоками из len + 1 октетов. Первый октет блока задает номер открытого ключа.
Ожидается [ERR_BAD_INPUT]
len == 16 || len == 24 || len == 32.
Ожидается [ERR_BAD_PUBKEY]
Номера открытых ключей, указанные в первых октетах частичных секретов, принадлежат интервалу {1, 2, ..., 16} и отличаются друг от друга.
- Возвращает
ERR_OK, если секрет успешно восстановлен, и код ошибки в противном случае.
Прим.
Реализован алгоритм bels-recover. Успешное восстановление не означает, что секрет будет совпадать с первоначально разделенным. Этого, например, не произойдет, если число частичных секретов меньше порога, использованого при разделении.
- Аргументы
s восстановленный секрет
count число пользователей
len длина секретов в октетах
si частичные секреты
err_t belsStdM (octet m[], size_t len, size_t num)
Загружается стандартный открытый ключ [len]m. Загружается либо общий открытый ключ из таблицы A.1 (при num == 0), либо открытый ключ пользователя номер num одной из таблиц A.2, A.3, A.4.
Ожидается [ERR_BAD_INPUT]
- len == 16 || len == 24 || len == 32;
- 0 <= num <= 16.
- Возвращает
ERR_OK, если ключ успешно загружен, и код ошибки в противном случае.
- Аргументы
m открытый ключ
len длина ключа в октетах
num номер ключа
err_t belsValM (const octet m[], size_t len)
Проверяется корректность открытого ключа [len]m.
- Ожидается [ERR_BAD_INPUT]
len == 16 || len == 24 || len == 32.
- Возвращает
ERR_OK, если ключ корректен, и код ошибки в противном случае.
- Аргументы
m открытый ключ
len длина ключа в октетах
Автор
Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.