ecp.h - Man Page

Эллиптические кривые над простыми полями

Synopsis

#include 'bee2/math/ec.h'

Функции

bool_t ecpCreateJ (ec_o *ec, const qr_o *f, const octet A[], const octet B[], void *stack)
Создание эллиптической кривой в якобиановых координатах
bool_t ecpIsValid (const ec_o *ec, void *stack)
Корректное описание эллиптической кривой?
bool_t ecpSeemsValidGroup (const ec_o *ec, void *stack)
Описание группы точек эллиптической кривой выглядит корректным?
bool_t ecpIsSafeGroup (const ec_o *ec, size_t mov_threshold, void *stack)
Надежная группа точек эллиптической кривой?
bool_t ecpIsOnA (const word a[], const ec_o *ec, void *stack)
Аффинная точка лежит на кривой?
void ecpNegA (word b[], const word a[], const ec_o *ec)
Обратная аффинная точка
bool_t ecpAddAA (word c[], const word a[], const word b[], const ec_o *ec, void *stack)
Cложение аффинных точек
bool_t ecpSubAA (word c[], const word a[], const word b[], const ec_o *ec, void *stack)
Вычитание аффинных точек
void ecpSWU (word b[], const word a[], const ec_o *ec, void *stack)
Преобразование элемента поля в аффинную точку

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

Реализована арифметика эллиптических кривых над простым полем f = GF(p). Кривая описывается уравнением Вейерштрасса E: y^2 = x^3 + Ax + B (\mod p). E(GF(p)) -- множество аффинных точек E (решений E в GF(p)), O -- бесконечно удаленная точка.

Поддерживаются якобиановы координаты (с помощью структуры ec_o) и аффинные координаты (прямые функции).

Предусловие

Все указатели, передаваемые в функции, действительны.

Буферы точек не пересекаются с буфером описания кривой.

Регулярность

todo

Функции

bool_t ecpAddAA (word c[], const word a[], const word b[], const ec_o * ec, void * stack)

Определяется сумма [2 * ec->f->n]c аффинных точек [2 * ec->f->n]a и [2 * ec->f->n]b кривой ec:

c <- a + b.

Предусловие

Описание ec работоспособно.

Координаты a и b лежат в базовом поле.

Ожидается

Описание ec корректно.

Ожидается

Точки a и b лежат на ec.

Возвращает

TRUE, если сумма является аффинной точкой, и FALSE в противном случае.

Схема расчета глубины stack

ecpAddAA_deep(ec->f->n, ec->f->deep).

Аргументы

c сумма  
a первое слагаемое  
b второе слагаемое  
ec описание кривой  
stack вспомогательная память

bool_t ecpCreateJ (ec_o * ec, const qr_o * f, const octet A[], const octet B[], void * stack)

Создается описание ec эллиптической кривой в якобиановых координатах над полем f с коэффициентами [f->no]A и [f->no]B.

Возвращает

Признак успеха.

Предусловие

gfpIsOperable(f) == TRUE.

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

f->mod > 3.

Постусловие

ec->d == 3.

Буферы ec->order и ec->base подготовлены для ecCreateGroup().

Схема расчета размера состояния ec

ecpCreateJ_keep(f->n).

Схема расчета глубины stack

ecpCreateJ_deep(f->n, f->deep).

Аргументы

ec описание кривой  
f базовое поле  
A коэффициент A  
B коэффициент B  
stack вспомогательная память

bool_t ecpIsOnA (const word a[], const ec_o * ec, void * stack)

Проверяется, что аффинная точка [2 * ec->f->n]a лежит на кривой ec.

Предусловие

Описание ec работоспособно.

Ожидается

Описание ec корректно.

Возвращает

Признак успеха проверки.

Схема расчета глубины stack

ecpIsOnA_deep(ec->f->n, ec->f->deep).

Аргументы

a точка  
ec описание кривой  
stack вспомогательная память

bool_t ecpIsSafeGroup (const ec_o * ec, size_t mov_threshold, void * stack)

Для группы точек кривой ec проверяются следующие условия, определяющие ее криптографическую надежность:

  • ec->order -- простое;
  • ec->order != p (условие Семаева);
  • ec->order не делит числа p^i - 1, i <= mov_threshold (MOV).

Предусловие

Описание ec (включая описание группы точек) работоспособно.

Ожидается

Описание ec (включая описание группы точек) корректно.

Возвращает

Признак успеха проверки.

Схема расчета глубины stack

ecpIsSafeGroup_deep(ec->f->n).

Аргументы

ec описание кривой  
mov_threshold MOV-порог  
stack вспомогательная память

bool_t ecpIsValid (const ec_o * ec, void * stack)

Проверяется корректность описания ec эллиптической кривой. Описание корректно, если:

  • ecSeemsValid(ec) == TRUE;
  • gfpIsValid(ec->f) == TRUE;
  • ec->f->mod > 3;
  • A, B ∈ f;
  • 4 A^3 + 27 B^2 не делится на p (гладкость).

Возвращает

Признак корректности.

Схема расчета глубины stack

ecpIsValid_deep(ec->f->n, f->deep).

Аргументы

ec описание кривой  
stack вспомогательная память

void ecpNegA (word b[], const word a[], const ec_o * ec)

Определяется аффинная точка [2 * ec->f->n]b кривой ec, обратная к аффинной точке [2 * ec->f->n]a.

Предусловие

Описание ec работоспособно.

Координаты a лежат в базовом поле.

Ожидается

Описание ec корректно.

Ожидается

Точка a лежит на ec.

Аргументы

b обратная точка  
a точка  
ec описание кривой

bool_t ecpSeemsValidGroup (const ec_o * ec, void * stack)

Проверяется корректность описания группы точек эллиптической кривой ec. Описание корректно, если:

  • ecIsOperableGroup(ec) == TRUE;
  • |ec->order * ec->cofactor - (p + 1)| <= 2 * \sqrt(p) (границы Хассе);
  • точка ec->base лежит на ec.

Предусловие

Описание ec работоспособно.

Возвращает

Признак корректности.

Прим.

Не проверяется, что порядок ec->base равняется ec->order.

Схема расчета глубины stack

ecpSeemsValidGroup_deep(ec->f->n, ec->f->deep).

Аргументы

ec описание кривой  
stack вспомогательная память

bool_t ecpSubAA (word c[], const word a[], const word b[], const ec_o * ec, void * stack)

Определяется разность [2 * ec->f->n]c аффинных точек [2 * ec->f->n]a и [2 * ec->f->n]b эллиптической кривой ec:

c <- a - b.

Предусловие

Описание ec работоспособно.

Координаты a и b лежат в базовом поле.

Ожидается

Описание ec корректно.

Ожидается

Точки a и b лежат на ec.

Возвращает

TRUE, если разность является аффинной точкой, и FALSE в противном случае (a == b).

Схема расчета глубины stack

ecpSubAA_deep(n, ec->f->deep).

Аргументы

c разность  
a уменьшаемое  
b вычитаемое  
ec описание кривой  
stack вспомогательная память

void ecpSWU (word b[], const word a[], const ec_o * ec, void * stack)

Элемент [ec->f->n]a поля ec->f преобразуется в аффинную точку [2 * ec->f->n]b эллиптической кривой ec.

Предусловие

Описание ec работоспособно.

a ∈ f && p \equiv 3 (\mod 4) && A != 0 && B != 0.

Ожидается

Описание ec корректно.

Ожидается

B -- квадратичный вычет по модулю p. Если это условие нарушается, то точка b не будет лежать на ec для a ∈ {0, p - 1}.

Прим.

Реализован алгоритм SWU в редакции СТБ 34.101.66.

Схема расчета глубины stack

ecpSWU_deep(ec->f->n, ec->f->deep).

Аргументы

b точка  
a элемент поля  
ec описание кривой  
stack вспомогательная память

Автор

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

Info

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