dstu.h - Man Page

Алгоритмы ДСТУ 4145-2002 (Украина)

Synopsis

#include 'bee2/defs.h'

Классы

struct dstu_params
Долговременные параметры dstu.

Функции

err_t dstuStdParams (dstu_params *params, const char *name)
Загрузка стандартных долговременных параметров
err_t dstuValParams (const dstu_params *params)
Проверка долговременных параметров
err_t dstuGenPoint (octet point[], const dstu_params *params, gen_i rng, void *rng_state)
Генерация точки
err_t dstuValPoint (const dstu_params *params, const octet point[])
Проверка точки
err_t dstuCompressPoint (octet xpoint[], const dstu_params *params, const octet point[])
Сжатие точки
err_t dstuRecoverPoint (octet point[], const dstu_params *params, const octet xpoint[])
Восстановление точки
err_t dstuGenKeypair (octet privkey[], octet pubkey[], const dstu_params *params, gen_i rng, void *rng_state)
Генерация пары ключей
err_t dstuSign (octet sig[], const dstu_params *params, size_t ld, const octet hash[], size_t hash_len, const octet privkey[], gen_i rng, void *rng_state)
Выработка ЭЦП
err_t dstuVerify (const dstu_params *params, size_t ld, const octet hash[], size_t hash_len, const octet sig[], const octet pubkey[])
Проверка ЭЦП

Подробное описание

Реализованы алгоритмы украинского стандарта ДСТУ 4145-2002.

Поля структуры долговременных параметров обозначаются также как в ДСТУ.

Максимальная размерность DSTU_SIZE соответствуют неприводимому многочлену степени 509, указанному в ДСТУ.

Базовое поле f = GF(2^m) описывается массивом из 4 размерностей, задающих полиномиальный или нормальный базисы. Первый элемент массива p[0] -- это степень расширения m поля f, элементы массива невозрастают: p[0] >= p[1] >= p[2] >= p[3].

В полиномиальном базисе поле строится как кольцо вычетов GF(2) / (p(x)), где p(x) –- неприводимый трехчлен или пятичлен степени m. Многочлен p(x) определяется следующим образом: p(x) = x^p[0] + x^p[1] + x^p[2] + x^p[3] + 1. При p[2] == 0 должно выполняться также p[3] == 0 и p(x) -- трехчлен.

Нормальный базис задается установкой p[0] = m, p[1] = p[2] = p[3] = 0. Операции в нормальном базисе не реализованы.

Степень m базового поля f определяет используемое число октетов в массиве dstu_params::B: в этом массиве используется O_OF_B(m) октет. В буфере сжатой точки xpoint также используется O_OF_B(m) октет. В массиве dstu_params::P, в буферах открытого ключа pubkey и точки point используется 2 * O_OF_B(m) октетов.

В структуре dstu_params неиспользуемые октеты могут быть заданы произвольным образом.

Порядок группы точек dstu_params::n не превосходит (2^m + 1 + 2 * 2^{m / 2}) / c, где кофактор c >= 2. Таким образом, порядок dstu_params::n укладывается в O_OF_B(m) октетов и даже, может быть, в меньшее число октетов.

Прим.

Кофактор c >= 2, поскольку точка (0, \sqrt(dstu_params::B)) лежит на кривой и имеет порядок 2.

Для стандартных кривых, заданных в приложении Г, кофактор равняется 2 при dstu_params::A == 1 или 4 при dstu_params::A == 0.

В буфере личного ключа privkey используется order_no октетов, где order_no -- число значащих (без завершающих нулевых) октетов буфера [O_OF_B(m)]dstu_params::n, т. е. длина числа dstu_params::n в октетах.

Ожидается [ERR_BAD_INPUT]:\n Все входные указатели корректны.

Регулярность:\n todo

Функции

err_t dstuCompressPoint (octet xpoint[], const dstu_params * params, const octet point[])

Точка point эллиптической кривой, заданной долговременными параметрами params, сжимается в точку xpoint.

Ожидается [ERR_BAD_PARAMS]:\n Параметры params корректны.

Возвращает

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

Прим.

Реализован алгоритм из раздела 6.9 ДСТУ.

Буферы point и xpoint могут пересекаться.

Аргументы

xpoint сжатая точка
params параметры
point сжимаемая точка

err_t dstuGenKeypair (octet privkey[], octet pubkey[], const dstu_params * params, gen_i rng, void * rng_state)

Для заданных параметров params генерируются личный и открытый ключи privkey и pubkey ключи. При генерации используется генератор rng и его состояние rng_state.

Ожидается [ERR_BAD_PARAMS]:\n Параметры params корректны.

Ожидается [ERR_BAD_RNG]:\n Генератор rng (с состоянием rng_state) корректен.

Ожидается:\n Используется криптографически стойкий генератор rng.

Возвращает

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

Прим.

Реализован алгоритм из раздела 9 ДСТУ.

Аргументы

privkey личный ключ
pubkey открытый ключ
params долговременные параметры
rng генератор случайных чисел
rng_state [in/out] состояние генератора

err_t dstuGenPoint (octet point[], const dstu_params * params, gen_i rng, void * rng_state)

Генерируется точка point эллиптической кривой, заданной долговременными параметрами params. При генерации используется генератор rng и его состояние rng_state. Дополнительно проверяется, что порядок point равняется params->n.

Ожидается [ERR_BAD_PARAMS]:\n Параметры params (кроме базовой точки P) корректны.

Возвращает

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

Прим.

Указатели point и params->P могут совпадать.

Реализован алгоритм из раздела 6.8 ДСТУ.

Аргументы

point точка
params долговременные параметры
rng генератор случайных чисел
rng_state [in/out] состояние генератора

err_t dstuRecoverPoint (octet point[], const dstu_params * params, const octet xpoint[])

Точка point эллиптической кривой, заданной долговременными параметрами params, восстанавливается из x-координаты (point->x).

Ожидается [ERR_BAD_PARAMS]:\n Параметры params корректны.

Возвращает

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

Прим.

Реализован алгоритм из раздела 6.10 ДСТУ.

Буферы point и xpoint могут пересекаться.

Аргументы

point восстановленная точка
params параметры
xpoint сжатая точка

err_t dstuSign (octet sig[], const dstu_params * params, size_t ld, const octet hash[], size_t hash_len, const octet privkey[], gen_i rng, void * rng_state)

Вырабатывается подпись [ld / 8]sig сообщения с хэш-значением [hash_len]hash. Подпись вырабатывается на личном ключе privkey. При выработке ЭЦП используются долговременные параметры params и генератор rng c состоянием rng_state.

Ожидается [ERR_BAD_PARAMS]:\n Параметры params корректны.

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

  • ld делится на 16;
  • два вычета по модулю params->n укладываются в ld битов.

Ожидается [ERR_BAD_PRIVKEY]:\n Личный ключ privkey корректен.

Ожидается [ERR_BAD_RNG]:\n Генератор rng (с состоянием rng_state) корректен.

Ожидается:\n Используется криптографически стойкий генератор rng.

Возвращает

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

Аргументы

sig подпись
params долговременные параметры
ld длина подписи в битах
hash хэш-значение
hash_len длина хэш-значения в октетах
privkey личный ключ
rng генератор случайных чисел
rng_state [in/out] состояние генератора

err_t dstuStdParams (dstu_params * params, const char * name)

В params загружаются стандартные долговременные параметры с именем name. Поддерживаются имена '1.2.804.2.1.1.1.1.3.1.1.1.2.0', ..., '1.2.112.0.2.0.34.101.45.3.2.9'. Это имена стандартных эллиптических кривых, заданных в таблице Г.2. Первым именем названа кривая над GF(2^163), последним -- кривая над GF(2^431).

Возвращает

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

Прим.

Имена (идентификаторы) параметров взяты из файла http://www.crypto.org.ua/Media/Default/patches/dstu101e.patch (patch для OpenSSL).

ДСТУ не определяет стандартные базовые точки. Их надо генерировать дополнительно, например, с помощью функции dstuGenPoint().

Аргументы

params стандартные параметры
name имя параметров

err_t dstuValParams (const dstu_params * params)

Проверяется корректность долговременных параметров params.

Возвращает

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

Прим.

Проверяется корректность в том числе и базовой точки P.

Аргументы

params параметры

err_t dstuValPoint (const dstu_params * params, const octet point[])

Проверяется, что точка point эллиптической кривой, заданной долговременными параметрами params, удовлетворяет требованиям ДСТУ.

Ожидается [ERR_BAD_PARAMS]:\n Параметры params корректны.

Возвращает

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

Прим.

Реализован алгоритм из раздела 10.1 ДСТУ.

Аргументы

params долговременные параметры
point проверяемая точка

err_t dstuVerify (const dstu_params * params, size_t ld, const octet hash[], size_t hash_len, const octet sig[], const octet pubkey[])

Проверяется подпись [ld / 8]sig сообщения с хэш-значением [hash_len]hash. При проверке используются долговременные параметры params и открытый ключ pubkey.

Ожидается [ERR_BAD_PARAMS]:\n Параметры params корректны.

Ожидается [ERR_BAD_PUBKEY]:\n Открытый ключ pubkey корректен.

Возвращает

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

Аргументы

params долговременные параметры
ld длина подписи в битах
hash хэш-значение
hash_len длина хэш-значения в октетах
sig подпись
pubkey открытый ключ

Автор

Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.

Info

Пн 13 Фев 2023 Библиотека Bee2