diff --git a/CMakeLists.txt b/CMakeLists.txt index 77c7095e..3a24164f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.5...3.31) project(BEE2 - VERSION 2.2.2 + VERSION 2.2.4 LANGUAGES C ) diff --git a/include/bee2/core/rng.h b/include/bee2/core/rng.h index 280f3226..e945f36b 100644 --- a/include/bee2/core/rng.h +++ b/include/bee2/core/rng.h @@ -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). ******************************************************************************* @@ -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 Обрабатываемые в тестах данные не считаются секретными. Эти данные не должны использовать для построения ключей. @@ -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] тестируемая последовательность */ @@ -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] тестируемая последовательность */ diff --git a/include/bee2/info.h b/include/bee2/info.h index b02bd5d5..a73ecdf6 100644 --- a/include/bee2/info.h +++ b/include/bee2/info.h @@ -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 Содержание diff --git a/include/bee2/math/zz.h b/include/bee2/math/zz.h index e3ecff46..baac3031 100644 --- a/include/bee2/math/zz.h +++ b/include/bee2/math/zz.h @@ -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). ******************************************************************************* @@ -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] длина чисел в машинных словах */ diff --git a/src/core/rng/rng_sys.c b/src/core/rng/rng_sys.c index 147a2520..53ae228e 100644 --- a/src/core/rng/rng_sys.c +++ b/src/core/rng/rng_sys.c @@ -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). ******************************************************************************* @@ -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) diff --git a/src/core/rng/rng_test.c b/src/core/rng/rng_test.c index 76137860..3095ab01 100644 --- a/src/core/rng/rng_test.c +++ b/src/core/rng/rng_test.c @@ -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). ******************************************************************************* @@ -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) @@ -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) @@ -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; @@ -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 { @@ -109,4 +109,3 @@ bool_t rngTestFIPS4(const octet buf[2500]) } return l < 26; } - diff --git a/src/crypto/bign/bign_keyt.c b/src/crypto/bign/bign_keyt.c index 791a42a8..41d91061 100644 --- a/src/crypto/bign/bign_keyt.c +++ b/src/crypto/bign/bign_keyt.c @@ -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). ******************************************************************************* @@ -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; } // завершение diff --git a/src/crypto/botp.c b/src/crypto/botp.c index 6cc616fe..7b35d1d4 100644 --- a/src/crypto/botp.c +++ b/src/crypto/botp.c @@ -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). ******************************************************************************* @@ -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. @@ -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); @@ -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, @@ -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); diff --git a/src/math/qr.c b/src/math/qr.c index 508b4a1d..149a66c8 100644 --- a/src/math/qr.c +++ b/src/math/qr.c @@ -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). ******************************************************************************* @@ -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) умножений @@ -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. ******************************************************************************* */ diff --git a/test/core/rng_test.c b/test/core/rng_test.c index 4191c0d0..2ff94c3d 100644 --- a/test/core/rng_test.c +++ b/test/core/rng_test.c @@ -4,7 +4,7 @@ \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). ******************************************************************************* @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -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;