/* vim:set sw=4 ts=8 fileencoding=cp1251::Кодировка:WINDOWS-1251[АБЁЪЯабёъя] */
#ifdef _WIN32
    #pragma setlocale("rus")
#endif
/*
 * Copyright(C) 2013 Проект ИОК
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто Про.
 */
/*!
 * \version $Revision: 89611 $
 * \date $Date: 2013-05-29 23:43:11 +0400 (СЃСЂ, 29 РјР°Р№ 2013) $
 * \author $Author: lse $
 *
 * \brief Интерфейс взаимодействия с реализацей TLS уровня ядра и
 *        взаимодействия узлов кластера.
 */

#ifndef __UTLS_h__
#define __UTLS_h__

#if !defined(_MSC_VER)
    #include "CSP_WinDef.h"
    #include "ntstatus.h"
    typedef ULONG NTSTATUS;
#endif

#include "wincspc.h"
#include "CSP_Sspi.h"
#include "ipsec/include/sadb.h"
/*! \defgroup ProUKTLS Структуры данных и функции работы с TLS в ядре и экспорта сессий
* \ingroup ProSSPSSPI
* Функции и структуры данных, позволяющие пробрасывать контекст сессии в ядро
* и экспортировать сессии на другие узлы кластера
*/
/*! \defgroup ProUTLS Структуры данных и функции уровня пользователя
  \ingroup ProUKTLS
*/
/*! \struct utlsdb_token
* \ingroup ProUTLS
* \brief Структура ключевой пары экспорта
*/
typedef struct
{
    PRIVKEY Priv; /*!< \brief Закрытый ключ отправителя */
    PUBKEY_2012 Pub; /*!< \brief Открытый ключ получателя */
} utlsdb_token;

/*! \ingroup ProUTLS
* \brief указатель на структуру с таблицами функций SADB и SSPI
*/
typedef struct _CPUTLS_vtbl_ CPUTLS_VTBL, * utls_gost_handle;
/*! \struct _CPUTLS_vtbl_
* \ingroup ProUTLS
* \brief Структура, содержащая таблицы работы с ассоциациями ключей и функций SSPI
*/
struct _CPUTLS_vtbl_
{
    GEN_SADB tlsdb; /*!< \brief Таблица функций SADB */
    PSecurityFunctionTable pSSPI; /*!< \brief Таблица функций SSPI */
};

/*! \ingroup ProUTLS
* \brief Структура utls_gost_in, в которой передается данные для создания utls_gost_handle
*/
typedef struct utls_gost_in_st {
   unsigned         allocatedMem;
    /*!< \brief Размер выделенной под utls_gost_handle памяти (не менее requiredMem в #utls_gost_out_st).*/
    void*            reserved[7];
    /*!< \brief Зарезервировано, не используется, заполняется нулями.*/
} utls_gost_in;

/*! \struct utls_gost_out_st
* \ingroup ProUTLS
* \brief Структура utls_gost_out, в которой возвращаются данные для создания utls_gost_handle
*/

typedef struct utls_gost_out_st {
    unsigned requiredMem;
    /*!< \brief Необходимый для utls_gost_handle размер памяти.*/
   void*    reserved[7];
    /*!< \brief Зарезервировано, не используется, заполняется нулями.*/
} utls_gost_out;
/*! \ingroup ProUTLS
* \def CPUTLS_CONTEXT_EXPORT_TO_KERNEL
* \brief экспорт сессионных ключей для модуля ядра
*/
#define CPUTLS_CONTEXT_EXPORT_TO_KERNEL  (0x1000)   
#define CPUTLS_CONTEXT_EXPORT_RESET_NEW	 (0x2000)   // экспорт master_secret для другого узла кластера
#define CPUTLS_CONTEXT_EXPORT_DELETE_OLD (0x4000)   // удалить сессию после экспорта
/*! \def CPUTLS_ATTR_CREDENTIAL_HANDLE
* \ingroup ProUTLS
* \brief вернуть хендл на созданные в процессе импорта Credentials
*/
#define CPUTLS_ATTR_CREDENTIAL_HANDLE	 (0x1001)   
/*! \ingroup ProUTLS
* \brief Функция cputls_init_gost() используется для инициализации библиотеки TLS.
* \param h [in/out] - указатель на область памяти под таблицы функций библиотеки.
* \param in [in] - указатель на структуру \ref utls_gost_in_st в которой указывается размер выделенной памяти
* \param uFlags [in] - не используется, заполняется нулем
* \param out [out] - указатель на структуру \ref utls_gost_out_st  в которой указывается размер памяти, которую необходимо выделить
* \return возвращает статус выполнения операции
* \retval STATUS_SUCCESS \e Успешное завершение. Если параметр h равен NULL в поле out возвращается размер памяти, которую надо выделить под структуру
* \retval STATUS_INTERNAL_ERROR \e параметры функции заданы неверно
* \retval STATUS_NO_MEMORY \e выделенной памяти не хватает под структуру
*/
DWORD cputls_init_gost(
    utls_gost_handle h,
    const utls_gost_in *in,
    unsigned uFlags,
    utls_gost_out *out
);

/*! \ingroup ProUTLS
* \brief Функция cputls_shutdown_gost() завершает работу библиотеки
* \note Память, зарезервированную в utls_gost_handle освобождает пользователь
* \param h указатель на освобождаемую структуру
* \param uFlags не используется, должно быть равно 0
* \returns STATUS_SUCCESS
*/
DWORD cputls_shutdown_gost (
    utls_gost_handle h,
    unsigned uFlags
);
#endif



