gf2.h - Man Page
Двоичные поля
Synopsis
#include 'bee2/math/qr.h'
Функции
bool_t gf2Create (qr_o *f, const size_t p[4], void *stack)
Создание описания поля GF(2^m)
bool_t gf2IsOperable (const qr_o *f)
Описание поля GF(2^m) работоспособно?
bool_t gf2IsValid (const qr_o *f, void *stack)
Описание поля GF(2^m) корректно?
size_t gf2Deg (const qr_o *f)
Степень расширения поля GF(2^m)
bool_t gf2Tr (const word a[], const qr_o *f, void *stack)
След элемента поля GF(2^m)
bool_t gf2QSolve (word x[], const word a[], const word b[], const qr_o *f, void *stack)
Решение квадратного уравнения в поле GF(2^m)
Подробное описание
Реализованы операции в поле GF(2^m). Элементы поля интерпретируются как элементы кольца вычетов GF(2) / (p(x)), где p(x) --- неприводимый многочлен степени m. Реализована поддержка трехчленов и пятичленов.
Элементы кольца кодируются строками из O_OF_B(m) октетов и задаются массивами из W_OF_B(m) машинных слов. При кодировании используются порядок "от младших к старшим". Перечисленные соглашения можно учитывать при планировании работы в поле.
Многочлен p(x) задается массивом size_t p[4]: p(x) = x^p[0] + x^p[1] + x^p[2] + x^p[3] + 1. В частности, m == p[0] --- степень расширения поля.
При p[2] == 0 должно выполняться также p[3] == 0 и p(x) -- трехчлен.
При p[1] == 0 должно выполняться также p[2] == p[3] == 0 и поле f описывается нормальным базисом (на будущее).
Для трехчленов и пятичленов p(x) должны выполняться ограничения, заданные в функциях ppRedTrinomial(), ppRedPentanomial().
Поле создается с помощью функции gf2Create(). При создании поля анализируется p(x) и в зависимости от его вида выбирается одна из общих функций редукции ppRedTrinomial() или ppRedPentanomial().
Массив p, описывающий p(x), при создании поля фиксируется
по адресу params (см. описание типа qr_o). При создании поля также формируется модуль mod. Модуль представляется либо n машинными словами (степень p(x) кратна B_PER_W), либо n + 1 словом (степень p(x) не кратна B_PER_W).
Некоторые неприводимые многочлены из криптографических стандартов: Belt, GCM: x^128 + x^7 + x^2 + x + 1, NIST163: x^163 + x^7 + x^6 + x^3 + 1, NIST233: x^233 + x^74 + 1, NIST283: x^283 + x^12 + x^7 + x^5 + 1, NIST409: x^409 + x^87 + 1, NIST571: x^571 + x^10 + x^5 + x^2 + 1.
Предусловие
Все указатели, передаваемые в функции, действительны.
- Регулярность
todo
Функции
bool_t gf2Create (qr_o * f, const size_t p[4], void * stack)
По описанию p многочлена p(x) создается описание f поля GF(2^m) = GF(2)/(p(x)). Подбирается оптимальное (с точки зрения эффективности вычислений) описание поля.
- Ожидается
p(x) -- неприводим.
Возвращает
Признак успеха.
- Постусловие
Cтепень расширения m совпадает с p[0].
f->n == W_OF_B(m) и f->no == O_OF_B(m).
- Схема расчета размера состояния f
gf2Create_keep(m).
- Схема расчета глубины stack
gf2Create_deep(m).
- Аргументы
f описание поля
p описание p(x)
stack вспомогательная память
size_t gf2Deg (const qr_o * f)
Определяется степень расширения m поля f = GF(2^m).
Предусловие
Описание f работоспособно.
Возвращает
Степень расширения.
- Аргументы
f описание поля
bool_t gf2IsOperable (const qr_o * f)
Проверяется работоспособность описания f поля GF(2^m). Проверяются следующие условия:
- qrIsOperable(f) == TRUE;
- указатель f->mod корректен;
- указатель f->params корректен;
- f->params указывает на массив [4]p;
- p[0] > p[1] >= p[2] >= p[3] >= 0;
- p[2] > 0 => предыдущие неравенства строгие (для пятичленов);
- последнее слово f->mod ненулевое;
- f->n == W_OF_B(m) (m == p[0]);
- f->no == O_OF_B(m).
Возвращает
Признак работоспособности.
Прим.
Не проверяется согласованность f->mod и [4]p, а также неприводимость f->mod.
- Аргументы
f описание поля
bool_t gf2IsValid (const qr_o * f, void * stack)
Проверяется корректность описания f поля GF(2^m). Проверяются следующие условия:
- gf2IsOperable(f) == TRUE;
- если p[1] > 0, то f->mod и массив [4]p описывают одинаковые многочлены;
- если p[1] > 0, то многочлен f->mod неприводим.
Здесь [4]p -- это массив по адресу f->params.
Возвращает
Признак корректности.
- Схема расчета глубины stack
gf2IsValid_deep(f->n).
- Аргументы
f описание поля
stack вспомогательная память
bool_t gf2QSolve (word x[], const word a[], const word b[], const qr_o * f, void * stack)
В поле f = GF(2^m) для заданных элементов [f->n]a, [f->n]b определяется решение [n]x квадратного уравнения
x^2 + a x + b == 0.
Предусловие
Описание f работоспособно.
m -- нечетное.
Буфер x не пересекается с буферами a, b.
Элементы a и b принадлежат f.
Ожидается
Описание f корректно.
- Возвращает
TRUE, если решение есть, и FALSE в противном случае.
Прим.
Если x -- решение, то и x + a -- решение.
- Схема расчета глубины stack
gf2QSolve_deep(f->n, f->deep).
- Аргументы
x решение
a коэффициент a
b коэффициент b
f описание поля
stack вспомогательная память
bool_t gf2Tr (const word a[], const qr_o * f, void * stack)
В поле f = GF(2^m) определяется абсолютный след элемента [f->n]a:
\tr(a) <- \sum {i = 0}^{m - 1} a^{2^i}.
След совпадает либо с нулем, либо с единицей поля.
Предусловие
Описание f работоспособно.
Элемент a принадлежит f.
Ожидается
Описание f корректно.
- Возвращает
FALSE, если след равняется 0, и TRUE, если след равняется 1.
- Схема расчета глубины stack
gf2Tr_deep(f->n, f->deep).
- Аргументы
a элемент
f описание поля
stack вспомогательная память
Автор
Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.