libakrypt.h 188.71 KiB
/* ----------------------------------------------------------------------------------------------- */
/*  Copyright (c) 2014 - 2024 by Axel Kenzo, axelkenzo@mail.ru                                     */
/*                                                                                                 */
/* ----------------------------------------------------------------------------------------------- */
/*  Copyright (c) 2018 by Mikhail Lavrinovich, mikhail.lavrinovich@netcracker.com                  */
/*  Copyright (c) 2018 by Petr Mikhalitsyn, myprettycapybara@gmail.com                             */
/*  Copyright (c) 2019 by Diffractee                                                               */
/*  Copyright (c) 2019 by kirlit26                                                                 */
/*  Copyright (c) 2019 by Anton Sakharov                                                           */
/*  Copyright (c) 2022 by Yasmin Yurovskikh, yaeyurovskikh@edu.hse.ru                              */
/*  Copyright (c) 2022 by AlexVCh66                                                                */
/*                                                                                                 */
/* ----------------------------------------------------------------------------------------------- */
/*  Файл libakrypt.h                                                                               */
/*                                                                                                 */
/* ----------------------------------------------------------------------------------------------- */
#ifndef    __LIBAKRYPT_H__
#define    __LIBAKRYPT_H__
/* ----------------------------------------------------------------------------------------------- */
 #include <libakrypt-base.h>
/* ----------------------------------------------------------------------------------------------- */
#ifdef AK_HAVE_GMP_H
 #define LIBAKRYPT_HAVE_GMP_H
#endif
/* ----------------------------------------------------------------------------------------------- */
#ifdef __cplusplus
extern "C" {
#endif
/* ----------------------------------------------------------------------------------------------- */
/** \defgroup libakrypt Основные криптографические преобразования (библиотека libakrypt)
  @{ */
/* ----------------------------------------------------------------------------------------------- */
/*! \brief Попытка доступа к неопределенной опции библиотеки. */
 #define ak_error_wrong_option                (-100)
/*! \brief Ошибка использования неправильного (неожидаемого) значения. */
 #define ak_error_invalid_value               (-101)
/*! \brief Неверный тип криптографического механизма. */
 #define ak_error_oid_engine                  (-110)
/*! \brief Неверный режим использования криптографического механизма. */
 #define ak_error_oid_mode                    (-111)
/*! \brief Ошибочное или не определенное имя криптографического механизма. */
 #define ak_error_oid_name                    (-112)
/*! \brief Ошибочный или неопределенный идентификатор криптографического механизма. */
 #define ak_error_oid_id                      (-113)
/*! \brief Ошибочный индекс идентификатора криптографического механизма. */
 #define ak_error_oid_index                   (-114)
/*! \brief Ошибка с обращением к oid. */
 #define ak_error_wrong_oid                   (-115)
/*! \brief Ошибка, возникающая когда параметры кривой не соответствуют алгоритму, в котором они используются. */
 #define ak_error_curve_not_supported         (-120)
/*! \brief Ошибка, возникающая если точка не принадлежит заданной кривой. */
 #define ak_error_curve_point                 (-121)
/*! \brief Ошибка, возникающая когда порядок точки неверен. */
 #define ak_error_curve_point_order           (-122)
/*! \brief Ошибка, возникающая если дискриминант кривой равен нулю (уравнение не задает кривую). */
 #define ak_error_curve_discriminant          (-123)
/*! \brief Ошибка, возникающая когда неверно определены вспомогательные параметры эллиптической кривой. */
 #define ak_error_curve_order_parameters      (-124)
/*! \brief Ошибка, возникающая когда простой модуль кривой задан неверно. */
 #define ak_error_curve_prime_modulo          (-125)
/*! \brief Ошибка, возникающая при сравнении двух эллиптических кривых */
 #define ak_error_curve_not_equal             (-126)
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
/*! \brief Ошибка, возникающая при использовании ключа, значение которого не определено. */ #define ak_error_key_value (-130) /*! \brief Ошибка, возникающая при использовании ключа для бесключевых функций. */ #define ak_error_key_usage (-131) /*! \brief Ошибка, возникающая при неверном заполнении полей структуры bckey. */ #define ak_error_wrong_block_cipher (-132) /*! \brief Ошибка, возникающая при зашифровании/расшифровании данных, длина которых не кратна длине блока. */ #define ak_error_wrong_block_cipher_length (-133) /*! \brief Ошибка, возникающая при неверном значении кода целостности ключа. */ #define ak_error_wrong_key_icode (-134) /*! \brief Ошибка, возникающая при неверном значении длины ключа. */ #define ak_error_wrong_key_length (-135) /*! \brief Ошибка, возникающая при использовании неверного типа ключа. */ #define ak_error_wrong_key_type (-136) /*! \brief Ошибка, возникающая при недостаточном ресурсе ключа. */ #define ak_error_low_key_resource (-137) /*! \brief Ошибка, возникающая при использовании синхропосылки (инициализационного вектора) неверной длины. */ #define ak_error_wrong_iv_length (-138) /*! \brief Ошибка, возникающая при неправильном использовании функций зашифрования/расшифрования данных. */ #define ak_error_wrong_block_cipher_function (-139) /*! \brief Ошибка согласования данных. */ #define ak_error_linked_data (-140) /*! \brief Использование неверного значения поля, определяющего тип данных */ #define ak_error_invalid_asn1_tag (-150) /*! \brief Использование неверного значения длины данных, размещаемых в узле ASN1 дерева */ #define ak_error_invalid_asn1_length (-151) /*! \brief Использование неверной функции для чтения отрицательных данных, размещаемых в узле ASN1 дерева */ #define ak_error_invalid_asn1_significance (-152) /*! \brief Полученные ASN.1 данные содержат неверный или неожидаемый контент */ #define ak_error_invalid_asn1_content (-153) /*! \brief Полученные ASN.1 данные содержат неверное количество элементов */ #define ak_error_invalid_asn1_count (-154) /*! \brief Ошибка, возникающая при кодировании ASN1 структуры (перевод в DER-кодировку). */ #define ak_error_wrong_asn1_encode (-155) /*! \brief Ошибка, возникающая при декодировании ASN1 структуры (перевод из DER-кодировки в ASN1 структуру). */ #define ak_error_wrong_asn1_decode (-156) /*! \brief Ошибка использования для проверки сертификата неопределенного открытого ключа (null указатель) */ #define ak_error_certificate_verify_key (-160) /*! \brief Ошибка использования для проверки сертификата открытого ключа с некорректным или не поддерживаемым алгоритмом электронной подписи. */ #define ak_error_certificate_verify_engine (-161) /*! \brief Ошибка использования для проверки сертификата открытого ключа, расширенное имя владельца которого не совпадает с именем эмитента в проверяемом сертификате. */ #define ak_error_certificate_verify_names (-162) /*! \brief Ошибка при импорте/экспорте сертификата: срок действия сертификата не актуален (истек или еще не начался) */ #define ak_error_certificate_validity (-165) /*! \brief Ошибка при импорте/экспорте сертификата: сертификат не является сертификатом центра сертификации. */ #define ak_error_certificate_ca (-166) /*! \brief Ошибка при импорте сертификата: сертификат не содержит установленный бит в расширении keyUsage. */ #define ak_error_certificate_key_usage (-167) /*! \brief Ошибка при импорте сертификата: сертификат предназначен для некорректного или неподдерживаемого алгоритма электронной подписи. */ #define ak_error_certificate_engine (-168) /*! \brief Ошибка при импорте сертификата: электроннная подпись под сертификатом не верна. */ #define ak_error_certificate_signature (-169) /*! \brief Ошибка при проверке электроннной подписи под произвольными данными */ #define ak_error_signature (-170) /*! \brief Ошибка при выборе схемы асимметричного шифрования */ #define ak_error_encrypt_scheme (-180) /*! \brief Ошибка использования не инициализированного aead контекста */ #define ak_error_aead_initialization (-181) /* ----------------------------------------------------------------------------------------------- */ /** \defgroup options-doc Инициализация и настройка параметров библиотеки
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
@{ */ /*! \brief Функция инициализации библиотеки. */ dll_export bool_t ak_libakrypt_create( ak_function_log * ); /*! \brief Функция завершает работу с библиотекой. */ dll_export int ak_libakrypt_destroy( void ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция возвращает номер версии бибилиотеки libakrypt. */ dll_export const char *ak_libakrypt_version( void ); /*! \brief Функция возвращает общее количества опций библиотеки. */ dll_export size_t ak_libakrypt_options_count( void ); /*! \brief Функция возвращает имя функции по ее индексу. */ dll_export char *ak_libakrypt_get_option_name( const size_t ); /*! \brief Функция возвращает значение опции по ее имени. */ dll_export ak_int64 ak_libakrypt_get_option_by_name( const char * ); /*! \brief Функция возвращает значение опции по ее индексу. */ dll_export ak_int64 ak_libakrypt_get_option_by_index( const size_t ); /*! \brief Функция устанавливает значение заданной опции. */ dll_export int ak_libakrypt_set_option( const char * , const ak_int64 ); /*! \brief Функция считывает значения опций библиотеки из файла. */ dll_export bool_t ak_libakrypt_load_options( void ); /*! \brief Функция выводит текущие значения всех опций библиотеки. */ dll_export void ak_libakrypt_log_options( void ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция устанавливает режим совместимости криптографических преобразований с библиотекой openssl. */ dll_export int ak_libakrypt_set_openssl_compability( bool_t ); /*! \brief Функция создает полное имя файла в домашем каталоге библиотеки. */ dll_export int ak_libakrypt_create_home_filename( char * , const size_t , char * , const int ); /*! \brief Функция выводит в заданный файл параметры эллиптической кривой. */ dll_export int ak_libakrypt_print_curve( FILE * , const char * ); /** \defgroup tests-doc Тестирование криптографических механизмов @{ */ /*! \brief Функция выполняет динамическое тестирование работоспособности криптографических преобразований. */ dll_export bool_t ak_libakrypt_dynamic_control_test( void ); /*! \brief Функция тестирования корректности реализации операций умножения в полях характеристики два. */ dll_export bool_t ak_libakrypt_test_gfn_multiplication( void ); /*! \brief Функция тестирует все определяемые библиотекой параметры эллиптических кривых, заданных в короткой форме Вейерштрасса. */ dll_export bool_t ak_libakrypt_test_wcurves( void ); /*! \brief Функция проверяет корректность реализации асимметричных криптографических алгоритмов. */ dll_export bool_t ak_libakrypt_test_asymmetric_functions( void ); /*! \brief Проверка корректной работы функции хеширования Стрибог-256 */ dll_export bool_t ak_libakrypt_test_streebog256( void ); /*! \brief Проверка корректной работы функции хеширования Стрибог-512 */ dll_export bool_t ak_libakrypt_test_streebog512( void ); /*! \brief Функция проверяет корректность реализации алгоритмов хэширования. */ dll_export bool_t ak_libakrypt_test_hash_functions( void ); /*! \brief Функция проверяет корректность реализации алгоритмов выработки имитовставки. */ dll_export bool_t ak_libakrypt_test_mac_functions( void ); /*! \brief Тестирование алгоритмов выработки имитовставки HMAC с отечественными функциями хеширования семейства Стрибог (ГОСТ Р 34.11-2012). */ dll_export bool_t ak_libakrypt_test_hmac_streebog( void ); /*! \brief Тестирование алгоритма PBKDF2, регламентируемого Р 50.1.113-2016. */ dll_export bool_t ak_libakrypt_test_pbkdf2( void ); /*! \brief Тестирование алгоритма KDF_GOSTR3411_2012_256, регламентируемого Р 50.1.113-2016 (раздел 4.4) */ dll_export bool_t ak_libakrypt_test_kdf256( void ); /*! \brief Тестирование алгоритма TLSTREE, регламентируемого Р 1323565.1.030-2016 (раздел 10.1.2.1) */ dll_export bool_t ak_libakrypt_test_tlstree( void ); /*! \brief Функция тестирует корректность реализации блочных шифров и режимов их использования. */ dll_export bool_t ak_libakrypt_test_block_ciphers( void ); /*! \brief Тестирование корректной работы алгоритма блочного шифрования Магма (ГОСТ Р 34.12-2015). */ dll_export bool_t ak_libakrypt_test_magma( void ); /*! \brief Тестирование корректной работы алгоритма блочного шифрования Кузнечик (ГОСТ Р 34.12-2015). */ dll_export bool_t ak_libakrypt_test_kuznechik( void ); /*! \brief Функция тестирует корректность реаличных реализаций алгоритма cmac. */ dll_export bool_t ak_libakrypt_test_cmac( void ); /*! \brief Тестирование корректной работы режима блочного шифрования с одновременной выработкой имитовставки. */ dll_export bool_t ak_libakrypt_test_mgm( void );
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
/*! \brief Тестирование корректной работы режима шифрования `ACPKM`, регламентируемого Р 1323565.1.017—2018. */ dll_export bool_t ak_libakrypt_test_acpkm( void ); /*! \brief Выполнение тестовых примеров для алгоритмов выработки и проверки электронной подписи */ dll_export bool_t ak_libakrypt_test_sign( void ); /** @}*/ /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /*! \brief Указатель на класс генератора псевдо-случайных чисел. */ typedef struct random *ak_random; /* ----------------------------------------------------------------------------------------------- */ /** \defgroup oid-doc Идентификаторы криптографических механизмов @{ */ /*! \brief Указатель на идентификатор криптографического механизма */ typedef struct oid *ak_oid; /*! \brief Функция, возвращающая код ошибки после инициализации объекта (конструктор). */ typedef int ( ak_function_create_object ) ( ak_pointer ); /*! \brief Функция, возвращающая код ошибки после разрушения объекта (деструктор). */ typedef int ( ak_function_destroy_object ) ( ak_pointer ); /*! \brief Функция, выполняющая криптографическое преобразование. */ typedef int ( ak_function_run_object ) ( ak_pointer, ... ); /*! \brief Функция, выполняющая присвоение фиксированного ключа. */ typedef int ( ak_function_set_key_object ) ( ak_pointer, const ak_pointer , const size_t ); /*! \brief Функция, выполняющая выработку нового случайного ключа. */ typedef int ( ak_function_set_key_random_object ) ( ak_pointer, ak_random ); /*! \brief Функция, выполняющая выработку ключа из пароля. */ typedef int ( ak_function_set_key_from_password_object ) ( ak_pointer, const ak_pointer , const size_t , const ak_pointer , const size_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Структура, контролирующая функционирование криптографических объектов библиотеки. */ /*! \details Структура представляет из себя описатель класса, позволяющий создавать и уничтожать объекты данного класса, а также вызывать базовые функции чтения и сохранения объектов. */ /* ----------------------------------------------------------------------------------------------- */ typedef struct object { /*! \brief Размер области памяти для первого объекта. */ size_t size; /*! \brief Конструктор первого объекта. */ ak_function_create_object *create; /*! \brief Деструктор первого объекта. */ ak_function_destroy_object *destroy; /*! \brief Функция, выполняющая присвоение фиксированного ключа. */ ak_function_set_key_object *set_key; /*! \brief Функция, выполняющая выработку нового случайного ключа. */ ak_function_set_key_random_object *set_key_random; /*! \brief Функция, выполняющая выработку ключа из пароля. */ ak_function_set_key_from_password_object *set_key_from_password; } *ak_object; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Структура, контролирующая функциональные возможности алгоритма. */ /*! \details Обеспечивает доступ к объектам (секретным ключам), а также криптографическим преобразованиям. */ typedef struct functional_objects { /*! \brief Управляющий объект криптографического алгоритма */ struct object first; /*! \brief Второй объект, в ряде алгоритмов - второй ключ криптографического алгоритма */ struct object second; /*! \brief Функция выполняющая прямое преобразование. \details В качестве такого преобразования может выступать, например, режим зашифрования для блочного шифра или алгоритм выработки имитовставки. */ ak_function_run_object *direct; /*! \brief Функция выполняющая обратное преобразование. \details В качестве такого преобразования может выступать, например, режим расшифрования для блочного шифра. */ ak_function_run_object *invert; } *ak_functional_objects; /* ----------------------------------------------------------------------------------------------- */
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
/*! \brief Тип криптографического механизма. */ typedef enum { /*! \brief идентификатор */ identifier, /*! \brief симметричный шифр (блочный алгоритм) */ block_cipher, /*! \brief симметричный шифр (поточный алгоритм) */ stream_cipher, /*! \brief схема гибридного шифрования */ hybrid_cipher, /*! \brief функция хеширования */ hash_function, /*! \brief семейство ключевых функций хеширования HMAC */ hmac_function, /*! \brief семейство функций выработки имитовставки согласно ГОСТ Р 34.13-2015. */ cmac_function, /*! \brief семейство функций выработки имитовставки MGM. */ mgm_function, /*! \brief класс всех ключевых функций хеширования (функций вычисления имитовставки) */ mac_function, /*! \brief функция выработки электронной подписи (секретный ключ электронной подписи) */ sign_function, /*! \brief функция проверки электронной подписи (ключ проверки электронной подписи) */ verify_function, /*! \brief генератор случайных и псевдо-случайных последовательностей */ random_generator, /*! \brief механизм идентификаторов криптографических алгоритмов */ oid_engine, /*! \brief алгоритм выработки мастер ключа для схемы Блома распределения симметричных ключей */ blom_master, /*! \brief алгоритм выработки ключа абонента для схемы Блома распределения симметричных ключей */ blom_subscriber, /*! \brief алгоритм выработки ключа парной связи */ blom_pairwise, /*! \brief неопределенный механизм, может возвращаться как ошибка */ undefined_engine } oid_engines_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Режим и параметры использования криптографического механизма. */ typedef enum { /*! \brief собственно криптографический механизм (алгоритм) */ algorithm, /*! \brief данные */ parameter, /*! \brief набор параметров эллиптической кривой в форме Вейерштрасса */ wcurve_params, /*! \brief набор параметров эллиптической кривой в форме Эдвардса */ ecurve_params, /*! \brief набор перестановок */ kbox_params, /*! \brief базовый режим шифрования */ encrypt_mode, /*! \brief режим шифрования с двумя ключами */ encrypt2k_mode, /*! \brief режим шифрования с указанием длины обрабатываемого блока */ acpkm, /*! \brief режим выработки имитовставки */ mac, /*! \brief режим аутентифицирующего шифрования */ aead, /*! \brief режим гаммирования поточного шифра (сложение по модулю 2) */ xcrypt, /*! \brief описатель для типов данных, помещаемых в asn1 дерево */ descriptor, /*! \brief неопределенный режим, может возвращаться как ошибка */ undefined_mode } oid_modes_t; /* ----------------------------------------------------------------------------------------------- */
351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
/*! \brief Класс для хранения идентификаторов объектов (криптографических механизмов) и их данных. */ /* ----------------------------------------------------------------------------------------------- */ typedef struct oid { /*! \brief Тип криптографического механизма. */ oid_engines_t engine; /*! \brief Режим применения криптографического механизма. */ oid_modes_t mode; /*! \brief Перечень идентификаторов криптографического механизма. */ const char **id; /*! \brief Перечень доступных имен криптографического механизма. */ const char **name; /*! \brief Указатель на данные. */ ak_pointer data; /*! \brief Структура, контролирующая поведение объектов криптографического механизма. */ struct functional_objects func; } *ak_oid; /* ----------------------------------------------------------------------------------------------- */ #define ak_object_undefined { 0, NULL, NULL, NULL, NULL, NULL } #define ak_functional_objects_undefined { ak_object_undefined, ak_object_undefined, NULL, NULL } #define ak_oid_undefined { undefined_engine, undefined_mode, \ NULL, NULL, NULL, ak_functional_objects_undefined } /* ----------------------------------------------------------------------------------------------- */ /*! \brief Получение человекочитаемого имени для заданного типа криптографического механизма. */ dll_export const char *ak_libakrypt_get_engine_name( const oid_engines_t ); /*! \brief Получение человекочитаемого имени режима или параметров криптографического механизма. */ dll_export const char *ak_libakrypt_get_mode_name( const oid_modes_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Создание объекта в оперативной памяти (куче) */ dll_export ak_pointer ak_oid_new_object( ak_oid ); /*! \brief Удаление объекта из кучи */ dll_export ak_pointer ak_oid_delete_object( ak_oid , ak_pointer ); /*! \brief Создание второго объекта в оперативной памяти (куче) */ dll_export ak_pointer ak_oid_new_second_object( ak_oid ); /*! \brief Удаление второго объекта из кучи */ dll_export ak_pointer ak_oid_delete_second_object( ak_oid , ak_pointer ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция возвращает количество идентификаторов библиотеки. */ dll_export size_t ak_libakrypt_oids_count( void ); /*! \brief Получение OID по его внутреннему индексу. */ dll_export ak_oid ak_oid_find_by_index( const size_t ); /*! \brief Поиск OID его имени. */ dll_export ak_oid ak_oid_find_by_name( const char * ); /*! \brief Поиск OID по его идентификатору (строке цифр, разделенных точками). */ dll_export ak_oid ak_oid_find_by_id( const char * ); /*! \brief Поиск OID по его имени или идентификатору. */ dll_export ak_oid ak_oid_find_by_ni( const char * ); /*! \brief Поиск OID по указателю на даные */ dll_export ak_oid ak_oid_find_by_data( ak_const_pointer ); /*! \brief Поиск OID по типу криптографического механизма. */ dll_export ak_oid ak_oid_find_by_engine( const oid_engines_t ); /*! \brief Продолжение поиска OID по типу криптографического механизма. */ dll_export ak_oid ak_oid_findnext_by_engine( const ak_oid, const oid_engines_t ); /*! \brief Поиск OID по режиму работы криптографического механизма. */ dll_export ak_oid ak_oid_find_by_mode( const oid_modes_t ); /*! \brief Продолжение поиска OID по режиму работы криптографического механизма. */ dll_export ak_oid ak_oid_findnext_by_mode( const ak_oid, const oid_modes_t ); /*! \brief Проверка соответствия заданного адреса корректному oid. */ dll_export bool_t ak_oid_check( const ak_pointer ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup random-doc Генераторы псевдо-случайных чисел @{ */ /*! \brief Функция, принимающая в качестве аргумента указатель на структуру struct random. */ typedef int ( ak_function_random )( ak_random ); /*! \brief Функция обработки данных заданного размера. */
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
typedef int ( ak_function_random_ptr_const )( ak_random , const ak_pointer, const ssize_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Класс, реализующий произвольный генератор псевдо-случайных чисел. */ /* ----------------------------------------------------------------------------------------------- */ struct random { /*! \brief OID генератора псевдо-случайных чисел. */ ak_oid oid; /*! \brief Указатель на функцию выработки следующего внутреннего состояния */ ak_function_random *next; /*! \brief Указатель на функцию инициализации генератора заданным массивом значений */ ak_function_random_ptr_const *randomize_ptr; /*! \brief Указатель на функцию выработки последователности псевдо-случайных байт */ ak_function_random_ptr_const *random; /*! \brief Указатель на функцию освобождения внутреннего состояния */ ak_function_random *free; /*! \brief Объединение, определяющее внутренние данные генератора */ union { /*! \brief Внутреннее состояние линейного конгруэнтного генератора */ ak_uint64 val; /*! \brief Внутреннее состояние xorshift32 генератора */ ak_uint32 value; /*! \brief Файловый дескриптор */ int fd; #ifdef AK_HAVE_WINDOWS_H /*! \brief Дескриптор крипто-провайдера */ HCRYPTPROV handle; #endif /*! \brief Указатель на произвольную структуру данных. */ ak_pointer ctx; } data; }; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация контекста линейного конгруэнтного генератора псевдо-случайных чисел. */ dll_export int ak_random_create_lcg( ak_random ); /*! \brief Инициализация контекста генератора, считывающего случайные значения из заданного файла. */ dll_export int ak_random_create_file( ak_random , const char * ); #if defined(__unix__) || defined(__APPLE__) /*! \brief Инициализация контекста генератора, считывающего случайные значения из /dev/random. */ dll_export int ak_random_create_random( ak_random ); /*! \brief Инициализация контекста генератора, считывающего случайные значения из /dev/urandom. */ dll_export int ak_random_create_urandom( ak_random ); #endif #ifdef _WIN32 /*! \brief Инициализация контекста, реализующего интерфейс доступа к генератору псевдо-случайных чисел, предоставляемому ОС Windows. */ dll_export int ak_random_create_winrtl( ak_random ); #endif /*! \brief Инициализация контекста нелинейного конгруэнтного генератора с обратной квадратичной связью * (NLFSR генератора). */ dll_export int ak_random_create_nlfsr( ak_random ); /*! \brief Инициализация контекста нелинейного конгруэнтного генератора с обратной квадратичной связью с явным указанием параметров генератора. */ dll_export int ak_random_create_nlfsr_with_params( ak_random , size_t , ak_uint64 ); /*! \brief Инициализация контекста генератора на основе функции хеширования согласно Р 1323565.1.006-2017. */ dll_export int ak_random_create_hrng( ak_random ); /*! \brief Инициализация контекста генератора по заданному OID алгоритма генерации псевдо-случайных чисел. */ dll_export int ak_random_create_oid( ak_random, ak_oid ); /*! \brief Установка внутреннего состояния генератора псевдо-случайных чисел. */ dll_export int ak_random_randomize( ak_random , const ak_pointer , const ssize_t ); /*! \brief Выработка псевдо-случайных данных. */ dll_export int ak_random_ptr( ak_random , const ak_pointer , const ssize_t ); /*! \brief Некриптографическая функция генерации случайного 64-х битного целого числа. */ dll_export ak_uint64 ak_random_value( void ); /*! \brief Уничтожение данных, хранящихся в полях структуры struct random. */ dll_export int ak_random_destroy( ak_random ); /*! \brief Функция очистки памяти. */ dll_export int ak_ptr_wipe( ak_pointer , size_t , ak_random ); /*! \brief Функция очистки и последующего удаления файла. */ dll_export int ak_file_delete( const char * , ak_random );
491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
/*! \brief Статистическая проверка двоичной последовательности */ dll_export bool_t ak_random_dynamic_test( ak_uint8 * , size_t ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup skey-doc Секретные ключи криптографических механизмов @{ */ /*! \brief Указатель на структуру секретного ключа. */ typedef struct skey *ak_skey; /*! \brief Однопараметрическая функция для проведения действий с секретным ключом, возвращает код ошибки. */ typedef int ( ak_function_skey )( ak_skey ); /*! \brief Однопараметрическая функция для проведения действий с секретным ключом, возвращает истину или ложь. */ typedef bool_t ( ak_function_skey_check )( ak_skey ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Перечисление, определяющее флаги хранения и обработки секретных ключей. */ typedef enum { /*! \brief Неопределенное значение */ key_flag_undefined = 0x0000000000000000ULL, /*! \brief Бит, отвечающий за установку значения ключа: 0 - ключ не установлен, 1 установлен. */ key_flag_set_key = 0x0000000000000001ULL, /*! \brief Бит, отвечающий за установку маски: 0 - маска не установлена, 1 - маска установлена. */ key_flag_set_mask = 0x0000000000000002ULL, /*! \brief Бит, отвечающий за установку контрольной суммы ключа: 0 - контрольная сумма не установлена не установлена, 1 - контрольная сумма установлена. */ key_flag_set_icode = 0x0000000000000004ULL, /*! \brief Бит отвечает за то, кто из классов skey или его наследники уничтожают внутреннюю память. Если флаг установлен, то класс skey очистку не производит и возлагает это на методы классов-наследников: 0 - очистка производится, 1 - очистка памяти не производится */ key_flag_data_not_free = 0x0000000000000008ULL, /*! \brief Флаг, который запрещает использование функции ctr без указания синхропосылки. */ key_flag_not_ctr = 0x0000000000000100ULL, /*! \brief Флаг, который определяет, можно ли использовать значение внутреннего буффера в режиме omac. */ key_flag_omac_buffer_used = 0x0000000000000200ULL, } key_flag_values_t; /*! \brief Множество состояний флагов */ typedef ak_uint64 key_flags_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Способ выделения памяти для хранения секретной информации. */ typedef enum { /*! \brief Механизм выделения памяти не определен. */ undefined_policy, /*! \brief Выделение памяти через стандартный malloc */ malloc_policy } memory_allocation_policy_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Тип ключа шифрования контента. */ typedef enum { /*! \brief Ключ шифрования контента, вырабатываемый из пароля пользователя */ password_based_encryption_key, } kek_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Место хранения зашифрованной информации. */ typedef enum { /*! \brief Данные отсутствуют. */ data_not_present_storage, /*! \brief Данные находятся в наличии. */ data_present_storage, /*! \brief Данные находятся в заданном файле. */ external_file_storage } data_storage_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Перечисление определяет возможные типы счетчиков ресурса секретного ключа. */
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
typedef enum { /*! \brief Счетчик числа использованных блоков. */ block_counter_resource, /*! \brief Счетчик числа использований ключа, например, количество подписанных сообщений или число производных ключей. */ key_using_resource, } counter_resource_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Тип и значение счетчика ресурса ключа. */ typedef struct key_resource_counter { /*! \brief Тип ресурса */ counter_resource_t type; /*! \brief Дополнение */ ak_uint8 padding[4]; /*! \brief Cчетчик числа использований, например, зашифрованных/расшифрованных блоков. */ ssize_t counter; } *ak_key_resoure_counter; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Временной интервал действия ключа. */ typedef struct time_interval { /*! \brief Время, до которого ключ недействителен. */ time_t not_before; /*! \brief Время, после которого ключ недействителен. */ time_t not_after; } *ak_time_intermal; typedef struct time_interval time_interval_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Ресурс ключа. */ typedef struct resource { /*! \brief Счетчик числа использований ключа. */ struct key_resource_counter value; /*! \brief Временной интервал использования ключа. */ struct time_interval time; } *ak_resource; typedef struct resource resource_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Абстрактный секретный ключ, содержит базовый набор данных и методов контроля. */ struct skey { /*! \brief ключ */ #ifdef AK_HAVE_STDALIGN_H #ifndef AK_HAVE_WINDOWS_H alignas(32) #endif #endif ak_uint8 *key; /*! \brief размер ключа (в октетах) */ size_t key_size; /*! \brief OID алгоритма для которого предназначен секретный ключ */ ak_oid oid; /*! \brief уникальный номер ключа */ ak_uint8 number[32]; /*! \brief контрольная сумма ключа */ ak_uint32 icode; /*! \brief генератор случайных масок ключа */ struct random generator; /*! \brief ресурс использования ключа */ struct resource resource; /*! \brief указатель на внутренние данные ключа */ ak_pointer data; /*! \brief пользовательская метка ключа */ char *label; /*! \brief Флаги текущего состояния ключа */ key_flags_t flags; /*! \brief Способ выделения памяти. */ memory_allocation_policy_t policy; /*! \brief указатель на функцию маскирования ключа */
631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
ak_function_skey *set_mask; /*! \brief указатель на функцию демаскирования ключа */ ak_function_skey *unmask; /*! \brief указатель на функцию выработки контрольной суммы от значения ключа */ ak_function_skey *set_icode; /*! \brief указатель на функцию проверки контрольной суммы от значения ключа */ ak_function_skey_check *check_icode; }; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Генерация случайного уникального вектора, рассматриваемого как номер ключа. */ dll_export int ak_libakrypt_generate_unique_number( ak_pointer , const size_t ); /*! \brief Получение человекочитаемого имени для типа ключевого ресурса. */ dll_export const char *ak_libakrypt_get_counter_resource_name( const counter_resource_t ); /*! \brief Функция выделения памяти для ключевой информации. */ dll_export int ak_skey_alloc_memory( ak_skey , size_t , memory_allocation_policy_t ); /*! \brief Функция освобождения выделенной ранее памяти. */ dll_export int ak_skey_free_memory( ak_skey ); /*! \brief Инициализация структуры секретного ключа. */ dll_export int ak_skey_create( ak_skey , size_t ); /*! \brief Очистка структуры секретного ключа. */ dll_export int ak_skey_destroy( ak_skey ); /*! \brief Присвоение секретному ключу уникального номера. */ dll_export int ak_skey_set_unique_number( ak_skey ); /*! \brief Присвоение секретному ключу заданного номера. */ dll_export int ak_skey_set_number( ak_skey , ak_pointer , size_t ); /*! \brief Присвоение секретному ключу константного значения. */ dll_export int ak_skey_set_key( ak_skey , const ak_pointer , const size_t ); /*! \brief Присвоение секретному ключу случайного значения. */ dll_export int ak_skey_set_key_random( ak_skey , ak_random ); /*! \brief Присвоение секретному ключу значения, выработанного из пароля */ dll_export int ak_skey_set_key_from_password( ak_skey , const ak_pointer , const size_t , const ak_pointer , const size_t ); /*! \brief Наложение или смена маски путем сложения по модулю два случайной последовательности с ключом. */ dll_export int ak_skey_set_mask_xor( ak_skey ); /*! \brief Снятие маски с ключа. */ dll_export int ak_skey_unmask_xor( ak_skey ); /*! \brief Вычисление значения контрольной суммы ключа. */ dll_export int ak_skey_set_icode_xor( ak_skey ); /*! \brief Проверка значения контрольной суммы ключа. */ dll_export bool_t ak_skey_check_icode_xor( ak_skey ); /*! \brief Функция устанавливает ресурс ключа. */ dll_export int ak_skey_set_resource( ak_skey , ak_resource ); /*! \brief Функция устанавливает временной интервал действия ключа. */ dll_export int ak_skey_set_validity( ak_skey , time_t , time_t ); /*! \brief Функция устанавливает ресурс и временной итервал действия ключа. */ dll_export int ak_skey_set_resource_values( ak_skey , counter_resource_t , const char * , time_t , time_t ); /*! \brief Фукция присваивает пользовательскую метку ключу. */ dll_export int ak_skey_set_label( ak_skey, const char * , const size_t ); #ifdef LIBAKRYPT_HAVE_DEBUG_FUNCTIONS /*! \brief Функция выводит информацию о контексте секретного ключа в заданный файл. */ int ak_skey_print_to_file( ak_skey , FILE *fp ); #endif /* ----------------------------------------------------------------------------------------------- */ /*! \brief Указатель на структуру ключа блочного алгоритма шифрования. */ typedef struct bckey *ak_bckey; /*! \brief Функция создания ключа блочного алгоритма шифрования. */ typedef int ( ak_function_bckey_create ) ( ak_bckey ); /*! \brief Функция зашифрования/расширования одного блока информации. */ typedef void ( ak_function_bckey )( ak_skey, ak_pointer, ak_pointer ); /*! \brief Функция, предназначенная для зашифрования/расшифрования области памяти заданного размера */ typedef int ( ak_function_bckey_encrypt )( ak_bckey, ak_pointer, ak_pointer, size_t, ak_pointer, size_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Секретный ключ блочного алгоритма шифрования. */ struct bckey {
701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
/*! \brief Указатель на секретный ключ. */ struct skey key; /*! \brief Размер блока обрабатываемых данных (в байтах). */ size_t bsize; /*! \brief Буффер, для хранения текущего значения синхропосылки. \details Максимальное количество блоков, помещающихся в буффер, равно 8 для Магмы и 4 для Кузнечика. */ ak_uint8 ivector[64]; /*! \brief Текущий размер вектора синхропосылки (в октетах) */ size_t ivector_size; /*! \brief Функция заширования одного блока информации. */ ak_function_bckey *encrypt; /*! \brief Функция расширования одного блока информации. */ ak_function_bckey *decrypt; /*! \brief Функция развертки ключа. */ ak_function_skey *schedule_keys; /*! \brief Функция уничтожения развернутых ключей. */ ak_function_skey *delete_keys; }; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация секретного ключа алгоритма блочного шифрования Магма. */ dll_export int ak_bckey_create_magma( ak_bckey ); /*! \brief Инициализация секретного ключа алгоритма блочного шифрования Кузнечик. */ dll_export int ak_bckey_create_kuznechik( ak_bckey ); /*! \brief Инициализация секретного ключа алгоритма блочного шифрования по его OID. */ dll_export int ak_bckey_create_oid( ak_bckey , ak_oid ); /*! \brief Очистка ключа алгоритма блочного шифрования. */ dll_export int ak_bckey_destroy( ak_bckey ); /*! \brief Присвоение ключу алгоритма блочного шифрования константного значения. */ dll_export int ak_bckey_set_key( ak_bckey, const ak_pointer , const size_t ); /*! \brief Присвоение ключу алгоритма блочного шифрования случайного значения. */ dll_export int ak_bckey_set_key_random( ak_bckey , ak_random ); /*! \brief Присвоение ключу алгоритма блочного шифрования значения, выработанного из пароля. */ dll_export int ak_bckey_set_key_from_password( ak_bckey , const ak_pointer , const size_t , const ak_pointer , const size_t ); /*! \brief Инициализация секретного ключа алгоритма блочного шифрования Belt. */ dll_export int ak_bckey_create_belt( ak_bckey ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция вырабатывает пару ключей алгоритма блочного шифрования из заданного пользователем пароля. */ dll_export int ak_bckey_create_key_pair_from_password( ak_bckey , ak_bckey , ak_oid , const char * , const size_t , ak_uint8 *, const size_t, const size_t ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup enc-doc Шифрование данных @{ */ /*! \brief Нелинейная перестановка для алгоритмов хеширования и блочного шифрования */ typedef ak_uint8 sbox[256]; /*! \brief Набор таблиц замен для блочного шифра Магма. */ typedef sbox magma[4]; /*! \brief Матрица линейного преобразования */ typedef ak_uint8 linear_matrix[16][16]; /*! \brief Линейный регистр сдвига */ typedef ak_uint8 linear_register[16]; /*! \brief Таблица, используемая для эффективной реализации алгоритма шифрования Кузнечик. */ typedef ak_uint64 expanded_table[16][256][2]; /*! \brief Структура, содержащая параметры алгоритма блочного шифрования Кузнечик. */ typedef struct kuznechik_params { /*! \brief Линейный регистр сдвига */ linear_register reg; /*! \brief 16я степень сопровождающей матрицы линейного регистра сдвига */ linear_matrix L; /*! \brief Нелинейная перестановка */ sbox pi; /*! \brief Развернутые таблицы, используемые для эффективного зашифрования */ expanded_table enc; /*! \brief Обратная матрица, к 16й степени сопровождающей матрицы линейного регистра сдвига. */
771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840
linear_matrix Linv; /*! \brief Обратная нелинейная перестановка. */ sbox pinv; /*! \brief Развернутые таблицы, используемые для эффективного расшифрования */ expanded_table dec; } *ak_kuznechik_params; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Зашифрование данных в режиме простой замены (electronic codebook, ecb). */ dll_export int ak_bckey_encrypt_ecb( ak_bckey , ak_pointer , ak_pointer , size_t ); /*! \brief Расшифрование данных в режиме простой замены (electronic codebook, ecb). */ dll_export int ak_bckey_decrypt_ecb( ak_bckey , ak_pointer , ak_pointer , size_t ); /*! \brief Зашифрование данных в режиме простой замены с зацеплением из ГОСТ Р 34.13-2015 (cipher block chaining, cbc). */ dll_export int ak_bckey_encrypt_cbc( ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Расшифрование данных в режиме простой замены с зацеплением из ГОСТ Р 34.13-2015 (cipher block chaining, cbc). */ dll_export int ak_bckey_decrypt_cbc( ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Шифрование данных в режиме гаммирования из ГОСТ Р 34.13-2015 (counter mode, ctr). */ dll_export int ak_bckey_ctr( ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Шифрование данных в режиме гаммирования с обратной связью по выходу (output feedback, ofb). */ dll_export int ak_bckey_ofb( ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Зашифрование данных в режиме гаммирования с обратной связью по шифртексту из ГОСТ Р 34.13-2015 (cipher feedback, cfb). */ dll_export int ak_bckey_encrypt_cfb( ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Расшифрование данных в режиме гаммирования с обратной связью по шифртексту из ГОСТ Р 34.13-2015 (cipher feedback, cfb). */ dll_export int ak_bckey_decrypt_cfb( ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Шифрование данных в режиме `CTR-ACPKM` из Р 1323565.1.017—2018. */ dll_export int ak_bckey_ctr_acpkm( ak_bckey , ak_pointer , ak_pointer , size_t , size_t , ak_pointer , size_t ); /*! \brief Зашифрование данных в режиме `XTS`. */ dll_export int ak_bckey_encrypt_xts( ak_bckey , ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Расшифрование данных в режиме `XTS`. */ dll_export int ak_bckey_decrypt_xts( ak_bckey , ak_bckey , ak_pointer , ak_pointer , size_t , ak_pointer , size_t ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup mac-doc Вычисление кодов целостности (хеширование и имитозащита) @{ */ /*! \brief Вычисление имитовставки согласно ГОСТ Р 34.13-2015. */ dll_export int ak_bckey_cmac( ak_bckey , ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Очистка внутреннего состояния секретного ключа. */ dll_export int ak_bckey_cmac_clean( ak_bckey ); /*! \brief Обновление внутреннего состояния секретного ключа при вычислении имитовставки согласно ГОСТ Р 34.13-2015. */ dll_export int ak_bckey_cmac_update( ak_bckey , const ak_pointer , const size_t ); /*! \brief Завершение вычисления имитовставки согласно ГОСТ Р 34.13-2015. */ dll_export int ak_bckey_cmac_finalize( ak_bckey , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Вычисление имитовставки для заданного файла. */ dll_export int ak_bckey_cmac_file( ak_bckey , const char * , ak_pointer , const size_t ); /*! \brief Вычисление имитовставки для фрагмента заданного файла. */ dll_export int ak_bckey_cmac_file_offset( ak_bckey , const char * , ak_int64 , ak_int64 , ak_pointer , const size_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция очистки контекста хеширования. */ typedef int ( ak_function_clean )( ak_pointer ); /*! \brief Однораундовая функция сжатия, применяемая к одному или нескольким входным блокам. */ typedef int ( ak_function_update )( ak_pointer, const ak_pointer , const size_t ); /*! \brief Функция завершения вычислений и получения конечного результата. */
841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
typedef int ( ak_function_finalize )( ak_pointer, const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Функция создания контекста хеширования. */ typedef int ( ak_function_hash_create )( ak_pointer ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Максимальный размер блока входных данных в октетах (байтах). */ #define ak_mac_max_buffer_size (64) /* ----------------------------------------------------------------------------------------------- */ /*! \brief Контекст алгоритма итерационного сжатия. */ /*! Класс предоставляет интерфейс для реализации процедруры сжатия данных фрагментами произвольной длины. Данная процедура может применяться в алгоритмах хеширования, выработки имитовставки и т.п.*/ /* ----------------------------------------------------------------------------------------------- */ typedef struct mac { /*! \brief Размер входного блока данных (в октетах) */ size_t bsize; /*! \brief Текущее количество данных во внутреннем буффере. */ size_t length; /*! \brief Внутренний буффер для хранения входных данных. */ ak_uint8 data[ ak_mac_max_buffer_size ]; /*! \brief Указатель на контекст, содержащий внутреннее состояние алгоритма сжатия. */ ak_pointer ctx; /*! \brief Функция очистки контекста ctx */ ak_function_clean *clean; /*! \brief Функция обновления состояния контекста ctx */ ak_function_update *update; /*! \brief Функция завершения вычислений и получения конечного результата */ ak_function_finalize *finalize; } *ak_mac; /* ----------------------------------------------------------------------------------------------- */ /*! \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 Контекст бесключевой функции хеширования. */ /*! \details Класс предоставляет интерфейс для реализации бесключевых функций хеширования, построенных с использованием итеративных сжимающих отображений. В настоящее время с использованием класса \ref hash реализованы следующие отечественные алгоритмы хеширования - Стрибог256, - Стрибог512. Перед началом работы контекст функции хэширования должен быть инициализирован вызовом одной из функций инициализации, например, функции ak_hash_create_streebog256() или функции ak_hash_create_streebog512(). После завершения вычислений контекст должен быть освобожден с помощью функции ak_hash_destroy(). */ /* ----------------------------------------------------------------------------------------------- */ typedef struct hash { /*! \brief OID алгоритма хеширования */ ak_oid oid; /*! \brief Контекст итерационного сжатия. */ struct mac mctx; /*! \brief Внутренние данные контекста */ union { /*! \brief Структура алгоритмов семейства Стрибог. */ struct streebog sctx; /*! \brief Вектор значений для алгоритмов семейства crc64 */ ak_uint64 b64;
911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
} data; } *ak_hash; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация контекста функции бесключевого хеширования ГОСТ Р 34.11-2012 (Стрибог256). */ dll_export int ak_hash_create_streebog256( ak_hash ); /*! \brief Инициализация контекста функции бесключевого хеширования ГОСТ Р 34.11-2012 (Стрибог512). */ dll_export int ak_hash_create_streebog512( ak_hash ); /*! \brief Инициализация контекста некриптографической функции хеширования crc64. */ dll_export int ak_hash_create_crc64( ak_hash ); /*! \brief Инициализация контекста функции бесключевого хеширования по заданному OID алгоритма. */ dll_export int ak_hash_create_oid( ak_hash, ak_oid ); /*! \brief Уничтожение контекста функции хеширования. */ dll_export int ak_hash_destroy( ak_hash ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция возвращает размер вырабатываемого хеш-кода (в октетах). */ dll_export size_t ak_hash_get_tag_size( ak_hash ); /*! \brief Функция возвращает размер блока входных данных, обрабатываемого функцией хеширования (в октетах). */ dll_export size_t ak_hash_get_block_size( ak_hash ); /*! \brief Очистка контекста алгоритма хеширования. */ dll_export int ak_hash_clean( ak_hash ); /*! \brief Обновление состояния контекста хеширования. */ dll_export int ak_hash_update( ak_hash , const ak_pointer , const size_t ); /*! \brief Обновление состояния и вычисление результата применения алгоритма хеширования. */ dll_export int ak_hash_finalize( ak_hash , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Хеширование заданной области памяти. */ dll_export int ak_hash_ptr( ak_hash , const ak_pointer, const size_t , ak_pointer , const size_t ); /*! \brief Хеширование заданного файла. */ dll_export int ak_hash_file( ak_hash , const char *, ak_pointer , const size_t ); /*! \brief Хеширование фрагмента заданного файла. */ dll_export int ak_hash_file_offset( ak_hash , const char * , ak_int64 , ak_int64 , ak_pointer , const size_t ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \addtogroup skey-doc Cекретные ключи криптографических механизмов @{ */ /*! \brief Секретный ключ алгоритма выработки имитовставки HMAC. */ /*! Алгоритм выработки имитовставки HMAC основан на двукратном применении бесключевой функции хеширования. Алгоритм описывается рекомендациями IETF RFC 2104 (см. также RFC 7836) и стандартизован отечественными рекомендациями по стандартизации Р 50.1.113-2016. Алгоритм предназначен, в основном, для выработки имитовставки и преобразования ключевой информации. В нашей реализации алгоритм может быть использован совместно с любой функцией хеширования, реализованной в библиотеке. Отметим, что согласно Р 50.1.113-2016 алгоритм рекомендуется использовать только совместно с функцией хеширования Стрибог (с длиной хеш кода как 256 бит, так и 512 бит). \note Использование ключей, чья длина превышает размер блока бесключевой функции хеширования, реализовано в соответствии с RFC 2104. */ /* ----------------------------------------------------------------------------------------------- */ typedef struct hmac { /*! \brief Контекст секретного ключа */ struct skey key; /*! \brief Контекст итерационного сжатия. */ struct mac mctx; /*! \brief Контекст функции хеширования */ struct hash ctx; /*! \brief Идентификатор второго алгоритма хеширования, применяется только в алгоритмах семейства NMAC (см. Р 1323565.1.022-2018) */ ak_oid nmac_second_hash_oid; } *ak_hmac; /*! \brief Создание секретного ключа алгоритма выработки имитовставки HMAC на основе функции Стрибог256. */ dll_export int ak_hmac_create_streebog256( ak_hmac ); /*! \brief Создание секретного ключа алгоритма выработки имитовставки HMAC на основе функции Стрибог512. */ dll_export int ak_hmac_create_streebog512( ak_hmac );
981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
/*! \brief Создание секретного ключа алгоритма выработки имитовставки NMAC, использующего две функции семейства Стрибог. */ dll_export int ak_hmac_create_nmac( ak_hmac ); /*! \brief Создание секретного ключа алгоритма выработки имитовставки HMAC c помощью заданного oid. */ dll_export int ak_hmac_create_oid( ak_hmac , ak_oid ); /*! \brief Уничтожение секретного ключа. */ dll_export int ak_hmac_destroy( ak_hmac ); /*! \brief Присвоение секретному ключу константного значения. */ dll_export int ak_hmac_set_key( ak_hmac , const ak_pointer , const size_t ); /*! \brief Присвоение секретному ключу случайного значения. */ dll_export int ak_hmac_set_key_random( ak_hmac , ak_random ); /*! \brief Присвоение секретному ключу значения, выработанного из пароля */ dll_export int ak_hmac_set_key_from_password( ak_hmac , const ak_pointer , const size_t , const ak_pointer , const size_t ); /* ----------------------------------------------------------------------------------------------- */ /** \defgroup skey-doc-derive Функции выработки производных секретных ключей @{ */ /*! \brief Идентификаторы множества алгоритмов выработки производного ключа */ typedef enum { /*! \brief Неопределеный алгоритм, может служить признаком ошибки */ undefined_kdf = 0x00, /* Идентификаторы множества алгоритмов выработки производного ключа, определяемых рекомендациями Р 1323565.1.022-2018, раздел 5. */ /*! \brief Промежуточный ключ `nmac`, развертка ключа - `cmac` с использованием блочного шифра Магма */ nmac_cmac_magma_kdf = 0x11, /*! \brief Промежуточный ключ `nmac`, развертка ключа - `cmac` с использованием блочного шифра Магма */ nmac_cmac_kuznechik_kdf = 0x12, /*! \brief Промежуточный ключ `nmac`, развертка ключа - `hmac256` */ nmac_hmac256_kdf = 0x13, /*! \brief Промежуточный ключ `nmac`, развертка ключа - `hmac512` */ nmac_hmac512_kdf = 0x14, /*! \brief Промежуточный ключ `nmac`, развертка ключа - `nmac` */ nmac_nmac_kdf = 0x15, /*! \brief Промежуточный ключ `lsb256(hmac512)`, развертка ключа - `cmac` с использованием блочного шифра Магма */ hmac_cmac_magma_kdf = 0x21, /*! \brief Промежуточный ключ `lsb256(hmac512)`, развертка ключа - `cmac` с использованием блочного шифра Кузнечик */ hmac_cmac_kuznechik_kdf = 0x22, /*! \brief Промежуточный ключ `lsb256(hmac512)`, развертка ключа - `hmac256` */ hmac_hmac256_kdf = 0x23, /*! \brief Промежуточный ключ `lsb256(hmac512)`, развертка ключа - `hmac512` */ hmac_hmac512_kdf = 0x24, /*! \brief Промежуточный ключ `lsb256(hmac512)`, развертка ключа - `nmac` */ hmac_nmac_kdf = 0x25, /*! \brief Промежуточный ключ `xor`, развертка ключа - `cmac` с использованием блочного шифра Магма */ xor_cmac_magma_kdf = 0x31, /*! \brief Промежуточный ключ `xor`, развертка ключа - `cmac` с использованием блочного шифра Кузнечик */ xor_cmac_kuznechik_kdf = 0x32, /*! \brief Промежуточный ключ `xor`, развертка ключа - `hmac256` */ xor_hmac256_kdf = 0x33, /*! \brief Промежуточный ключ `xor`, развертка ключа - `hmac512` */ xor_hmac512_kdf = 0x34, /*! \brief Промежуточный ключ `xor`, развертка ключа - `nmac` */ xor_nmac_kdf = 0x35, /* Идентификаторы множества алгоритмов выработки производного ключа, определяемых рекомендациями Р 50.1.113-2016, раздел 4.4. */ /*! \brief Идентификатор алгоритма KDF256 */ kdf256 = 0x91, /*! \brief Идентификатор алгоритма KDF512 */ kdf512 = 0x92, /*! \brief Идентификатор алгоритма KDFNMAC */
1051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
kdfnmac = 0xa1 } kdf_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция выработки производного ключа с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 50.1.113-2016, раздел 4.4. */ dll_export int ak_skey_derive_kdf_hmac( kdf_t , ak_uint8 *, const size_t , ak_uint8 *, const size_t , ak_uint8 *, const size_t , ak_uint8 *, const size_t ); /*! \brief Функция выработки производного ключа с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 50.1.113-2016, раздел 4.4. */ dll_export int ak_skey_derive_kdf_hmac_from_skey( kdf_t , ak_pointer , ak_uint8 *, const size_t , ak_uint8 *, const size_t , ak_uint8 *, const size_t ); /*! \brief Функция выработки производного ключа с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 50.1.113-2016, раздел 4.4. */ dll_export int ak_skey_set_derive_kdf_hmac_from_skey( ak_pointer , kdf_t , ak_pointer , ak_uint8 *, const size_t , ak_uint8 *, const size_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Предопределенные константы для алгоритма выработки производных ключей tlstree */ typedef enum { tlstree_with_kuznyechik_mgm_l, tlstree_with_magma_mgm_l, tlstree_with_kuznyechik_mgm_s, tlstree_with_magma_mgm_s, tlstree_with_libakrypt_65536, tlstree_with_libakrypt_4096 } tlstree_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Контекст алгоритма генерации производной ключевой информации */ typedef struct tlstree_state { /*! \brief бесконечный массив для генерации цепочки производных ключей */ ak_uint8 key[256]; /*! \brief текущее значение номера ключа */ ak_uint64 key_number; /*! \brief текущие значения промежуточных индексов */ ak_uint64 ind1, ind2, ind3; /*! \brief внутренний механизм выработки производного ключа: kdf256, kdf512 или kdfnmac */ kdf_t type; /*! \brief множество предопределенных констант алгоритма выработки производных ключей */ tlstree_t state; } *ak_tlstree_state; /*! \brief Функция инициализирует контекст алгоритма TLSTREE и вырабатывает производный ключ * для заданного значения индекса. */ dll_export int ak_tlstree_state_create( kdf_t , ak_tlstree_state , ak_uint8 *, const size_t , ak_uint64 , tlstree_t ); /*! \brief Функция возвращает текущее значение производного ключа */ dll_export ak_uint8 *ak_tlstree_state_get_key( ak_tlstree_state ); /*! \brief Функция вырабатывает новое значение производного ключа (для следующего номера ключа) */ dll_export int ak_tlstree_state_next( ak_tlstree_state ); /*! \brief Функция уничтожает контекст алгоритма TLSTREE */ dll_export int ak_tlstree_state_destroy( ak_tlstree_state ); /*! \brief Функция TLSTREE для выработки производного ключа с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 1323565.1.030-2019, раздел 10.1.2.1 */ dll_export int ak_skey_derive_tlstree( kdf_t , ak_uint8 *, const size_t , ak_uint64 , tlstree_t , ak_uint8 *, const size_t ); /*! \brief Функция TLSTREE для выработки производного ключа с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 1323565.1.030-2019, раздел 10.1.2.1 */ dll_export int ak_skey_derive_tlstree_from_skey( kdf_t , ak_pointer , ak_uint64 , tlstree_t , ak_uint8 *, const size_t ); /*! \brief Функция TLSTREE для выработки производного ключа с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 1323565.1.030-2019, раздел 10.1.2.1 */ dll_export int ak_skey_set_derive_tlstree_from_skey( ak_pointer , kdf_t , ak_pointer , ak_uint64 , tlstree_t ); /*! \brief Функция TLSTREE для выработки пары производных ключей с использованием обобщенного алгоритма, регламентируемого в рекомендациях Р 1323565.1.030-2019, раздел 10.1.2.1 (явный вызов алгоритма TLSTREE512 )
1121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190
dll_export int ak_skey_set_pair_derive_tlstree_from_skey( ak_pointer , ak_pointer , ak_pointer , ak_uint64 , tlstree_t ); */ /* ----------------------------------------------------------------------------------------------- */ /*! \brief Контекст алгоритма генерации производной ключевой информации */ typedef struct kdf_state { /*! \brief Промежуточный ключ, используемый для выработки ключевой информации */ union { struct bckey bkey; struct hmac hkey; } key; /*! \brief Внутреннее состояние */ ak_uint8 ivbuffer[1024]; /*! \brief Размер внутреннего состояния в октетах */ size_t state_size; /*! \brief Размер блока вырабатываемой ключевой информации (в октетах) */ size_t block_size; /*! \breif Номер последнего выработанного ключа */ ak_uint64 number; /*! \brief Максимально допустимое количество ключей */ ak_uint64 max; /*! \brief Испольуемый алгоритм */ kdf_t algorithm; } *ak_kdf_state; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация контекта выработки производных ключей, согласно Р 1323565.1.022-2018, раздел 5. */ dll_export int ak_kdf_state_create( ak_kdf_state , ak_uint8 *, const size_t , kdf_t , ak_uint8 *, const size_t , ak_uint8 *, const size_t , ak_uint8 *, const size_t , size_t ); /*! \brief Функция возвращает длину обного блока вырабатываемой ключевой информации */ dll_export size_t ak_kdf_state_get_block_size( ak_kdf_state ); /*! \brief Функция вырабатывает следующий фрагмент ключевой информации */ dll_export int ak_kdf_state_next( ak_kdf_state , ak_pointer , const size_t ); /*! \brief Удаление контекста выработки производных ключей */ dll_export int ak_kdf_state_destroy( ak_kdf_state ); /** @}*/ /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \addtogroup mac-doc Вычисление кодов целостности (хеширование и имитозащита) @{ */ /*! \brief Функция возвращает размер вырабатываемой имитовставки. */ dll_export size_t ak_hmac_get_tag_size( ak_hmac ); /*! \brief Функция возвращает размер блока входных данных, обрабатываемого функцией выработки имитовставки. */ dll_export size_t ak_hmac_get_block_size( ak_hmac ); /*! \brief Очистка контекста секретного ключа алгоритма выработки имитовставки HMAC, а также проверка ресурса ключа. */ dll_export int ak_hmac_clean( ak_hmac ); /*! \brief Обновление текущего состояния контекста алгоритма выработки имитовставки HMAC. */ dll_export int ak_hmac_update( ak_hmac , const ak_pointer , const size_t ); /*! \brief Завершение алгоритма выработки имитовставки HMAC. */ dll_export int ak_hmac_finalize( ak_hmac , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Вычисление имитовставки для заданной области памяти. */ dll_export int ak_hmac_ptr( ak_hmac , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Вычисление имитовставки для заданного файла. */ dll_export int ak_hmac_file( ak_hmac , const char* , ak_pointer , const size_t ); /*! \brief Вычисление имитовставки для заданного файла. */ dll_export int ak_hmac_file_offset( ak_hmac , const char* , ak_int64 , ak_int64 , ak_pointer , const size_t ); /*! \brief Развертка ключевого вектора из пароля (согласно Р 50.1.111-2016, раздел 4) */ dll_export int ak_hmac_pbkdf2_streebog512( const ak_pointer , const size_t , const ak_pointer , const size_t, const size_t , const size_t , ak_pointer ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup aead-doc Аутентифицированное шифрование данных
1191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260
@{ */ /*! \brief Функция аутентифицированного шифрования. */ typedef int ( ak_function_aead )( ak_pointer, ak_pointer, const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Зашифрование данных в режиме `mgm` с одновременной выработкой имитовставки согласно Р 1323565.1.026-2019. */ dll_export int ak_bckey_encrypt_mgm( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Расшифрование данных в режиме `mgm` с одновременной проверкой имитовставки согласно Р 1323565.1.026-2019. */ dll_export int ak_bckey_decrypt_mgm( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer, const size_t ); /*! \brief Зашифрование данных в режиме `xtsmac` с одновременной выработкой имитовставки. */ dll_export int ak_bckey_encrypt_xtsmac( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Расшифрование данных в режиме `xtsmac` с одновременной проверкой имитовставки. */ dll_export int ak_bckey_decrypt_xtsmac( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer, const size_t ); /*! \brief Зашифрование данных с одновременной выработкой имитовставки согласно ГОСТ Р 34.13-2015. */ dll_export int ak_bckey_encrypt_ctr_cmac( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Расшифрование данных с одновременной проверкой имитовставки согласно ГОСТ Р 34.13-2015. */ dll_export int ak_bckey_decrypt_ctr_cmac( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer, const size_t ); /*! \brief Зашифрование данных в режиме гаммирования с одновременной выработкой имитовставки согласно Р 50.1.113-2016. */ dll_export int ak_bckey_encrypt_ctr_hmac( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Расшифрование данных в режиме гаммирования с одновременной проверкой имитовставки согласно Р 50.1.113-2016. */ dll_export int ak_bckey_decrypt_ctr_hmac( ak_pointer , ak_pointer , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer, const size_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция первичной инициализации контекста aead алгоритма перед выработкой имитовставки. */ typedef int ( ak_function_aead_authentication_clean ) ( ak_pointer , ak_pointer , const ak_pointer , const size_t ); /*! \brief Функция обновления контекста aead алгоритма в процессе выработки имитовставки. */ typedef int ( ak_function_aead_authentication_update) ( ak_pointer , ak_pointer , const ak_pointer , const size_t ); /*! \brief Функция закрытия контекста aead алгоритма в процессе выработки имитовставки. */ typedef int ( ak_function_aead_authentication_finalize) ( ak_pointer , ak_pointer , ak_pointer out, const size_t ); /*! \brief Функция первичной инициализации контекста aead алгоритма перед шифрованием данных. */ typedef int ( ak_function_aead_encryption_clean ) ( ak_pointer , ak_pointer , const ak_pointer , const size_t ); /*! \brief Функция обновления контекста aead алгоритма в процессе зашифрования данных. */ typedef int ( ak_function_aead_encryption_update ) ( ak_pointer , ak_pointer , ak_pointer , ak_pointer , ak_pointer , const size_t ); /*! \brief Функция обновления контекста aead алгоритма в процессе расшифрования данных. */ typedef int ( ak_function_aead_decryption_update ) ( ak_pointer , ak_pointer , ak_pointer , ak_pointer , ak_pointer , const size_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Контекст алгоритма аутентифицированного шифрования */ typedef struct aead { /*! \brief Ключ шифрования */ ak_pointer encryptionKey; /*! \brief Ключ имитозашиты */ ak_pointer authenticationKey;
1261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330
/*! \brief Идентификатор созданного алгоритма */ ak_oid oid; /*! \brief Указатель на внутренний контекст алгоритма */ ak_pointer ictx; /*! \brief Размер блока обрабатываемых данных */ size_t block_size; /*! \brief Размер синхропосылки */ size_t iv_size; /*! \brief Размер имитовставки */ size_t tag_size; /*! \brief Функция первичной инициализации параметров алгоритма, отвечающих за имитозащиту */ ak_function_aead_authentication_clean *auth_clean; /*! \brief Функция первичной инициализации параметров алгоритма, отвечающих за шифрование */ ak_function_aead_encryption_clean *enc_clean; /*! \brief Имитозащита данных, передаваемых в открытом виде */ ak_function_aead_authentication_update *auth_update; /*! \brief Шифрование и имитозащита данных, подлежащих защите */ ak_function_aead_encryption_update *enc_update; /*! \brief Расшифрование и имитозащита данных, подлежащих защите */ ak_function_aead_decryption_update *dec_update; /*! \brief Завершение вычисления имитовставки */ ak_function_aead_authentication_finalize *auth_finalize; } *ak_aead; /*! \brief Создание контекста алгоритма аутентифицированного шифрования Р 1323565.1.024-2019 для блочного шифра Магма */ dll_export int ak_aead_create_mgm_magma( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования Р 1323565.1.024-2019 для блочного шифра Кузнечик */ dll_export int ak_aead_create_mgm_kuznechik( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования xtsmac для блочного шифра Магма */ dll_export int ak_aead_create_xtsmac_magma( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-cmac для блочного шифра Магма */ dll_export int ak_aead_create_ctr_cmac_magma( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-cmac для блочного шифра Кузнечик */ dll_export int ak_aead_create_ctr_cmac_kuznechik( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-nmac для блочного шифра Магма */ dll_export int ak_aead_create_ctr_nmac_magma( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-hmac для блочного шифра Магма и функции хеширования Стрибог256 */ dll_export int ak_aead_create_ctr_hmac_magma_streebog256( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-hmac для блочного шифра Магма и функции хеширования Стрибог512 */ dll_export int ak_aead_create_ctr_hmac_magma_streebog512( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-nmac для блочного шифра Кузнечик */ dll_export int ak_aead_create_ctr_nmac_kuznechik( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-hmac для блочного шифра Кузнечик и функции хеширования Стрибог256 */ dll_export int ak_aead_create_ctr_hmac_kuznechik_streebog256( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования ctr-hmac для блочного шифра Кузнечик и функции хеширования Стрибог512 */ dll_export int ak_aead_create_ctr_hmac_kuznechik_streebog512( ak_aead , bool_t ); /*! \brief Создание контекста алгоритма аутентифицированного шифрования по заданному oid */ dll_export int ak_aead_create_oid( ak_aead , bool_t, ak_oid ); /*! \brief Удаление контекста алгоритма аутентифицированного шифрования */ dll_export int ak_aead_destroy( ak_aead ); /*! \brief Присвоение секретному ключу шифрования константного значения */ dll_export int ak_aead_set_encrypt_key( ak_aead , const ak_pointer , const size_t ); /*! \brief Присвоение секретному ключу аутентификации константного значения */ dll_export int ak_aead_set_auth_key( ak_aead , const ak_pointer , const size_t ); /*! \brief Присвоение константных значений секретным ключам шифрования и аутентификации */ dll_export int ak_aead_set_keys( ak_aead , const ak_pointer , const size_t , const ak_pointer , const size_t ); /*! \brief Функция возвращает размер вырабатываемой имитовставки (в октетах) */ dll_export ssize_t ak_aead_get_tag_size( ak_aead );
1331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400
/*! \brief Функция возвращает размер блока обрабатываемых данных (в октетах) */ dll_export ssize_t ak_aead_get_block_size( ak_aead ); /*! \brief Функция возвращает ожидаемый размер синхропосылки (в октетах) */ dll_export ssize_t ak_aead_get_iv_size( ak_aead ); /*! \brief Функция реализует аутентифицируемое зашифрование данных */ dll_export int ak_aead_encrypt( ak_aead , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Функция реализует аутентифицируемое расшифрование данных */ dll_export int ak_aead_decrypt( ak_aead , const ak_pointer , const size_t , const ak_pointer , ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Функция реализует выработку имитовставки (кода аутентификации) */ dll_export int ak_aead_mac( ak_aead , const ak_pointer , const size_t , const ak_pointer , const size_t , ak_pointer , const size_t ); /*! \brief Первичная инициализация параметров контекста алгоритма аутентифицированного шифрования, отвеающих как за шифрование, так и за выработку кода атентификации (имитовставку) */ dll_export int ak_aead_clean( ak_aead , const ak_pointer , const size_t ); /*! \brief Первичная инициализация параметров, отвечающих за выработку кода атентификации (имитовставку) */ dll_export int ak_aead_auth_clean( ak_aead , const ak_pointer , const size_t ); /*! \brief Первичная инициализация параметров, отвечающих за шифрование */ dll_export int ak_aead_encrypt_clean( ak_aead , const ak_pointer , const size_t ); /*! \brief Обновление контекста алгоритма аутентифицированного шифрования ассоциированными данными */ dll_export int ak_aead_auth_update( ak_aead , const ak_pointer , const size_t ); /*! \brief Закрытие контекста алгоритма аутентифицированного шифрования и вычисление кода аутентификации */ dll_export int ak_aead_finalize( ak_aead , ak_pointer out, const size_t out_size ); /*! \brief Зашифрование данных и обновление контекста алгоритма аутентифицированного шифрования */ dll_export int ak_aead_encrypt_update( ak_aead , const ak_pointer , ak_pointer , const size_t ); /*! \brief Расшифрование данных и обновление контекста алгоритма аутентифицированного шифрования */ dll_export int ak_aead_decrypt_update( ak_aead , const ak_pointer , ak_pointer , const size_t ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup math-doc Математические функции @{ */ /** \defgroup mpzn-doc Арифметика больших чисел @{ */ #ifdef LIBAKRYPT_HAVE_GMP_H #include <gmp.h> #endif /* ----------------------------------------------------------------------------------------------- */ #define ak_mpzn256_size (4) #define ak_mpzn512_size (8) #define ak_mpznmax_size (18) #define ak_mpzn256_zero { 0, 0, 0, 0 } #define ak_mpzn256_one { 1, 0, 0, 0 } #define ak_mpzn512_zero { 0, 0, 0, 0, 0, 0, 0, 0 } #define ak_mpzn512_one { 1, 0, 0, 0, 0, 0, 0, 0 } #define ak_mpznmax_zero { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } #define ak_mpznmax_one { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* ----------------------------------------------------------------------------------------------- */ /*! \brief Элемент кольца вычетов по модулю \f$2^{256}\f$. */ typedef ak_uint64 ak_mpzn256[ ak_mpzn256_size ]; /*! \brief Элемент кольца вычетов по модулю \f$2^{512}\f$. */ typedef ak_uint64 ak_mpzn512[ ak_mpzn512_size ]; /*! \brief Тип данных для хранения максимально возможного большого числа. */ typedef ak_uint64 ak_mpznmax[ ak_mpznmax_size ]; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Присвоение вычету другого вычета. */ dll_export void ak_mpzn_set( ak_uint64 *, ak_uint64 * , const size_t ); /*! \brief Присвоение вычету беззнакового целого значения. */ dll_export void ak_mpzn_set_ui( ak_uint64 *, const size_t , const ak_uint64 ); /*! \brief Присвоение вычету случайного значения. */ dll_export int ak_mpzn_set_random( ak_uint64 *, const size_t , ak_random ); /*! \brief Присвоение вычету случайного значения по фиксированному модулю. */ dll_export int ak_mpzn_set_random_modulo( ak_uint64 *, ak_uint64 *, const size_t , ak_random );
1401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470
/*! \brief Присвоение вычету значения, записанного строкой шестнадцатеричных символов. */ dll_export int ak_mpzn_set_hexstr( ak_uint64 *, const size_t , const char * ); /*! \brief Преобразование вычета в строку шестнадцатеричных символов. */ dll_export const char *ak_mpzn_to_hexstr( ak_uint64 *, const size_t ); /*! \brief Преобразование вычета в строку шестнадцатеричных символов с выделением памяти. */ dll_export char *ak_mpzn_to_hexstr_alloc( ak_uint64 *, const size_t ); /*! \brief Сериализация вычета в последовательность октетов. */ dll_export int ak_mpzn_to_little_endian( ak_uint64 * , const size_t , ak_pointer , const size_t , bool_t ); /*! \brief Присвоение вычету сериализованного значения. */ dll_export int ak_mpzn_set_little_endian( ak_uint64 * , const size_t , const ak_pointer , const size_t , bool_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Сложение двух вычетов */ dll_export ak_uint64 ak_mpzn_add( ak_uint64 *, ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Вычитание двух вычетов */ dll_export ak_uint64 ak_mpzn_sub( ak_uint64 *, ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Сравнение двух вычетов */ dll_export int ak_mpzn_cmp( ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Сравнение вычета с беззнаковым целым числом (типа ak_uint64) */ dll_export bool_t ak_mpzn_cmp_ui( ak_uint64 *, const size_t , const ak_uint64 ); /*! \brief Умножение вычета на беззнаковое целое */ dll_export ak_uint64 ak_mpzn_mul_ui( ak_uint64 *, ak_uint64 *, const size_t, const ak_uint64 ); /*! \brief Умножение двух вычетов как целых чисел */ dll_export void ak_mpzn_mul( ak_uint64 *, ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Вычисление остатка от деления одного вычета на другой */ dll_export void ak_mpzn_rem( ak_uint64 *, ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Вычисление остатка от деления вычета на одноразрядное число */ dll_export ak_uint32 ak_mpzn_rem_uint32( ak_uint64 *, const size_t , ak_uint32 ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Сложение двух вычетов в представлении Монтгомери. */ dll_export void ak_mpzn_add_montgomery( ak_uint64 *, ak_uint64 *, ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Удвоение на двойку в представлении Монтгомери. */ dll_export void ak_mpzn_lshift_montgomery( ak_uint64 *, ak_uint64 *, ak_uint64 *, const size_t ); /*! \brief Умножение двух вычетов в представлении Монтгомери. */ dll_export void ak_mpzn_mul_montgomery( ak_uint64 *, ak_uint64 *, ak_uint64 *, ak_uint64 *, ak_uint64, const size_t ); /*! \brief Модульное возведение в степень в представлении Монтгомери. */ dll_export void ak_mpzn_modpow_montgomery( ak_uint64 *, ak_uint64 *, ak_uint64 *, ak_uint64 *, ak_uint64, const size_t ); /* ----------------------------------------------------------------------------------------------- */ #ifdef AK_HAVE_GMP_H /*! \brief Преобразование ak_mpznxxx в mpz_t. */ dll_export void ak_mpzn_to_mpz( const ak_uint64 *, const size_t , mpz_t ); /*! \brief Преобразование mpz_t в ak_mpznxxx. */ dll_export void ak_mpz_to_mpzn( const mpz_t , ak_uint64 *, const size_t ); #endif /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup curves-doc Эллиптические кривые @{ */ struct wcurve; /*! \brief Контекст эллиптической кривой, заданной в короткой форме Вейерштрасса. */ typedef struct wcurve *ak_wcurve; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Класс, реализующий точку эллиптической кривой. Класс представляет собой точку \f$ P \f$ эллиптической кривой, заданной в короткой форме Вейерштрасса, в проективных координатах, т.е. точка представляется в виде вектора \f$ P=(x:y:z) \f$, удовлетворяющего сравнению \f$ y^2z \equiv x^3 + axz^2 + bz^3 \pmod{p} \f$. В дальнейшем, при проведении вычислений, для координат точки используется представление Монтгомери. */ /* ----------------------------------------------------------------------------------------------- */ struct wpoint { /*! \brief x-координата точки эллиптической кривой */
1471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540
ak_uint64 x[ak_mpzn512_size]; /*! \brief y-координата точки эллиптической кривой */ ak_uint64 y[ak_mpzn512_size]; /*! \brief z-координата точки эллиптической кривой */ ak_uint64 z[ak_mpzn512_size]; }; /*! \brief Контекст точки эллиптической кривой в короткой форме Вейерштрасса */ typedef struct wpoint *ak_wpoint; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация и присвоение контексту значения образующей точки эллиптической кривой. */ dll_export int ak_wpoint_set( ak_wpoint, ak_wcurve ); /*! \brief Инициализация и присвоение контексту значения бесконечно удаленной точки эллиптической кривой. */ dll_export int ak_wpoint_set_as_unit( ak_wpoint , ak_wcurve ); /*! \brief Инициализация и присвоение контексту значения заданной точки эллиптической кривой. */ dll_export int ak_wpoint_set_wpoint( ak_wpoint , ak_wpoint , ak_wcurve ); /*! \brief Проверка принадлежности точки заданной кривой. */ dll_export bool_t ak_wpoint_is_ok( ak_wpoint , ak_wcurve ); /*! \brief Проверка порядка заданной точки. */ dll_export bool_t ak_wpoint_check_order( ak_wpoint , ak_wcurve ); /*! \brief Удвоение точки эллиптической кривой, заданной в короткой форме Вейерштрасса. */ dll_export void ak_wpoint_double( ak_wpoint , ak_wcurve ); /*! \brief Прибавление к одной точке эллиптической кривой значения другой точки. */ dll_export void ak_wpoint_add( ak_wpoint , ak_wpoint , ak_wcurve ); /*! \brief Приведение проективной точки к аффинному виду. */ dll_export void ak_wpoint_reduce( ak_wpoint , ak_wcurve ); /*! \brief Вычисление кратной точки эллиптической кривой. */ dll_export void ak_wpoint_pow( ak_wpoint , ak_wpoint , ak_uint64 *, size_t , ak_wcurve ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Перечисление числовых идентификаторов поддерживаемых эллиптических кривых */ typedef enum { undefined_curve = 0x00, id_tc26_gost_3410_2012_256_paramSetA_curve = 0x01, id_tc26_gost_3410_2012_256_paramSetB_curve = 0x02, id_tc26_gost_3410_2012_256_paramSetC_curve = 0x03, id_tc26_gost_3410_2012_256_paramSetD_curve = 0x04, id_tc26_gost_3410_2012_512_paramSetA_curve = 0x05, id_tc26_gost_3410_2012_512_paramSetB_curve = 0x06, id_tc26_gost_3410_2012_512_paramSetC_curve = 0x07, id_axel_gost_3410_2012_256_paramSet_N0_curve = 0x17, } wcurve_id_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Класс, реализующий эллиптическую кривую, заданную в короткой форме Вейерштрасса Класс определяет эллиптическую кривую, заданную сравнением \f$ y^2 \equiv x^3 + ax + b \pmod{p} \f$, а также образующую точку \f$P=(x_P, y_P)\f$ на этой кривой с заданным порядком \f$ q \f$. Порядок \f$ m \f$ всей группы точек эллиптической кривой может быть определен из равенства \f$ m = dq \f$, где величину \f$ d \f$ называют кофактором. Параметры \f$ n, n_q, r_2\f$ вводятся для оптимизации вычислений. Определим \f$ r = 2^{256}\f$ или \f$ r=2^{512}\f$, тогда \f$ n \equiv n_0 \pmod{2^{64}}\f$, где \f$ n_0 \equiv -p^{-1} \pmod{r}\f$. Величина \f$ r_2 \f$ удовлетворяет сравнению \f$ r_2 \equiv r^2 \pmod{p}\f$. */ /* ----------------------------------------------------------------------------------------------- */ struct wcurve { /*! \brief Размер параметров эллиптической кривой, исчисляемый количеством 64-х битных блоков. */ ak_uint32 size; /*! \brief Кофактор эллиптической кривой - делитель порядка группы точек. */ ak_uint32 cofactor; /*! \brief Коэффициент \f$ a \f$ эллиптической кривой (в представлении Монтгомери) */ ak_uint64 a[ak_mpzn512_size];
1541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610
/*! \brief Коэффициент \f$ b \f$ эллиптической кривой (в представлении Монтгомери). */ ak_uint64 b[ak_mpzn512_size]; /*! \brief Модуль \f$ p \f$ эллиптической кривой. */ ak_uint64 p[ak_mpzn512_size]; /*! \brief Величина \f$ r^2\f$, взятая по модулю \f$ p \f$ и используемая в арифметике Монтгомери. */ ak_uint64 r2[ak_mpzn512_size]; /*! \brief Порядок \f$ q \f$ подгруппы, порождаемой образующей точкой \f$ P \f$. */ ak_uint64 q[ak_mpzn512_size]; /*! \brief Величина \f$ r^2\f$, взятая по модулю \f$ q \f$ и используемая в арифметике Монтгомери. */ ak_uint64 r2q[ak_mpzn512_size]; /*! \brief Точка \f$ P \f$ эллиптической кривой, порождающая подгруппу порядка \f$ q \f$. */ struct wpoint point; /*! \brief Константа \f$ n \f$, используемая в арифметике Монтгомери по модулю \f$ p \f$. */ ak_uint64 n; /*! \brief Константа \f$ n_q \f$, используемая в арифметике Монтгомери по модулю \f$ q\f$. */ ak_uint64 nq; /*! \brief Строка, содержащая символьную запись модуля \f$ p \f$. \details Используется для проверки корректного хранения параметров кривой в памяти. */ const char *pchar; /*! \brief Идентификатор эллиптической кривой, используемый в криптографических протоколах. */ wcurve_id_t id; }; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Вычисление дискриминанта эллиптической кривой, заданной в короткой форме Вейерштрасса. */ dll_export void ak_mpzn_set_wcurve_discriminant( ak_uint64 *, ak_wcurve ); /*! \brief Проверка корректности дискриминанта эллиптической кривой, заданной в форме Вейерштрасса. */ dll_export int ak_wcurve_discriminant_is_ok( ak_wcurve ); /*! \brief Проверка корректности параметров, необходимых для вычисления по модулю q. */ dll_export int ak_wcurve_check_order_parameters( ak_wcurve ); /*! \brief Проверка набора параметров эллиптической кривой, заданной в форме Вейерштрасса. */ dll_export int ak_wcurve_is_ok( ak_wcurve ); /*! \brief Функция выводит с помощью установленной функции аудита параметры эллиптической кривой */ dll_export void ak_wcurve_print_to_log( ak_wcurve , int ); /* ----------------------------------------------------------------------------------------------- */ /* параметры 256-ти битных эллиптических кривых */ /* ----------------------------------------------------------------------------------------------- */ extern const struct wcurve id_tc26_gost_3410_2012_256_paramSetTest; extern const struct wcurve id_tc26_gost_3410_2012_256_paramSetA; extern const struct wcurve id_rfc4357_gost_3410_2001_paramSetA; extern const struct wcurve id_rfc4357_gost_3410_2001_paramSetB; extern const struct wcurve id_rfc4357_gost_3410_2001_paramSetC; /*! \brief Параметры кривой A из RFC 4357, включенные в состав рекомендаций Р 1323565.0.024-2019 */ #define id_tc26_gost_3410_2012_256_paramSetB ( id_rfc4357_gost_3410_2001_paramSetA ) /*! \brief Параметры кривой B из RFC 4357, включенные в состав рекомендаций Р 1323565.0.024-2019 */ #define id_tc26_gost_3410_2012_256_paramSetC ( id_rfc4357_gost_3410_2001_paramSetB ) /*! \brief Параметры кривой C из RFC 4357, включенные в состав рекомендаций Р 1323565.0.024-2019 */ #define id_tc26_gost_3410_2012_256_paramSetD ( id_rfc4357_gost_3410_2001_paramSetC ) extern const struct wcurve id_axel_gost_3410_2012_256_paramSet_N0; /* ----------------------------------------------------------------------------------------------- */ /* параметры 512-ти битных эллиптических кривых */ /* ----------------------------------------------------------------------------------------------- */ extern const struct wcurve id_tc26_gost_3410_2012_512_paramSetTest; extern const struct wcurve id_tc26_gost_3410_2012_512_paramSetA; extern const struct wcurve id_tc26_gost_3410_2012_512_paramSetB; extern const struct wcurve id_tc26_gost_3410_2012_512_paramSetC; /*! \brief Функция возвращает числовой идентификатор кривой по указателю на ее параметры */ dll_export wcurve_id_t ak_wcurve_get_identifier( ak_wcurve ); /*! \brief Функция возвращает указатель на параметры кривой по ее числовому идентификатору */ dll_export const struct wcurve *ak_wcurve_get_parameters( wcurve_id_t ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup gf2n-doc Конечные поля характеристики два
1611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680
@{ */ /*! \brief Умножение элемента поля на примитивный элемент. \details Макрос реализует умножение произвольного элемента поля \f$ \mathbb F_{2^{128}} \f$ на примитивный элемент поля. `s1` задает старшие 64 бита элемента, `s0` - младшие 64 бита. Степень расширения поля равняется 128, а многочлен, порождающий поле равен \f$ f(x) = x^{128} + x^7 + x^2 + x + 1 \in \mathbb F_2[x]\f$. */ /* ----------------------------------------------------------------------------------------------- */ #define ak_gf128_mul_theta(s1,s0) {\ ak_uint64 n = s1&0x8000000000000000LL;\ s1 <<= 1; s1 ^= ( s0 >> 63 ); s0 <<= 1;\ if( n ) s0 ^= 0x87;\ } /* ----------------------------------------------------------------------------------------------- */ /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{64}}\f$. */ dll_export void ak_gf64_mul_uint64( ak_pointer z, ak_pointer x, ak_pointer y ); /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{128}}\f$. */ dll_export void ak_gf128_mul_uint64( ak_pointer z, ak_pointer x, ak_pointer y ); /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{256}}\f$. */ dll_export void ak_gf256_mul_uint64( ak_pointer z, ak_pointer x, ak_pointer y ); /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{512}}\f$. */ dll_export void ak_gf512_mul_uint64( ak_pointer z, ak_pointer x, ak_pointer y ); #ifdef AK_HAVE_BUILTIN_CLMULEPI64 /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{64}}\f$. */ dll_export void ak_gf64_mul_pcmulqdq( ak_pointer z, ak_pointer x, ak_pointer y ); /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{128}}\f$. */ dll_export void ak_gf128_mul_pcmulqdq( ak_pointer z, ak_pointer a, ak_pointer b ); /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{256}}\f$. */ dll_export void ak_gf256_mul_pcmulqdq( ak_pointer z, ak_pointer a, ak_pointer b ); /*! \brief Умножение двух элементов поля \f$ \mathbb F_{2^{512}}\f$. */ dll_export void ak_gf512_mul_pcmulqdq( ak_pointer z, ak_pointer a, ak_pointer b ); #define ak_gf64_mul ak_gf64_mul_pcmulqdq #define ak_gf128_mul ak_gf128_mul_pcmulqdq #define ak_gf256_mul ak_gf256_mul_pcmulqdq #define ak_gf512_mul ak_gf512_mul_pcmulqdq #else #define ak_gf64_mul ak_gf64_mul_uint64 #define ak_gf128_mul ak_gf128_mul_uint64 #define ak_gf256_mul ak_gf256_mul_uint64 #define ak_gf512_mul ak_gf512_mul_uint64 #endif /* Размеры конечных полей (в октетах) */ /*! \brief Размер поля \f$ \mathbb F_{2^{64}}\f$ в байтах. */ #define ak_galois64_size (8) /*! \brief Размер поля \f$ \mathbb F_{2^{128}}\f$ в байтах. */ #define ak_galois128_size (16) /*! \brief Размер поля \f$ \mathbb F_{2^{256}}\f$ в байтах. */ #define ak_galois256_size (32) /*! \brief Размер поля \f$ \mathbb F_{2^{512}}\f$ в байтах. */ #define ak_galois512_size (64) /** @}*/ /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup asn1-doc Функции кодирования и декодирования ASN.1 нотации @{ */ /* Флаги, определяющие класс данных ASN.1. */ #define UNIVERSAL 0x00u #define APPLICATION 0x40u #define CONTEXT_SPECIFIC 0x80u #define PRIVATE 0xC0u /* ----------------------------------------------------------------------------------------------- */ /* Флаг, определяющий структуру блока данных ASN.1. */ #define PRIMITIVE 0x00u
1681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750
#define CONSTRUCTED 0x20u /* ----------------------------------------------------------------------------------------------- */ /* Номера стандартных тегов ASN.1. */ #define TEOC 0x00u #define TBOOLEAN 0x01u #define TINTEGER 0x02u #define TBIT_STRING 0x03u #define TOCTET_STRING 0x04u #define TNULL 0x05u #define TOBJECT_IDENTIFIER 0x06u #define TOBJECT_DESCRIPTOR 0x07u #define TEXTERNAL 0x08u #define TREAL 0x09u #define TENUMERATED 0x0Au #define TUTF8_STRING 0x0Cu #define TSEQUENCE 0x10u #define TSET 0x11u #define TNUMERIC_STRING 0x12u #define TPRINTABLE_STRING 0x13u #define TT61_STRING 0x14u #define TVIDEOTEX_STRING 0x15u #define TIA5_STRING 0x16u #define TUTCTIME 0x17u #define TGENERALIZED_TIME 0x18u #define TGRAPHIC_STRING 0x19u #define TVISIBLE_STRING 0x1Au #define TGENERAL_STRING 0x1Bu #define TUNIVERSAL_STRING 0x1Cu #define TCHARACTER_STRING 0x1Du #define TBMP_STRING 0x1Eu /* ----------------------------------------------------------------------------------------------- */ /*! \brief Биты, определяющие класс данных */ #define DATA_CLASS(x) ((x) & 0xC0) /*! \brief Бит, определяющий структуру данных */ #define DATA_STRUCTURE(x) ((x) & 0x20) /*! \brief Биты, определяющие номер тега */ #define TAG_NUMBER(x) ((x) & 0x1F) /* ----------------------------------------------------------------------------------------------- */ /*! \brief Длина тега (текущая реализация поддерживает кодирование * и декодирование тегов, представленных одним байтом) */ #define TAG_LEN 1 /* ----------------------------------------------------------------------------------------------- */ /*! \brief Указатель на примитивный элемент дерева ASN1 нотации */ typedef struct tlv *ak_tlv; /*! \brief Указатель на один уровень дерева ASN1 нотации */ typedef struct asn1 *ak_asn1; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Класс, реализующий один уровень дерева ASN1 нотации. \details Фактически, класс asn1 является двусвязным списком узлов, расположенных на одном уровне ASN1 дерева. Каждый узел, реализуемый при помощи структуры \ref tlv, представляет собой примитивный элемент, либо низлежащий уровень -- двусвязный список, также реализуемый при помощи класса asn1. */ /* ----------------------------------------------------------------------------------------------- */ typedef struct asn1 { /*! \brief указатель на текущий узел списка */ ak_tlv current; /*! \brief количество содержащихся узлов в списке (одного уровня) */ size_t count; } *ak_asn1; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Структура, определяющая элемент дерева ASN1 нотации \details ASN1 дерево представляется в памяти двусвязным списком узлов (tlv структур), образующих один уровень. При этом, каждый узел может быть: - примитивным, содержащим данные, для которых определены стандартные процедуры кодирования и
1751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820
декодирования, - составным, представляющим собой двусвязный список узлов следующего уровня; составные узлы позволяют образовывать произвольные типы данных, отличные от примитивных; процедуры кодирования/декодирования составных узлов сводятся к последовательному применению процедур для примитивных типов. */ /* ----------------------------------------------------------------------------------------------- */ struct tlv { /*! \brief объединение, определяющее способ представления данных (примитивный или составной элемент), а также сами данные. */ union { /*! \brief указатель на примитивные, закодированые по правилам ASN.1 данные */ ak_uint8* primitive; /*! \brief указатель на составные данные, представляющие собой двусвязный список следующего уровня */ ak_asn1 constructed; } data; /*! \brief тег, идентифицирующий данные. */ ak_uint8 tag; /*! \brief длинна данных. */ ak_uint32 len; /*! \brief флаг, определяющий, должен ли объект освобождать память из под данных, которыми управляет */ bool_t free; /*! \brief указатель на предыдущий элемент списка. */ ak_tlv prev; /*! \brief указатель на следующий элемент списка. */ ak_tlv next; }; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Структура, используемая для передачи информации о битовых строках. */ typedef struct bit_string { /*! \brief массив, содержащий данные (в шестнадцатеричном виде) */ ak_uint8 *value; /*! \brief размер массива с данными (в октетах) */ ak_uint32 len; /*! \brief кол-во неиспользуемых битов в последнем байте (допустимые значения: от 0 до 7 включительно). */ ak_uint8 unused; } *ak_bit_string; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Формат хранения asn1 дерева в файле */ typedef enum { /*! \brief хранение asn1 дерева в виде der-последовательности. */ asn1_der_format, /*! \brief хранение asn1 дерева в виде der-последовательнсти, закодированной в base64. */ asn1_pem_format, } export_format_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Тип контента, помещаемого в контейнер. */ typedef enum { /*! \brief Не заданный или не определенный контент. */ undefined_content = 0x0, /*! \brief Секретный ключ симметричного криптографического алгоритма. */ symmetric_key_content = 0x1, /*! \brief Секретный ключ асимметричного криптографического алгоритма. */ secret_key_content = 0x2, /*! \brief Открытый ключ асимметричного криптографического алгоритма. */ public_key_certificate_content = 0x3, /*! \brief Запрос на получение открытого ключа асимметричного криптографического алгоритма. */ public_key_request_content = 0x4, /*! \brief Зашифрованные, не ключевые данные. */ encrypted_content = 0x5, /*! \brief Незашифрованные, не ключевые данные. */ plain_content = 0x06, /*! \brief Контейнер сертификатов открытых ключей, в формате PKCS #7 */ p7b_container_content = 0x07
1821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890
} crypto_content_t; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Определение количества байт, необходимых для кодирования длины элемента ASN1 дерева. */ dll_export size_t ak_asn1_get_length_size( const size_t ); /*! \brief Определение количества байт, необходимых для кодирования идентификатора объекта. */ dll_export size_t ak_asn1_get_length_oid( const char * ); /*! \brief Получение символьного (человекочитаемого) описания типа примитивного элемента ASN1 дерева. */ dll_export const char* ak_asn1_get_tag_description( ak_uint8 ); /*! \brief Получение из DER-последовательности тега для текущего узла ASN1 дерева. */ dll_export int ak_asn1_get_tag_from_der( ak_uint8** , ak_uint8 * ); /*! \brief Получение из DER-последовательности длины текущего узла ASN1 дерева. */ dll_export int ak_asn1_get_length_from_der( ak_uint8** , size_t * ); /*! \brief Установка функции вывода (печать), используемой при выводе ASN1 деревьев. */ dll_export int ak_asn1_set_print_function( ak_function_log * ); /*! \brief Установка функции вывода ASN.1 по умолчанию (используется стандартный файловый вывод) */ dll_export int ak_asn1_unset_print_function( void ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Создание примитивного узла ASN1 дерева. */ dll_export int ak_tlv_create_primitive( ak_tlv , ak_uint8 , size_t , ak_pointer , bool_t ); /*! \brief Создание примитивного узла ASN1 дерева. */ dll_export ak_tlv ak_tlv_new_primitive( ak_uint8 , size_t , ak_pointer , bool_t ); /*! \brief Создание составного узла ASN1 дерева. */ dll_export int ak_tlv_create_constructed( ak_tlv , ak_uint8 , ak_asn1 ); /*! \brief Создание составного узла ASN1 дерева. */ dll_export ak_tlv ak_tlv_new_constructed( ak_uint8 , ak_asn1 ); /*! \brief Создание составного узла ASN1 дерева, содержащего пустую последовательность */ dll_export ak_tlv ak_tlv_new_sequence( void ); /*! \brief Уничтожение примитивного узла ASN1 дерева. */ dll_export int ak_tlv_destroy( ak_tlv ); /*! \brief Уничтожение примитивного узла ASN1 дерева и освобождение памяти. */ dll_export ak_pointer ak_tlv_delete( ak_pointer ); /*! \brief Вывод информации о заданном узле ASN1 дерева. */ dll_export int ak_tlv_print( ak_tlv ); /*! \brief Вывод информации о примитивном узле ASN1 дерева. */ dll_export int ak_tlv_print_primitive( ak_tlv ); /*! \brief Функция вычисляет размер, занимаемый данным уровнем ASN.1 дерева */ dll_export int ak_tlv_evaluate_length( ak_tlv , size_t * ); /*! \brief Кодирование одного узла ASN1 дерева в DER-последовательность октетов. */ dll_export int ak_tlv_encode( ak_tlv , ak_pointer , size_t * ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Получение булевого значения, хранящегося в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_bool( ak_tlv , bool_t * ); /*! \brief Получение беззнакового, 32-х битного значения, хранящегося в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_uint32( ak_tlv , ak_uint32 * ); /*! \brief Получение указателя на последовательность октетов, хранящуюся в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_octet_string( ak_tlv , ak_pointer *, size_t * ); /*! \brief Получение указателя на utf8 последовательность символов, хранящуюся в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_utf8_string( ak_tlv , ak_pointer * ); /*! \brief Получение указателя на ia5 строку, хранящуюся в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_ia5_string( ak_tlv , ak_pointer * ); /*! \brief Получение указателя на строку, содержащую только символы английского алфавита (см. стандарт ITU-T X.690 ). */ dll_export int ak_tlv_get_printable_string( ak_tlv , ak_pointer * ); /*! \brief Получение указателя на строку, содержащую только арабские цифры и пробел. */ dll_export int ak_tlv_get_numeric_string( ak_tlv , ak_pointer * ); /*! \brief Получение указателя на битовую строку. */ dll_export int ak_tlv_get_bit_string( ak_tlv , ak_bit_string ); /*! \brief Получение указателя на символьную запись идентификатора объекта (OID), хранящуюся в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_oid( ak_tlv , ak_pointer * ); /*! \brief Получение универсального времни, хранящегося в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_utc_time( ak_tlv , time_t * ); /*! \brief Получение указателя на строку, содержащую значение локального времени (UTC), хранящегося в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_utc_time_string( ak_tlv , ak_pointer * ); /*! \brief Получение времни, хранящегося в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_generalized_time( ak_tlv , time_t * ); /*! \brief Получение указателя на строку, содержащую значение локального времени (GeneralizedTime),
1891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960
хранящегося в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_generalized_time_string( ak_tlv , ak_pointer * ); /*! \brief Получение временного интервала в структуру данных TimeValidity, хранящуюся в заданном узле ASN1 дерева. */ dll_export int ak_tlv_get_validity( ak_tlv , time_t * , time_t * ); /*! \brief Получение структуры, содержащей ресурс (структуру struct resource). */ dll_export int ak_tlv_get_resource( ak_tlv , ak_resource ); /*! \brief Получение идентификаторов криптографического алгоритма. */ dll_export int ak_tlv_get_algorithm_identifier( ak_tlv, ak_oid * , ak_oid * ); /*! \brief Добавление типизированной строки в последовательность обобщенных имен, которой владеет текущий узел. */ dll_export int ak_tlv_add_string_to_global_name( ak_tlv , const char * , const char * ); /*! \brief Функция создает новую последовательность обобщенных имен и копирует в нее типизированные строки из заданной последовательности. */ dll_export ak_tlv ak_tlv_duplicate_global_name( ak_tlv ); /*! \brief Функция сравнивает две последовательности обобщенных имен. */ dll_export int ak_tlv_compare_global_names( ak_tlv , ak_tlv ); /*! \brief Вывод информации о расширенном имени в заданный файл. */ dll_export int ak_tlv_print_global_name( ak_tlv ); /*! \brief Вывод информации о расширенном имени в заданную строку. */ dll_export int ak_tlv_snprintf_global_name( ak_tlv , char * , const size_t ); /*! \brief Получение данных, содержащихся в заданной строке глобального имени. */ dll_export ak_uint8 *ak_tlv_get_string_from_global_name( ak_tlv , const char * , size_t * ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Выделение памяти и создание одного уровня ASN1 дерева. */ dll_export ak_asn1 ak_asn1_new( void ); /*! \brief Создание одного уровня ASN1 дерева. */ dll_export int ak_asn1_create( ak_asn1 ); /*! \brief Перемещение к следующему узлу текущего уровня ASN1 дерева. */ dll_export bool_t ak_asn1_next( ak_asn1 ); /*! \brief Перемещение к предыдущему узлу текущего уровня ASN1 дерева. */ dll_export bool_t ak_asn1_prev( ak_asn1 ); /*! \brief Перемещение к последнему узлу текущего уровня ASN1 дерева. */ dll_export bool_t ak_asn1_last( ak_asn1 ); /*! \brief Перемещение к первому узлу текущего уровня ASN1 дерева. */ dll_export bool_t ak_asn1_first( ak_asn1 ); /*! \brief Изъятие текущего узла из ASN1 дерева. */ dll_export ak_tlv ak_asn1_exclude( ak_asn1 asn1 ); /*! \brief Уничтожение текущего узла с текущего уровня ASN1 дерева. */ dll_export bool_t ak_asn1_remove( ak_asn1 ); /*! \brief Уничтожение текущего уровня ASN1 дерева. */ dll_export int ak_asn1_destroy( ak_asn1 ); /*! \brief Уничтожение текущего уровня ASN1 дерева и освобождение памяти. */ dll_export ak_pointer ak_asn1_delete( ak_pointer ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Добавление нового узла к текущему уровню ASN1 дерева. */ dll_export int ak_asn1_add_tlv( ak_asn1 , ak_tlv ); /*! \brief Добавление к текущему уровню ASN1 дерева булева значения. */ dll_export int ak_asn1_add_bool( ak_asn1 , const bool_t ); /*! \brief Добавление к текущему уровню ASN1 дерева целого числа, представимого в виде беззнакового 32-х битного значения. */ dll_export int ak_asn1_add_uint32( ak_asn1 , const ak_uint32 ); /*! \brief Добавление к текущему уровню ASN1 дерева большого целого числа, представимого в виде объекта класса \ref ak_mpzn */ dll_export int ak_asn1_add_mpzn( ak_asn1 , ak_uint8 tag, ak_uint64 * , const size_t ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего произвольную последовательность октетов */ dll_export int ak_asn1_add_octet_string( ak_asn1 , const ak_pointer , const size_t ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего произвольную строку в кодировке utf-8. */ dll_export int ak_asn1_add_utf8_string( ak_asn1 , const char * ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего произвольную ia5-строку. */ dll_export int ak_asn1_add_ia5_string( ak_asn1 , const char * ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего произвольную printable-строку. */ dll_export int ak_asn1_add_printable_string( ak_asn1 , const char * ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего произвольную последовательность арабских цифр. */
1961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030
dll_export int ak_asn1_add_numeric_string( ak_asn1 , const char * ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего двоичную строку. */ dll_export int ak_asn1_add_bit_string( ak_asn1 , ak_bit_string ); /*! \brief Добавление к текущему уровню ASN1 дерева узла, содержащего идентификатор объекта */ dll_export int ak_asn1_add_oid( ak_asn1 , const char * ); /*! \brief Добавление универсального времени к текущему уровню ASN1 дерева узла*/ dll_export int ak_asn1_add_utc_time( ak_asn1 , time_t ); /*! \brief Добавление к текущему уровню ASN1 дерева низлежащего уровня */ dll_export int ak_asn1_add_asn1( ak_asn1 , ak_uint8 , ak_asn1 ); /*! \brief Добавление к текущему уровню ASN1 дерева низлежащего уровня, представленного в виде der-последовательности октетов */ dll_export int ak_asn1_add_asn1_as_octet_string( ak_asn1 , ak_asn1 ); /*! \brief Добавление к текущему уровню ASN1 дерева низлежащего уровня, содержащего временной интервал */ dll_export int ak_asn1_add_validity( ak_asn1 , time_t , time_t ); /*! \brief Функция добавляет в ASN.1 структуру, содержащую ресурс (структуру struct resource). */ dll_export int ak_asn1_add_resource( ak_asn1 root, ak_resource ); /*! \brief Функция добавляет в ASN.1 структуру, содержащую идентификатор алгоритма. */ dll_export int ak_asn1_add_algorithm_identifier( ak_asn1 , ak_oid , ak_oid ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Вывод информации о текущем уровне ASN1 дерева. */ dll_export int ak_asn1_print( ak_asn1 ); /*! \brief Функция вычисляет размер, занимаемый данным уровнем ASN.1 дерева */ dll_export int ak_asn1_evaluate_length( ak_asn1 , size_t * ); /*! \brief Кодирование ASN1 дерева в DER-последовательность октетов. */ dll_export int ak_asn1_encode( ak_asn1 , ak_pointer , size_t * ); /*! \brief Декодирование ASN1 дерева из заданной DER-последовательности октетов. */ dll_export int ak_asn1_decode( ak_asn1 , const ak_pointer , const size_t , bool_t ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Экспорт ASN.1 дерева в файл в виде der-последовательности. */ dll_export int ak_asn1_export_to_derfile( ak_asn1 , const char * ); /*! \brief Экспорт ASN.1 дерева в файл в виде der-последовательности, закодированной в base64. */ dll_export int ak_asn1_export_to_pemfile( ak_asn1 , const char * , crypto_content_t ); /*! \brief Экспорт ASN.1 дерева в файл. */ dll_export int ak_asn1_export_to_file( ak_asn1 , const char * , export_format_t , crypto_content_t ); /*! \brief Импорт ASN.1 дерева из файла, содержащего der-последовательность. */ dll_export int ak_asn1_import_from_file( ak_asn1 , const char * , export_format_t * ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция выводит в заданный файл закодированное ASN.1 дерево. */ dll_export int ak_libakrypt_print_asn1( const char * ); /*! \brief Конвертирование asn1 дерева из der формата в pem и обратно. */ dll_export int ak_libakrypt_convert_asn1( const char * , const char * , export_format_t , crypto_content_t ); /*! \brief Разбиение asn1 дерева на поддеревья первого уровня. */ dll_export int ak_libakrypt_split_asn1( const char * , export_format_t , crypto_content_t ); /*! \brief Функция проверяет, является ли заданное asn1 дерево запросом на сертификат открытого ключа. */ dll_export bool_t ak_asn1_is_request( ak_asn1 ); /*! \brief Функция проверяет, является ли заданное asn1 дерево сертификатом открытого ключа. */ dll_export bool_t ak_asn1_is_certificate( ak_asn1 ); /*! \brief Функция проверяет, является ли заданное asn1 дерево хранилищем списка сертификатов. */ dll_export bool_t ak_asn1_is_p7b_container( ak_asn1 ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \addtogroup skey-doc Ключи криптографических механизмов @{ */ /*! \brief Секретный ключ алгоритма выработки электронной подписи ГОСТ Р 34.10-2012. Ключ может рассматриваться в качестве секретного ключа как для действующего стандарта ГОСТ Р 34.10-2012, так и для предыдущей редакции 2001 года. Кроме того, данный контекст секретного ключа может быть применим для любого асимметричного криптографического механизма, использующего вычисления с эллиптическими кривыми в короткой форме Вейерштрасса, либо в искривленной форме Эдвардса. Кривые указанных форм поддерживаются отечественными рекомендациями Р 1323565.024-2019. */ /* ----------------------------------------------------------------------------------------------- */ typedef struct signkey { /*! \brief контекст секретного ключа */
2031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100
struct skey key; /*! \brief контекст функции хеширования */ struct hash ctx; /*! \brief номер открытого ключа, выработанного из данного секретного ключа. */ ak_uint8 verifykey_number[32]; } *ak_signkey; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция создания контекста секретного ключа электронной подписи. */ typedef int ( ak_function_signkey_create ) ( ak_signkey ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация контекста секретного ключа алгоритма ГОСТ Р 34.10-2012. */ dll_export int ak_signkey_create( ak_signkey , const ak_wcurve ); /*! \brief Инициализация контекста секретного ключа алгоритма ГОСТ Р 34.10-2012 с указанием имени эллиптической кривой. */ dll_export int ak_signkey_create_str( ak_signkey , const char * ); /*! \brief Инициализация контекста секретного ключа алгоритма ГОСТ Р 34.10-2012 с параметрами эллиптической кривой по-умолчанию. */ dll_export int ak_signkey_create_streebog256( ak_signkey ); /*! \brief Инициализация контекста секретного ключа алгоритма ГОСТ Р 34.10-2012 с параметрами эллиптической кривой по-умолчанию. */ dll_export int ak_signkey_create_streebog512( ak_signkey ); /*! \brief Инициализация контекста секретного ключа алгоритма выработки электронной подписи по заданному идентификатору алгоритма. */ dll_export int ak_signkey_create_oid( ak_signkey , ak_oid ); /*! \brief Присвоение контексту секретного ключа указателя на эллиптическую кривую. */ dll_export int ak_signkey_set_curve( ak_signkey , const ak_wcurve ); /*! \brief Присвоение контексту секретного ключа указателя на эллиптическую кривую. */ dll_export int ak_signkey_set_curve_str( ak_signkey sctx, const char * ); /*! \brief Функция устанавливает временной интервал действия секретного ключа. */ dll_export int ak_signkey_set_validity( ak_signkey , time_t , time_t ); /*! \brief Функция устанавливает ресурс и временной итервал действия ключа. */ dll_export int ak_signkey_set_resource_values( ak_signkey , counter_resource_t , const char * , time_t , time_t ); /*! \brief Уничтожение контекста секретного ключа. */ dll_export int ak_signkey_destroy( ak_signkey ); /*! \brief Размер области памяти, которую занимает электронная подпись. */ dll_export size_t ak_signkey_get_tag_size( ak_signkey ); /*! \brief Присвоение секретному ключу электронной подписи константного значения. */ dll_export int ak_signkey_set_key( ak_signkey , const ak_pointer , const size_t ); /*! \brief Присвоение секретному ключу электронной подписи случайного значения. */ dll_export int ak_signkey_set_key_random( ak_signkey , ak_random ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup sign-doc Электронная подпись @{ */ /** \defgroup cert-doc Открытые ключи асимметричных алгоритмов @{ */ /* ----------------------------------------------------------------------------------------------- */ /*! \brief Открытый ключ алгоритма проверки электронной подписи ГОСТ Р 34.10-2012. Ключ представляет собой объединение точки эллиптической кривой, а также ряда параметров (номера ключа, обобщенного имени владельца, времени действия ключа и т.п.), используемых при помещении ключа в контейнер или сертификат. Ключ может рассматриваться в качестве открытого ключа как для алгоритма электронной подписи, регламентируемой ГОСТ Р 34.10-2012, так и для любого асимметричного криптографического механизма, использующего вычисления с эллиптическими кривыми в короткой форме Вейерштрасса, либо в искривленной форме Эдвардса. Кривые указанных форм поддерживаются отечественными рекомендациями Р 1323565.024-2019. */ /* ----------------------------------------------------------------------------------------------- */ typedef struct verifykey { /*! \brief контекст функции хеширования */ struct hash ctx; /*! \brief уникальный номер открытого ключа (значение SubjectKeyIdentifier в RFC 5280) */ ak_uint8 number[32];
2101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170
/*! \brief длина номера (в октетах) \details для ключей, созданных другим ПО может быть меньше, чем sizeof( number ) */ ak_uint32 number_length; /*! \brief контекст эллиптической кривой */ ak_wcurve wc; /*! \brief OID алгоритма, для которого используется ключ; в случае электронной подписи используется идентификтор алгоритма проверки подписи */ ak_oid oid; /*! \brief точка кривой, являющаяся открытым ключом электронной подписи */ struct wpoint qpoint; /*! \brief флаги состояния ключа */ key_flags_t flags; } *ak_verifykey; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Инициализация контекста открытого ключа асимметричного криптографического алгоритма, в частности, алгоритма ГОСТ Р 34.10-2012. */ dll_export int ak_verifykey_create( ak_verifykey , const ak_wcurve ); /*! \brief Инициализация контекста открытого ключа асимметричного криптографического алгоритма, c фиксированной кривой размера 256 бит. */ dll_export int ak_verifykey_create_streebog256( ak_verifykey ); /*! \brief Инициализация контекста открытого ключа асимметричного криптографического алгоритма, c фиксированной кривой размера 512 бит. */ dll_export int ak_verifykey_create_streebog512( ak_verifykey ); /*! \brief Инициализация контекста открытого ключа асимметричного криптографического алгоритма, в частности, алгоритма ГОСТ Р 34.10-2012. */ dll_export int ak_verifykey_create_from_signkey( ak_verifykey , ak_signkey ); /*! \brief Функция вырабатывает номер открытого ключа. */ dll_export int ak_verifykey_set_number( ak_verifykey ); /*! \brief Уничтожение контекста открытого ключа. */ dll_export int ak_verifykey_destroy( ak_verifykey ); /*! \brief Функция сохраняет открытый ключ в файле в простом текстовом формате */ dll_export int ak_verifykey_export_to_file( ak_verifykey , const char * ); /*! \brief открытого ключа асимметричного криптографического алгоритма значением, предварительно сохраненном в простом текстовом файле */ dll_export int ak_verifykey_create_from_file( ak_verifykey , const char * ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup cert-export-doc Функции экспорта и импорта открытых ключей @{ */ /*! \brief Выработка электронной подписи для фиксированного значения случайного числа и вычисленного заранее значения хеш-функции. */ dll_export void ak_signkey_sign_const_values( ak_signkey , ak_uint64 * , ak_uint64 * , ak_pointer ); /*! \brief Выработка электронной подписи для вычисленного заранее значения хеш-функции. */ dll_export int ak_signkey_sign_hash( ak_signkey , ak_random , ak_pointer , size_t , ak_pointer , size_t ); /*! \brief Выработка электронной подписи для заданной области памяти. */ dll_export int ak_signkey_sign_ptr( ak_signkey , ak_random , const ak_pointer , const size_t , ak_pointer , size_t ); /*! \brief Выработка электронной подписи для заданного файла. */ dll_export int ak_signkey_sign_file( ak_signkey , ak_random , const char * , ak_pointer , size_t ); /*! \brief Выработка электронной подписи для фрагмента заданного файла. */ dll_export int ak_signkey_sign_file_offset( ak_signkey , ak_random , const char * , ak_int64 , ak_int64 , ak_pointer , size_t ); /*! \brief Проверка электронной подписи для вычисленного заранее значения хеш-функции. */ dll_export bool_t ak_verifykey_verify_hash( ak_verifykey , const ak_pointer , const size_t , ak_pointer ); /*! \brief Проверка электронной подписи для заданной области памяти. */ dll_export bool_t ak_verifykey_verify_ptr( ak_verifykey , const ak_pointer , const size_t , ak_pointer ); /*! \brief Проверка электронной подписи для заданного файла. */ dll_export bool_t ak_verifykey_verify_file( ak_verifykey , const char * , ak_pointer ); /*! \brief Проверка электронной подписи для фрагмента заданного файла. */ dll_export bool_t ak_verifykey_verify_file_offset( ak_verifykey , const char * , ak_int64 , ak_int64 , ak_pointer );
2171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240
/* ----------------------------------------------------------------------------------------------- */ /*! \brief Параметры запроса на сертификат открытого ключа */ typedef struct request_opts { /*! \brief Версия запроса на сертификат, значение 1 соответствует PKCS#10 в варианте, изложенным в рекомендациях Р 1323565.1.023-2018, другие значения не поддерживаются */ ak_uint32 version; /*! \brief ASN.1 дерево, содержащее в себе последовательность расширенных имен владельца ключа (согласно ITU-T X.509) */ ak_tlv subject; /*! \brief Значение электронной подписи \details Данное поле используется только при чтении созданного ранее запроса */ ak_uint8 signature[128]; } *ak_request_opts; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Запрос на сертификат открытого ключа */ typedef struct request { /*! \brief Открытый ключ */ struct verifykey vkey; /*! \brief Параметры запроса на сертификат */ struct request_opts opts; } *ak_request; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция формирует asn1 дерево с запросом на сертификат открытого ключа. */ dll_export int ak_request_export_to_asn1( ak_request , ak_signkey , ak_random , ak_asn1 ); /*! \brief Функция экспортирует открытый ключ асиметричного криптографического алгоритма в запрос на получение сертификата окрытого ключа. */ dll_export int ak_request_export_to_file( ak_request , ak_signkey , ak_random , char * , const size_t , export_format_t ); /*! \brief Функция импортирует открытый ключ асимметричного преобразования из запроса на сертификат открытого ключа */ dll_export int ak_request_import_from_file( ak_request , const char * ); /*! \brief Функция импортирует открытый ключ асимметричного преобразования из запроса на сертификат открытого ключа */ dll_export int ak_request_import_from_asn1( ak_request , ak_asn1 ); /*! \brief Функция освобождает контекст запроса на сертификат. */ dll_export int ak_request_destroy( ak_request ); /* ----------------------------------------------------------------------------------------------- */ /*! \brief Бит `digitalSignature` расширения `keyUsage`. */ #define bit_digitalSignature (256) /*! \brief Бит `contentCommitment` расширения `keyUsage`. */ #define bit_contentCommitment (128) /*! \brief Бит `keyEncipherment` расширения `keyUsage`. */ #define bit_keyEncipherment (64) /*! \brief Бит `dataEncipherment` расширения `keyUsage`. */ #define bit_dataEncipherment (32) /*! \brief Бит `keyAgreement` расширения `keyUsage`. */ #define bit_keyAgreement (16) /*! \brief Бит `keyCertSign` расширения `keyUsage`. */ #define bit_keyCertSign (8) /*! \brief Бит `cRLSign` расширения `keyUsage`. */ #define bit_cRLSign (4) /*! \brief Бит `encipherOnly` расширения `keyUsage`. */ #define bit_encipherOnly (2) /*! \brief Бит `decipherOnly` расширения `keyUsage`. */ #define bit_decipherOnly (1) /* ----------------------------------------------------------------------------------------------- */ /*! \brief Параметры сертификата открытого ключа */ typedef struct certificate_opts { /*! \brief Версия сертификата (по-умолчанию, мы всегда работаем с v3, значение 2 ) */ ak_uint32 version; /*! \brief Обобщенное имя владельца сертификата */ ak_tlv subject; /*! \brief Значение электронной подписи \details Данное поле используется только при чтении созданного ранее сертификата */ ak_uint8 signature[128];
2241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310
/*! \brief Обобщенное имя эмитента (центра сертификации, выдавшего сертификат) */ ak_tlv issuer; /*! \brief Временной интервал действия сертификата */ struct time_interval time; /*! \brief Серийный номер сертификата */ /*! \details при экспорте данное значение вырабатывается в процессе выработки сертификата, при импорте - считывается из asn1 дерева */ ak_uint8 serialnum[32]; /*! \brief длина серийного номера */ ak_uint32 serialnum_length; /*! \brief Номер ключа эмитента (центра сертификации, выдавшего сертификат) */ ak_uint8 issuer_number[32]; /*! \brief Длина ключа эмитента */ ak_uint32 issuer_number_length; /*! \brief Серийный номер эмитента (центра сертификации, выдавшего сертификат) */ ak_uint8 issuer_serialnum[32]; /*! \brief Длина серийного номера сертификата эмитента */ ak_uint32 issuer_serialnum_length; /*! \brief Флаг того, создан ли сертификат, используется только при импорте сертификатов */ bool_t created; /*! \brief расширение `Basic Constraints` (oid: 2.5.29.19) */ struct { /*! \brief определено ли данное расширение */ bool_t is_present; /*! \brief разрешено ли порождать цепочки сертификации */ bool_t value; /*! \brief количество промежуточных сертификатов в цепочке сертификации. */ ak_uint32 pathlenConstraint; } ext_ca; /*! \brief расширение `Key Usage` (oid: 2.5.29.15) */ struct { /*! \brief определено ли данное расширение */ bool_t is_present; /*! \brief набор бит, описывающих область применения открытого ключа */ ak_uint32 bits; } ext_key_usage; /*! \brief расширение Subject Key Identifier (oid: 2.5.29.14) \details Значение номера ключа хранится в поле number структуры verifykey */ struct { /*! \brief определено ли данное расширение */ bool_t is_present; } ext_subjkey; /*! \brief расширение Authority Key Identifier (oid: 2.5.29.35) */ struct { /*! \brief определено ли данное расширение */ bool_t is_present; /*! \brief надо ли включать расширенное имя эмитента в сертификат */ bool_t include_name; } ext_authoritykey; /*! \brief расширение `Secret Key Number` (oid: 1.2.643.2.52.1.98.1) */ struct { /*! \brief определено ли данное расширение */ bool_t is_present; /*! \brief уникальный номер секретного ключа, соответствующий данному открытому ключу \details поскольку данное расширение вводится только в рамках данной библиотеки, то длина номера определяется длиной поля struct skey.number */ ak_uint8 number[32]; } ext_secret_key_number; } *ak_certificate_opts; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Сертификат открытого ключа */ typedef struct certificate { /*! \brief Открытый ключ */
2311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380
struct verifykey vkey; /*! \brief Параметры сертификата */ struct certificate_opts opts; } *ak_certificate; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция присваивает значения по-умолчанию для опций сертификата. */ dll_export int ak_certificate_opts_create( ak_certificate_opts ); /*! \brief Функция вырабатывает серийный номер сертификата. */ dll_export int ak_certificate_generate_serial_number( ak_verifykey , ak_signkey , ak_uint8 *, const size_t ); /*! \brief Функция формирует полный путь к сертификату в репозирории */ dll_export int ak_ceritifcate_generate_repository_name( char * , size_t , const ak_uint8 * , const size_t ); /*! \brief Функция создает asn1 дерево, содержащее сертификат открытого ключа. */ dll_export ak_asn1 ak_certificate_export_to_asn1( ak_certificate , ak_signkey , ak_certificate , ak_random ); /*! \brief Функция экспортирует открытый ключ асиметричного криптографического алгоритма в сертификат открытого ключа. */ dll_export int ak_certificate_export_to_file( ak_certificate , ak_signkey , ak_certificate , ak_random , char * , const size_t , export_format_t ); /*! \brief Функция экспортирует открытый ключ асиметричного криптографического алгоритма в сертификат открытого ключа и помещает его в хранилище сертификатов. */ dll_export int ak_certificate_export_to_repository( ak_certificate , ak_signkey , ak_certificate , ak_random ); /*! \brief Функция сохраняет сертификат в текущем репозитории */ dll_export int ak_certificate_add_file_to_repository( const char * ); /*! \brief Функция сохраняет сертификат в текущем репозитории */ dll_export int ak_certificate_add_ptr_to_repository( ak_uint8 * , const size_t ); /*! \brief Функция сохраняет сертификат в текущем репозитории */ dll_export int ak_certificate_add_asn1_to_repository( ak_asn1 ); /*! \brief Функция переводит код ошибки при проверке сертификата в человеко-читаемую строку */ dll_export char *ak_certificate_get_error_message( int ); /*! \brief Функция импортирует открытый ключ асимметричного преобразования из сертификата открытого ключа, представленного в виде asn1 дерева */ dll_export int ak_certificate_import_from_asn1( ak_certificate , ak_certificate , ak_asn1 ); /*! \brief Функция импортирует открытый ключ асимметричного преобразования из сертификата открытого ключа */ dll_export int ak_certificate_import_from_file( ak_certificate , ak_certificate , const char * ); /*! \brief Функция импортирует открытый ключ асимметричного преобразования из сертификата открытого ключа, расположенного в памяти */ dll_export int ak_certificate_import_from_ptr( ak_certificate , ak_certificate , const ak_pointer , const size_t ); /*! \brief Функция импортирует открытый ключ асимметричного преобразования из сертификата открытого ключа, хранящегося в репозитории открытых ключей */ dll_export int ak_certificate_import_from_repository( ak_certificate , ak_certificate , const ak_uint8 * , const size_t ); /*! \brief Функция изменяет установленный по-умолчанию каталог с расположением хранилища сертификатов */ dll_export int ak_certificate_set_repository( const char * ); /*! \brief Функция возвращает указатель на установленный каталог с расположением хранилища сертификатов */ dll_export const char *ak_certificate_get_repository( void ); /*! \brief Функция освобождает контекст сертификата открытого ключа. */ dll_export int ak_certificate_destroy( ak_certificate ); /*! \brief Получение последовательности сертификатов из p7b контейнера */ dll_export ak_asn1 ak_certificate_get_sequence_from_p7b_asn1( ak_asn1 ); /*! \brief Получение последовательности сертификатов из p7b контейнера */ dll_export ak_asn1 ak_certificate_get_sequence_from_p7b_container( const char * ); /*! \brief Создание нового (пустого) p7b контейнера */ dll_export ak_asn1 ak_certificate_new_p7b_skeleton( ak_asn1 *); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup cert-tlv-doc Функции создания расширений сертификатов открытых ключей @{ */ /*! \brief Создание расширения, содержащего идентификатор открытого ключа
2381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450
(x509v3: SubjectKeyIdentifier ) */ dll_export ak_tlv ak_tlv_new_subject_key_identifier( ak_pointer, const size_t ); /*! \brief Создание расширения, содержащего основные ограничения (x509v3: BasicConstraints ) */ dll_export ak_tlv ak_tlv_new_basic_constraints( bool_t , const ak_uint32 ); /*! \brief Создание расширения, содержащего область применения сертификата (x509v3: keyUsage ) */ dll_export ak_tlv ak_tlv_new_key_usage( const ak_uint32 ); /*! \brief Создание расширения, содержащего информацию о ключе проверки сертификата (x509v3: Authority Key Identifier) */ dll_export ak_tlv ak_tlv_new_authority_key_identifier( ak_certificate , bool_t ); /*! \brief Создание расширения, содержащего номер секретного ключа, соответсвующего открытому ключу (non x509v3, Secret Key Number) */ dll_export ak_tlv ak_tlv_new_secret_key_number( ak_pointer , const size_t ); /** @}*/ /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \addtogroup skey-doc Секретные ключи криптографических механизмов @{ */ /*! \defgroup skey-export-doc Функции экспорта и импорта секретных ключей @{ */ /*! \brief Перечисление, определяющее способ интерпретации данных, введенных с клавиатуры. */ typedef enum { /*! \brief Последовательность интерпретируется как последовательность символов */ symbolic_pass, /*! \brief Последовательность интерпретируется как последовательность шестнадцатеричных символов. \details Данный способ ввода позволяет вводить произвольные двоичные данные. */ hexademal_pass } password_t; /*! \brief Тип функции, предназначенной для считывания пароля. */ typedef ssize_t ( ak_function_password_read ) ( const char *, char *, const size_t , password_t ); /*! \brief Чтение пароля из консоли с выводом уведомления (устанавливается по-умолчанию) */ dll_export ssize_t ak_password_read_from_terminal( const char * , char * , const size_t , password_t ); /*! \brief Функция устанавливает обработчик - функцию чтения пользовательского пароля. */ dll_export int ak_libakrypt_set_password_read_function( ak_function_password_read * ); /*! \brief Функция устанавливает приглашение к вводу пароля. */ dll_export int ak_libakrypt_set_password_read_prompt( const char * ); /*! \brief Функция устанавливает флаг интерпретации вводимогом пароля. */ dll_export int ak_libakrypt_set_password_read_method( password_t ); /*! \brief Функция экспортирует секретный ключ в указанный файл. */ dll_export int ak_skey_export_to_file_with_password( ak_pointer , const char *, const size_t , char * , const size_t , export_format_t ); /*! \brief Функция экспортирует секретный ключ в указанный файл в незашифрованном виде */ dll_export int ak_skey_export_to_file_unencrypted( ak_pointer , char * , const size_t , export_format_t ); /*! \brief Функция инициализирует контекст секретного ключа, импортирует параметры ключа из указанного файла, а также присваивает значение секретного ключа. */ dll_export int ak_skey_import_from_file( ak_pointer , oid_engines_t , const char * ); /*! \brief Функция создает и инициализирует контекст секретного ключа, после чего импортирует параметры ключа из указанного файла. */ dll_export ak_pointer ak_skey_new_from_file( const char * ); /*! \brief Функция создает и инициализирует контекст секретного ключа, после чего импортирует значение секретного ключа и его параметры из указанного файла. */ dll_export ak_pointer ak_skey_load_from_file( const char * ); /*! \brief Функция удаляет считаный ранее контекст секретного ключа */ dll_export int ak_skey_delete( ak_pointer ); /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** \defgroup skey-blom-doc Реализация схемы Блома распределения ключевой информации @{ */ /*! \brief Секретный ключ для схемы Блома распределения ключевой информации. */ /*! Подробное описание механизмов выработки ключей содержится в разделе \ref skey-blom-doc. */ typedef struct blomkey { /*! \brief количество октетов, образующих один элемент конечного поля. */ ak_uint32 count; /*! \brief величина определяет размер матрицы в \f$ size\times size\f$ элементов */
24512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506
ak_uint32 size; /*! \brief указатель на ключевые данные */ ak_uint8 *data; /*! \brief контрольная сумма (хэш-код ключевых данных) */ ak_uint8 icode[32]; /*! \brief контекст алгоритма выработки имитовставки */ struct hash ctx; /*! \brief тип ключа */ enum { /*! \brief мастер-ключ, из которого вырабатываются все производные ключи */ blom_matrix_key, /*! \brief секретный ключ клиента, представляющий собой вектор-строку */ blom_abonent_key } type; } *ak_blomkey; /* ----------------------------------------------------------------------------------------------- */ /*! \brief Функция создает мастер-ключ для схемы Блома. */ dll_export int ak_blomkey_create_matrix( ak_blomkey , const ak_uint32 , const ak_uint32 , ak_random ); /*! \brief Функция создает ключ абонента для схемы Блома. */ dll_export int ak_blomkey_create_abonent_key( ak_blomkey , ak_blomkey , ak_pointer , const size_t ); /*! \brief Функция создает ключ парной связи (в виде последовательности октетов) */ dll_export int ak_blomkey_create_pairwise_key_as_ptr( ak_blomkey , ak_pointer , const size_t , ak_pointer , size_t ); /*! \brief Функция создает ключ парной связи и помещает его в контекст секретного ключа */ dll_export ak_pointer ak_blomkey_new_pairwise_key( ak_blomkey , ak_pointer , const size_t , ak_oid ); /*! \brief Функция возвращает элемент ключа с заданным индексом */ dll_export ak_uint8 *ak_blomkey_get_element_by_index( ak_blomkey , const ak_uint32 , const ak_uint32 ); /*! \brief Уничтожение ключа */ dll_export int ak_blomkey_destroy( ak_blomkey ); /*! \brief Экспорт ключа схемы Блома в заданный файл */ dll_export int ak_blomkey_export_to_file_with_password( ak_blomkey , const char * , const size_t , char * , const size_t ); /*! \brief Импорт ключа схемы Блома из заданного файла */ dll_export int ak_blomkey_import_from_file_with_password( ak_blomkey , const char * , const size_t , char * ); /** @}*/ /** @}*/ /* ----------------------------------------------------------------------------------------------- */ /** @} */ #ifdef __cplusplus } /* конец extern "C" */ #endif #endif /* ----------------------------------------------------------------------------------------------- */ /* libakrypt.h */ /* ----------------------------------------------------------------------------------------------- */