Skip to content

Commit

Permalink
++ec_dbl_adda_i
Browse files Browse the repository at this point in the history
  • Loading branch information
StanislauParuchnik committed Mar 21, 2021
1 parent b48f743 commit 8821f7a
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 27 deletions.
103 changes: 77 additions & 26 deletions include/bee2/math/ec.h
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,30 @@ typedef void (*ec_tpl_i)(
void* stack /*!< [in] вспомогательная память */
);

/*! \brief Удвоение якобиевой и вычитание/сложение с аффинной точкой
На эллиптической кривой ec определяется точка [3 * ec->f->n]с,
полученная удвоением точки [3 * ec->f->n]a и сложением с точкой ((-1) ^ (1 + neg_b)) * [2 * ec->f->n]b:
\code
c <- 2 a + ((-1) ^ (1 + neg_b)) b.
\endcode
\pre Описание ec работоспособно.
\pre Буфер c либо не пересекается, либо совпадает с буфером a.
\pre Буферы a и b не пересекается.
\pre Буферы b и c не пересекается.
\pre Координаты a и b лежат в базовом поле.
\expect Описание ec корректно.
\expect Точки a и b лежат на кривой.
*/
typedef void (*ec_dbl_adda_i)(
word с[], /*!< [out] результат удвоения и сложения*/
const word a[], /*!< [in] первоначальная точка */
const word b[], /*!< [in] первоначальная точка */
bool_t neg_b, /*!< [in] флаг вычитания/сложения с точкой b*/
const struct ec_o* ec, /*!< [in] описание эллиптической кривой */
void* stack /*!< [in] вспомогательная память */
);

typedef void (*ec_smulsa_i)(
word* c, /*!< [out] линейный массив нечетных малых кратных (2i-1)[2n]a для i=1,2^{w-1} в аффинных координатах */
word d[], /*!< [out] опционально (если d != NULL) удвоенная точка (2)[2n]a в аффинных координатах */
Expand Down Expand Up @@ -399,34 +423,35 @@ typedef void (*ec_smulsj_i)(
*/
typedef struct ec_o
{
obj_hdr_t hdr; /*!< заголовок */
obj_hdr_t hdr; /*!< заголовок */
// ptr_table {
const qr_o* f; /*!< базовое поле */
word* A; /*!< коэффициент A */
word* B; /*!< коэффициент B */
word* base; /*!< базовая точка */
word* order; /*!< порядок группы точек */
void* params; /*!< дополнительные параметры */
const qr_o* f; /*!< базовое поле */
word* A; /*!< коэффициент A */
word* B; /*!< коэффициент B */
word* base; /*!< базовая точка */
word* order; /*!< порядок группы точек */
void* params; /*!< дополнительные параметры */
// }
size_t d; /*!< размерность */
word cofactor; /*!< кофактор группы точек */
ec_froma_i froma; /*!< функция импорта из аффинной точки */
ec_toa_i toa; /*!< функция экспорта в аффинную точку */
ec_neg_i neg; /*!< функция обращения */
ec_nega_i nega; /*!< функция обращения аффинной точки */
ec_add_i add; /*!< функция сложения */
ec_adda_i adda; /*!< функция сложения с аффинной точкой */
ec_sub_i sub; /*!< функция вычитания */
ec_suba_i suba; /*!< функция вычитания аффинной точки */
ec_dbl_i dbl; /*!< функция удвоения */
ec_dbla_i dbla; /*!< функция удвоения аффинной точки */
ec_tpl_i tpl; /*!< функция утроения */
ec_smulsa_i smulsa; /*!< рассчет малых кратных в аффинных координатах */
ec_smulsj_i smulsj; /*!< рассчет малых кратных в якобиевых координатах */
size_t precomp_w; /*!< размер окна w */
word const *precomp_Gs; /*!< малые нечетные кратные {(1-2^w)G, ..., -3G, -1G, 1G, 3G, .., (2^w-1)G, 2G} базовой точки G в аффинных координатах */
size_t deep; /*!< максимальная глубина стека функций */
octet descr[]; /*!< память для размещения данных */
size_t d; /*!< размерность */
word cofactor; /*!< кофактор группы точек */
ec_froma_i froma; /*!< функция импорта из аффинной точки */
ec_toa_i toa; /*!< функция экспорта в аффинную точку */
ec_neg_i neg; /*!< функция обращения */
ec_nega_i nega; /*!< функция обращения аффинной точки */
ec_add_i add; /*!< функция сложения */
ec_adda_i adda; /*!< функция сложения с аффинной точкой */
ec_sub_i sub; /*!< функция вычитания */
ec_suba_i suba; /*!< функция вычитания аффинной точки */
ec_dbl_i dbl; /*!< функция удвоения */
ec_dbla_i dbla; /*!< функция удвоения аффинной точки */
ec_tpl_i tpl; /*!< функция утроения */
ec_dbl_adda_i dbl_adda; /*!< функция удвоения якобиевой точки и вычитания/сложения с аффинной точкой */
ec_smulsa_i smulsa; /*!< рассчет малых кратных в аффинных координатах */
ec_smulsj_i smulsj; /*!< рассчет малых кратных в якобиевых координатах */
size_t precomp_w; /*!< размер окна w */
word const *precomp_Gs; /*!< малые нечетные кратные {(1-2^w)G, ..., -3G, -1G, 1G, 3G, .., (2^w-1)G, 2G} базовой точки G в аффинных координатах */
size_t deep; /*!< максимальная глубина стека функций */
octet descr[]; /*!< память для размещения данных */
} ec_o;

/*
Expand Down Expand Up @@ -717,6 +742,32 @@ bool_t SAFE(ecAddMulA)(

size_t SAFE(ecAddMulA_deep)(size_t n, size_t ec_d, size_t ec_deep, size_t k,...);

/*! \brief Удвоение якобиевой и вычитание/сложение с аффинной точкой
На эллиптической кривой ec определяется точка [3 * ec->f->n]с,
полученная удвоением точки [3 * ec->f->n]a и сложением с точкой ((-1) ^ (1 + neg_b)) * [2 * ec->f->n]b:
\code
c <- 2 a + ((-1) ^ (1 + neg_b)) b.
\endcode
\pre Описание ec работоспособно.
\pre Буфер c либо не пересекается, либо совпадает с буфером a.
\pre Буферы a и b не пересекается.
\pre Буферы b и c не пересекается.
\pre Координаты a и b лежат в базовом поле.
\expect Описание ec корректно.
\expect Точки a и b лежат на кривой.
*/
void ecDblAddA(
word с[], /*!< [out] результат удвоения и сложения*/
const word a[], /*!< [in] первоначальная точка */
const word b[], /*!< [in] первоначальная точка */
bool_t neg_b, /*!< [in] флаг вычитания/сложения с точкой b*/
const struct ec_o* ec, /*!< [in] описание эллиптической кривой */
void* stack /*!< [in] вспомогательная память */
);

//size_t ecDblAddA_deep(); = max(ec->dbl_deep, ec->suba_deep, ec->adda_deep) - уже учитываются в функциях ecCreate

void ecSmallMultAdd2J(
word c[], /*!< [out] кратные якобиевы точки */
word d[], /*!< [out] удвоенная якобиева точка */
Expand Down
12 changes: 12 additions & 0 deletions src/math/ec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1347,6 +1347,18 @@ size_t ecAddMulA_deep(size_t n, size_t ec_d, size_t ec_deep, size_t k, ...) {
;
}

void ecDblAddA(word c[], const word a[], const word b[], bool_t neg_b, const struct ec_o* ec, void* stack) {
//todo SAFE - memcpy b to another buffer and apply (-1)^(1+neg_b) to it?
ec->dbl(c, a, ec, stack);
if (neg_b) {
ec->suba(c, c, b, ec, stack);
}
else
{
ec->adda(c, c, b, ec, stack);
}
}

void ecSmallMultAdd2J(word* c, word d[], const word a[], const size_t w, const ec_o* ec, void* stack) {
const size_t n = ec->f->n * ec->d;
size_t k = SIZE_1 << (w - 1);
Expand Down
1 change: 1 addition & 0 deletions src/math/ec2.c
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,7 @@ bool_t ec2CreateLD(ec_o* ec, const qr_o* f, const octet A[], const octet B[],
ec->suba = ec2SubALD;
ec->dbl = ec2DblLD;
ec->dbla = ec2DblALD;
ec->dbl_adda = ecDblAddA;
ec->smulsa = ecSmallMultAdd2A;
ec->smulsj = ecSmallMultAdd2J;
ec->deep = utilMax(8,
Expand Down
14 changes: 13 additions & 1 deletion src/math/ecp.c
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,16 @@ size_t ecpTplJA3_deep(size_t n, size_t f_deep)
return O_OF_W(7 * n) + f_deep;
}

void ecpDblAddA(word c[], const word a[], const word b[], bool_t neg_b, const struct ec_o* ec, void* stack) {
//todo implement properly for ecp
ecDblAddA(c, a, b, neg_b, ec, stack);
}

void ecpDblAddA_deep() {
//todo implement properly for ecp
return 0;
}

bool_t ecpDivp = TRUE;
bool_t ecpCreateJ(ec_o* ec, const qr_o* f, const octet A[], const octet B[],
void* stack)
Expand Down Expand Up @@ -846,6 +856,7 @@ bool_t ecpCreateJ(ec_o* ec, const qr_o* f, const octet A[], const octet B[],
ec->dbl = bA3 ? ecpDblJA3 : ecpDblJ;
ec->dbla = ecpDblAJ;
ec->tpl = bA3 ? ecpTplJA3 : ecpTplJ;
ec->dbl_adda = ecpDblAddA;
ec->smulsa = ecpDivp ? ecpSmallMultDivpA : ecSmallMultAdd2A;
ec->smulsj = ecpDivp ? ecpSmallMultDivpJ : ecSmallMultAdd2J;
ec->deep = utilMax(8,
Expand All @@ -856,7 +867,8 @@ bool_t ecpCreateJ(ec_o* ec, const qr_o* f, const octet A[], const octet B[],
ecpSubAJ_deep(f->n, f->deep),
bA3 ? ecpDblJA3_deep(f->n, f->deep) : ecpDblJ_deep(f->n, f->deep),
ecpDblAJ_deep(f->n, f->deep),
bA3 ? ecpTplJA3_deep(f->n, f->deep) : ecpTplJ_deep(f->n, f->deep));
bA3 ? ecpTplJA3_deep(f->n, f->deep) : ecpTplJ_deep(f->n, f->deep),
ecpDblAddA_deep);
ec->deep += utilMax(3,
ecpDivp
? ecpSmallMultDivpA_deep(TRUE, 6, f->n, f->deep)
Expand Down

0 comments on commit 8821f7a

Please sign in to comment.