Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Ecsafe #18

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions include/bee2/core/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ extern "C" {
#ifdef NDEBUG
#define ASSERT(e) ((void)0)
#else
extern void utilAssert(int e, const char* file, int line);
#define ASSERT(e) utilAssert(!!(e), __FILE__, __LINE__)
extern void utilAssert(int e, const char* file, int line, char const *msg);
#define ASSERT(e) utilAssert(!!(e), __FILE__, __LINE__, #e)
#endif

/*! \brief Проверяется выполнение условия
Expand Down
10 changes: 9 additions & 1 deletion include/bee2/crypto/bign.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ extern "C" {
*******************************************************************************
*/

/*! \brief Предвычисления bign */
typedef struct
{
size_t w; /*!< размер окна w */
octet const *Gs; /*!< малые нечетные кратные {(1-2^w)G, ..., -3G, -1G, 1G, 3G, .., (2^w-1)G, 2G} базовой точки G в аффинных координатах */
} bign_precomp;

/*! \brief Долговременные параметры bign */
typedef struct
{
Expand All @@ -71,7 +78,8 @@ typedef struct
octet b[64]; /*!< коэффициент b */
octet q[64]; /*!< порядок q */
octet yG[64]; /*!< y-координата точки G */
octet seed[8]; /*!< параметр seed */
octet seed[8]; /*!< параметр seed */
bign_precomp precomp; /*!< предвычисления опционально */
} bign_params;

/*! \brief Загрузка стандартных долговременных параметров
Expand Down
296 changes: 207 additions & 89 deletions include/bee2/math/ec.h

Large diffs are not rendered by default.

54 changes: 54 additions & 0 deletions include/bee2/math/ecp.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,60 @@ void ecpSWU(

size_t ecpSWU_deep(size_t n, size_t f_deep);

/*! \brief Расчет малых нечетных кратных в якобиевых координатах

Для i \in \{1,2,\ldots,2^{w-1}-1\} определяются кратности (2i+1) a
аффинной точки [2 * ec->f->n]a кривой ec:
\code
da <- 2 a
c[i] <- (2i+1) a.
\endcode
Кратности помещаются в буфер [(2^{w-1}-1) * 3 * ec->f->n]c.
\pre Описание ec работоспособно.
\pre Координата a лежит в базовом поле.
\expect Описание ec корректно.
\expect Точка a лежит на ec.
\deep{stack} ecpOddSmall_deep(w, ec->f->n, ec->f->deep).
\safe Алгоритм регулрен.
*/
void ecpSmallMultDivpJ(
word c[], /*!< [out] кратные якобиевы точки */
word da[], /*!< [out] удвоенная якобиева точка */
const word a[], /*!< [in] аффинная точка */
const size_t w, /*!< [in] ширина окна */
const ec_o* ec, /*!< [in] описание кривой */
void* stack /*!< [in] вспомогательная память */
);

size_t ecpSmallMultDivpJ_deep(bool_t da, const size_t w, size_t n, size_t f_deep);

/*! \brief Расчет малых нечетных кратных в аффинных координатах

Для i \in \{1,2,\ldots,2^{w-1}-1\} определяются кратности (2i+1) a
аффинной точки [2 * ec->f->n]a кривой ec:
\code
da <- 2 a
c[i] <- (2i+1) a.
\endcode
Кратности помещаются в буфер [(2^{w-1}-1) * 2 * ec->f->n]c.
\pre Описание ec работоспособно.
\pre Координата a лежит в базовом поле.
\expect Описание ec корректно.
\expect Точка a лежит на ec.
\deep{stack} ecpOddSmall_deep(w, ec->f->n, ec->f->deep).
\safe Алгоритм регулрен.
*/
void ecpSmallMultDivpA(
word c[], /*!< [out] кратные аффинные точки */
word da[], /*!< [out] удвоенная аффинная точка */
const word a[], /*!< [in] аффинная точка */
const size_t w, /*!< [in] ширина окна */
const ec_o* ec, /*!< [in] описание кривой */
void* stack /*!< [in] вспомогательная память */
);

size_t ecpSmallMultDivpA_deep(bool_t da, const size_t w, size_t n, size_t f_deep);

#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
9 changes: 9 additions & 0 deletions include/bee2/math/gfp.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,15 @@ size_t gfpIsValid_deep(size_t n);
#define gfpHalf(b, a, f)\
zzHalfMod(b, a, (f)->mod, (f)->n)

#define gfpMul2(c, a, b, a2, b2, f, stack)\
do {\
qrAdd(c, a, b, f);\
qrSqr(c, c, f, stack);\
qrSub(c, c, a2, f);\
qrSub(c, c, b2, f);\
gfpHalf(c, c, f);\
} while(0)

#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
23 changes: 23 additions & 0 deletions include/bee2/math/qr.h
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,29 @@ void qrPower(

size_t qrPower_deep(size_t n, size_t m, size_t r_deep);

/*! \brief Вычисление обратных элеметнов в кольце вычетов для нескольких элементов сразу


//todo описаниие (ссылка на статью, больше деталей)
В кольце вычетов r вычисляются обратные елементы c помощью алгоритма Монтгомери

\pre Описание кольца r работоспособно.
\pre буфферы c и u совпадают или не пересекаются
\expect Описание кольца r корректно.
\deep{stack} qrMontInv_deep(r->n, m, r->deep).
\safe алгоритм регулярен
*/
void qrMontInv(
word c[], /*!< [out] обратные элементы */
const word u[], /*!< [in] входные элементы */
size_t m, /*!< [in] количиство входных элементов */
const qr_o* r, /*!< [in] описание кольца */
void* stack /*!< [in] вспомогательная память */
);

size_t qrMontInv_deep(size_t n, size_t m, size_t r_deep);


#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
95 changes: 93 additions & 2 deletions include/bee2/math/ww.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
\author (C) Sergey Agievich [agievich@{bsu.by|gmail.com}]
\created 2012.04.18
\version 2019.06.27
\license This program is released under the GNU General Public License
\license This program is released under the GNU General Public License
version 3. See Copyright Notices in bee2/info.h.
*******************************************************************************
*/
Expand Down Expand Up @@ -275,7 +275,7 @@ bool_t FAST(wwIsZero)(const word a[], size_t n);

/*! \brief Принимает значение -- машинное слово?

Проверяется, что слово [n]a принимает значение w, которое
Проверяется, что слово [n]a принимает значение w, которое
является машинным словом:
\code
a[0] == w && a[1] == ... == a[n - 1] == 0?
Expand Down Expand Up @@ -484,6 +484,97 @@ size_t wwNAF(
size_t w /*!< [in] длина окна */
);

/*! \brief Расчет OddRecording

В [m]oddRecording помещается кодированное представление нечетного слова
[n]a (a_0, a_1,..., a_{k-1}) такое, что
- a_i \in {\pm 1, \pm 3, ..., \pm 2^w - 1};
- a как число равняется \sum {i=0}^{k-1} a_i 2^{i*w};
.
\remark Кодирование символов состоит в следующем
(\<b> -- двоичная запись числа b):
- положительные a_i представляются двоичными символами 0\<a_i> длины w+1;
- отрицательные a_i представляются двоичными символами 1\<|a_i|> длины w+1;
- кодированное представление - это конкатенация кода a_{k-1}
(первые символы), ...., кода a_1, кода a_0 (последние символы).
.
\remark Для [n]a длину представления k можно оценить следующим образом:
k >= (n * B_PER_W + w - 1) / w.
\remark Для данной реализации значение k всегда должно равняться (n * B_PER_W + w - 1) / w?
\remark Для хранения кодированного представления [n]a потребуется
m = W_OF_B(k * (w + 1)) слов.
\remark Для кодирования k последовательных элементов a_i потребуется
k * (w+1) бит. Поэтому для хранения всего кодового представления
потребуется не менее W_OF_B(k * (w + 1)) слов.
\pre 2 <= w < B_PER_W.
\pre Буфер recording не пересекается с буфером a.
\pre a -- нечетное
\pre k * w >= n * B_PER_W
\pre m >= W_OF_B(k * (w + 1))
\safe Время работы функции зависит от n, k, w;
*/
void wwOddRecording(
word oddRecording[], /*!< [out] кодированное представление */
size_t m, /*!< [in] длина представления в машинных словах */
const word a[], /*!< [in] слово */
size_t n, /*!< [in] длина a в машинных словах */
size_t k, /*!< [in] количество элементов представления */
size_t w /*!< [in] длина окна */
);

/*! \brief Расчет OddRecording_size
Для n --- длины числа в машинных словах и ширины окна w вычисляет оптимальное
(наименьшее) количество элементов кодированного представления OddRecording
k = (n * B_PER_W + w - 1) / w.
\return (n * B_PER_W + w - 1) / w
*/
size_t wwOddRecording_size(const size_t n, const size_t w);

/*! \brief Расчет odd windowed form

В [n]owf помещается кодированное представление нечетного слова
[n]a (a_0, a_1,..., a_{k-1}) такое, что
- k = n * B_PER_W / w
- a_i \in {\pm 1, \pm 3, ..., \pm 2^w - 1};
- a как число равняется \sum {i=0}^{k-1} a_i 2^{i*w};
.
\remark Кодирование символов состоит в следующем
(\<b> -- двоичная запись числа b):
- положительные a_i представляются двоичными символами 0\<a_i> длины w+1;
- отрицательные a_i представляются двоичными символами 1\<|a_i|> длины w+1;
- кодированное представление - это конкатенация кода a_{k-1}
(первые символы), ...., кода a_1, кода a_0 (последние символы).
.
\remark Для [n]a длину представления k можно оценить следующим образом:
k >= (n * B_PER_W + w - 1) / w.
\remark Для данной реализации значение k всегда должно равняться (n * B_PER_W + w - 1) / w?
\remark Для хранения кодированного представления [n]a потребуется
m = W_OF_B(k * (w + 1)) слов.
\remark Для кодирования k последовательных элементов a_i потребуется
k * (w+1) бит. Поэтому для хранения всего кодового представления
потребуется не менее W_OF_B(k * (w + 1)) слов.
\pre 2 <= w < B_PER_W.
\pre Буфер recording не пересекается с буфером a.
\pre a -- нечетное
\pre k * w >= n * B_PER_W
\pre m >= W_OF_B(k * (w + 1))
\safe Время работы функции зависит от n, k, w;
*/
void wwOWF(
word owf[], /*!< [out] кодированное представление */
const word a[], /*!< [in] слово */
size_t n, /*!< [in] длина a в машинных словах */
size_t w /*!< [in] длина окна */
);

/*! \brief Расчет OddRecording_size
Для n --- длины числа в машинных словах и ширины окна w вычисляет оптимальное
(наименьшее) количество элементов кодированного представления OddRecording
k = (n * B_PER_W + w - 1) / w.
\return (n * B_PER_W + w - 1) / w
*/
size_t wwOWF_size(const size_t n, const size_t w);

/*
*******************************************************************************
Сдвиги и очистка
Expand Down
4 changes: 2 additions & 2 deletions src/core/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ Assert
*******************************************************************************
*/

void utilAssert(int b, const char* file, int line)
void utilAssert(int b, const char* file, int line, char const *msg)
{
if (!b)
{
fprintf(stderr, "Assertion in %s::%d\n", file, line);
fprintf(stderr, "Assertion in %s::%d: %s\n", file, line, msg);
abort();
}
}
Expand Down
Loading