Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
883e410
Start v2.2.1
agievich Dec 22, 2025
0b96e4b
Upgrade rng/trng: retries and 64-bit values
agievich Dec 23, 2025
679cdbd
Update comments in core/rng/trng
agievich Dec 24, 2025
2c32027
Simplify memWipe()
agievich Dec 24, 2025
54c1366
Use BCryptGenRandom() as sys2 entropy source
agievich Dec 24, 2025
c1ee87f
Fix typos in comments
agievich Dec 29, 2025
21b9f20
Refine belsGenMid()
agievich Jan 8, 2026
5ab060b
Provide interface for calculating small multiples in ec.h
agievich Jan 9, 2026
1d8f3c3
Refactor NAF methods
agievich Jan 12, 2026
06746a0
Add ecMulSNZ()
agievich Jan 16, 2026
432afb4
Start complete addition formulas in math/ecp
agievich Jan 16, 2026
3b3f3b4
Update interfaces in math/ec
agievich Jan 18, 2026
0c012b9
Clarify bibitems
agievich Jan 20, 2026
f29911d
Update test/math/ecp and pp
agievich Jan 20, 2026
741cea6
Add ecpDblAddA() and ecpFinAddA()
agievich Jan 21, 2026
248bd27
Clarify ecpDblAddA()
agievich Jan 22, 2026
ade2cc3
Start math/ec/pre
agievich Jan 26, 2026
2b253b0
Start ec/pre/SNZ
agievich Jan 27, 2026
6dd8e92
Start math/ec/SNZA
agievich Jan 27, 2026
a91a4bb
Finish ecMulPreSNZ()
agievich Jan 28, 2026
84e4adf
Update test/ecp
agievich Jan 29, 2026
7635c92
Fix comments in math/ec
agievich Feb 2, 2026
acc0d51
Add ec_sgn_i and ec_sgna_i interfaces
agievich Feb 3, 2026
0b569a6
Update test/math/ecp
agievich Feb 3, 2026
c3632fb
Update SNZ and SNZA schemas in math/ec
agievich Feb 4, 2026
ac1b6d2
Add wwSel()
agievich Feb 4, 2026
a8331a5
Split math/ecp into parts
agievich Feb 4, 2026
ed2092f
Start math/ecp/pre
agievich Feb 4, 2026
feb0558
Update ecpPreSNZ()
agievich Feb 5, 2026
bda29ec
Update math/ecp/pre
agievich Feb 6, 2026
b54e9b8
Finish ecpPreSNZ()
agievich Feb 6, 2026
6bef02f
Start ecpPreSNZA()
agievich Feb 7, 2026
ac88c90
Finish ecpPreSNZA()
agievich Feb 9, 2026
fac6b4f
Start math/ec/pre/snzh
agievich Feb 9, 2026
8653436
Finish ecMulPreSNZH()
agievich Feb 9, 2026
9bad13b
Start math/ec/preHPB
agievich Feb 11, 2026
da7f3e9
Finish ecMulPreHPB()
agievich Feb 11, 2026
a05a088
Add test/math/ec
agievich Feb 12, 2026
009e5d3
Add odd_order to the inputs of ecpCreateJ()
agievich Feb 12, 2026
09fada5
Update test/math/ec
agievich Feb 12, 2026
cf486cd
Make math/gfp/inv constant-time
agievich Feb 13, 2026
880a743
Make Bign algorithms constant-time
agievich Feb 13, 2026
4c31c19
Rename math/ec/pre schemas
agievich Feb 16, 2026
641ea30
Slightly optimize ecMulPreSOA()
agievich Feb 18, 2026
0d8547c
Start Co-Z formulas in math/ecp
agievich Feb 20, 2026
f6973c4
Switch math/ecp/pre to use Co-Z formulas
agievich Feb 21, 2026
fd3b59e
Add SH schema to math/ec
agievich Feb 23, 2026
c375a4f
Clarify comments in math/ec
agievich Feb 24, 2026
3b67e13
Clarify preconditions in math/ec
agievich Feb 24, 2026
57e4350
Add ecMulPreSH()
agievich Mar 3, 2026
ca3a6e1
Make Bake protocols constant-time
agievich Mar 3, 2026
8d0983a
Simplify bench/ecp
agievich Mar 3, 2026
3a47fb3
Replace ecMulSH() with ecMulSO2() in math/ec
agievich Mar 5, 2026
2559550
Add bignPrePrint()
agievich Mar 5, 2026
3f5c964
Add Bign128, Bign192 and Bign256
agievich Mar 6, 2026
f0c6fa7
Fix bignXXXEcUnlock() calls
agievich Mar 6, 2026
c10dc9b
Fix ecPreIsOperable() after Coverity warning
agievich Mar 6, 2026
ce5d51c
Fix unchecked return values in ec_test and ecp_bench
agievich Mar 6, 2026
ddab213
Simplify management of elliptic curves in crypto/bignXXX
agievich Mar 8, 2026
8cab5c0
Add bign_bench
agievich Mar 9, 2026
b5ad20f
Clarify comments in ec.h
agievich Mar 9, 2026
c7cb624
Clarify preconditions in ec.h
agievich Mar 10, 2026
113ec7e
Use bignXXX everywhere
agievich Mar 10, 2026
6e7aae3
Use precomputed tables in bign96
agievich Mar 10, 2026
9293d4d
Go to v2.2.2
agievich Mar 13, 2026
05bbf6e
Rearrange jobs in actions/build
agievich Mar 13, 2026
5f94218
Link bee2_static with phtread
agievich Mar 13, 2026
a1aae80
Prefetch tables in belt_block
agievich Mar 15, 2026
fa6b879
Merge branch 'master' into dev
agievich Mar 18, 2026
9d2b833
Fix rngSysRead error handling for fileRead2
WhyNovaa Mar 18, 2026
ad3e7f1
Update unix/rngSysRead()
agievich Mar 18, 2026
7202e28
Start v2.2.3
agievich Mar 18, 2026
145b0d8
Fix comments in math/qr and core/rng
agievich Mar 20, 2026
c4777d1
Improve tests for rngTestFIPSX()
agievich Mar 20, 2026
75465b1
Fix a typo in zzSubIf()
agievich Mar 20, 2026
236b2b8
Fix bignKeyUnwrapEc()
agievich Mar 24, 2026
fa53ee1
Suppress non-const-time strEq() in crypto/botp
agievich Mar 24, 2026
758a5c2
Go to v2.2.4
agievich Mar 25, 2026
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
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.5...3.31)
project(BEE2
VERSION 2.2.2
VERSION 2.2.4
LANGUAGES C
)

Expand Down
14 changes: 7 additions & 7 deletions include/bee2/core/rng.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Entropy sources and random number generators
\project bee2 [cryptographic library]
\created 2014.10.13
\version 2025.10.03
\version 2026.03.20
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -36,10 +36,10 @@ extern "C" {
Реализованы статистические тесты стандарта FIPS 140-2. В этих тестах
обрабатывает последовательность двоичных символов длины 20000 (2500 байтов).

Уровень значимости тестов p = 0.01. С такой вероятностью истинно случайная
последовательность не пройдет тест. Известно, что тесты FIPS слабо зависимы.
Поэтому истинно случайная последовательность не пройдет батарею из n тестов
с вероятностью 1 - (1 - p)^n \approx n p.
Уровень значимости тестов p \approx 0.0001. С такой вероятностью истинно
случайная последовательность не пройдет тест. Известно, что тесты FIPS слабо
зависимы. Поэтому истинно случайная последовательность не пройдет батарею из n
тестов с вероятностью 1 - (1 - p)^n \approx n p.

\safe Обрабатываемые в тестах данные не считаются секретными. Эти данные
не должны использовать для построения ключей.
Expand Down Expand Up @@ -83,7 +83,7 @@ bool_t rngTestFIPS2(
выполняется: S_1 \in [2315, 2685], S_2 \in [1114, 1386],
S_3 \in [527, 723], S_4 \in [240, 384], S_5, S_6+ \in [103, 209].
Здесь S_i -- количество серий длины i = 1, 2, ..., S_6+ = S_6 + S_7 + ....
\remark Бит с номером i: wwTestBit((const word*)buf, i).
\remark Бит с номером i: (buf[i / 8] >> (i % 8)) & 1.
*/
bool_t rngTestFIPS3(
const octet buf[2500] /*!< [in] тестируемая последовательность */
Expand All @@ -96,7 +96,7 @@ bool_t rngTestFIPS3(
\return Признак успешного прохождения теста.
\remark Тест пройден, если в последовательности отсутствуют серии
длины 26 и больше.
\remark Бит с номером i: wwTestBit((const word*)buf, i).
\remark Бит с номером i: (buf[i / 8] >> (i % 8)) & 1.
*/
bool_t rngTestFIPS4(
const octet buf[2500] /*!< [in] тестируемая последовательность */
Expand Down
8 changes: 4 additions & 4 deletions include/bee2/info.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,18 @@
#define __BEE2_INFO

#define BEE2_NAME "Bee2"
#define BEE2_VERSION "2.2.2"
#define BEE2_VERSION "2.2.4"
#define BEE2_VERSION_MAJOR "2"
#define BEE2_VERSION_MINOR "2"
#define BEE2_VERSION_PATCH "2"
#define BEE2_VERSION_PATCH "4"
#define BEE2_VERSION_NUM\
2, 2, 2
2, 2, 4

/*!
*******************************************************************************
\mainpage Библиотека Bee2

\version 2.2.2
\version 2.2.4

\section toc Содержание

Expand Down
4 changes: 2 additions & 2 deletions include/bee2/math/zz.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Multiple-precision unsigned integers
\project bee2 [cryptographic library]
\created 2012.04.22
\version 2026.01.20
\version 2026.03.20
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -292,7 +292,7 @@ word zzSubW2(
\remark Функция используется при регуляризации.
*/
void zzSubIf(
word с[], /*!< [out] результат */
word c[], /*!< [out] результат */
const word a[], /*!< [in] потенциальное уменьшаемое */
const word b[], /*!< [in] потенциальное вычитаемое */
size_t n, /*!< [in] длина чисел в машинных словах */
Expand Down
10 changes: 5 additions & 5 deletions src/core/rng/rng_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Random number generation: system entropy sources
\project bee2 [cryptographic library]
\created 2014.10.13
\version 2025.12.24
\version 2026.03.18
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -138,14 +138,14 @@ err_t rngSys2Read(void* buf, size_t* read, size_t count)
err_t rngSysRead(void* buf, size_t* read, size_t count)
{
file_t file;
ASSERT(memIsValid(read, O_PER_S));
err_t code;
ASSERT(memIsValid(buf, count));
file = fileOpen("/dev/urandom", "rb");
if (!file)
return ERR_FILE_OPEN;
*read = fileRead2(buf, count, file);
fclose(file);
return ERR_OK;
code = fileRead(read, buf, count, file);
fileClose(file);
return code;
}

#if defined(OS_APPLE)
Expand Down
27 changes: 13 additions & 14 deletions src/core/rng/rng_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Random number generation: statistical tests
\project bee2 [cryptographic library]
\created 2014.10.13
\version 2025.10.08
\version 2026.03.20
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand All @@ -24,10 +24,13 @@
*******************************************************************************
*/

#define memTestBit(buf, i)\
((((const octet*)(buf))[(i) / 8] >> ((i) % 8)) & 1)

bool_t rngTestFIPS1(const octet buf[2500])
{
register size_t s;
register word w;
size_t s;
word w;
size_t count;
ASSERT(memIsValid(buf, 2500));
for (w = 0, count = 2500; !memIsAligned(buf, O_PER_W); ++buf, --count)
Expand All @@ -41,17 +44,16 @@ bool_t rngTestFIPS1(const octet buf[2500])
for (w = 0; count; ++buf, --count)
w = (w << 8) | *buf;
s += wordWeight(w);
CLEAN(w);
return 9725 < s && s < 10275;
}

bool_t rngTestFIPS2(const octet buf[2500])
{
u32 s[16];
size_t i = 2500;
size_t i;
ASSERT(memIsValid(buf, 2500));
memSetZero(s, sizeof(s));
while (i--)
for (i = 2500; i--;)
++s[buf[i] & 15], ++s[buf[i] >> 4];
s[0] *= s[0];
for (i = 1; i < 16; ++i)
Expand All @@ -62,16 +64,15 @@ bool_t rngTestFIPS2(const octet buf[2500])

bool_t rngTestFIPS3(const octet buf[2500])
{
word s[2][7];
size_t s[2][7];
octet b;
size_t l;
size_t i;
ASSERT(memIsValid(buf, 2500));
memSetZero(s, sizeof(s));
b = buf[0] & 1;
l = 1;
for (i = 1; i < 20000; ++i)
if ((buf[i / 8] >> i % 8 & 1) == b)
for (i = l = 1; i < 20000; ++i)
if (memTestBit(buf, i) == b)
++l;
else
++s[b][MIN2(l, 6)], b = !b, l = 1;
Expand All @@ -97,9 +98,8 @@ bool_t rngTestFIPS4(const octet buf[2500])
size_t i;
ASSERT(memIsValid(buf, 2500));
b = buf[0] & 1;
l = 1;
for (i = 1; i < 20000; ++i)
if ((buf[i / 8] >> i % 8 & 1) == b)
for (i = l = 1; i < 20000; ++i)
if (memTestBit(buf, i) == b)
++l;
else
{
Expand All @@ -109,4 +109,3 @@ bool_t rngTestFIPS4(const octet buf[2500])
}
return l < 26;
}

3 changes: 2 additions & 1 deletion src/crypto/bign/bign_keyt.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief STB 34.101.45 (bign): key transport
\project bee2 [cryptographic library]
\created 2012.04.27
\version 2026.02.13
\version 2026.03.24
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -218,6 +218,7 @@ err_t bignKeyUnwrapEc(octet key[], const ec_o* ec, const octet token[],
header == 0 && !memIsZero(header2, 16))
{
memSetZero(key, len - no - 16);
blobClose(state);
return ERR_BAD_KEYTOKEN;
}
// завершение
Expand Down
13 changes: 6 additions & 7 deletions src/crypto/botp.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief STB 34.101.47/botp: OTP algorithms
\project bee2 [cryptographic library]
\created 2015.11.02
\version 2025.09.23
\version 2026.03.24
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand All @@ -27,9 +27,8 @@
В botpDT() реализован механизм "динамической обрезки" (dynamic truncation),
объявленный в RFC 4226 для HMAC(SHA-1), а затем продолженный в RFC 6238, 6287
для HMAC(SHA-256) и HMAC(SHA-512). Пояснений по продолжению нет, но как выяснили
экспериментально вот здесь
http://crypto.stackexchange.com/questions/27474/
[how-does-the-hotp-dynamic-truncation-function-generalize-to-longer-hashes]
экспериментально вот здесь
http://crypto.stackexchange.com/questions/27474/
номер октета, с которого начинается пароль, определяется по последнему октету
mac.

Expand Down Expand Up @@ -164,7 +163,7 @@ bool_t botpHOTPStepV(const char* otp, void* state)
memCopy(st->ctr1, st->ctr, 8);
// проверить пароль
botpHOTPStepR(st->otp, state);
if (strEq(st->otp, otp))
if (strLen(otp) == st->digit && memEq(st->otp, otp, st->digit))
return TRUE;
// вернуться к первоначальному счетчику
memCopy(st->ctr, st->ctr1, 8);
Expand Down Expand Up @@ -282,7 +281,7 @@ bool_t botpTOTPStepV(const char* otp, tm_time_t t, void* state)
ASSERT(memIsDisjoint2(otp, strLen(otp) + 1, state, botpTOTP_keep()));
// вычислить и проверить пароль
botpTOTPStepR(st->otp, t, state);
return strEq(st->otp, otp);
return strLen(otp) == st->digit && memEq(st->otp, otp, st->digit);
}

err_t botpTOTPRand(char* otp, size_t digit, const octet key[], size_t key_len,
Expand Down Expand Up @@ -573,7 +572,7 @@ bool_t botpOCRAStepV(const char* otp, const octet q[], size_t q_len,
memCopy(st->ctr1, st->ctr, 8);
// проверить пароль
botpOCRAStepR(st->otp, q, q_len, t, state);
if (strEq(st->otp, otp))
if (strLen(otp) == st->digit && memEq(st->otp, otp, st->digit))
return TRUE;
// вернуться к первоначальному счетчику
memCopy(st->ctr, st->ctr1, 8);
Expand Down
23 changes: 14 additions & 9 deletions src/math/qr.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Quotient rings
\project bee2 [cryptographic library]
\created 2013.09.14
\version 2026.02.05
\version 2026.03.19
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
Expand Down Expand Up @@ -53,23 +53,25 @@ bool_t qrIsOperable(const qr_o* r)
Возведение в степень

В функции qrPower() реализован скользящий оконный метод возведения
в степень (c = a^b). Предварительно рассчитываются малые степени
в степень:
c <- a^b.
Предварительно рассчитываются малые степени
a^1, a^3,..., a^{2^w} - 1,
где w --- величина окна. Затем в b выделяются серии из нулей и слайды.
Слайд -- это битовый фрагмент, окаймленный единицами, длина которого не
превосходит w. Слайд интерпретируется как число (нечетное).

Обработка нуля серии состоит в возведении с в квадрат.
Обработка слайда длины slide_size состоит в slide_size возведениях c
в квадрат и последующем умножении c на малую степень a.
Обработка нуля серии состоит в возведении с в квадрат. Обработка слайда длины
slide_size состоит в slide_size возведениях c в квадрат и последующем
умножении c на малую степень a.

В начале вычислений выполняется присвоение c <- a^{старший_слайд_b}.
В начале вычислений выполняется присвоение
c <- a^{старший_слайд_b}.

Скользящий оконный метод основан на представлении
b = \sum {i=0}^{l - 1} b_i 2^i, b_i \in {0, 1, 3,..., 2^w - 1}
Известно [Moller B. Improved Techniques for Fast Exponentiation,
ICISC 2002], что l = wwBitSize(b) и доля ненулевых b_i для случайного
показателя b равняется 1 / (w + 1).
Известно [Mol02], что доля ненулевых b_i для случайного показателя b
равняется 1 / (w + 1).

Для расчета малых степеней a требуется 2^{w - 1} - 1 умножения.
Для расчета c в среднем требуется еще около (l - w) / (w + 1) умножений
Expand All @@ -78,6 +80,9 @@ ICISC 2002], что l = wwBitSize(b) и доля ненулевых b_i для

В функции qrCalcSlideWidth() определяется w, которое доставляет
минимум целевой функции 2^{w - 1} + (l - w) / (w + 1).

[Mol02] Moller B. Information Security and Cryptology – ICISC 2002,
Springer-Verlag LNCS 2587, pp. 298–312, ISBN 3-540-00716-4, 2003.
*******************************************************************************
*/

Expand Down
12 changes: 11 additions & 1 deletion test/core/rng_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
\brief Tests for random number generators
\project bee2/test
\created 2014.10.10
\version 2025.10.07
\version 2026.03.20
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
*/

#include <stdio.h>
#include <bee2/core/hex.h>
#include <bee2/core/mem.h>
#include <bee2/core/rng.h>
#include <bee2/core/util.h>

Expand Down Expand Up @@ -54,6 +55,15 @@ bool_t rngTest()
printf("rngSource[%5s]: %s\n", sources[pos], hex);
}
}
// тестирование специально подобранных данных
memSet(buf, 0x5C, 2500);
if (!rngTestFIPS1(buf) || rngTestFIPS2(buf) ||
rngTestFIPS3(buf) || !rngTestFIPS4(buf))
return FALSE;
memSet(buf + 10, 0x00, 69);
if (rngTestFIPS1(buf) || rngTestFIPS2(buf) ||
rngTestFIPS3(buf) || rngTestFIPS4(buf))
return FALSE;
// работа с ГСЧ
if (rngCreate(0, 0) != ERR_OK)
return FALSE;
Expand Down
Loading