diff --git a/CMakeLists.txt b/CMakeLists.txt index 1289d249830bfef964eac97cffc9b43c6f74fd34..56131ae850f3033bbe1e0e6877550f83ee282026 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ project( libakrypt C ) # -------------------------------------------------------------------------------------------------- # # Перечень доступных опций для СЃР±РѕСЂРєРё библиотеки option( AK_SHARED_LIB "Build the shared library" ON ) -option( AK_STATIC_LIB "Build the static library" ON ) +option( AK_STATIC_LIB "Build the static library" OFF ) option( AK_EXAMPLES "Build examples for libakrypt" OFF ) option( AK_TESTS "Build tests for libakrypt" OFF ) option( AK_TESTS_GMP "Build comparison tests for gmp and libakrypt" OFF ) diff --git a/Changelog.md b/Changelog.md index 50f91f414a1b2146698e55fefab8cdddf7bedbb2..9bf0de8700fa0ead736084cdaa67edc9796759a2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,9 +1,10 @@ -# Libakrypt: перечень изменений + Libakrypt: перечень изменений ## Рзменения РІ версии 0.9.15 - - Добавлена поддержка опции библиотеки, отвечающей Р·Р° дополнительные проверки + - Р’ библиотеку libakrypt-base добавлена функция ak_time_to_str() + - Добавлена поддержка опции СЃР±РѕСЂРєРё библиотеки, отвечающей Р·Р° дополнительные проверки корректной работы СЂСЏРґР° криптографических алгоритмов diff --git a/source/ak_file.c b/source/ak_file.c index fd527cadbb6b9ebd02564f6bfef4bff2f8521792..3e57196d32f202dfc4459f382b045ad795471ab8 100644 --- a/source/ak_file.c +++ b/source/ak_file.c @@ -37,6 +37,7 @@ if(( !filename ) || ( stat( filename, &st ))) return ak_error_access_file; if( S_ISREG( st.st_mode )) return DT_REG; if( S_ISDIR( st.st_mode )) return DT_DIR; + if( S_ISCHR( st.st_mode )) return DT_CHR; return 0; } diff --git a/source/ak_random.c b/source/ak_random.c index 68cbfdccd9370e155dbfab3eaec2b9866c621f4a..d2695a6494fd1af4d18db8d7e4dd58e0dc58d2ba 100644 --- a/source/ak_random.c +++ b/source/ak_random.c @@ -291,39 +291,45 @@ /* ----------------------------------------------------------------------------------------------- */ static int ak_random_file_ptr( ak_random rnd, const ak_pointer ptr, const ssize_t size ) { - ak_uint8 *value = ptr; - ssize_t result = 0, count = size; + ak_uint8 *value = ptr; + ssize_t result = 0, offset = 0, count = size; - if( rnd == NULL ) return ak_error_message( ak_error_null_pointer, __func__ , + if( rnd == NULL ) return ak_error_message( ak_error_null_pointer, __func__ , "use a null pointer to a random generator" ); - if( ptr == NULL ) return ak_error_message( ak_error_null_pointer, __func__ , + if( ptr == NULL ) return ak_error_message( ak_error_null_pointer, __func__ , "use a null pointer to data" ); - if( size <= 0 ) return ak_error_message( ak_error_zero_length, __func__ , + if( size <= 0 ) return ak_error_message( ak_error_zero_length, __func__ , "use a data with wrong length" ); - /* считываем несколько байт */ - slabel: result = read( rnd->data.fd, value, - #ifdef _MSC_VER - (unsigned int) - #else - (size_t) - #endif - count ); + /* обнуляем */ + memset( ptr, 0, size ); - /* если конец файла, то переходим РІ начало */ - if( result == 0 ) { - lseek( rnd->data.fd, 0, SEEK_SET ); - goto slabel; - } - /* если РјС‹ считали меньше, чем надо */ - if( result < count ) { - value += result; +slabel: + /* считываем, сколько получится */ + result = read( rnd->data.fd, value +offset, + #ifdef _MSC_VER + (unsigned int) + #else + (size_t) + #endif + count + ); + + if( result < 0 ) { /* здесь ошибка чтения: + - файл РјРѕРі потеряться, + - или устройство могло выключиться */ + return ak_error_message( ak_error_read_data, __func__, "incorrect data reading"); + } + if( result == 0 ) { + lseek( rnd->data.fd, 0, SEEK_SET ); + goto slabel; + } + + /* ищменяем значения индексов */ + offset += result; count -= result; + + if( offset >= size ) return ak_error_ok; goto slabel; - } - /* если ошибка чтения, то возбуждаем ошибку */ - if( result == -1 ) return ak_error_message( ak_error_read_data, __func__ , - "wrong reading data from file" ); - return ak_error_ok; } /* ----------------------------------------------------------------------------------------------- */ diff --git a/source/ak_tools.c b/source/ak_tools.c index 2e9cce20e16486b695b50f43823523678af0fecd..21ebe986427ae1f9799e9d8184d939beb71fc8e5 100644 --- a/source/ak_tools.c +++ b/source/ak_tools.c @@ -1091,6 +1091,38 @@ #endif } +/* ----------------------------------------------------------------------------------------------- */ +/*! Функция формирует строку, содержащую время (РІ часах, минута Рё секундах) + @param timea Количество секунд + @return Указатель РЅР° константную область памяти. */ +/* ----------------------------------------------------------------------------------------------- */ + char *ak_time_to_str( time_t timea ) +{ + ak_uint32 days = timea/86400; + ak_uint32 hours = ( timea - days*86400 )/3600; + ak_uint32 minutes = ( timea - days*86400 - hours*3600 )/60; + ak_uint32 seconds = timea%60; + + if( days > 0 ) { + ak_snprintf( ak_static_buffer, sizeof( ak_static_buffer) -1, + "%u Рґ. %u С‡. %u Рј. %u сек.", days, hours, minutes, seconds ); + return ak_static_buffer; + } + if( hours > 0 ) { + ak_snprintf( ak_static_buffer, sizeof( ak_static_buffer) -1, + "%u С‡. %u Рј. %u сек.", hours, minutes, seconds ); + return ak_static_buffer; + } + if( minutes > 0 ) { + ak_snprintf( ak_static_buffer, sizeof( ak_static_buffer) -1, + "%u Рј. %u сек.", minutes, seconds ); + return ak_static_buffer; + } + + ak_snprintf( ak_static_buffer, sizeof( ak_static_buffer) -1, "%u сек.", (unsigned int) timea ); + return ak_static_buffer; +} + /* ----------------------------------------------------------------------------------------------- */ /* ak_tools.c */ /* ----------------------------------------------------------------------------------------------- */ diff --git a/source/libakrypt-base.h.in b/source/libakrypt-base.h.in index 47bb30114bca9a07c2d19d3fb5317f10c6e3c310..67272e281609ffc996d5c0c7aead9fce2ca3dc79 100644 --- a/source/libakrypt-base.h.in +++ b/source/libakrypt-base.h.in @@ -530,6 +530,9 @@ extern "C" { #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif +#ifndef DT_CHR + #define DT_CHR (2) +#endif #ifndef DT_DIR #define DT_DIR (4) #endif @@ -663,6 +666,8 @@ extern "C" { dll_export ak_pointer ak_aligned_malloc( size_t ); /*! \brief Освобождение выравненной памяти. */ dll_export void ak_aligned_free( ak_pointer ); +/*! \brief Вывод времени ( РІ секундах) РІ человекочитаемом формате. */ + dll_export char *ak_time_to_str( time_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief РЎРїРѕСЃРѕР± конвертации двоичных данных РІ строку символов РІ формате base64 */