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 */