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

Info

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