/* ----------------------------------------------------------------------------------------------- */
/*  Copyright (c) 2014 - 2019 by Axel Kenzo, axelkenzo@mail.ru                                     */
/*                                                                                                 */
/*  Файл ak_hash.h                                                                                 */
/*  - содержит описания функций, реализующих бесключевые алгоритмы хеширования.                    */
/* ----------------------------------------------------------------------------------------------- */
#ifndef __AK_HASH_H__
#define __AK_HASH_H__

/* ----------------------------------------------------------------------------------------------- */
 #include <ak_mac.h>

/* ----------------------------------------------------------------------------------------------- */
/*! \brief Структура для хранения внутренних данных функций хеширования семейства Стрибог. */
/* ----------------------------------------------------------------------------------------------- */
 typedef struct streebog {
 /*! \brief Вектор h - временный */
  ak_uint64 h[8];
 /*! \brief Вектор n - временный */
  ak_uint64 n[8];
 /*! \brief Вектор  \f$ \Sigma \f$ - контрольная сумма */
  ak_uint64 sigma[8];
 /*! \brief Размер блока выходных данных (хеш-кода)*/
  size_t hsize;
} *ak_streebog;

/* ----------------------------------------------------------------------------------------------- */
/*! \brief Функция создания контекста хеширования. */
 typedef int ( ak_function_hash_context_create )( ak_pointer );

/* ----------------------------------------------------------------------------------------------- */
/*! \brief Бесключевая функция хеширования. */
/*! \details Класс предоставляет интерфейс для реализации бесключевых функций хеширования, построенных
    с использованием итеративных сжимающих отображений. В настоящее время
    с использованием класса \ref hash реализованы следующие отечественные алгоритмы хеширования
     - Стрибог256,
     - Стрибог512,
     - ГОСТ Р 34.11-94 (в настоящее время стандарт выведен из обращения).

  Перед началом работы контекст функции хэширования должен быть инициализирован
  вызовом одной из функций инициализации, например, функции ak_hash_context_create_streebog256()
  или функции ak_hash_context_create_streebog512().
  После завершения вычислений контекст должен быть освобожден с помощью функции
  ak_hash_context_destroy().                                                                       */
/* ----------------------------------------------------------------------------------------------- */
 typedef struct hash {
  /*! \brief OID алгоритма хеширования */
   ak_oid oid;
  /*! \brief Контекст итерационного сжатия. */
   struct mac mctx;
  /*! \brief Внутренние данные контекста */
   union {
   /*! \brief Структура алгоритмов семейства Стрибог. */
    struct streebog sctx;
   } data;
 } *ak_hash;

/* ----------------------------------------------------------------------------------------------- */
/*! \brief Инициализация контекста функции бесключевого хеширования ГОСТ Р 34.11-2012 (Стрибог256). */
 int ak_hash_context_create_streebog256( ak_hash );
/*! \brief Инициализация контекста функции бесключевого хеширования ГОСТ Р 34.11-2012 (Стрибог512). */
 int ak_hash_context_create_streebog512( ak_hash );
/*! \brief Инициализация контекста функции бесключевого хеширования по заданному OID алгоритма. */
 int ak_hash_context_create_oid( ak_hash, ak_oid );
/*! \brief Уничтожение контекста функции хеширования. */
 int ak_hash_context_destroy( ak_hash );
/*! \brief Освобождение памяти из под контекста функции хеширования. */
 ak_pointer ak_hash_context_delete( ak_pointer );

/* ----------------------------------------------------------------------------------------------- */
/*! \brief Функция возвращает размер вырабатываемого хеш-кода (в октетах). */
 size_t ak_hash_context_get_tag_size( ak_hash );
/*! \brief Функция возвращает размер блока входных данных, обрабатываемого функцией хеширования (в октетах). */
 size_t ak_hash_context_get_block_size( ak_hash );
/*! \brief Очистка контекста алгоритма хеширования. */
 int ak_hash_context_clean( ak_hash );
/*! \brief Обновление состояния контекста хеширования. */
 int ak_hash_context_update( ak_hash , const ak_pointer , const size_t );
/*! \brief Обновление состояния и вычисление результата применения алгоритма хеширования. */
 int ak_hash_context_finalize( ak_hash , const ak_pointer , const size_t , ak_pointer , const size_t );
/*! \brief Хеширование заданной области памяти. */
 int ak_hash_context_ptr( ak_hash , const ak_pointer , const size_t , ak_pointer , const size_t );
/*! \brief Хеширование заданного файла. */
 int ak_hash_context_file( ak_hash , const char*, ak_pointer , const size_t );

/* ----------------------------------------------------------------------------------------------- */
/*! \brief Проверка корректной работы функции хеширования Стрибог-256 */
 bool_t ak_hash_test_streebog256( void );
/*! \brief Проверка корректной работы функции хеширования Стрибог-512 */
 bool_t ak_hash_test_streebog512( void );

#endif
/* ----------------------------------------------------------------------------------------------- */
/*                                                                                      ak_hash.h  */
/* ----------------------------------------------------------------------------------------------- */
