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 состояние генератора

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 состояние генератора

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 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)

Секрет [len]s разделяется с порогом threshold на count частичных секретов, которые записываются в массив [count * len]si. При разделении используется общий открытый ключ [len]m0 и открытые ключи пользователей из массива [count * len]mi. Секреты и ключи размещаются в массивах si, mi последовательными блоками из len октетов: первый блок соответствует первому пользователю, второй -- второму и т.д. При разделении секрета используется генератор rng и его состояние rng_state.

Ожидается [ERR_BAD_INPUT]

  • len == 16 || len == 24 || len == 32;
  • 0 < threshold <= count.

Ожидается [ERR_BAD_PUBKEY]

Открытые ключи m0, mi корректны и отличаются друг от друга.

Ожидается [ERR_BAD_RNG]

Генератор rng (с состоянием rng_state) корректен.

Ожидается

Генератор rng является криптографически стойким.

Возвращает

ERR_OK, если секрет успешно разделен, и код ошибки в противном случае.

Прим.

Реализован алгоритм bels-share.

Аргументы

si частичные секреты  
count число пользователей  
threshold пороговое число  
len длина секрета в октетах  
s секрет  
m0 общий открытый ключ  
mi открытые ключи пользователей  
rng генератор случайных чисел  
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)

Секрет [len]s разделяется с порогом threshold на count частичных секретов, которые записываются в массив [count * (len + 1)]si. При разделении используются стандартные открытые ключи belsStdM(m, len, i), i = 0, 1, ..., count. Частичные секреты размещается в массиве si последовательными блоками из len + 1 октетов: первый блок соответствует первому пользователю, второй -- второму и т.д. В первом октете блока указывается его номер (от 1 до count). При разделении секрета используется генератор rng и его состояние rng_state.

Ожидается [ERR_BAD_INPUT]

  • len == 16 || len == 24 || len == 32;
  • 0 < threshold <= count < = 16.

Ожидается [ERR_BAD_RNG]

Генератор rng (с состоянием rng_state) корректен.

Ожидается

Генератор rng является криптографически стойким.

Возвращает

ERR_OK, если секрет успешно разделен, и код ошибки в противном случае.

Прим.

Реализован алгоритм bels-share.

Аргументы

si частичные секреты  
count число пользователей  
threshold пороговое число  
len длина секрета в октетах  
s секрет  
rng генератор случайных чисел  
rng_state состояние генератора

err_t belsShare3 (octet si[], size_t count, size_t threshold, size_t len, const octet s[])

Секрет [len]s разделяется с порогом threshold на count частичных секретов, которые записываются в массив [count * (len + 1)]si. При разделении используется стандартные открытые ключи belsStdM(m, len, i), i = 0, 1, ..., count. Секреты размещается в массиве si последовательными блоками из len + 1 октетов. В первом октете блока указывается его номер (от 1 до count). Одноразовый ключ, который используется при разделении секрета, строится по разделяемому ключу с помощью (экспериментального) детерминированного алгоритма bels-genk.

Ожидается [ERR_BAD_INPUT]
  • len == 16 || len == 24 || len == 32;
  • 0 < threshold <= count <= 16.
Возвращает

ERR_OK, если секрет успешно разделен, и код ошибки в противном случае.

Прим.

Реализован алгоритм bels-share.

Предупреждения

Экспериментальный режим.

Аргументы

si частичные секреты  
count число пользователей  
threshold пороговое число  
len длина секрета в октетах  
s секрет

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 из исходного текста.

Info

Вт 23 Янв 2024 00:00:00 Библиотека Bee2