/*
* Copyright(C) 2003 проект CERTEX
*
* Этот файл содержит информацию, являющуюся собственностью НИЛ Гамма ТЕХНОЛОГИИ.
* 
* Любая часть этого файла не может быть скопирована,
* исправлена, переведена на другие языки,
* локализована или модифицирована любым способом,
* откомпилирована, передана по сети с или на
* любую компьютерную систему без предварительного
* заключения соглашения с НИЛ Гамма ТЕХНОЛОГИИ.
*
*
* FileVersion  : 1.1.211.227
* PrivateBuild : 1.43
* Date modify  : 09.07.03
* FileDescription : CERTEX CryptoAPI 
*
*/

#ifndef __STRLIB_H__
#define __STRLIB_H__


// BUILD_DLL_STRLIB должен быть определен в проекте создания DLL
#include "crtstructure.h"

#define CMS_DATA                0 //незащищенные данные
#define CMS_SIGN_DATA           1 //подписанные данные
#define CMS_ENVP_DATA           2 //зашифрованные на получателя сообщения данные (цифровой пакет)
#define CMS_DIGS_DATA           3 //хешированные данные
#define CMS_ENCR_DATA           4 //зашифрованные на себя данные
#define CMS_AUTH_DATA           5 //аутентифицируемые данные
#define LDAP_DATA               7 //для режима OFF-LINE

#define ONLY_ONE_CA     1
#define MORE_ONE_CA     0


//когда работает винда...
#ifdef _WIN32

#ifndef _INC_WINDOWS
#include <windows.h>
#endif 
#include <wincrypt.h>

#ifdef BUILD_DLL_STRLIB
//макрос для экспорта из библиотеки
#define _WIN_DLL extern "C" __declspec(dllexport)

#else
//макрос для импорта в приложение
#define _WIN_DLL extern "C" __declspec(dllimport)

#endif

//#define WINAPI __stdcall  // compile option -> /Gz

//когда работает уникс...
#else

#include "wdefs.h"
#define _WIN_DLL extern "C"

#endif

typedef unsigned long ulong32;

//здесь определяем прототипы экспортируемого...


typedef void (*t_callback)(int,int,void *);

#define CRT_STORE_PROV_LDAP     0
#define CRT_STORE_PROV_MEMORY   1
#define CRT_STORE_PROV_SYSTEM   2
#define CRT_STORE_PROV_FILE     3



//typedef unsigned long hPKICONTEXT;
//typedef unsigned long hENROLLCONTEXT;
//typedef unsigned long hCERTCONTEXT;
//typedef unsigned long hCRLCONTEXT;
//typedef unsigned long hCRYPTMSG;
//typedef unsigned long hAUTHMSG;
//typedef unsigned long hCERTCHAINCONTEXT;
//typedef unsigned long hCERTCOLLECTION;
//
//typedef struct _CERT_CRL_CHAIN {
//  int             certCount;
//  hCERTCONTEXT    hCertContext;
//  int             crlCount;
//  hCRLCONTEXT     hCRLContext;
//  int             crtcrlCount;
//  hCERTCONTEXT    hCertCRLContext;
//  unsigned long   Flags;
//} CERT_CRL_CHAIN, *pCERT_CRL_CHAIN;
//
//
//
//typedef struct _CERT_COLLECTION {
//  int             certCount;
//  hCERTSTORE      hStore;
//  hCERTSTORE      hMY;
//  hCERTCONTEXT    hContext;
//  unsigned long   Flags;
//} CERT_COLLECTION, *pCERT_COLLECTION;


//**************************************************************

_WIN_DLL int __initSSL(char *lib_path);

_WIN_DLL int __chkSSL(void);

_WIN_DLL void __finiSSL(void);



_WIN_DLL char * ErrorString(const int err);

/*
*   CertOpenStore       - открыть хранилище сертификатов
*
*   Входные параметры   - StoreProvider - способ доступа к хранилищу 0-SOCKET
*                                                                    1-DDE
*                                                                    2-SYSTEM
*                                                                    3-HARDDISK
*                         hProv   - хендл на криптопровайдер (получить с помощью CSPOpenContext)
*                         dwFlags - 1 - ONLY_ONE_CA, 0 - MORE_ONE_CA.
*                         bFlags  - зарезервировано
*                         pvPara  - зарезервировано
*
*   Выходные параметры  - phStore - указатель (хендл) на хранилище.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtOpenStore
                       (DWORD StoreProvider,
                        HCRYPTPROV hProv,
                        unsigned long dwFlags,
                        bool  bFlag,
                        const void *pvParam,
                        hCERTSTORE *phStore);


/*
*   CertSetStoreProperty- настроить хранилище сертификатов
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище.
*                         Flags   - ONLY_ONE_CA или MORE_ONE_CA
*                         host    - адрес (например "192.168.7.100" или "C:\\Store\\Local")
*                         port    - порт (например 62102 или "LOCAL")
*                         name    - имя (например NULL)
*                         pass    - пароль (например NULL)
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtSetStoreProperty
                               (const hCERTSTORE hStore,
                                const unsigned long Flags,
                                const char *host,
                                const char *port,
                                const char *name,
                                const char *pass);


/*
*   CrtSetStorePropertyExt  - настроить хранилище сертификатов
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище.
*                         Flags   - ONLY_ONE_CA или MORE_ONE_CA
*                         DName   - точка входа в хранилище (тип хранилища)
*                                   [L] - хранилище сертификатов"
*                                   [M] - хранилище собственных сертификатов"
*                                   [A] - хранилище сертификатов ЦС"
*                                   [R] - хранилище списков отозванных сертификатов"
*                                   [I] - архивное хранилище"
*                                   [T] - хранилище trust-информации"
*                                   [Z] - хранилище временной информации"
*                         host    - адрес (например "192.168.7.100" или "C:\\Store\\Local")
*                         port    - порт (например 62102 или "LOCAL")
*                         timeOut - время ожидания отклика
*                         name    - имя (например NULL)
*                         pass    - пароль (например NULL)
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtSetStorePropertyExt
                                 (const hCERTSTORE hStore,
                                  const unsigned long Flags,
                                  const char *DName,
                                  const char *host,
                                  const char *port,
                                  const int timeOut,
                                  const char *name,
                                  const char *pass);


_WIN_DLL int CrtSetStorePKCS11(const hCERTSTORE hStore,
                               HCRYPTPROV hProv);

/*
*   CrtSetURL          - установить URL
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище.
*                         URL     - <протокол>://[<имя пользователя>[:<пароль>[:mech[:FQDN]]]@]<хост>[:<порт>][/dn[?[attributes][?[scope]]]
*                                    mech       = NTLM,DIGEST-MD5,...
*                                    FQDN       = (Fully Qualified Domain Name )
*                                    dn         =  distinguishedName
*                                    scope      = "base" / "one" / "sub"
*                                    attributes =  attrdesc *("," attrdesc) (temporarily not supported)*
*                         sasl_path - путь к библиотеки SASL (например NULL)
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtSetURL
                      (const hCERTSTORE hStore,
                      const char *URL,
                      const char *sasl_path);


/*
*   CrtConnectToStore   - подключиться к хранилищу сертификатов
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище.
*                         Flags   - ONLY_ONE_CA или MORE_ONE_CA
*                         timeOut - время ожидания отклика
*                         URL     - <протокол>://[<имя пользователя>[:<пароль>[:mech[:FQDN]]]@]<хост>[:<порт>][/dn[?[attributes][?[scope]]]
*                                    mech       = NTLM,DIGEST-MD5,...
*                                    FQDN       = (Fully Qualified Domain Name )
*                                    dn         =  distinguishedName
*                                    scope      = "base" / "one" / "sub"
*                                    attributes =  attrdesc *("," attrdesc) (temporarily not supported)*
*                         sasl_path - путь к библиотеки SASL (например NULL)
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtConnectToStore
                              (const hCERTSTORE hStore,
                              const unsigned long Flags,
                              const int timeOut,
                              const char *URL,
                              const char *sasl_path);


/*
*   CrtSetProxy         - настроить PROXY для доступа к хранилищу сертификатов
*
*   Входные параметры   - hStore        - указатель (хендл) на хранилище.
*                         proxy_type    - 
*                         proxy_host    - 
*                         proxy_port    - 
*                         proxy_name    -
*                         proxy_pass    -
*                         proxy_exclude - 
*                         proxy_dns_flag-
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtSetProxy
                       (const hCERTSTORE hStore,
                        const int proxy_type,
                        const char *proxy_host,
                        const char *proxy_port,
                        const char *proxy_name,
                        const char *proxy_pass,
                        const char *proxy_exclude,
                        const int proxy_dns_flag);

/*
*   CrtSetSSL           - настроить SSL для доступа к хранилищу сертификатов
*
*   Входные параметры   - hStore       - указатель (хендл) на хранилище.
*                         file_pkey    - 
*                         file_cert    - 
*                         file_ca_cert - 
*                         path_ca      -
*                         cert_verify  -
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtSetSSL
                     (const hCERTSTORE hStore,
                      const char *file_pkey,
                      const char *file_cert,
                      const char *file_ca_cert,
                      const char *path_ca,
                      const int  cert_verify);


/*
*   CrtSetSSLKey        - настроить SSL для доступа к хранилищу сертификатов
*
*   Входные параметры   - hStore      - указатель (хендл) на хранилище.
*                         key_type    - 
*                         key_size    - 
*                         key         - 
*                         cert_size   -
*                         cert        -
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtSetSSLKey
                         (const hCERTSTORE hStore,
                          int key_type,
                          unsigned long key_size,
                          unsigned char *key,
                          unsigned long cert_size,
                          unsigned char *cert);


/*
*   IsLDAPexist         - проверить наличие LDAP соединения
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище.
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int IsLDAPexist(const hCERTSTORE hStore);



/*
*   CertCloseStore      - закрыть хранилище сертификатов
*
*   Входные параметры   - hStore - указатель (хендл) на хранилище.
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtCloseStore(hCERTSTORE *phStore);



/*
*   SetLDAPver          - установить версию хранилища сертификатов (для совместимости с предыдущими версиями). 
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище.
*                         ver     - номер версии (например 3)
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL void SetLDAPver(hCERTSTORE hStore, int ver);


/*
*   CreateUserStore     - создать хранилище. Создает корень дерева (ROOT, COMMON, LOCAL и т.п.).
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище.
*                         ownerName - имя владельца в формате DN
*                                     (прописыватся в файле ROOT, или COMMON соответственно с port)
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CreateUserStore
                         (hCERTSTORE hStore,
                          const char *ownerName);



/*
*   GetOwnerName        - получить имя владельца хранилища
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище.
*                         DName
*
*   Выходные параметры  - ownerName - имя владельца в формате DN.
*                                     Память отводит вызывающая программа.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetOwnerName
                       (hCERTSTORE hStore,
                        const char *DName,
                        char *ownerName);


/*
*   AddOwnerName        - добавить имя владельца хранилища
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище.
*                         DName
*                         ownerName - имя владельца в формате DN.
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddOwnerName
                        (hCERTSTORE hStore,
                         const char *DName,
                         const char *ownerName);

/*
*   GetModifyTime       - получить время поледнего обновления хранилища
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище,
*                         DName
*
*   Выходные параметры  - modifyTime - время в формате "20020903000000Z".
*                                     Память отводит вызывающая программа.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetModifyTime
                          (hCERTSTORE hStore,
                           const char *DName,
                           char *modifyTime);


//**************************************************************


/*
*   AddTrustNode        - добавить в хранилище информацию о доверительных ЦС. Если соответствующего
*                         узла нет, создается автоматически.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         node     - узел для добавления
*                         GName    - имя группы доверенного ЦС
*                         DName    - имя доверенного ЦС
*                         hostLDAP - адрес LDAP хранилищ доверенных ЦС
*                         portLDAP - порт LDAP хранилищ
*                         hostCRL  - адрес точки распространения СОС доверенных ЦС
*                         portCRL  - порт точки распространения СОС хранилищ
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddTrustNode
                        (hCERTSTORE hStore,
                         const char *node,
                         const char *GName,
                         const char *DName,
                         const char *hostLDAP,
                         const char *portLDAP,
                         const char *hostCRL,
                         const char *portCRL);


/*
*   AddCertificate      - добавить сертификат в хранилище. Если соответствующего узла нет,
*                         создается автоматически.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCertificate
                         (hCERTSTORE hStore,
                          const unsigned char *certBody,
                          const unsigned long bodySize);


/*
*   AddCertificateExist - добавить сертификат в существующий узел.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCertificateExist
                               (hCERTSTORE hStore,
                                const unsigned char *certBody,
                                const unsigned long bodySize);

/*
*   AddCertificateTemp  - добавить шаблон сертификата в хранилище. Если соответствующего узла нет,
*                         создается автоматически.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName    - имя узла в формате DN
*                         certBody - шаблон сертификата
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCertificateTemp(hCERTSTORE hStore,
                                const char *DName,
                                const unsigned char *certBody,
                                const unsigned long bodySize);


/*
*   AddCACertificate    - добавить сертификат ЦС в корень хранилища.
*                         Предварительно создать корень с помощью createUserStore.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         certBody - сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCACertificate
                           (hCERTSTORE hStore,
                            const char *DName,
                            const unsigned char *certBody,
                            const unsigned long bodySize);


/*
*   AddCAOldCertificate - добавить старый сертификат ЦС в корень хранилища.
*                         Подразумевается, что корень дерева уже есть.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         certBody - сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCAOldCertificate
                             (hCERTSTORE hStore,
                              const char *DName,
                              const unsigned char *certBody,
                              const unsigned long bodySize);


/*
*   AddCANewOld         - добавить сертификат ЦС, подписанный на старых ключах в корень хранилища.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         certBody - сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCANewOld
                     (hCERTSTORE hStore,
                      const char *DName,
                      const unsigned char *certBody,
                      const unsigned long bodySize);


/*
*   AddCAOldNew         - добавить старый сертификат ЦС, подписанный на новых ключах
*                         в корень хранилища.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         certBody - сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCAOldNew
                     (hCERTSTORE hStore,
                      const char *DName,
                      const unsigned char *certBody,
                      const unsigned long bodySize);



/*
*   AddCRL              - добавить СОС в хранилище R.
*                         Подразумевается, что корень дерева уже есть.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         crlBody - список отозванных сертификатов
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddCRL
                 (hCERTSTORE hStore,
                  const char *DName,
                  const unsigned char *crlBody,
                  const unsigned long bodySize);

/*
*   AddDeltaCRL         - добавить разностный СОС в хранилище R.
*                         Подразумевается, что корень дерева уже есть.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         crlBody - список отозванных сертификатов
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddDeltaCRL(hCERTSTORE hStore,
                        const char *DName,
                        const unsigned char *crlBody,
                        const unsigned long bodySize);


/*
*   AddUserCRL          - добавить пользовательский СОС в хранилище. Для совместимости с СГДС!
*                         Подразумевается, что корень дерева уже есть.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в который добавлять. Если Root то "".
*                         crlBody - список отозванных сертификатов
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddUserCRL
                 (hCERTSTORE hStore,
                  const char *DName,
                  const unsigned char *crlBody,
                  const unsigned long bodySize);




/*
*   AddUserRequest      - добавить CMC запрос в хранилище. Если соответствующего узла нет,
*                         создается автоматически.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         type      - тип запроса 0, 1, 2 или 3
*                         DName     - имя узла в формате DN
*                         transID   - идентификатор запроса
*                         reqBody   - запрос
*                         bodySize  - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AddUserRequest
                          (hCERTSTORE hStore,
                           const int type,
                           const char *DName,
                           const char *transID,
                           const unsigned char *reqBody,
                           const unsigned long bodySize);

/*
*   SaveTimeStamp      - добавить запрос в хранилище. Если соответствующего узла нет,
*                         создается автоматически.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         DName     - имя узла в формате DN
*                         reqBody   - запрос
*                         bodySize  - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SaveTimeStamp
                          (hCERTSTORE hStore,
                           const char *DName,
                           const unsigned char *reqBody,
                           const unsigned long bodySize);

//***************************************************************

/*
*   DelRevokedNode      - удалить узлы с отозваными сертификатами.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         groupName - соответствующее групповое имя в формате DN ("C=KZ")
*                         crlBody - СОС
*                         bodySize - размер СОС
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DelRevokedNode
                       (hCERTSTORE hStore,
                        const char *groupName,
                        const unsigned char *crlBody,
                        const unsigned long bodySize);




/*
*   DelInvalidNode      - удалить узлы с просроченными сертификатами.
*
*   Входные параметры   - hStore     - указатель (хендл) на хранилище
*                         groupName  - соответствующее групповое имя в формате DN ("C=KZ")
*                         dataValid  - время проверки
*                         deltaValid - период проверки
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DelInvalidNode
                      (hCERTSTORE hStore,
                       const char *groupName,
                       const char *dataValid,
                       const unsigned int deltaValid);


/*
*   DelNode             - удалить узел соответствующий DN из хранилища.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - соответствующее имя в формате DN
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DelNode
                    (hCERTSTORE hStore,
                     const char *DName);




/*
*   DelTrustNode        - удалить соответствующий трастовые отношения из хранилища.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         node      - узел для модификации
*                         GName     - групповое имя доверенного ЦС
*                         DName     - имя доверенного ЦС
*                         hostLDAP  - адрес LDAP хранилища доверенного ЦС
*                         portLDAP  - порт LDAP хранилища
*                         hostCRL   - адрес точки СОС доверенного ЦС
*                         portCRL   - порт точки СОС
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
 _WIN_DLL int DelTrustNode
                          (hCERTSTORE hStore,
                           const char *node,
                           const char *GName,
                           const char *DName,
                           const char *hostLDAP,
                           const char *portLDAP,
                           const char *hostCRL,
                           const char *portCRL);


/*
*   DelCertificate      - удалить сертификат из хранилища. Если сертификата нет,
*                         ошибка не возвращается.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. 
*                         isCA     - признак
*                         certBody - удаляемый сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DelCertificate
                         (hCERTSTORE hStore,
                          const char *DName,
                          const bool isCA,
                          const unsigned char  *certBody,
                          const unsigned long  bodySize);


/*
*   DelCertificateTemp  - удалить шаблон сертификата из хранилища. Если шаблона нет,
*                         ошибка не возвращается.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать.
*                         tempBody - удаляемый шаблон
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DelCertificateTemp
                               (hCERTSTORE hStore,
                                const char *DName,
                                const unsigned char  *tempBody,
                                const unsigned long  bodySize);


/*
*   DelCertificateRequest  - удалить запрос сертификата из хранилища. Если запроса нет,
*                         ошибка не возвращается.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         type     -
*                         DName    - имя узла в котором искать. 
*                         reqBody  - удаляемый запрос
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DelCertificateRequest
                                 (hCERTSTORE hStore,
                                  const int type,
                                  const char *DName,
                                  const unsigned char  *reqBody,
                                  const unsigned long  bodySize);

/*
*   RevCertificate      - отозвать сертификат. Если сертификата нет,
*                         ошибка не возвращается.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         revDate - дата отзыва в формате "YYYYMMDDHHMMSSZ"
*                         revReason - причина отзыва (см. CRL.H)
*                         certBody - удаляемый сертификат
*                         bodySize - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int RevCertificate
                         (hCERTSTORE hStore,
                          const char *revDate,
                          const int revReason,
                          const unsigned char  *certBody,
                          const unsigned long  bodySize);



/*
*   KillZombi - специфическая для CERTEX OFF-LINE. Пока не использовать.
*/
_WIN_DLL int KillZombi
                   (hCERTSTORE *hStore,
                    const char *DName);


//***************************************************************


/*
*   GetCACertificateKey  - получить сертификат ЦС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         keyOID - алгоритм использования,
*                         isValid
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCACertificateKey
                           (hCERTSTORE hStore,
                            const char *DName,
                            const char *keyOID,
                            const bool isValid,
                            unsigned char *certBody,
                            unsigned long *bodySize);


/*
*   GetCACertificateNum  - получить сертификат ЦС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         serNum - серийный номер сертификата.
*                         len    - длина серийного номера.
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCACertificateNum
                           (hCERTSTORE hStore,
                            const char *DName,
                            const unsigned char *serNum,
                            const long len,
                            unsigned char *certBody,
                            unsigned long *bodySize);


/*
*   GetCAOldCertificate - получить старый сертификат ЦС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         serNum - серийный номер сертификата.
*                         len    - длина серийного номера.
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCAOldCertificate
                             (hCERTSTORE hStore,
                              const char *DName,
                              const unsigned char *serNum,
                              const long len,
                              unsigned char *certBody,
                              unsigned long *bodySize);


/*
*   GetCANewOld         - получить новый сертификат ЦС, подписанный на старых ключах.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         serNum - серийный номер сертификата.
*                         len    - длина серийного номера.
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCANewOld
                     (hCERTSTORE hStore,
                      const char *DName,
                      const unsigned char *serNum,
                      const long len,
                      unsigned char *certBody,
                      unsigned long *bodySize);


/*
*   GetCAOldNew         - получить старый сертификат ЦС, подписанный на новых ключах.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         serNum - серийный номер сертификата.
*                         len    - длина серийного номера.
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCAOldNew
                         (hCERTSTORE hStore,
                          const char *DName,
                          const unsigned char *serNum,
                          const long len,
                          unsigned char *certBody,
                          unsigned long *bodySize);


/*
*   GetCurrentCRL       - получить СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*
*   Выходные параметры  - crlBody - список отозванных сертификатов.
*                                   Память отводит вызывающая программа.
*                                   Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCurrentCRL
                          (hCERTSTORE hStore,
                           const char *DName,
                           unsigned char *crlBody,
                           unsigned long *bodySize);

/*
*   GetCurrentCRLNumber - получить номер СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*
*   Выходные параметры  - num - номер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCurrentCRLNumber(hCERTSTORE hStore,
                                 const char *DName,
                                 ulong32 *num);

/*
*   GetCRLExt           - получить СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*
*   Выходные параметры  - crlBody - указатель на список отозванных сертификатов.
*                                   Память отводит библиотека.
*                                   Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLExt
                          (hCERTSTORE hStore,
                           const char *DName,
                           unsigned char **crlBody,
                           unsigned long *bodySize);


/*
*   GetCRLbyIndex       - получить СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         index - 
*
*   Выходные параметры  - crlBody - указатель на список отозванных сертификатов.
*                                   Память отводит библиотека.
*                                   Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLbyIndex(hCERTSTORE hStore,
                          const char *DName,
                          const int index,
                          unsigned char **crlBody,
                          unsigned long *bodySize);

/*
*   GetDeltaCRL         - получить разностный СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName - имя узла в котором искать. Если Root то "".
*                         index - 
*
*   Выходные параметры  - crlBody - указатель на список отозванных сертификатов.
*                                   Память отводит библиотека.
*                                   Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetDeltaCRL(hCERTSTORE hStore,
                        const char *DName,
                        const int index,
                        unsigned char **crlBody,
                        unsigned long *bodySize);


/*
*   GetMYCertificate    - получить собственный сертификат пользователя.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName    - имя владельца в формате DN.
*                         keySpec  - AT_KEYEXCHANGE или AT_SIGNATURE.
*                         isCA     -
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер сертификата
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetMYCertificate
                              (hCERTSTORE hStore,
                               const char *DName,
                               const unsigned long keySpec,
                               const bool isCA,
                               unsigned char *certBody,
                               unsigned long *bodySize);

/*
*   GetNumberCertificate- получить сертификат пользователя по серийному номеру.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName  - имя владельца в формате DN.
*                         serNum - серийный номер сертификата.
*                         len    - длина серийного номера.
*                         isRevoked - искать среди отозваных сертификатов (true)
*                                     или неотозваных (false).
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер сертификата
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetNumberCertificate
                                 (hCERTSTORE hStore,
                                  const char *DName,
                                  const unsigned char *serNum,
                                  const long len,
                                  const bool isRevoked,
                                  unsigned char *certBody,
                                  unsigned long *bodySize);

/*
*   GetNameCertificate  - получить сертификат пользователя по параметрам.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         DName  - имя владельца в формате DN.
*                         keyOID - алгоритм использования.
*                         isValid   - искать среди просроченных сертификатов (true)
*                                     или непросроченных (false)
*                         isRevoked - искать среди отозваных сертификатов (true)
*                                     или неотозваных (false).
*
*   Выходные параметры  - certBody - сертификат.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер сертификата
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetNameCertificate
                              (hCERTSTORE hStore,
                               const char *DName,
                               const char *keyOID,
                               const bool isValid,
                               const bool isRevoked,
                               unsigned char *certBody,
                               unsigned long *bodySize);

/*
*   GetCertificateTemp  - получить шаблон сертификата пользователя по параметрам.
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище
*                         DName   - имя владельца в формате DN.
*                         keyOID  - алгоритм использования.
*
*   Выходные параметры  - tempBody - шаблон.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер шаблона
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertificateTemp(hCERTSTORE hStore,
                                const char *DName,
                                const char *keyOID,
                                unsigned char *tempBody,
                                unsigned long *bodySize);


/*
*   GetTemplates        - получить все шаблоны пользователя по параметрам.
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище
*                         DName   - имя владельца в формате DN.
*
*   Выходные параметры  - tempCount - количество найденных шаблонов
*                         tempBody - массив шаблонов
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - массив размеров
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetTemplates(hCERTSTORE hStore,
                         const char *DName,
                         int *tempCount,
                         unsigned char **tempBody,
                         unsigned long *bodySize);

/*
*   GetGroupCertificate - получить сертификаты пользователей по групповому имени.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         groupName - имя группы в формате DN.(например "C=KZ; O=GAMMA;")
*                         Filter    -
*                         keyOID    - может быть 0
*                         dataValid - время проверки сертификатов
*                         isValid   - искать среди просроченных сертификатов (true)
*                                     или непросроченных (false)
*                         isRevoked - искать среди отозваных сертификатов (true)
*                                     или неотозваных (false).
*
*   Выходные параметры  - certCount - количество найденных сертификатов
*                         certBody  - массив сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize -  массив размеров сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetGroupCertificate
                                 (hCERTSTORE hStore,
                                  const char *groupName,
                                  unsigned char *Filter,
                                  const char *keyOID,
                                  const char *dataValid,
                                  const bool isValid,
                                  const bool isRevoked,
                                  int *certCount,
                                  unsigned char **certBody,
                                  unsigned long *bodySize);


/*
*   StartGroupCertificate - отправить запрос на  получение сертификатов пользователей по групповому имени.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         groupName - имя группы в формате DN.(например "C=KZ; O=GAMMA;")
*                         Filter    -
*                         isRevoked - искать среди отозваных сертификатов (true)
*                                     или неотозваных (false).
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int StartGroupCertificate
                                 (hCERTSTORE hStore,
                                  const char *groupName,
                                  unsigned char *Filter,
                                  const bool isRevoked);


/*
*   NextGroupCertificate - получить сертификаты пользователей по отправленному запросу.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         keyOID,   - может быть 0
*                         dataValid - время проверки сертификатов
*                         isValid   - искать среди просроченных сертификатов (true)
*                                     или непросроченных (false)
*                         isRevoked - искать среди отозваных сертификатов (true)
*                                     или неотозваных (false).
*
*   Выходные параметры  - certCount - количество найденных сертификатов
*                         certBody  - массив сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize -  массив размеров сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int NextGroupCertificate
                                 (hCERTSTORE hStore,
                                  const char *keyOID,
                                  const char *dataValid,
                                  const bool isValid,
                                  const bool isRevoked,
                                  int *certCount,
                                  unsigned char **certBody,
                                  unsigned long *bodySize);


/*
*   NextRevokedCertificate  - получить отозванные сертификаты пользователей по отправленному запросу.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         keyOID    - может быть 0
*                         dataRev   - время отзыва сертификатов (опционально)
*                         dataValid - время проверки сертификатов
*                         isValid   - искать среди просроченных сертификатов (true)
*                                     или непросроченных (false)
*
*   Выходные параметры  - certCount - количество найденных сертификатов
*                         revDate   - массив дат отзыва
*                                     Память отводит вызывающая программа.
*                         revReason - массив причин отзыва
*                                     Память отводит вызывающая программа.
*                         certBody  - массив сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize -  массив размеров сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int NextRevokedCertificate
                                  (hCERTSTORE hStore,
                                   const char *keyOID,
                                   const char *dataRev,
                                   const char *dataValid,
                                   const bool isValid,
                                   int *certCount,
                                   char **revDate,
                                   int *revReason,
                                   unsigned char **certBody,
                                   unsigned long *bodySize);



/*
*   GetGroupRevoke     - получить отозванные сертификаты пользователей по групповому имени.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         groupName - имя группы (НЕ ПОЛНОЕ) в формате DN.(например "C=KZ; O=GAMMA;")
*                         keyOID    - может быть NULL
*                         dataRev   - время отзыва сертификатов (опционально)
*                         dataValid - время проверки сертификатов
*                         isValid   - искать среди просроченных сертификатов (true)
*                                     или непросроченных (false)
*
*   Выходные параметры  - certCount - количество найденных сертификатов
*                         revDate   - массив дат отзыва
*                                     Память отводит вызывающая программа.
*                         revReason - массив причин отзыва
*                                     Память отводит вызывающая программа.
*                         certBody  - массив сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize -  массив размеров сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetGroupRevoke
                           (hCERTSTORE hStore,
                            const char *groupName,
                            const char *keyOID,
                            const char *dataValid,
                            const char *dataRev,
                            const bool isValid,
                            int *certCount,
                            char **revDate,
                            int *revReason,
                            unsigned char **certBody,
                            unsigned long *bodySize);



/*
*   GetGroupCA - получить сертификаты CA по групповому имени.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         groupName - имя группы в формате DN.(например "C=KZ; O=GAMMA;")
*                         dataValid - время проверки сертификатов
*                         isValid   - искать среди просроченных сертификатов (true)
*                                     или непросроченных (false)
*
*   Выходные параметры  - certCount - количество найденных сертификатов
*                         certBody  - массив сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize -  массив размеров сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetGroupCA
                       (hCERTSTORE hStore,
                        const char *groupName,
                        const char *dataValid,
                        const bool isValid,
                        int *certCount,
                        unsigned char **certBody,
                        unsigned long *bodySize);


/*
*   GetTrustNode        - получить из хранилища информацию о доверительных ЦС.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         node      - узел от которого искать на один уровень ниже(C=KZ)
*
*   Выходные параметры  - count     - количество найденных доверительных ЦС
*                         CName     - массив имен групп пользователей доверенных ЦС
*                         DName     - массив имен доверенных ЦС
*                         hostLDAP  - адрес LDAP хранилищ доверенных ЦС
*                         portLDAP  - порт LDAP хранилищ
*                         hostCRL   - адрес точки распространения СОС доверенных ЦС
*                         portCRL   - порт точки распространения СОС хранилищ
*
*                         Память отводит вызывающая программа.
*                         Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetTrustNode
                        (hCERTSTORE hStore,
                         const char *node,
                         int *count,
                         char **CName,
                         char **DName,
                         char **hostLDAP,
                         char **portLDAP,
                         char **hostCRL,
                         char **portCRL);



/*
*   GetDName - получить сертификаты CA по групповому имени.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         groupName - имя группы (НЕ ПОЛНОЕ) в формате DN.(например "C=KZ; O=GAMMA;")
*                         scope     - SCOPE_SUB_TREE
*                         offset    - start
*                         count     - max кол-во элементов массива
*
*   Выходные параметры  - count   - кол-во элементов массива
*                         DName   - массив имен
*                         filter
*                         size
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetDName
                      (hCERTSTORE hStore,
                       char *groupName,
                       int offset,
                       int scope,
                       int *count,
                       char **DName,
                       unsigned char *filter,
                       long *size);


/*
*   GetUserRequest      - получить СМС запросы пользователя.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         type      - тип запроса 0, 1, 2 или 3
*                         DName     - имя пользователя (для которго запрос) в формате DN
*                         transID   - идентификатор запроса
*                         sendName  - имя отправителя запроса в формате DN
*                         notBefore - время формирования запроса "не раньше чем"
*                         notAfter  - время формирования запроса "не позже чем"
*
*   Выходные параметры  - reqCount  - количество найденных запросов
*                         reqBody   - массив запросов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize  - массив размеров запросов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetUserRequest
                          (hCERTSTORE hStore,
                           const int type,
                           const char *DName,
                           const char *transID,
                           const char *sendName,
                           const char *notBefore,
                           const char *notAfter,
                           int *reqCount,
                           unsigned char **reqBody,
                           unsigned long *bodySize);

/*
*   GetTimeStamp        - получить запросы пользователя.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         DName     - имя пользователя (для которго запрос) в формате DN
*                         reqTime   - идентификатор запроса
*
*   Выходные параметры  - reqCount  - количество найденных запросов
*                         reqBody   - массив запросов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize  - массив размеров запросов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetTimeStamp
                          (hCERTSTORE hStore,
                           const char *DName,
                           const char *reqTime,
                           int *reqCount,
                           unsigned char **reqBody,
                           unsigned long *bodySize);



/*
*   StartGroupRequest - отправить запрос на  получение запрсов пользователей по групповому имени.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         type      - тип запроса 0, 1, 2 или 3 (см. pkistructure.h)
*                                     CertificateRequest  =0
*                                     StatusOfCertificate =1
*                                     CertificateRevoke   =2
*                                     CertificateChange   =3
*                                     AnyUserRequest      =4 // только для RA
*                                     AnyUserRevoke       =5 // только для RA
*                                     StoreSecretKeys     =6 
*                                     LDAPRequest         =7
*                                     CertificatePattern  =8 

*                         groupName - имя группы в формате DN.(например "C=KZ; O=GAMMA;")
*                         Filter    -
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int StartGroupRequest
                             (hCERTSTORE hStore,
                              const int type,
                              const char *groupName,
                              unsigned char *Filter);

/*
*   NextGroupRequest    - получить запросы пользователя.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         type      - тип запроса 0, 1, 2 или 3 (см. pkistructure.h)
*
*   Выходные параметры  - reqCount  - количество найденных запросов
*                         reqBody   - массив запросов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize  - массив размеров запросов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int NextGroupRequest
                            (hCERTSTORE hStore,
                             const int type,
                             int *reqCount,
                             unsigned char **reqBody,
                             unsigned long *bodySize);


/*
*   VerifyCertificates  - найти и удалить просроченные сертификаты из хранилища L, 
*                         и записать их в хранилище I.
*
*   Входные параметры   - host    - параметр для ldapi.
*                         baseDN  - узел, с которого начать поиск.
*                         timeout - локальное время ожидания, рекомендуется 1800 (если на сервере не меньше).
*                         KeyOID  - ограничить поиск сертификатов с заданным OID ключа.
*                         ext_log - внешняя функция логирования
*                         lctx    - контекст логирования
*
*   Выходные параметры  - node_count - кол-во найденных узлов с просроченными сертификатами.
*                         cert_del   - кол-во просроченных сертификатов удалённых из хранилища.
*                         cert_add   - кол-во просроченных сертификатов добавленных в архив.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifyCertificates(hCERTSTORE hStore,
                               const char *host, 
                               const char *baseDN, 
                               int timeout, 
                               const char *KeyOID,
                               void (*ext_log)(int level, char op, void *ctx, const char *line,...),
                               void *lctx,
                               int *node_count, 
                               int *cert_del, 
                               int *cert_add);

/*
*   CRLVerifyTimeValidity - проверить валидность СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         pTime    - время проверки
*                         crlBody - тело СОС
*                         bodySize - размер СОС
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CRLVerifyTimeValidity
                                   (const hCERTSTORE hStore,
                                    const char *pTime,
                                    const unsigned char *crlBody,
                                    const unsigned long bodySize);


/*
*   CertVerifyTimeValidity - проверить валидность сертификата.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         pTime    - время проверки
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyTimeValidity
                                    (const hCERTSTORE hStore,
                                     const char *pTime,
                                     const unsigned char *certBody,
                                     const unsigned long bodySize);


/*
*   GetCACertificateContext - получить kонтекст сертификата ЦС по контексту сертификата
*
*   Входные параметры   - hStore - указатель (хендл) на хранилище
*                         hCA    - указатель (хендл) на хранилище
*                         hRoot  - указатель (хендл) на хранилище
*                         hContext - kонтекст сертификата
*
*   Выходные параметры  - hCAContext  - kонтекст сертификата ЦС
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCACertificateContext
                                    (const hCERTSTORE hStore,
                                     const hCERTSTORE hCA,
                                     const hCERTSTORE hRoot,
                                     const hCERTCONTEXT hContext,
                                     hCERTCONTEXT *hCAContext);


/*
*   GetCertificateContext      - получить kонтекст сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - hContext  - kонтекст сертификата
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertificateContext
                           (const hCERTSTORE hStore,
                            const unsigned char *certBody,
                            const unsigned long bodySize,
                            hCERTCONTEXT *phContext);


/*
*   ReleaseCertificateContext  - очистить kонтекст сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         hContext  - kонтекст сертификата
*   Выходные параметры  - нет
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ReleaseCertificateContext
                              (const hCERTSTORE hStore,
                               hCERTCONTEXT *phContext);


/*
*   GetCRLContext      - получить kонтекст COC
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody  - тело COC
*                         bodySize - размер
*
*   Выходные параметры  - hContext  - kонтекст COC
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLContext
                           (const hCERTSTORE hStore,
                            const unsigned char *crlBody,
                            const unsigned long bodySize,
                            hCRLCONTEXT *phContext);


/*
*   ReleaseCRLContext  - очистить kонтекст СОС
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         hContext  - kонтекст COC
*   Выходные параметры  - нет
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ReleaseCRLContext
                              (const hCERTSTORE hStore,
                               hCRLCONTEXT *phContext);


/*
*   GetCRLnumber        -  получить информацию о номере CRL
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody  - тело CRL
*                         bodySize - размер
*   Выходные параметры  - number   - номер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLnumber
                          (const hCERTSTORE hStore,
                           const unsigned char *crlBody,
                           const unsigned long bodySize,
                           unsigned long *number);

/*
*   GetDeltaCRLnumber   -  получить информацию о номере CRL
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody  - тело CRL
*                         bodySize - размер
*   Выходные параметры  - number   - номер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetDeltaCRLnumber
                          (const hCERTSTORE hStore,
                           const unsigned char *crlBody,
                           const unsigned long bodySize,
                           unsigned long *number);


/*
*   GetCRLUpDates       - получить время обновления СОС.
*
*   Входные параметры   - hStore      - указатель (хендл) на хранилище
*                         crlBody     - список отозванных сертификатов. 
*                         bodySize    - размер 
*
*   Выходные параметры  - thisUpdate  - дата выпуска
*                         nextUpdate  - дата следующего обновления
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLUpDates
                          (const hCERTSTORE hStore,
                           const unsigned char *crlBody,
                           const unsigned long bodySize,
                           char *thisUpdate,
                           char *nextUpdate);


/*
*   GetCRLIssuerInfo   - получить информацию о выпустившем CRL
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody  - тело CRL
*                         bodySize - размер
*
*   Выходные параметры  - DName     - DN (char[256])
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLIssuerInfo
                            (const hCERTSTORE hStore,
                             const unsigned char *crlBody,
                             const unsigned long bodySize,
                             char *DName);


/*
*   GetCRLDistrPoint    - получить  адрес УЦ
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody  - тело СОС
*                         bodySize - размер сертификата
*
*   Выходные параметры  - CApoint  - нуль-терминированная строка IP адрес
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLDistrPoint
                            (const hCERTSTORE hStore,
                             const unsigned char *crlBody,
                             const unsigned long bodySize,
                             char *CApoint);


/*
*   GetCRLalterName   - получить информацию об альтернативном имени
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody  - тело CRL
*                         bodySize - размер
*
*   Выходные параметры  - DName     - DN (char[256])
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLalterName
                            (const hCERTSTORE hStore,
                             const unsigned char *crlBody,
                             const unsigned long bodySize,
                             char *DName);


/*
*   GetCRLIssuerNumber - получить информацию о серийном номере выпустившего CRL
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody -  тело CRL
*                         bodySize - размер
*
*   Выходные параметры  - serNum    - серийный номер
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         numSize   - длина
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLIssuerNumber
                               (const hCERTSTORE hStore,
                                const unsigned char *crlBody,
                                const unsigned long bodySize,
                                unsigned char *serNum,
                                unsigned long *numSize);


/*
*   GetCRLSignature    - извлечь подпись СОС
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody -  тело CRL
*                         bodySize - размер
*
*   Выходные параметры  - sigOID   - алгоритм подписи (char[32])
*                         sign     - подпись
*                         signSize - длина
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCRLSignature(const hCERTSTORE hStore,
                             const unsigned char *crlBody,
                             const unsigned long bodySize,
                             char *sigOID,
                             unsigned char *sign,
                             unsigned long *signSize);


/*
*   GetCertSubjectInfo  - получить информацию о владельце сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - CName     - CN (char[64])
*                         DName     - DN (char[256])
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertSubjectInfo
                              (const hCERTSTORE hStore,
                               const unsigned char *certBody,
                               const unsigned long bodySize,
                               char *CName,
                               char *DName);

/*
*   GetCertIssuerInfo   - получить информацию о выпустившем сертификат
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - CName     - CN (char[64])
*                         DName     - DN (char[256])
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertIssuerInfo
                              (const hCERTSTORE hStore,
                               const unsigned char *certBody,
                               const unsigned long bodySize,
                               char *CName,
                               char *DName);

/*
*   GetCertValidInfo    - получить информацию о сроке действия сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - notBefore - не ранее (char[16])
*                       - notAfter  - не позже (char[16])
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertValidInfo
                            (const hCERTSTORE hStore,
                             const unsigned char *certBody,
                             const unsigned long bodySize,
                             char *notBefore,
                             char *notAfter);

/*
*   GetCertSubjectKey   - извлечь открытый ключ
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - keyOID   - алгоритм открытого ключа (char[32])
*                         key      - открытый ключ
*                         keySize  - его длина
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertSubjectKey
                              (const hCERTSTORE hStore,
                               const unsigned char *certBody,
                               const unsigned long bodySize,
                               char *keyOID,
                               unsigned char *key,
                               unsigned long *keySize);

_WIN_DLL int GetCertSubjectKeyEx
                              (const hCERTSTORE hStore,
                               const unsigned char *certBody,
                               const unsigned long bodySize,
                               char *keyOID,
                               char *algOID,
                               unsigned char *key,
                               unsigned long *keySize);


/*
*   GetCertSignature    - извлечь подпись сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - sigOID   - алгоритм подписи (char[32])
*                         sign     - подпись
*                         signSize - длина
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertSignature
                              (const hCERTSTORE hStore,
                               const unsigned char *certBody,
                               const unsigned long bodySize,
                               char *sigOID,
                               unsigned char *sign,
                               unsigned long *signSize);


/*
*   GetDistributionPoint- получить точку распространения СОС и адрес УЦ
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - CApoint  - нуль-терминированная строка IP адрес
*                       - CRLpoint - нуль-терминированная строка IP адрес
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetDistributionPoint
                                (const hCERTSTORE hStore,
                                 const unsigned char *certBody,
                                 const unsigned long bodySize,
                                 char *CApoint,
                                 char *CRLpoint);


/*
*   GetOCSPPoint - получить точку OCSP 
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - OCSPpoint - нуль-терминированная строка IP адрес
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetOCSPPoint(const hCERTSTORE hStore,
                          const unsigned char *certBody,
                          const unsigned long bodySize,
                          char *OCSPpoint);



/*
*   GetTSAPoint - получить точку TSA 
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - TSApoint - нуль-терминированная строка IP адрес
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetTSAPoint(const hCERTSTORE hStore,
                         const unsigned char *certBody,
                         const unsigned long bodySize,
                         char *TSApoint);

/*
*   GetDVCSPoint - получить точку DVCS 
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - DVCSpoint - нуль-терминированная строка IP адрес
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetDVCSPoint(const hCERTSTORE hStore,
                          const unsigned char *certBody,
                          const unsigned long bodySize,
                          char *DVCSpoint);

/*
*   GetCertificateKeyID - получить информацию о идентификаторах ключей сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - keyID    - идентификатор ключа
*                         idSize   - длина
*                         caKeyID  - идентификатор ключа издателя
*                         caIdSize - длина
*
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertificateKeyID(const hCERTSTORE hStore,
                                const unsigned char *certBody,
                                const unsigned long certSize,
                                unsigned char *keyID,
                                unsigned long *idSize,
                                unsigned char *caKeyID,
                                unsigned long *caIdSize);


/*
*   GetCertSubjectNumber - получить информацию о серийном номере сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - serNum   - серийный номер
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         numSize  - длина
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertSubjectNumber
                                (const hCERTSTORE hStore,
                                 const unsigned char *certBody,
                                 const unsigned long bodySize,
                                 unsigned char *serNum,
                                 unsigned long *numSize);

/*
*   GetCertIssuerNumber - получить информацию о серийном номере выпустившего сертификат
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - serNum    - серийный номер
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         numSize   - длина
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertIssuerNumber
                                (const hCERTSTORE hStore,
                                 const unsigned char *certBody,
                                 const unsigned long bodySize,
                                 unsigned char *serNum,
                                 unsigned long *numSize);


/*
*   GetCertIssuerPolicy - получить информацию о политиках сертификата
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - policyCount - количество политик
*                         policyOID   - массив OID политики
*                         policyURL   - массив URI, указывающий на описание политики. 
*                                       Максимальный размер буфера – 256 символов.
*                         policyOwner - массив название организации, подготовившей уведомление. 
*                                       Максимальная длина строки – 255 символов.
*                         policyText  - массив дополнительный текст, который включается в сертификат. 
*                                       Максимальная длина строки – 200 символов.
*                                       Память отводит вызывающая программа.
*                                       Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertIssuerPolicy
                                (const hCERTSTORE hStore,
                                 const unsigned char *certBody,
                                 const unsigned long bodySize,
                                 int *policyCount,
                                 char **policyOID,
                                 char **policyURL,
                                 char **policyOwner,
                                 char **policyText);


/*
*   GetCertAltName      - получить альтернативное имя владельца сертификата.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*
*   Выходные параметры  - altCount - количество имен
*                         altOID   - массив OID имен
*                                    Максимальный размер буфера – 32 символов.
*                         altName  - массив имен. 
*                                    Максимальный размер буфера – 256 символов.
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertAltName
                          (const hCERTSTORE hStore,
                           const unsigned char *certBody,
                           const unsigned long bodySize,
                           int *altCount,
                           char **altOID,
                           char **altName);


/*
*   CertCompareCRL     - проверить СОС на равенство.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody1  - тело СОС
*                         bodySize1 - размер СОС
*                         crlBody2  - тело СОС
*                         bodySize2 - размер СОС
*
*   Выходные параметры  - result <0 - второй больше; =0 - равны; >0 - второй меньше.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtCompareCRL
                            (const hCERTSTORE hStore,
                             const unsigned char *crlBody1,
                             const unsigned long crlSize1,
                             const unsigned char *crlBody2,
                             const unsigned long crlSize2,
                             int *result);


/*
*   CertKeyCompare     - проверить соответствие текущего ключевого контейнера и сертификата.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер
*
*   Выходные параметры  - keyClass - AT_SIGNATURE || AT_KEYEXCHANGE
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtKeyCompare
                          (const hCERTSTORE hStore,
                           const unsigned char *certBody,
                           const unsigned long bodySize,
                           unsigned long *keyClass);


/*
*   CertCreatePattern   - создать шаблон собственного сертификата.
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         DName     - собственное имя 
*                         notBefore - начало срока действия
*                         notAfter  - окончание срока действия
*                         keyOID    - алгоритм использования ключа
*                         sigOID    - алгоритм подписи сертификата
*                         keyBlob   - открытый ключ
*                         keySize   - размер
*                         Flag      - резерв
*
*   Выходные параметры  - certBody  - тело сертификата
*                         bodySize  - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtCreatePattern
                              (const hCERTSTORE hStore,
                               const char *DName,
                               const char *notBefore,
                               const char *notAfter,
                               const char *keyOID,
                               const char *sigOID,
                               const unsigned char *keyBlob,
                               const unsigned long keySize,
                               const unsigned long Flag,
                               unsigned char *certBody,
                               unsigned long *bodySize);



/*
*   CertVerifyCRLRevocation - проверить отозван/неотозван сертификат.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*                         crlBody - СОС
*                         bodySize - размер СОС
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyCRLRevocation
                                    (const hCERTSTORE hStore,
                                     const unsigned char *certBody,
                                     const unsigned long certSize,
                                     const unsigned char *crlBody,
                                     const unsigned long crlSize);


/*
*   CrtGetNumRevocReason - проверить отозван/неотозван сертификат по s/n.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         serNum - s/n сертификата
*                         nimSize - размер s/n
*                         crlBody - СОС
*                         bodySize - размер СОС
*
*   Выходные параметры  - reason  - причина
*                       - revDate - дата попадания в СОС
*                       - invalidDate - дата изменения статуса
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtGetNumRevocReason
                                (const hCERTSTORE hStore,
                                 const unsigned char *serNum,
                                 const unsigned long numSize,
                                 const unsigned char *crlBody,
                                 const unsigned long crlSize,
                                 int  *reason,
                                 char *revDate,
                                 char *invalidDate);


/*
*   CertGetRevocationReason - проверить отозван/неотозван сертификат.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата
*                         bodySize - размер сертификата
*                         crlBody - СОС
*                         bodySize - размер СОС
*
*   Выходные параметры  - reason  - причина
*                       - revDate - дата попадания в СОС
*                       - invalidDate - дата изменения статуса
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtGetRevocationReason
                                    (const hCERTSTORE hStore,
                                     const unsigned char *certBody,
                                     const unsigned long certSize,
                                     const unsigned char *crlBody,
                                     const unsigned long crlSize,
                                     int  *reason,
                                     char *revDate,
                                     char *invalidDate);


/*
*   GetSerialNumberFromCRL - получить серийные номера и дату отзыва.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody - СОС
*                         bodySize - размер СОС
*
*   Выходные параметры  - count   - количество
*                       - revDate - массив дат попадания в СОС
*                       - serNum  - массив серийных номеров
*                       - serNumSize - массив длин
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetSerialNumberFromCRL
                                  (const hCERTSTORE hStore,
                                   const unsigned char *crlBody,
                                   const unsigned long crlSize,
                                   int  *count,
                                   char **revDate,
                                   unsigned char **serNum,
                                   unsigned long *serNumSize);


/*
*   CertVerifySubjectCertificate - проверить был ли сертификата пользователя подписан
*                                     соответствующим сертификатом.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата пользователя
*                         certSize - размер сертификата
*                         CABody - сертификат ЦС
*                         caSize - размер сертификата
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifySubjectCertificate
                                          (const hCERTSTORE hStore,
                                           const unsigned char *certBody,
                                           const unsigned long certSize,
                                           const unsigned char *CABody,
                                           const unsigned long caSize);

/*
*   CertVerifyIsCA     - проверить является ли сертификат ЦС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         CABody - сертификат ЦС
*                         caSize - размер сертификата
*
*   Выходные параметры  - caLevel - кол-во сертификатов ЦС над данным. Если ==0, то Root
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyIsCA
                            (const hCERTSTORE hStore,
                             const unsigned char *CABody,
                             const unsigned long caSize,
                             int *caLevel);


/*
*   CertVerifyIsRoot    - проверить является ли сертификат коренвым ЦС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         CABody - сертификат ЦС
*                         caSize - размер сертификата
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyIsRoot
                            (const hCERTSTORE hStore,
                             const unsigned char *CABody,
                             const unsigned long caSize);


/*
*   CrtVerifyIsOCSP    - проверить является ли сертификат OCSP респондером.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody - сертификат  
*                         crtSize - размер сертификата
*
*   Выходные параметры  - ocspNoCheck - имеется ли OID проверки статуса сертификата id-pkix-ocsp-nocheck.
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyIsOCSP(const hCERTSTORE hStore,
                             const unsigned char *crtBody,
                             const unsigned long crtSize,
                             bool *ocspNoCheck);


/*
*   CrtVerifyIsTSA      - проверить является ли сертификат TSA респондером.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody - сертификат  
*                         crtSize - размер сертификата
*
*   Выходные параметры  - нет.
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyIsTSA(const hCERTSTORE hStore,
                            const unsigned char *crtBody,
                            const unsigned long crtSize);

/*
*   CrtVerifyIsDVCS     - проверить является ли сертификат DVCS респондером.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody - сертификат  
*                         crtSize - размер сертификата
*
*   Выходные параметры  - нет.
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyIsDVCS(const hCERTSTORE hStore,
                             const unsigned char *crtBody,
                             const unsigned long crtSize);


/*
*   CrtVerifyIsRA       - проверить является ли сертификат RA.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody - сертификат  
*                         crtSize - размер сертификата
*
*   Выходные параметры  - нет.
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtVerifyIsRA(const hCERTSTORE hStore,
                           const unsigned char *crtBody,
                           const unsigned long crtSize);


/*
*   CrtGetBasicConstraints - получить базовые ограничения.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody  - сертификат  
*                         crtSize  - размер сертификата
*
*   Выходные параметры  - isCA    - признак УЦ
*                       - pathLen - глубина иерархии
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtGetBasicConstraints(const hCERTSTORE hStore,
                                   const unsigned char *crtBody,
                                   const unsigned long crtSize,
                                   bool *isCA, int *pathLen);


/*
*   CrtGetKeyUsage      - получить алгоритмы использование ключа.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody  - сертификат  
*                         crtSize  - размер сертификата
*
*   Выходные параметры  - keyUsage - использование ключа ()
*                       - extUsageCount - кол-во алгоритмов расширенного использования
*                       - extKeyUsage   - массив алгоритмов расширенного использования
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtGetKeyUsage(const hCERTSTORE hStore,
                           const unsigned char *crtBody,
                           const unsigned long crtSize,
                           ulong32 *keyUsage,
                           int *extUsageCount,
                           char **extKeyUsage);

/*
*   CrtGetKeyUsageX      - получить алгоритмы использование ключа.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody  - сертификат  
*                         crtSize  - размер сертификата
*
*   Выходные параметры  - keyUsage - использование ключа ()
*                       - isCritical
*                       - extUsageCount - кол-во алгоритмов расширенного использования
*                       - extKeyUsage   - массив алгоритмов расширенного использования
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtGetKeyUsageX(const hCERTSTORE hStore,
                            const unsigned char *crtBody,
                            const unsigned long crtSize,
                            ulong32 *keyUsage,
                            bool *isCritical,
                            int *extUsageCount,
                            char **extKeyUsage);

/*
*   CrtGetExtensions    - получить OID расширения сертификата.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody  - сертификат
*                         crtSize  - размер сертификата
*
*   Выходные параметры  - extCount - количество раширений
*                         extOIDs  - 
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
  int CrtGetExtensions(const hCERTSTORE hStore,
                       const unsigned char *crtBody,
                       const unsigned long crtSize,
                       int *extCount,
                       char **extOIDs);

/*
*   CrtGetCritical      - получить OID критичные расширения сертификата.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody  - сертификат
*                         crtSize  - размер сертификата
*
*   Выходные параметры  - extCount - количество раширений
*                         extOIDs  - 
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
  int CrtGetCritical(const hCERTSTORE hStore,
                     const unsigned char *crtBody,
                     const unsigned long crtSize,
                     int *extCount,
                     char **extOIDs);


/*
*   CrtGetExtensionValue   - получить значения расширений сертификата.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody  - сертификат
*                         crtSize  - размер сертификата
*                         extOIDs  - 
*
*   Выходные параметры  - criticalFlg
*                         extValue  - значение
*                         extSize   - размер
*                         
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
  int CrtGetExtensionValue(const hCERTSTORE hStore,
                           const unsigned char *crtBody,
                           const unsigned long crtSize,
                           const char *extOID, 
                           bool *criticalFlg, 
                           unsigned char *extValue, 
                           long *extSize);


/*
*   CrtGetUpCount       - проверить значение параметра сертификата пользователя.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crtBody - сертификат  
*                         crtSize - размер сертификата
*
*   Выходные параметры  - нет.
*                         
*   Результат           - значение параметра
*/
_WIN_DLL long CrtGetUpCount(const hCERTSTORE hStore,
                            const unsigned char *crtBody,
                            const unsigned long crtSize);

/*
*   CryptVerifyCertificateSignature - проверить подпись сертификата пользователя.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         certBody - тело сертификата пользователя
*                         certSize - размер сертификата
*                         CABody - сертификат ЦС
*                         caSize - размер сертификата
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrptVerifyCertificateSignature
                                            (const hCERTSTORE hStore,
                                             const unsigned char *certBody,
                                             const unsigned long certSize,
                                             const unsigned char *CABody,
                                             const unsigned long caSize);


/*
*   CryptVerifyCRLSignature - проверить подпись СОС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         crlBody - тело СОС
*                         bodySize - размер СОС
*                         CABody - сертификат ЦС
*                         caSize - размер сертификата
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrptVerifyCRLSignature
                                     (const hCERTSTORE hStore,
                                      const unsigned char *crlBody,
                                      const unsigned long crlSize,
                                      const unsigned char *CABody,
                                      const unsigned long caSize);



/*
*   CryptVerifyRootSignature - проверить подпись самоподписанного сертификата ЦС.
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         CABody - сертификат ЦС
*                         caSize - размер сертификата
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrptVerifyRootSignature
                                    (const hCERTSTORE hStore,
                                     const unsigned char *CABody,
                                     const unsigned long caSize);


/*
*   GetTime             - получить текущее время в формате YYYYMMDDHHMMSSZ.
*
*   Входные параметры   - нет.
*
*   Выходные параметры  - текущее время.
*
*   Результат           - нет.
*/
_WIN_DLL int GetTime
                        (char *_time);


/*
*   GetTimePlusHour     - прибавить к текущему времени часы
*
*   Входные параметры   - hour.
*
*   Выходные параметры  - текущее время + hour.
*
*   Результат           - нет.
*/
_WIN_DLL int GetTimePlusHour
                            (char *_time, int hour);



/*
*   SetTimePlusHour     - прибавить к времени часы.
*
*   Входные параметры   - hour.
*
*   Выходные параметры  - время + hour.
*
*   Результат           - нет.
*/
_WIN_DLL int SetTimePlusHour
                              (char *_time, int hour);


/*
*   DN2struct           - получить DN-имя по разделениям.
*/
_WIN_DLL int DN2struct
                      (char* dn, void *sdn);


/*
*   DN2format           - получить DN-имя отформатированое.
*/
_WIN_DLL int DN2format
                      (char* dn, char *fdn);

_WIN_DLL int DN2invert
                      (char* dn, char *fdn);



///////////////////////////////////////////////////////////////////////
///////////////// ФУНКЦИИ КРИПТОПРОВАЙДЕРА ////////////////////////////
///////////////////////////////////////////////////////////////////////

//#ifdef __Open_CSP_func


/*
*   PKCSGetSlotsCount   - получить количество слотов PKCS#11
*
*   Входные параметры   - pLibName      - имя библиотеки
*
*   Выходные параметры  - pulCount       - кол-во
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSGetSlotsCount(CHAR *pLibName,
                                 DWORD *pulCount);

/*
*   PKCSGetSlotsCount   - получить количество слотов PKCS#11
*
*   Входные параметры   - pLibName      - имя библиотеки
*                         ulSlotNumber  - номер слота
*
*   Выходные параметры  - slotDescription - char[64]
*                         slotManufacturerID - char [32]
*                         isTokenPresent  - 0/1
*                         tokenLabel      - char[32]
*                         tokenModel      - char[16]
*                         tokenManufacturerID - char[32]
*                         serialNumber    - char[16]
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSGetSlotInfo(CHAR *pLibName,
                               DWORD ulSlotNumber,
                               unsigned char *slotDescription,
                               unsigned char *slotManufacturerID,
                               bool *isTokenPresent,
                               unsigned char *tokenLabel,
                               unsigned char *tokenModel,
                               unsigned char *tokenManufacturerID,
                               unsigned char *serialNumber);

/*
*   PKCSAddCertificate  - добавить сертификат PKCS#11
*
*   Входные параметры   - hProv - хендл PKCS#11
*                         certType      - тип (CKC_X_509-0x0, CKC_CERTEX_HSM_CA - 0x8E000001, CKC_CERTEX_HSM_HSM - 0x8E000002)
*                         pLabel        - метка
*                         pSubject      - имя владельца сертификата в формате DN
*                         subjSize      - размер имени
*                         pSerialNum    - серийный номер сертификата
*                         numSize       - размер серийного номера
*                         pCertificate  - тело сертификта
*                         certSize      - размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSAddCertificate(HCRYPTPROV hProv,
                                 DWORD certType, 
                                 CHAR  *pLabel, 
                                 UCHAR *pSubject, 
                                 DWORD  subjSize,
                                 UCHAR  *pSerialNum, 
                                 DWORD  numSize,
                                 UCHAR  *pCertificate, 
                                 DWORD  certSize);

/*
*   PKCSOpenContext     - получить контекст PKCS#11
*
*   Входные параметры   - pLibName      - имя библиотеки
*                         ulSlotNumber  - номер слота
*                         keyAlg        - алгоритм (CKK_RSA - 0x00000000, CKK_DSA - 0x00000001)
*                         keySize       - размер ключей (например - 1024 бит)
*                         pPin          - пароль на доступ
*                         ulPinLen      - длина пароля
*                         pszContainer  - имя профайла
*                         dwFlags       - флаг режима работы криптопровайдера (0, CRYPT_NEWKEYSET, CRYPT_DELETEKEYSET)
*
*   Выходные параметры  - phProv        - хендл PKCS#11
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSOpenContext(HCRYPTPROV *phProv,
                               CHAR *pLibName,
                               DWORD ulSlotNumber,
                               DWORD keyAlg,
                               DWORD keySize,
                               UCHAR *pPin, 
                               DWORD ulPinLen,
                               CHAR *pContainer,
                               DWORD dwFlags);

/*
*   PKCSCloseContext    - удалить контекст PKCS#11
*
*   Входные параметры   - *hProv - хендл PKCS#11
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/_WIN_DLL DWORD PKCSCloseContext(HCRYPTPROV *phProv);



/*
*   sslGenKey           - создать ключ в формате PKCS#12
*
*   Входные параметры   - algID       - идентификатор алгоритма (6-RSAEncrypt, 19-RSAMD5, 116-DSAEcrypt, 66,113-DSASHA1, 408-EC)
*                         keyBits     - длина ключа (512, 1024,2048 - RSA, 1024 - DSA, 714 - EC)
*                         sslCallback - функция typedef void (*t_callback)(int,int,void *)
*                         pkcsPasswd  - пароль на PKCS#12
*
*   Выходные параметры  - keyPKCS12   - секретный ключ в формате PKCS#12
*                         keySize     - указатель на размер
*                         openKey     - открытый ключ
*                         openSize    - указатель на размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslGenKey
                      (const int algID,
                       const int keyBits,
                       t_callback sslCallback,
                       char *pkcsPasswd,
                       unsigned char *keyPKCS12,
                       unsigned long *keySize,
                       unsigned char *openKey,
                       unsigned long *openSize);

/*
*   sslCreatePKCS12     - создать PKCS#12
*
*   Входные параметры   - DName       - имя владельца ключей
*                         pkcsPasswd  - пароль на PKCS12
*                         keyPKCS12   - ключ в формате PKCS12
*                         keySize     - 
*                         certBody    - сертификат, соответствующий ключу
*                         certSize    -
*                         caBody      - сертификат УЦ
*                         caSize      -
*
*   Выходные параметры  - pkcs12      - PKCS12
*                         pkcsSize    - указатель на размер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslCreatePKCS12
                            (char *DName,
                             char *pkcsPasswd,
                             unsigned char *keyPKCS12,
                             unsigned long keySize,
                             unsigned char *certBody,
                             unsigned long certSize,
                             unsigned char *caBody,
                             unsigned long caSize,
                             unsigned char *pkcs12,
                             unsigned long *pkcsSize);


/*
*   sslPKCS12toDER        - PKCS -> DER
*
*   Входные параметры   - pkcsPasswd  - пароль
*                         pkcs12      - PKCS12
*                         pkcsSize    - размер
*
*   Выходные параметры  - keyDER      -  ключ в формате DER
*                         keySize     - размер
*                         certDER     -  сертификат в формате DER
*                         certSize    - размер
*                         caDER       -  сертификат УЦ в формате DER
*                         caSize      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslPKCS12toDER
                          (const char *pkcsPasswd,
                           const unsigned char *pkcs12,
                           const unsigned long pkcsSize,
                           unsigned char *keyDER,
                           unsigned long *keySize,
                           unsigned char *certDER,
                           unsigned long *certSize,
                           unsigned char *caDER,
                           unsigned long *caSize);

/*
*   sslPKCS12toPEM      - PKCS -> PEM
*
*   Входные параметры   - pkcsPasswd  - пароль
*                         pkcs12      - PKCS12
*                         pkcsSize    - размер
*
*   Выходные параметры  - keyPEM      -  ключ в формате PEM
*                         keySize     - размер
*                         certPEM     -  сертификат в формате PEM
*                         certSize    - размер
*                         caPEM       -  сертификат УЦ в формате PEM
*                         caSize      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslPKCS12toPEM
                           (const char *pkcsPasswd,
                            const unsigned char *pkcs12,
                            const unsigned long pkcsSize,
                            unsigned char *keyPEM,
                            unsigned long *keySize,
                            unsigned char *certPEM,
                            unsigned long *certSize,
                            unsigned char *caPEM,
                            unsigned long *caSize);

/*
*   CSPOpenContext      - получить контекст криптопровайдера
*
*   Входные параметры   - pszContainer  - имя профайла
*                         dwProvType    - тип криптопровайдера
*                         dwProvParam   - если нужно - сразу установим параметр
*                         dwFlags       - флаг режима работы криптопровайдера
*
*   Выходные параметры  - phProv        - хендл криптопровайдера
*                         phLib         - хедл библиотеки криптопровайдера
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD CSPOpenContext
                              (HCRYPTPROV *phProv,
                               CHAR *pszContainer,
                               DWORD dwProvType,
                               DWORD dwProvParam,
                               DWORD dwFlags,
                               BYTE * pbSignature,
                               DWORD dwSigLen,
                               BYTE * pbContainer,
                               DWORD * dwContLen,
                               HINSTANCE *phLib);

/*
*   CSPOpenContextEx      - получить контекст криптопровайдера
*
*   Входные параметры   - pszContainer  - имя профайла
*                         dwProvType    - тип криптопровайдера
*                         dwProvParam   - если нужно - сразу установим параметр
*                         dwFlags       - флаг режима работы криптопровайдера
*                         pszCSPLib     - полный путь к библиотеки
*
*   Выходные параметры  - phProv        - хендл криптопровайдера
*                         phLib         - хедл библиотеки криптопровайдера
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD CSPOpenContextEx
                              (HCRYPTPROV *phProv,
                               CHAR *pszContainer,
                               DWORD dwProvType,
                               DWORD dwProvParam,
                               DWORD dwFlags,
                               CHAR *pszCSPLib,
                               HINSTANCE *phLib);


/*
*   CSPCloseContext   - удалить контекст криптопровайдера
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPCloseContext
                              (HCRYPTPROV *phProv);


/*
*   CSPSetProvParam   - установить параметры криптопровайдера
*
*   Входные параметры   - param   - 
*                         pbData  -
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPSetProvParam
                            (DWORD param,
                             BYTE  *pbData);



/*
*   CSPSetProvParamEx   - установить параметры криптопровайдера
*
*   Входные параметры   - hProv   - хендл на криптопровайдер
*                         param   - 
*                         pbData  -
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPSetProvParamEx
                            (HCRYPTPROV hProv,
                             DWORD param,
                             BYTE  *pbData);


/*
*   CSPGetKeyParam      - получить параметры ключей
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         keySpec   - 
*                         keyParam  - 
*                         
*   Выходные параметры  - dataKey   -
*                         dataSize  -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPGetKeyParam
                           (HCRYPTPROV hProv,
                            const unsigned long keySpec,
                            const unsigned long keyParam,
                            unsigned char *dataKey,
                            unsigned long *dataSize);

/*
*   CSPSetKeyParam      - установить параметры ключей
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         keySpec   - 
*                         keyParam  - 
*                         dataKey   -
*                         dataSize  -
*
*   Выходные параметры  - нет
*                         
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPSetKeyParam
                           (HCRYPTPROV hProv,
                            const unsigned long keySpec,
                            const unsigned long keyParam,
                            unsigned char *dataKey,
                            unsigned long dataSize);


/*
*   CSPOIDInfo          - информация об алгоритмах соответствующего класса
*
*   Входные параметры   - AlgId
*
*   Выходные параметры  - count
*                         algName
*                         algOID
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int   CSPOIDInfo
                      (ALG_ID AlgId,
                       int *count,
                       char **algName,
                       char **algOID);


/*
*   CSPOIDtoHashOID     - установить соответствие между OID и Hash OID
*
*   Входные параметры   - OID
*
*   Выходные параметры  - hashOID
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPOIDtoHashOID
                            (const char *OID,
                             char *hashOID);


/*
*   CSPOIDtoHashOIDex   - установить соответствие между OID и Hash OID
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         OID       - алгоритм подписи
*
*   Выходные параметры  - hashOID   - алгоритм хеширования
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPOIDtoHashOIDex(HCRYPTPROV hProv,
                              const char *OID,
                              char *hashOID);

/*
*   CSPOIDtoAlgId       - установить соответствие между OID и AlgID
*
*   Входные параметры   - OID
*
*   Выходные параметры  - AlgId
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPOIDtoAlgId
                          (const char *OID,
                           ALG_ID *AlgId);

/*
*   CSPAlgIdtoOID       - установить соответствие между OID и AlgID
*
*   Входные параметры   - AlgId
*
*   Выходные параметры  - OID
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPAlgIdtoOID
                          (const ALG_ID AlgId,
                           char *OID);


/*
*   CSPAlgClassToOID    - установить соответствие между OID и AlgID
*
*   Входные параметры   - AlgId
*
*   Выходные параметры  - OID
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPAlgClassToOID
                            (ALG_ID AlgId,
                             char *OID);


/*
*   CSPGetProviderParam - получить параметры криптопровайдера
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         param -
*
*   Выходные параметры  - paramBuf   -
*                         paramSize  -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPGetProviderParam
                                (HCRYPTPROV hProv,
                                 unsigned long param,
                                 unsigned char *paramBuf,
                                 unsigned long *paramSize);



/*
*   CSPGetContainersName - получить все доступные ключевые контейнеры
*
*   Входные параметры    - hProv    - хендл на криптопровайдер
*
*   Выходные параметры   - count    -
*                          contName -
*
*   Результат            - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPGetContainersName
                                 (HCRYPTPROV hProv,
                                  unsigned int *count,
                                  char **contName);


/*
*   CSPRandomSess       - получить случайный сессионный ключ
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         keyOID
*
*   Выходные параметры  - randBuf
*                         bufSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPRandomSess
                          (HCRYPTPROV hProv,
                           const char *keyOID,
                           unsigned char *randBuf,
                           unsigned long *bufSize);


/*
*   CSPHashPublicKey     - получить получить хеш на открытый ключ (серийный номер)
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         keySpec
*                         hashOID
*
*   Выходные параметры  - serNum
*                         numSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPHashPublicKey
                            (HCRYPTPROV hProv,
                             const unsigned long keySpec,
                             const char *hashOID,
                             unsigned char *keyHash,
                             unsigned long *hashSize);

/*
*   PKCSHashPublicKey   - получить получить хеш на открытый ключ (серийный номер)
*
*   Входные параметры   - hProv - хендл на PKCS#11
*
*   Выходные параметры  - serNum
*                         numSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSHashPublicKey(HCRYPTPROV hProv,
                                unsigned char *keyHash,
                                unsigned long *hashSize);


/*
*   CSPGetHash          - получить получить хеш на текст
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         hashOID   - ( szOID_TGR3411        "1.3.6.1.4.1.6801.1.2.1")
*                         Final     - признак окончания операции
*                         strReq    - хешируемые данные
*                         reqSize   - размер
*
*   Выходные параметры  - strHash   - хеш-значение
*                         hashSize  - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPGetHash
                        (HCRYPTPROV hProv,
                         const char *hashOID,
                         const bool Final,
                         const unsigned char *strReq,
                         const unsigned long reqSize,
                         unsigned char *strHash,
                         unsigned long *hashSize);

/*
*   PKCSGetHash         - получить получить хеш на текст
*
*   Входные параметры   - hProv   - хендл на PKCS#11
*                         hashAlg - CKM_SHA_1 и т.д.
*                         Final   - признак окончания операции
*                         strReq
*                         reqSize
*
*   Выходные параметры  - strHash
*                         hashSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
DWORD PKCSGetHash(HCRYPTPROV hProv,
                  DWORD hashAlg,
                  bool Final,
                  UCHAR *strReq,
                  DWORD reqSize,
                  UCHAR *strHash,
                  DWORD *hashSize);


/*
*   CSPGetContainersName - получить все доступные ключевые контейнеры
*
*   Входные параметры    - hProv    - хендл на криптопровайдер
*
*   Выходные параметры   - count    -
*                          contName -
*
*   Результат            - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPGetContainersName
                                 (HCRYPTPROV hProv,
                                  unsigned int *count,
                                  char **contName);


/*
*   CSPRandomSess       - получить случайный сессионный ключ
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         keyOID
*
*   Выходные параметры  - randBuf
*                         bufSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPRandomSess
                          (HCRYPTPROV hProv,
                           const char *keyOID,
                           unsigned char *randBuf,
                           unsigned long *bufSize);



/*
*   CSPExportKeyPair    - получить зашифрованую ключевую пару
*
*   Входные параметры   - hProv       - хендл на криптопровайдер
*                         keySpec     - 
*                         openKeyBlob - 
*                         openKeySize - 
*
*   Выходные параметры  - keyBlob     -
*                         blobSize    -
*                         openKeyHash -
*                         openKeyhSize-
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPExportKeyPair
                            (HCRYPTPROV hProv,
                             const unsigned long keySpec,
                             const unsigned char *openKeyBlob,
                             const unsigned long openKeySize,
                             unsigned char *keyBlob,
                             unsigned long *blobSize,
                             unsigned char *openKeyHash,
                             unsigned long *openKeyhSize);

/*
*   CSPImportKeyPair    - создать ключевой контейнер из зашифрованой ключевой пары
*
*   Входные параметры   - hProv       - хендл на криптопровайдер
*                         Container   - 
*                         UserName    - 
*                         openKeyHash -
*                         openKeyhSize-
*                         blobExch    - 
*                         blobExchLen - 
*                         blobSign    - 
*                         blobSignLen - 
*
*   Выходные параметры  - нет
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPImportKeyPair
                            (HCRYPTPROV hProv,
                             const char *Container, 
                             const char *UserName, 
                             const unsigned char *openKeyHash,
                             const unsigned long openKeyhSize,
                             const unsigned char *blobExch, 
                             const unsigned long blobExchLen, 
                             const unsigned char *blobSign, 
                             const unsigned long blobSignLen);


/*
*   CSPExPassKeyPair    - получить получить зашифрованую на пароле ключевую пару
*
*   Входные параметры   - hProv    - хендл на криптопровайдер
*                         keySpec  - 
*                         cryptOID - 
*                         hashOID  - 
*                         passWord -
*
*   Выходные параметры  - keyBlob     -
*                         blobSize    -
*                         sesKeyHash  -
*                         sesKeyhSize -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPExPassKeyPair
                             (HCRYPTPROV hProv,
                              const unsigned long keySpec,
                              const char *cryptOID,
                              const char *hashOID,
                              const char *passWord,
                              unsigned char *keyBlob,
                              unsigned long *blobSize,
                              unsigned char *sesKeyHash,
                              unsigned long *sesKeyhSize);


/*
*   CSPImPassKeyPair    - создать ключевой контейнер из зашифрованой ключевой пары
*
*   Входные параметры   - hProv       -
*                         Container   - 
*                         UserName    - 
*                         cryptOID    -
*                         hashOID     -
*                         passWord    -
*                         sesKeyHash  -
*                         sesKeyhSize -
*                         blobExch    - 
*                         blobExchLen - 
*                         blobSign    - 
*                         blobSignLen - 
*
*   Выходные параметры  - нет
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPImPassKeyPair
                             (HCRYPTPROV hProv,
                              const char *Container, 
                              const char *UserName, 
                              const char *cryptOID,
                              const char *hashOID,
                              const char *passWord,
                              const unsigned char *sesKeyHash,
                              const unsigned long sesKeyhSize,
                              const unsigned char *blobExch, 
                              const unsigned long blobExchLen, 
                              const unsigned char *blobSign, 
                              const unsigned long blobSignLen);



/*
*   CSPExportPublicKey  - получить блоб с открытым ключом
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         keySpec
*
*   Выходные параметры  - keyBlob
*                         blobSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPExportPublicKey
                        (HCRYPTPROV hProv,
                         const unsigned long keySpec,
                         unsigned char *keyBlob,
                         unsigned long *blobSize);

/*
*   CSPExportPKCS12     - получить секретный ключ в формате PKCS#12
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         keySpec -
*                         passwd  - 
*
*   Выходные параметры  - keyBlob
*                         blobSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPExportPKCS12(HCRYPTPROV hProv,
                            const unsigned long keySpec,
                            const char *passwd,
                            unsigned char *keyBlob,
                            unsigned long *blobSize);


/*
*   PKCSExportPublicKey - получить получить блоб с открытым ключом
*
*   Входные параметры   - hProv - хендл на PKCS#11
*
*   Выходные параметры  - keyBlob
*                         blobSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSExportPublicKey(HCRYPTPROV hProv,
                                  UCHAR *keyBlob,
                                  DWORD *blobSize);

/*
*   PackUserKey         - упаковать ключи для депонирования 
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         version   - версия 
*                         DName     - имя владельца ключей
*                         certExch  - сертификат для ключей обмена
*                         exchSize  - размер сертификата
*                         certSign  - сертификат для ключей подписи
*                         signSize  - размер сертификата
*                         openCAKey - открытый ключ сертификата ЦС
*                         keySize   - размер открытого ключа
*                         passWord  - парольное слово (необязательно, если есть openCAKey)
*                         keyName   - имя для идентификации ключей
*
*   Выходные параметры  - keyInfo     - структура для депонирования
*                         keyInfoSize - размер структуры
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int PackUserKey
                        (HCRYPTPROV hProv,
                         const int version,
                         const char *DName,
                         const char *keyName,
                         const unsigned char *certExch,
                         const unsigned long exchSize,
                         const unsigned char *certSign,
                         const unsigned long signSize,
                         const char *passWord,
                         const unsigned char *openCAKey,
                         const unsigned long keySize,
                         unsigned char *keyInfo,
                         unsigned long *keyInfoSize);


/*
*   PackUserKeyInfo     - информация о ключях для депонирования без извлечения
*
*   Входные параметры   - keyInfo     - структура для депонирования
*                         keyInfoSize - размер структуры
*                         
*
*   Выходные параметры  - version   - версия 
*                         DName     - имя владельца ключей
*                         keyName   - имя для идентификации ключей
*                         packTime  - время создания структуры
*                         packOID   - тип структуры
*                                     CERTEX_SECRET_KEY_BACKUP_PASS - при депонировании использовался пароль
*                                     CERTEX_SECRET_KEY_BACKUP_EXCH - при депонировании использовался сертификат ЦС
*                         certExch  - сертификат для ключей обмена
*                         exchSize  - размер сертификата
*                         certSign  - сертификат для ключей подписи
*                         signSize  - размер сертификата
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int PackUserKeyInfo
                            (const unsigned char *keyInfo,
                             const unsigned long keyInfoSize,
                             int  *version,
                             char *DName,
                             char *keyName,
                             char *packTime,
                             char *packOID,
                             unsigned char *certExch,
                             unsigned long *exchSize,
                             unsigned char *certSign,
                             unsigned long *signSize);


/*
*   UnpackUserKey     - извлечь ключи депонирования
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         keyInfo     - структура для депонирования
*                         keyInfoSize - размер структуры
*                         passWord  - парольное слово (необязательно, если CERTEX_SECRET_KEY_BACKUP_EXCH)
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int UnpackUserKey
                          (HCRYPTPROV hProv,
                           const unsigned char *keyInfo,
                           const unsigned long keyInfoSize,
                           const char *passWord);



/*
*   CSPCheckImit        - проверить имитовставку
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         hashOID
*                         openKeyBlob
*                         openSize
*                         strReq
*                         reqSize
*                         strImit
*                         imitSize
*                         sesKeyBlob
*                         sesSize
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPCheckImit
                        (HCRYPTPROV hProv,
                         const char *hashOID,
                         const unsigned char *openKeyBlob,
                         const unsigned long openSize,
                         const unsigned char *strReq,
                         const unsigned long reqSize,
                         const unsigned char *strImit,
                         const unsigned long imitSize,
                         const unsigned char *sesKeyBlob,
                         const unsigned long sesSize);



/*
*   CSPSetImit          - установить имитовставку
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         cryptOID
*                         hashOID
*                         cKeyBlob
*                         openKeyBlob
*                         openSize
*                         strReq
*                         reqSize
*
*   Выходные параметры  - strImit
*                         imitSize
*                         sesKeyBlob
*                         sesSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPSetImit
                      (HCRYPTPROV hProv,
                       const char *cryptOID,
                       const char *hashOID,
                       const int cKeyBlob,
                       const unsigned char **openKeyBlob,
                       const unsigned long *openSize,
                       const unsigned char *strReq,
                       const unsigned long reqSize,
                       unsigned char *strImit,
                       unsigned long *imitSize,
                       unsigned char **sesKeyBlob,
                       unsigned long *sesSize);


/*
*   CSPEncrypt          - зашифровать
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         cryptOID
*                         cKeyBlob
*                         openKeyBlob
*                         openSize
*                         mData
*                         lData
*
*   Выходные параметры  - mData
*                         sesKeyBlob
*                         sesSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPEncrypt
                      (HCRYPTPROV hProv,
                       const char *cryptOID,
                       const int cKeyBlob,
                       const unsigned char **openKeyBlob,
                       const unsigned long *openSize,
                       unsigned char *mData,
                       unsigned long lData,
                       unsigned char **sesKeyBlob,
                       unsigned long *sesSize);



/*
*   CSPDecrypt          - расшифровать
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         cryptOID
*                         openKeyBlob
*                         openSize
*                         mData
*                         lData
*                         sesKeyBlob
*                         sesSize
*
*   Выходные параметры  - mData
*
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPDecrypt
                       (HCRYPTPROV hProv,
                        const char *cryptOID,
                        unsigned char *openKeyBlob,
                        unsigned long openSize,
                        unsigned char *mData,
                        unsigned long lData,
                        unsigned char *sesKeyBlob,
                        unsigned long sesSize);


/*
*   CSPSetSign          - подписать
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         hashOID
*                         keySpec
*                         strReq
*                         reqSize
*
*   Выходные параметры  - strSig
*                         sigSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPSetSign
                      (HCRYPTPROV hProv,
                       const char *hashOID,
                       const unsigned long keySpec,
                       const unsigned char *strReq,
                       const unsigned long reqSize,
                       unsigned char *strSig,
                       unsigned long *sigSize);


/*
*   CSPSetSign          - подписать
*
*   Входные параметры   - hProv - хендл на PKCS#11
*                         hashAlg
*                         Final
*                         strReq
*                         reqSize
*
*   Выходные параметры  - strSig
*                         sigSize
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSSetSign(HCRYPTPROV hProv,
                          DWORD hashAlg,
                          bool Final,
                          UCHAR *strReq,
                          DWORD reqSize,
                          UCHAR *strSig,
                          DWORD *sigSize);

/*
*   CSPCheckSign        - проверить подпись
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         hashOID
*                         strReq
*                         reqSize
*                         strSig
*                         sigSize
*                         openKeyBlob
*                         openSize
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CSPCheckSign
                        (HCRYPTPROV hProv,
                         const char *hashOID,
                         const unsigned char *strReq,
                         const unsigned long reqSize,
                         const unsigned char *strSig,
                         const unsigned long sigSize,
                         const unsigned char *openKeyBlob,
                         const unsigned long openSize);

/*
*   CSPCheckSign        - проверить подпись
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         hashAlg
*                         Final
*                         strReq
*                         reqSize
*                         strSig
*                         sigSize
*                         openKeyBlob
*                         openSize
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL DWORD PKCSCheckSign(HCRYPTPROV hProv,
                            DWORD hashAlg,
                            bool Final,
                            UCHAR *strReq,
                            DWORD reqSize,
                            UCHAR *strSig,
                            DWORD sigSize,
                            UCHAR *openKeyBlob,
                            DWORD openSize);

//#endif  // __Open_CSP_func

//**********************************************************************************
//**********************************************************************************

/*
*   CreatePKCS10        - создать PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*                         DName   - имя делающего запрос в формате DN
*                         Usage   - алгоритм использования ключа - ОИД
*                         sigOID  - алгоритм подписи
*
*   Выходные параметры  - pPKCS10    - буфер в котрый будет записан запрос
*                         pLenPKCS10 - длина буфера
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CreatePKCS10
                          (const hENROLLCONTEXT hEnroll,
                           const char *DName,
                           const char *Usage,
                           const char *sigOID,
                           unsigned char *pPKCS10,
                           unsigned long *pLenPKCS10);

/*
*   sslCreatePKCS10     - создать PKCS#10
*
*   Входные параметры   - hEnroll   - хендл
*                         DName     - имя делающего запрос в формате DN
*                         sigOID    - алгоритм подписи
*                         pkcsPasswd- пароль
*                         keyPKCS12 - ключ
*                         keySize   - размер
*
*   Выходные параметры  - pPKCS10    - буфер в котрый будет записан запрос
*                         pLenPKCS10 - длина буфера
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslCreatePKCS10(const hENROLLCONTEXT hEnroll,
                            const char *DName,
                            const char *sigOID,
                            const char *pkcsPasswd,
                            const unsigned char *keyPKCS12,
                            const unsigned long keySize,
                            unsigned char *pPKCS10,
                            unsigned long *pLenPKCS10);


/*
*   sslCreatePKCS7      - создать PKCS#7
*
*   Входные параметры   - inData      - входные данные (например PKCS#10)
*                         inSize      - размер
*                         pkcsPasswd  - пароль
*                         keyPKCS12   - ключ
*                         keySize     - размер
*
*   Выходные параметры  - outData    - выходные данные (PKCS#7)
*                         outSize    - длина 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslCreatePKCS7(const unsigned char *inData, 
                           const unsigned long inSize,
                           const char *pkcsPasswd,
                           const unsigned char *keyPKCS12,
                           const unsigned long keySize,
                           unsigned char *outData,
                           unsigned long *outSize);

/*
*   sslVerifyPKCS7      - проверить PKCS#7
*
*   Входные параметры   - inData      - входные данные (PKCS#7)
*                         inSize      - размер
*
*   Выходные параметры  - outData    - нет. 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int sslVerifyPKCS7
                          (const unsigned char *inData, 
                           const unsigned long inSize);

/*
*   SetPKCS10PKCS11     - задать PKCS#11
*
*   Входные параметры   - hEnroll - хендл
*                         hProv   - хендл PKCS11
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10PKCS11(const hENROLLCONTEXT hEnroll,
                             const HCRYPTPROV hProv);

/*
*   VerifyPKCS10        - получить параметры PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*                         pPKCS10 - буфер c запросом
*                         LenPKCS10 - длина буфера
*                         Flags
*
*   Выходные параметры  - DName    - имя делающего запрос в формате DN
*                         sigOID   - алгоритм подписи
*                         keyOID   - алгоритм использования ключа - ОИД
*                         hashKeyBlob -
*                         hashSize    -
*                         keyBlob     -
*                         keySize     -
*                         result      - результат проверки подписи
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifyPKCS10
                        (const hENROLLCONTEXT hEnroll,
                         const unsigned char *pPKCS10,
                         const unsigned long LenPKCS10,
                         const int Flags,
                         char *DName,
                         char *sigOID,
                         char *keyOID,
                         unsigned char *hashKeyBlob,
                         unsigned long *hashSize,
                         unsigned char *keyBlob,
                         unsigned long *keySize,
                         int *result);

/*
*   SetPKCS10Usage      - установить тип использования ключей 
*
*   Входные параметры   - hEnroll     - хендл
*                         keyUsage    - тип ключей
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10Usage(const hENROLLCONTEXT hEnroll,
                           ulong32 keyUsage);


/*
*   SetPKCS10UsageX     - установить тип использования ключей 
*
*   Входные параметры   - hEnroll     - хендл
*                         isCritical  - флаг
*                         keyUsage    - тип ключей
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10UsageX(const hENROLLCONTEXT hEnroll,
                             const bool isCritical,
                             ulong32 keyUsage);


/*
*   GetPKCS10Usage      - установить тип использования ключей 
*
*   Входные параметры   - hEnroll     - хендл
*
*   Выходные параметры  - keyUsage    - тип ключей:
*
*                                       INFRA_VAL_EXTN_KEYUSAGE_DIGSIGN  0x0080
*                                       INFRA_VAL_EXTN_KEYUSAGE_NONREPU  0x0040
*                                       INFRA_VAL_EXTN_KEYUSAGE_KEYENCH  0x0020
*                                       INFRA_VAL_EXTN_KEYUSAGE_DATAENC  0x0010
*                                       INFRA_VAL_EXTN_KEYUSAGE_KEYAGRM  0x0008
*                                       INFRA_VAL_EXTN_KEYUSAGE_CERTSIG  0x0004
*                                       INFRA_VAL_EXTN_KEYUSAGE_CRLSIGN  0x0002
*                                       INFRA_VAL_EXTN_KEYUSAGE_ENCONLY  0x0001
*                                       INFRA_VAL_EXTN_KEYUSAGE_DECONLY  0x8000
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetPKCS10Usage(const hENROLLCONTEXT hEnroll,
                            bool *isCritical,
                            ulong32 *keyUsage);


/*
*   SetPKCS10NetScape   - установить тип ключей 
*
*   Входные параметры   - hEnroll         - хендл
*                         typeNetScape    - тип ключей
*                                           NETSCAPE_SSL_CLIENT					0x80
*                                           NETSCAPE_SSL_SERVER					0x40
*                                           NETSCAPE_SMIME							0x20
*                                           NETSCAPE_OBJECT_SIGNING			0x10
*                                           NETSCAPE_SSL_CA							0x04
*                                           NETSCAPE_SMIME_CA						0x02
*                                           NETSCAPE_OBJECT_SIGNING_CA	0x01
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10NetScape(const hENROLLCONTEXT hEnroll,
                               ulong32 typeNetScape);


/*
*   GetPKCS10NetScape   - установить тип ключей 
*
*   Входные параметры   - hEnroll     - хендл
*
*   Выходные параметры  - typeNetScape    - тип ключей
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetPKCS10NetScape(const hENROLLCONTEXT hEnroll,
                              ulong32 *typeNetScape);


/*
*   SetKeySpec          - установить тип ключей AT_EXCHANGE AT_SIGNATURE
*
*   Входные параметры   - hEnroll - хендл
*                         spec   - тип ключей
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetKeySpec
                        (const hENROLLCONTEXT hEnroll,
                         unsigned long spec);



/*
*   SetCertTemplate     - установить шаблон сертификатов
*
*   Входные параметры   - hEnroll - хендл
*                         TName   - имя шаблона в формате DN
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetCertTemplate(const hENROLLCONTEXT hEnroll,
                             char *TName);


/*
*   GetCertTemplate     - получить шаблон сертификатов
*
*   Входные параметры   - hEnroll - хендл                        
*
*   Выходные параметры  - TName   - имя шаблона в формате DN
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertTemplate(const hENROLLCONTEXT hEnroll,
                             char *TName);


/*
*   GetPKCS10AltName    - получить альтернативное имя из запроса PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*
*   Выходные параметры  - altCount - количество имен
*                         altOID   - указатель на массив OID имен
*                                  Максимальный размер оида – 32 символов.
*                         altName  - указатель на массив имен. 
*                                  Максимальный размер имени – 256 символов.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetPKCS10AltName
                             (const hENROLLCONTEXT hEnroll,
                              int *altCount,
                              char ***altOID,
                              char ***altName);

/*
*   SetPKCS10AltName    - установить альтернативные имена в запрос PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*                       - altCount - количество имен
*                         altOID   - массив OID имен
*                                  Максимальный размер оида – 32 символов.
*                         altName  - массив имен. 
*                                  Максимальный размер имени – 256 символов.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10AltName(const hENROLLCONTEXT hEnroll,
                             int altCount,
                             char **altOID,
                             char **altName);


/*
*   SetPKCS10ExtUsage   - установить расширенное использование ключа в запрос PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*                       - extUsageCount - количество расширений
*                         extUsage      - указатель на массив OID
*                                         Максимальный размер оида – 32 символов.
*                                         INFRA_VAL_EXTN_EXTNKEYUSAGE_SERV "1.3.6.1.5.5.7.3.1"
*                                         INFRA_VAL_EXTN_EXTNKEYUSAGE_CLNT "1.3.6.1.5.5.7.3.2"
*                                         INFRA_VAL_EXTN_EXTNKEYUSAGE_CODS "1.3.6.1.5.5.7.3.3"
*                                         INFRA_VAL_EXTN_EXTNKEYUSAGE_EMAL "1.3.6.1.5.5.7.3.4"
*                                         INFRA_VAL_EXTN_EXTNKEYUSAGE_TSTM "1.3.6.1.5.5.7.3.8"
*                                         INFRA_VAL_EXTN_EXTNKEYUSAGE_OCSP "1.3.6.1.5.5.7.3.9"
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10ExtUsage(const hENROLLCONTEXT hEnroll,
                              int extUsageCount,
                              char **extUsage);



/*
*   GetPKCS10ExtUsage   - получить расширенное использование ключа в запрос PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*
*   Выходные параметры  - extUsageCount - количество расширений
*                         extUsage      - указатель на массив OID
*                                         Максимальный размер оида – 32 символов.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetPKCS10ExtUsage(const hENROLLCONTEXT hEnroll,
                              int *extUsageCount,
                              char **extUsage);

/*
*   SetPKCS10Ext        - установить дополнительные расширения в запрос PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*
*   Выходные параметры  - extCount - количество расширений
*                         extOID   - указатель на массив OID
*                                  Максимальный размер оида – 32 символов.
*                         extValue - указатель на массив значений. 
*                                  Максимальный размер имени – 256 символов.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetPKCS10Ext(const hENROLLCONTEXT hEnroll,
                          int extCount,
                          char **extOID,
                          char **extValue);

/*
*   GetPKCS10Ext        - получить дополнительные расширения из запроса PKCS#10
*
*   Входные параметры   - hEnroll - хендл
*
*   Выходные параметры  - crtExtSize - размер массива расширений
*                         crtExt     - указатель на массив расширений
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetPKCS10Ext(const hENROLLCONTEXT hEnroll,
                          unsigned long *crtExtSize,
                          unsigned char **crtExt);


/*
*   CreateEnroll        - получить хендл на Enroll
*
*   Входные параметры   - hProv     - хендл на криптопровайдер
*                         hContext  - указатель (хендл) на на сертификат пользователя 
*
*   Выходные параметры  - hEnroll - хендл.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CreateEnroll
                         (HCRYPTPROV hProv,
                          hCERTCONTEXT hContext,
                          hENROLLCONTEXT *hEnroll);



/*
*   ReleaseEnroll       - очистить хендл на Enroll
*
*   Входные параметры   - hEnroll - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ReleaseEnroll
                          (hENROLLCONTEXT *phEnroll);


//////////////////////////////////////////////////////////////////////////////////


/*
*   CreatePKIContext   - получить хендл на CMC
*
*   Входные параметры   - hPKI - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CreatePKIContext
                            (hPKICONTEXT *hPKI);


/*
*   TypeRequest         - получить тип CMC запроса
*
*   Входные параметры   - hPKI      - хендл
*                         cmcBlob   - запрос
*                         sizeBlob  - длина запроса
*
*   Выходные параметры  - reqType   - тип - 0, 1, 2, 3
*                         transID   - метка транзакции
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int TypeRequest
                        (hPKICONTEXT hPKI,
                         const unsigned char *cmcBlob,
                         const unsigned long sizeBlob,
                         int *reqType,
                         char *transID);




/*
*   KeyStoreRequest     - получить CMC запрос на депонирование ключей
*
*   Входные параметры   - hPKI        - хендл
*                         keySecure   - зашифрованые ключи из класса TCont
*                         keySecSize  - длина 
*                         DName       - имя сделавшего запрос
*                         transID     - идентификатор транзакции
*
*   Выходные параметры  - cmcBlob   - Результат - запрос
*                         sizeBlob  - длина запроса
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int KeyStoreRequest
                            (hPKICONTEXT hPKI,
                             const unsigned char *keySecure,
                             const unsigned long keySecSize,
                             const char *DName,
                             const char *transID,
                             unsigned char **cmcBlob,
                             unsigned long *sizeBlob);




/*
*   ViewKeyStoreRequest - рассмотреть CMC запрос на депонирование ключей
*
*   Входные параметры   - hPKI      - хендл
*                         cmcBlob   - запрос
*                         sizeBlob  - длина запроса
*
*   Выходные параметры  - DName     - имя, на которое запрос, если запрос не для себя то не NULL
*                         transID   - метка транзакции
*                         keySecure - зашифрованые ключи для TCont
*                         keySize   - длина
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ViewKeyStoreRequest
                                (hPKICONTEXT hPKI,
                                 const unsigned char *cmcBlob,
                                 const unsigned long sizeBlob,
                                 char *DName,
                                 char *transID,
                                 unsigned char *keySecure,
                                 unsigned long *keySize);


/*
*   CertRequest         - получить CMC запрос на сертификатов
*
*   Входные параметры   - hPKI      - хендл
*                         pkscSign  - запрос на сертификат для подписи
*                         pkcsSignSize - длина запроса
*                         pkcsExch  - запрос на сертификат для ключевого обмена
*                         pkcsExchSize - длина запроса
*                         DName     - если запрос не для себя то не NULL
*                         transID   - Идентификатор транзакции
*
*   Выходные параметры  - cmcBlob   - Результат - запрос
*                         sizeBlob  - длина запроса
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtRequest
                        (hPKICONTEXT hPKI,
                         const unsigned char *pkscSign,
                         const unsigned long pkcsSignSize,
                         const unsigned char *pkcsExch,
                         const unsigned long pkcsExchSize,
                         const char *DName,
                         const char *transID,
                         unsigned char **cmcBlob,
                         unsigned long *sizeBlob);


/*
*   ViewCertRequest         - рассмотреть CMC запрос на сертификатов
*
*   Входные параметры   - hPKI      - хендл
*                         cmcBlob   - запрос
*                         sizeBlob  - длина запроса
*
*   Выходные параметры  - DName     - имя, на которое запрос, если запрос не для себя то не NULL
*                         reqCount  - kоличество запросов (обычно 2)
*                         request   - массив запросов
*                         size      - массив длин запросов
*                         transID   - метка транзакции
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ViewCertRequest
                            (hPKICONTEXT hPKI,
                             const unsigned char *cmcBlob,
                             const unsigned long sizeBlob,
                             char *DName,
                             int *reqCount,
                             unsigned char **request,
                             unsigned long *size,
                             char *transID);


/*
*   CertRevoke          - получить CMC запрос на отзыв сертификатов
*
*   Входные параметры   - hPKI        - хендл
*                         crtSign     - сертификат для подписи
*                         crtSignSize - длина
*                         crtExch     - сертификат для ключевого обмена
*                         crtExchSize - длина
*                         revReason   - причина отзыва
*                         revDate     - дата отзыва
*                         DName       - имя владельца сертификатов
*                         Comment     - коментарий
*                         transID     - Идентификатор транзакции
*
*   Выходные параметры  - cmcBlob   - Результат - запрос
*                         sizeBlob  - длина запроса
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtRevoke
                      (hPKICONTEXT hPKI,
                      const unsigned char *crtSign,
                      const unsigned long crtSignSize,
                      const unsigned char *crtExch,
                      const unsigned long crtExchSize,
                      const int revReason,
                      const char *revDate,
                      const char *DName,
                      const char *Comment,
                      const char *transID,
                      unsigned char **cmcBlob,
                      unsigned long *sizeBlob);


/*
*   ViewCertRevoke      - рассмотреть CMC запрос на отзыв сертификатов
*
*   Входные параметры   - hPKI      - хендл
*                         cmcBlob   - запрос
*                         sizeBlob  - длина запроса
*
*   Выходные параметры  - serNum      - массив серийных номеров сертификатов
*                         serNumSize  - массив длин
*                         IssuerName  - имя выпустившего сертификат
*                         revReason   - причина отзыва
*                         strRevReason- причина отзыва
*                         revDate     - дата отзыва
*                         DName       - имя владельца сертификатов
*                         Comment     - Произвольный коментарий (256)
*                         transID     - Идентификатор транзакции
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ViewCertRevoke
                          (hPKICONTEXT hPKI,
                          const unsigned char *cmcBlob,
                          const unsigned long sizeBlob,
                          unsigned char **serNum,
                          unsigned long *serNumSize,
                          char *IssuerName,
                          int  *revReason,
                          char *strRevReason,
                          char *revDate,
                          char *DName,
                          char *Comment,
                          char *transID);

/*
*   CertChange          - получить CMC запрос на смену сертификатов
*
*   Входные параметры   - hPKI        - хендл
*                         crtSign     - сертификат для подписи
*                         crtSignSize - длина
*                         crtExch     - сертификат для ключевого обмена
*                         crtExchSize - длина
*                         revReason   - причина отзыва
*                         revDate     - дата отзыва
*                         DName       - имя владельца сертификатов
*                         Comment     - Произвольный коментарий (256)
*                         pkscSign    - запрос на сертификат для подписи
*                         pkcsSignSize - длина запроса
*                         pkcsExch    - запрос на сертификат для ключевого обмена
*                         pkcsExchSize - длина запроса
*                         transID     - Идентификатор транзакции
*
*   Выходные параметры  - cmcBlob   - Результат - запрос
*                         sizeBlob  - длина запроса
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrtChange
                      (hPKICONTEXT hPKI,
                       const unsigned char *crtSign,
                       const unsigned long crtSignSize,
                       const unsigned char *crtExch,
                       const unsigned long crtExchSize,
                       const int revReason,
                       const char *revDate,
                       const char *DName,
                       const char *Comment,
                       const unsigned char *pkscSign,
                       const unsigned long pkcsSignSize,
                       const unsigned char *pkcsExch,
                       const unsigned long pkcsExchSize,
                       const char *transID,
                       unsigned char **cmcBlob,
                       unsigned long *sizeBlob);


/*
*   ReleasePKIContext   - очистить хендл на CMC
*
*   Входные параметры   - hPKI - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ReleasePKIContext
                              (hPKICONTEXT *phPKI);


////////////////////////////////////////////////////////////////////
//////////////////// MESSAGE FUNCTIONS /////////////////////////////
////////////////////////////////////////////////////////////////////

/*
*   AuthMsgOpen        - установить хендл на класс authfunc
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         Flag  - зарезервировано
*
*   Выходные параметры  - phAuth - хендл.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AuthMsgOpen
                        (HCRYPTPROV hProv,
                         int Flags,
                         hAUTHMSG *phAuth);

/*
*   AuthMsgClose       - закрыть хендл на класс CMS-nac
*
*   Входные параметры   - phCrypt - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AuthMsgClose
                          (hAUTHMSG *phAuth);


/*
*   AuthMsgSet          - создать последовательность
*
*   Входные параметры   - hAuth     - хендл
*                         DName     - имя абонента
*                         crtSign   - сертификат для подписи
*                         signSize  -
*                         crtExch   - сертификат обмена
*                         exchSize  -
*                         crlBody   - СОС
*                         crlSize   -
*
*   Выходные параметры  - authBuf   - аутентификационная последовательность
*                         authSize  - длина
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AuthMsgSet
                        (hAUTHMSG hAuth,
                        const char *DName,
                        const unsigned char *crtSign,
                        const unsigned long signSize,
                        const unsigned char *crtExch,
                        const unsigned long exchSize,
                        const unsigned char *crlBody,
                        const unsigned long crlSize,
                        unsigned char *authBuf,
                        unsigned long *authSize);

/*
*   AuthMsgDone         - извлечь из последовательности
*
*   Входные параметры   - hAuth     - хендл
*                         authBuf   - аутентификационную последовательность
*                         authSize  -
*
*   Выходные параметры  - DName     - имя абонента
*                         crtSign   - сертификат для подписи
*                         signSize  -
*                         crtExch   - сертификат обмена
*                         exchSize  -
*                         crlBody   - указатель на СОС
*                         crlSize   -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AuthMsgDone
                        (hAUTHMSG hAuth,
                         const unsigned char *authBuf,
                         const unsigned long authSize,
                         char *DName,
                         unsigned char *crtSign,
                         unsigned long *signSize,
                         unsigned char *crtExch,
                         unsigned long *exchSize,
                         unsigned char **crlBody,
                         unsigned long *crlSize);

/*
*   AuthMsgVerify       - проверить последовательность
*
*   Входные параметры   - hAuth     - хендл
*                         authBuf   - аутентификационную последовательность
*                         authSize  -
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int AuthMsgVerify
                        (hAUTHMSG hAuth,
                         const unsigned char *authBuf,
                         const unsigned long authSize);


/*
*   ImitMsgOpen        - установить хендл на класс CMS-mac
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         Flag  - зарезервировано
*
*   Выходные параметры  - phCrypt - хендл.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ImitMsgOpen
                        (HCRYPTPROV hProv,
                         int Flags,
                         hCRYPTMSG *phCrypt);


/*
*   ImitMsgClose       - закрыть хендл на класс CMS-mac
*
*   Входные параметры   - phCrypt - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ImitMsgClose
                          (hCRYPTMSG *phCrypt);


//_WIN_DLL int CryptMsgTime
//                          (const hCRYPTMSG hCrypt,
//                           time_t *time, 
//                           unsigned short *millitm, 
//                           time_t *_time, 
//                           unsigned short *_millitm);


/*
*   ImitMessage        - получить CMS-mac
*
*   Входные параметры   - phCrypt        - хендл на cms
*                         hCollection    - указатель (хендл) на коллекцию сертификатов
*                         MYCert         - хендл на собственный сертификат
*                         crypthOID      - ОИД
*                         hashOID        - ОИД
*                         imitOID        - ОИД
*                         Final
*                         dataOID
*                         dataToEncrypted
*                         dataSize
*                         dataDescriptor
*                         Flags         - если 0 - включать сертификат в сообщение.
*
*   Выходные параметры  - encryptedBlob - указатель CMS-crypt
*                         sizeBlob      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ImitMessage
                         (const hCRYPTMSG hCrypt,
                          const hCERTCOLLECTION hCollection,
                          const hCERTCONTEXT MYCert,
                          const char *cryptOID,
                          const char *hashOID,
                          const char *imitOID,
                          const char *dataOID,
                          const bool Final,
                          const unsigned char *dataToEncrypted,
                          const unsigned long dataSize,
                          const char *dataDescriptor,
                          const unsigned long Flags,
                          unsigned char *encryptedBlob,
                          unsigned long *sizeBlob);



/*
*   DeimitMessage      - обработать CMS-mac
*
*   Входные параметры   - phCrypt       - хендл на cms
*                         MYCert        - сертификат проверяющего
*                         hStore        - указатель (хендл) на хранилище
*                         Final
*                         encryptedBlob - указатель CMS-crypt
*                         sizeBlob      - размер
*                         Flags         - 
*
*   Выходные параметры  - SenderName    - указатель на имена отправителей
*                         timeToImited  - указатель на время вычисления имитовставки
*                         dataDescriptor- указатель описание данных
*                         dataToSigned  - указатель на расшифрованные данные
*                         dataSize      - размер
*                         VerifyRes     - результат проверки
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DeimitMessage
                          (const hCRYPTMSG hCrypt,
                           const hCERTCOLLECTION hCollection,
                           const hCERTCONTEXT MYCert,
                           const bool Final,
                           const unsigned char *encryptedBlob,
                           const unsigned long sizeBlob,
                           const int Flags,
                           char *SenderName,
                           char *timeToImited,
                           char *dataDescriptor,
                           unsigned char *dataToDecrypted,
                           unsigned long *dataSize,
                           int *VerifyRes);


/*
*   HashMsgOpen         - установить хендл на класс CMS-hash
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         Flag  - зарезервировано
*
*   Выходные параметры  - phCrypt - хендл.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int HashMsgOpen
                        (HCRYPTPROV hProv,
                         int Flags,
                         hCRYPTMSG *phCrypt);



/*
*   HashMsgClose        - закрыть хендл на класс CMS-hash
*
*   Входные параметры   - phCrypt - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int HashMsgClose
                          (hCRYPTMSG *phCrypt);



/*
*   HashMessage         - получить CMS-hash
*
*   Входные параметры   - phCrypt       - хендл на cms
*                         hashOID       - ОИД на алгоритм хеширования
*                         dataOID       - описание данных
*                         Final
*                         dataToHashed  - данные для хеширования
*                         dataSize      - размер
*                         Flags         - резерв
*
*   Выходные параметры  - hashedBlob    - CMS-hash
*                         sizeBlob      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int HashMessage
                        (const hCRYPTMSG hCrypt,
                         const char *hashOID,
                         const char *dataOID,
                         const bool Final,
                         const unsigned char *dataToHashed,
                         const unsigned long dataSize,
                         const unsigned long Flags,
                         unsigned char *hashedBlob,
                         unsigned long *sizeBlob);



/*
*   VerifyHashMessage   - проверить CMS-sign
*
*   Входные параметры   - phCrypt       - хендл на cms
*                         hashedBlob    - CMS-hash
*                         sizeBlob      - размер
*                         Final         - признак конца операции
*
*   Выходные параметры  - dataToSigned  - указатель на хешированые данные
*                         dataSize      - размер
*                         dataOID       - указатель описание данных
*                         VerifyRes     - указатель на результат проверки
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifyHashMessage
                              (const hCRYPTMSG hCrypt,
                               const unsigned char *hashedBlob,
                               const unsigned long sizeBlob,
                               const bool Final,
                               unsigned char *dataToHashed,
                               unsigned long *dataSize,
                               char *dataOID,
                               int *VerifyRes);


/*
*   CryptMsgOpen        - установить хендл на класс CMS-crypt
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         Flag  - зарезервировано
*
*   Выходные параметры  - phCrypt - хендл.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrptMsgOpen
                        (HCRYPTPROV hProv,
                         int Flags,
                         hCRYPTMSG *phCrypt);



/*
*   CryptMsgClose       - закрыть хендл на класс CMS-crypt
*
*   Входные параметры   - phCrypt - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CrptMsgClose
                          (hCRYPTMSG *phCrypt);



/*
*   CryptMessage        - получить CMS-crypt
*
*   Входные параметры   - phCrypt         - хендл на cms
*                         hCollection     - указатель (хендл) на коллекцию сертификатов
*                         MYCert          - хендл на собственный сертификат
*                         crypthOID       - алгоритм шифрования (szOID_TGR3410        "1.3.6.1.4.1.6801.1.2.2")
*                         dataOID         - ОИД, описывающий подписываемые данные (NULL - default)
*                         Final           - признак окончания операции
*                         dataToEncrypted - шифруемые данные
*                         dataSize        - размер
*                         dataDescriptor  - описание данных
*                         Flags           - если 0 - не включать исходные данные
*
*   Выходные параметры  - encryptedBlob - CMS-crypt
*                         sizeBlob      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int CryptMessage
                        (const hCRYPTMSG hCrypt,
                         const hCERTCOLLECTION hCollection,
                         const hCERTCONTEXT MYCert,
                         const char *cryptOID,
                         const char *dataOID,
                         const bool Final,
                         unsigned char *dataToEncrypted,
                         unsigned long dataSize,
                         const char *dataDescriptor,
                         const unsigned long Flags,
                         unsigned char *encryptedBlob,
                         unsigned long *sizeBlob);



/*
*   DecryptMessage      - обработать CMS-crypt
*
*   Входные параметры   - hCrypt          - хендл на cms
*                         hCollection     - указатель (хендл) на коллекцию сертификатов
*                         MYCert          - хендл на собственный сертификат
*                         Final           - признак окончания операции
*                         encryptedBlob   - указатель CMS-crypt
*                         sizeBlob        - размер
*
*   Выходные параметры  - SenderName      - имена отправителей
*                         timeToCrypted   - указатель на время создания сообщения
*                         dataDescriptor  - описание данных
*                         dataToDecrypted - расшифрованные данные
*                         dataSize        - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int DecryptMessage
                          (const hCRYPTMSG hCrypt,
                           const hCERTCOLLECTION hCollection,
                           const hCERTCONTEXT MYCert,
                           const bool Final,
                           const unsigned char *encryptedBlob,
                           const unsigned long sizeBlob,
                           char *SenderName,
                           char *timeToCrypted,
                           char *dataDescriptor,
                           unsigned char *dataToDecrypted,
                           unsigned long *dataSize);


/*
*   SignMsgOpen         - установить хендл на класс CMS-sign
*
*   Входные параметры   - hProv - хендл на криптопровайдер
*                         Flag  - зарезервировано
*
*   Выходные параметры  - phCrypt - хендл.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SignMsgOpen
                        (HCRYPTPROV hProv,
                         int Flags,
                         hCRYPTMSG *phCrypt);

/*
*   SignMsgPKCS11       - установить хендл на PKCS11
*
*   Входные параметры   - phCrypt - хендл на cms
*                         hProv   - хендл на PKCS11
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SignMsgPKCS11(const hCRYPTMSG hCrypt,
                           const HCRYPTPROV hProv);


/*
*   SignMsgClose        - закрыть хендл на класс CMS-sign
*
*   Входные параметры   - phCrypt - хендл
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SignMsgClose
                          (hCRYPTMSG *phCrypt);


/*
*   SignMessageNoSign   - создать CMS-sign для передачи сертификатов
*
*   Входные параметры   - phCrypt       - хендл на cms
*                         CACert        - хендл на сертификат CA
*                         MYCert        - хендл на собственный сертификат
*                         dataToSigned  - данные для подписи
*                         dataSize      - размер
*                         Flags         - если 0 - не включать исходные данные
*
*   Выходные параметры  - signedBlob    - CMS-sign
*                         sizeBlob      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SignMessageNoSign
                              (const hCRYPTMSG hCrypt,
                               const hCERTCONTEXT CACert,
                               const hCERTCONTEXT MYCert,
                               const char *dataOID,
                               const unsigned char *dataToSigned,
                               const unsigned long dataSize,
                               const unsigned long Flags,
                               unsigned char *signedBlob,
                               unsigned long *sizeBlob);


/*
*   SignMessage         - создать CMS-sign
*
*   Входные параметры   - phCrypt       - хендл на cms
*                         hStore        - указатель (хендл) на хранилище
*                         MYCert        - хендл на собственный сертификат
*                         hashOID       - алгоритм хеширования
*                         signOID       - алгоритм подпис
*                         dataOID       - ОИД, описывающий подписываемые данные (NULL - default)
*                         Final         - признак завершения операции
*                         dataToSigned  - данные для подписи
*                         dataSize      - размер
*                         dataDescriptor- описание данных
*                         Flags         - если 0 - не включать исходные данные
*
*   Выходные параметры  - signedBlob    - CMS-sign
*                         sizeBlob      - размер
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SignMessage
                        (const hCRYPTMSG hCrypt,
                         const hCERTSTORE hStore,
                         const hCERTCONTEXT MYCert,
                         const char *hashOID,
                         const char *signOID,
                         const char *dataOID,
                         const bool Final,
                         const unsigned char *dataToSigned,
                         const unsigned long dataSize,
                         const char *dataDescriptor,
                         const unsigned long Flags,
                         unsigned char *signedBlob,
                         unsigned long *sizeBlob);

/*
*   VerifySignMessage   - проверить подпись CMS-sign
*
*   Входные параметры   - phCrypt       - хендл на cms
*                         hCollection   - указатель на коллекцию сертификатов
*                         signedBlob    - CMS-sign
*                         sizeBlob      - размер
*                         Flags         -
*
*   Выходные параметры  - signerName    - указатель на имена подписавших
*                         timeToSigned  - указатель на время подписей
*                         dataDescriptor- указатель описание данных
*                         dataToSigned  - указатель на подписаные данные
*                         dataSize      - размер
*                         dataOID       - указатель на ОИД'ы, описывающие подписываемые данные
*                         VerifyRes     - указатель на результаты проверок
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifySignMessage
                              (const hCRYPTMSG hCrypt,
                               const hCERTCOLLECTION hCollection,
                               const unsigned char *SignedBlob,
                               const unsigned long sizeBlob,
                               const int Flags,
                               char **SignerName,
                               char **timeToSigned,
                               char **dataDescriptor,
                               unsigned char *dataToSigned,
                               unsigned long *dataSize,
                               char **dataOID,
                               int *VerifyRes);


/*
*   MessageType         - проверить CMS сообщение и получить тип
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - type      - тип сообщения (CMS_SIGN_DATA, CMS_AUTH_DATA, CMS_ENVP_DATA)
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageType
                        (const unsigned char *cmsData,
                         const unsigned long dataSize,
                         int  *type);



/*
*   MessageKeysCount    - проверить CMS сообщение и получить количество отправителей (получателей)
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - count     - кол-во отправителей (CMS_SIGN_DATA) или получателей (CMS_AUTH_DATA, CMS_ENVP_DATA)
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageKeysCount
                             (const unsigned char *cmsData,
                              const unsigned long dataSize,
                              int  *count);


/*
*   MessageInfo         - получить информацию о времени формирования CMS сообщения и (если есть) извлеч подпись
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - Time      - время отправки сообщения
*                         haveCert  - признак наличия сертификатов отправителя
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageInfo
                        (const unsigned char *cmsData,
                         const unsigned long dataSize,
                         bool *haveCert,
                         char *Time);



/*
*   MessageSignature    - получить подпись
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - Signature - подпись (если есть)
*                         size      - длина подписи
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageSignature
                            (const unsigned char *cmsData,
                             const unsigned long dataSize,
                             unsigned char *Signature,
                             unsigned long *size);


/*
*   MessageSignatureAlg - получить алгоритмы подписи
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - SignOID   - алгоритм подписи
*                         HashOID   - алгоритм хеширования
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageSignatureAlg
                                (const unsigned char *cmsData,
                                 const unsigned long dataSize,
                                 char *SignOID,
                                 char *HashOID);

/*
*   MessageDigest       - получить хеш-значение
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - Digest    - хеш-значение (если есть)
*                         digestSize- длина 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageDigest
                            (const unsigned char *cmsData,
                             const unsigned long dataSize,
                             unsigned char *Digest,
                             unsigned long *digestSize);


/*
*   MessageName         - получить информацию об отправителях/полцчателях из CMS сообщение
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - senderCount - кол-во отправителей
*                         senderName  - массив имен отправителей
*                         recipCount  - кол-во получателей
*                         recipName   - массив имен получателей
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageName
                        (const unsigned char *cmsData,
                         const unsigned long dataSize,
                         int *senderCount,
                         char **senderName,
                         int *recipCount,
                         char **recipName);



/*
*   MessageCert         - получить информацию об ключах отправителей из CMS сообщение
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - certCount - кол-во отправителей
*                         certBody  - массив сертификаты отправителей (если есть)
*                         certSize  - массив длин сертификатов
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageCert
                        (const unsigned char *cmsData,
                         const unsigned long dataSize,
                         int *certCount,
                         unsigned char **certBody,
                         unsigned long *certSize);



/*
*   MessageSender       - получить информацию об ключах отправителей из CMS сообщение
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - keyCount    - кол-во отправителей
*                         serNum      - массив серийных номеров/открытых ключей отправителей
*                         serNumSize  - массив длин серийныйх номеров/открытых ключей
*                         issuerName  - массив имен ЦС
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageSender
                        (const unsigned char *cmsData,
                         const unsigned long dataSize,
                         int *keyCount,
                         unsigned char **serNum,
                         unsigned long *serNumSize,
                         char **issuerName);


/*
*   MessageRecip        - получить информацию об ключах получателей из CMS сообщение
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - keyCount    - кол-во отправителей
*                         serNum      - массив серийных номеров открытых ключей получателей
*                         serNumSize  - массив длин серийныйх номеров открытых ключей
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageRecip
                        (const unsigned char *cmsData,
                         const unsigned long dataSize,
                         int *keyCount,
                         unsigned char **serNum,
                         unsigned long *serNumSize);

/*
*   MessageEncryptedKey  - получить информацию об ключах получателей из CMS сообщение
*
*   Входные параметры   - cmsData   - CMS сообщение
*                         dataSize  - длина
*
*   Выходные параметры  - crptAlgorithm - OID криптоалгоритма
*                         keyCount    - кол-во отправителей
*                         crptKey     - массив серийных номеров открытых ключей получателей
*                         crptKeySize - массив длин серийныйх номеров открытых ключей
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int MessageEncryptedKey
                               (const unsigned char *cmsData,
                                const unsigned long dataSize,
                                char *crptAlgorithm,
                                int *keyCount,
                                unsigned char **crptKey,
                                unsigned long *crptKeySize);

/*
*   BinToBase            - получить из бинарной строки Base64
*
*   Входные параметры   - inBuf       - бинарные данные
*                         inSize      - размер
*
*   Выходные параметры  - ouBuf       - данные в формате Base64
*                         outSize     - размер (увеличивается )
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int BinToBase
                      (unsigned char *inBuf, 
                       long inSize, 
                       unsigned char *ouBuf,
                       long *outSize);


/*
*   BaseToBin            - получить из Base64 строки бинарную
*
*   Входные параметры   - inBuf       - данные в формате Base64
*                         inSize      - размер
*
*   Выходные параметры  - ouBuf       - бинарные данные
*                         outSize     - размер (уменьшается) 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int BaseToBin
                    (unsigned char *inBuf, 
                     long inSize, 
                     unsigned char *ouBuf,
                     long *outSize);



/*
*   BinToPEM            - получить из бинарной строки PEM
*
*   Входные параметры   - inBuf       - бинарные данные
*                         inSize      - размер
*                         type        - тип данных
*                                       #define PEM_X509_OLD      0
*                                       #define PEM_X509          1
*                                       #define PEM_X509_PAIR     2
*                                       #define PEM_X509_TRUSTED  3
*                                       #define PEM_X509_REQ_OLD  4
*                                       #define PEM_X509_REQ      5
*                                       #define PEM_X509_CRL      6
*                                       #define PEM_EVP_PKEY      7
*                                       #define PEM_PUBLIC        8
*                                       #define PEM_RSA           9 
*                                       #define PEM_RSA_PUBLIC   10
*                                       #define PEM_DSA          11
*                                       #define PEM_DSA_PUBLIC   12
*                                       #define PEM_PKCS7        13
*                                       #define PEM_PKCS8        14
*                                       #define PEM_PKCS8INF     15
*                                       #define PEM_DHPARAMS     16
*                                       #define PEM_SSL_SESSION  17
*                                       #define PEM_DSAPARAMS    18
*                                       #define PEM_ECDSA_PUBLIC 19
*                                       #define PEM_ECPARAMETERS 20
*                                       #define PEM_ECPRIVATEKEY 21
*
*   Выходные параметры  - ouBuf       - данные в формате Base64
*                         outSize     - размер (увеличивается )
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int BinToPEM(unsigned char *inBuf, 
                      long inSize, 
                      int type,
                      unsigned char *ouBuf,
                      long *outSize);


/*
*   PEMToBin            - получить из PEM строки бинарную
*
*   Входные параметры   - inBuf       - данные в формате Base64
*                         inSize      - размер
*                         index       - порядковый номер (например 0)
*
*   Выходные параметры  - type        - тип данных
*                         ouBuf       - бинарные данные
*                         outSize     - размер (уменьшается) 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int PEMToBin(unsigned char *inBuf, 
                      long inSize, 
                      int index,
                      int *type,
                      unsigned char *ouBuf,
                      long *outSize);


/*
*   BinToStr          - получить из бинарной (CAPICOM) строки текстовую
*
*   Входные параметры   - inBuf       - бинарная строка
*                         inSize      - размер
*
*   Выходные параметры  - ouBuf       - размер уменьшается 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int BinToStr
                    (unsigned char *inBuf, 
                     long inSize, 
                     char *ouBuf);

/*
*   StrToBin          - получить из текстовой строки бинарную (CAPICOM) 
*
*   Входные параметры   - inBuf       - нуль-терминированная строка
*
*   Выходные параметры  - ouBuf       - бинарная строка
*                         outSize     - размер увеличивается 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int StrToBin
                    (char *inBuf, 
                     unsigned char *ouBuf,
                     long *outSize);


/*
*   BinToStr          - получить из бинарной (CAPICOM) строки текстовую
*
*   Входные параметры   - inBuf       - бинарная строка
*                         inSize      - размер
*                         cpage       - #define CPAGE_ASCII    0
*                                       #define CPAGE_CP1251KZ 1 // default
*                                       #define CPAGE_KOI8R    2
*                                       #define CPAGE_CP1251RU 3
*                                       #define CPAGE_KZ1048   4
*
*   Выходные параметры  - ouBuf       - размер уменьшается 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int BinToStrEx
                    (unsigned char *inBuf, 
                     long inSize, 
                     int cpage,
                     char *ouBuf);

/*
*   StrToBin          - получить из текстовой строки бинарную (CAPICOM) 
*
*   Входные параметры   - inBuf       - нуль-терминированная строка
*                         cpage       - #define CPAGE_ASCII    0
*                                       #define CPAGE_CP1251KZ 1 // default
*                                       #define CPAGE_KOI8R    2
*                                       #define CPAGE_CP1251RU 3
*                                       #define CPAGE_KZ1048   4
*
*   Выходные параметры  - ouBuf       - бинарная строка
*                         outSize     - размер увеличивается 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int StrToBinEx
                    (char *inBuf, 
                     int cpage,
                     unsigned char *ouBuf,
                     long *outSize);

/*
*   BinToHex            - получить из бинарной строки текстовую
*
*   Входные параметры   - inBuf       - 
*                         inSize      - 
*
*   Выходные параметры  - ouBuf       - размер увеличивается в два раза
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int BinToHex
                      (unsigned char *inBuf, 
                       unsigned long inSize, 
                       unsigned char *ouBuf);


/*
*   HexToBin            - получить из текстовой строки бинарную
*
*   Входные параметры   - inBuf       - 
*                         inSize      - 
*
*   Выходные параметры  - ouBuf       - размер уменьшается в два раза
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int HexToBin
                    (unsigned char *inBuf, 
                     unsigned long inSize, 
                     unsigned char *ouBuf);


/*
*   GetMessageCertificate - получить хендл на сертификаты ассоциированые с CMS
*
*   Входные параметры   - hStore   - указатель (хендл) на хранилище
*                         CMSBlob  - CMS
*                         sizeBlob - размер CMS
*
*   Выходные параметры  - hCollection - хендл на коллекцию сертификатов
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetMessageCertificate
                                  (const hCERTSTORE hStore,
                                   const unsigned char *CMSBlob,
                                   const unsigned long sizeBlob,
                                   hCERTCOLLECTION *hCollection);

/*
*   FreeCertificateCollection - освободить хендл на коллекцию сертификатов
*
*   Входные параметры   - hCollection - хендл на коллекцию сертификатов
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int FreeCertificateCollection
                                      (hCERTCOLLECTION *phCollection);




/*
*   GetCertificateCollectionCount - получить кол-во сертификатов в коллекции
*
*   Входные параметры   - hCollection - хендл на коллекцию сертификатов
*
*   Выходные параметры  - нет.
*
*   Результат           - кол-во сертификатов в коллекции
*/
_WIN_DLL int GetCertificateCollectionCount
                                          (const hCERTCOLLECTION hCollection);


/*
*   VerifyCertCollection - проверить коллекцию сертификатов
*
*   Входные параметры   - hCollection - хендл на коллекцию сертификатов
*                         hCA         - хендл хранилища сертификатов доверенных УЦ
*                         hRoot       - хендл хранилища сертификатов корневых УЦ
*                         hTrust      - зарезервированно
*                         useOCSP     - использовать сервис OCSP
*                         timeVerify  - время проверки
*                         Flags       - зарезервированно
*
*   Выходные параметры  - result - массив результатов.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifyCertificateCollection
                                (const hCERTCOLLECTION hCollection,
                                 const hCERTSTORE hCA,
                                 const hCERTSTORE hRoot,
                                 const hCERTSTORE hTrust,
                                 const bool useOCSP,
                                 const char *timeVerify,
                                 const int Flags,
                                 int *result);


/*
*   GetCertificateCollection - получить хендл на коллекцию сертификатов
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         hMY       - указатель (хендл) на хранилище
*                         keyOID    - ОИДы ключей в сертификатах
*                         nameCount - кол-во элементов в массиве DName
*                         DName     - массив имен
*
*   Выходные параметры  - hCollection - хендл на коллекцию сертификатов
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertificateCollection
                                      (const hCERTSTORE hStore,
                                       const hCERTSTORE hMY,
                                       const char *keyOID,
                                       const int nameCount,
                                       char **DName,
                                       hCERTCOLLECTION *hCollection);


/*
*   GetCertificateCollectionEx - получить хендл на коллекцию сертификатов
*
*   Входные параметры   - hStore    - указатель (хендл) на хранилище
*                         certCount - кол-во сертификатов
*                         certBuf   - массив сертификатов
*                         certSize  - массив длин
*
*   Выходные параметры  - hCollection - хендл на коллекцию сертификатов
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertificateCollectionEx
                                      (const hCERTSTORE hStore,
                                       const int certCount,
                                       unsigned char **certBuf,
                                       unsigned long *certSize,
                                       hCERTCOLLECTION *hCollection);


/*
*   OpenCertificateChain - освободить хендл на цепочку проверки сертификатов
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище
*                         hCA
*                         hRoot
*                         hTrust
*                         useOCSP
*
*
*   Выходные параметры  - phChain  - указатель на цепочку.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int OpenCertificateChain
                                (const hCERTSTORE hStore,
                                 const hCERTSTORE hCA,
                                 const hCERTSTORE hRoot,
                                 const hCERTSTORE hTrust,
                                 const bool useOCSP,
                                 hCERTCHAINCONTEXT *phChain);


/*
*   FreeCertificateChain - освободить хендл на цепочку проверки сертификатов
*
*   Входные параметры   - phChain  - указатель на цепочку
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int FreeCertificateChain
                                    (hCERTCHAINCONTEXT *phChain);


/*
*   VerifyCertificateChain - проверить цепочку сертификатов/СОС
*
*   Входные параметры   - hChain  - указатель на цепочку
*                         timeVerify
*                         Flags
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifyCertificateChain
                                    (const hCERTCHAINCONTEXT hChain,
                                     const char *timeVerify,
                                     const int Flags);


/*
*   VerifyFastCertificate - проверить цепочку сертификатов/СОС
*
*   Входные параметры   - hChain  - указатель на цепочку
*                         hContext  указатель на проверяемый сертификат
*                         timeVerify
*                         Flags
*
*   Выходные параметры  - нет.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int VerifyFastCertificate
                                  (const hCERTCHAINCONTEXT hChain,
                                   const hCERTCONTEXT hContext,
                                   const char *timeVerify,
                                   const int Flags);


/*
*   SetCertificateChain - получить цепочку сертификатов/СОС для проверки
*
*   Входные параметры   - hChain   - указатель на цепочку
*                         hContext - указатель на проверяемый сертификат
*                         Flag     - если 0 - то не строить цепочку заново если это возможно
*
*   Выходные параметры  -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetCertificateChain
                                (const hCERTCHAINCONTEXT hChain,
                                 const hCERTCONTEXT hContext,
                                 const int Flag);


/*
*   SetCertificateChainEx - установить цепочку сертификатов/СОС для проверки
*
*   Входные параметры   - hChain  - указатель на цепочку
*                         hCert   - указатель на проверяемый сертификат
*                         hCA     - указатель на проверяемый сертификат ЦС
*                         hCrl    - указатель на проверяемый СОС
*                         Flag    - зарезервировано
*
*   Выходные параметры  -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SetCertificateChainEx
                                (const hCERTCHAINCONTEXT hChain,
                                 const hCERTCONTEXT hCert,
                                 const hCERTCONTEXT hCA,
                                 const hCERTCONTEXT hCrl,
                                 const int Flag);

/*
*   GetCertificateChain - получить цепочку сертификатов/СОС
*
*   Входные параметры   - hChain  - указатель на цепочку
*                         phContext
*
*   Выходные параметры  -
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int GetCertificateChain
                                (const hCERTCHAINCONTEXT hChain,
                                 CERT_CRL_CHAIN *phContext);

/*
*   RequestCRLoffline   - получить LDAP запрос на CRL
*
*   Входные параметры   - type  - если 0 - ATTRIBUTE_DELTA_CRL, 1 - ATTRIBUTE_DRAFT_CRL, 
*                                 иначе ATTRIBUTE_CRL
*                         id    - 
*                         DName -
*
*   Выходные параметры  - reqCRL  - тело запроса.
*                                   Память отводит вызывающая программа.
*                                   Если параметр NULL, то нечего не возвращается.
*                         reqSize - размер 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int RequestCRLoffline
                              (const int type,
                               const int id,
                               const char *DName,
                               unsigned char *reqCRL,
                               unsigned long *reqSize);

/*
*   RequestCAoffline   - получить LDAP запрос на сертификат ЦС
*
*   Входные параметры   - id  - 
*
*   Выходные параметры  - reqCAcert  - тело запроса.
*                                      Память отводит вызывающая программа.
*                                      Если параметр NULL, то нечего не возвращается.
*                         reqSize    - размер 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int RequestCAoffline
                              (const int id,
                               unsigned char *reqCAcert,
                               unsigned long *reqSize);



/*
*   RequestCertOffline   - получить LDAP запрос на сертификат пользователя
*
*   Входные параметры   - DName      - имя пользователя в формате DN
*                         id
*                         sernum
*                         numsize
*
*   Выходные параметры  - reqCert    - тело запроса.
*                                      Память отводит вызывающая программа.
*                                      Если параметр NULL, то нечего не возвращается.
*                         reqSize    - размер 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int RequestCertOffline
                              (const char *DName,
                               const int   id,
                               const unsigned char *sernum, 
                               const unsigned long numsize, 
                               unsigned char *reqCert,
                               unsigned long *reqSize);


/*
*   RequestOfflineInfo   - получить информацию по LDAP запросу
*
*   Входные параметры   - reqBuf    - тело запроса
*                         reqSize   - размер
*
*   Выходные параметры  - DName      - имя пользователя в формате DN
*                         attrList   - список атрибутов
*                         id
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int RequestOfflineInfo
                              (const unsigned char *reqBuf,
                               const unsigned long reqSize,
                               char *DName,
                               char *attrList,
                               int  *id);


/*
*   RequestOfflineFilter   - получить информацию по LDAP запросу
*
*   Входные параметры   - reqBuf    - тело запроса
*                         reqSize   - размер
*
*   Выходные параметры  - filter     - 
*                         filterSize - 
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int RequestOfflineFilter
                              (const unsigned char *reqBuf,
                               const unsigned long reqSize,
                               unsigned char *filter, 
                               unsigned long *filterSize);


/*
*   ResponceOnlineGet   - получить LDAP запрос
*
*   Входные параметры   - hStore  - указатель (хендл) на хранилище
*                         DName   - имя владельца в формате DN.
*                         Filter  - 
*                         attr    - атрибут : ATTRIBUTE_CA_CERTIFICATE
*                                             ATTRIBUTE_CRL
*                                             ATTRIBUTE_USER_CERTIFICATE
*                                             ATTRIBUTE_REV_CERTIFICATE
*
*   Выходные параметры  - respBody - LDAP ответ.
*                                    Память отводит вызывающая программа.
*                                    Если параметр NULL, то нечего не возвращается.
*                         bodySize - размер.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ResponceOnlineGet
                              (hCERTSTORE hStore,
                               const char *DName,
                               unsigned char *Filter,
                               const char *attr,
                               unsigned char *respBody,
                               unsigned long *bodySize);


/*
*   ResponceOfflineInfo - получить информацию по LDAP запросу
*
*   Входные параметры   - respBuf    - тело ответа
*                         respSize   - размер
*
*   Выходные параметры  - DName      - имя пользователя в формате DN [256]
*                                      Память отводит вызывающая программа.
*                         attrList   - список атрибутов [256]
*                                      Память отводит вызывающая программа.
*                         id
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ResponceOfflineInfo
                                (const unsigned char *respBuf,
                                 const unsigned long respSize,
                                 char *DName,
                                 char *attrList,
                                 int  *id);

/*
*   ResponceOfflineGet - получить информацию по LDAP запросу
*
*   Входные параметры   - respBuf    - тело ответа
*                         respSize   - размер
*                         attr    - атрибут : ATTRIBUTE_CA_CERTIFICATE
*                                             ATTRIBUTE_CRL
*                                             ATTRIBUTE_USER_CERTIFICATE
*                                             ATTRIBUTE_REV_CERTIFICATE
*
*   Выходные параметры  - count     - количество найденных сертификатов
*                         respBody  - массив сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*                         bodySize -  массив размеров сертификатов.
*                                     Память отводит вызывающая программа.
*                                     Если параметр NULL, то нечего не возвращается.
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int ResponceOfflineGet
                              (const unsigned char *respBuf,
                               const unsigned long respSize,
                               const char *attr,
                               int  *count,
                               unsigned char **respBody,
                               unsigned long *bodySize);


/*
*   SendPKIMessage      - послать PKI сообщение по протоколу TCP
*
*   Входные параметры   - sendBlob  - тело для отправки
*                         sendSize  - размер
*                         ipCA      - IP адрес получателя
*                         portCA    - порт получателя
*                         timeOut   - время 
*                         Flag      - 0-(SendMess+RecvMess), 1-(PutBlock+GetBlock)
*
*   Выходные параметры  - respBlob  - ответ сервера 
*                                     память отводит вызывающая программа
*                         respSize -  указатель на размер ответа
*
*   Результат           - 0 если все в порядке, иначе смотри myerror.h
*/
_WIN_DLL int SendPKIMessage
                        (const unsigned char *sendBlob,
                         const unsigned long sendSize,
                         char *ipCA,
                         char *portCA,
                         int timeOut,
                         int Flag,
                         unsigned char *respBlob,
                         unsigned long *respSize);

#endif
