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