//---------------------------------------------------------------------------

#pragma hdrstop

#include <windows.h>
#include <stdio.h>
#include <wincrypt.h>
#include <winldap.h>
#include "tspdefs.h"
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
struct berval bv_res;
DWORD val_len=0;
unsigned char* val=NULL;
BYTE pbContent[] = "123456789";
HCRYPTPROV hCryptProv=0;
HCRYPTHASH hHash=0;
DWORD out_len=0;
BYTE* output=NULL;
TSPREQUEST tsp_req;
LDAP *hLdap;
int res_code,version=LDAP_VERSION3;
struct berval *bv_res1=NULL;
TSPRESPONCE *resp=NULL;
DWORD resp_size=0;
try
{
        // вычисляем хэш-значение на которое необходимо получить метку времени
        if (!CryptAcquireContext(&hCryptProv,NULL,NULL,25,CRYPT_VERIFYCONTEXT)) throw GetLastError();
        if (!CryptCreateHash(hCryptProv,0x801d,0,0,&hHash)) throw GetLastError();
        if (!CryptHashData(hHash,pbContent,9,0)) throw GetLastError();
        if (!CryptGetHashParam(hHash,HP_HASHVAL,NULL,&out_len,0)) throw GetLastError();
        output = (BYTE*)malloc(out_len);
        if (!CryptGetHashParam(hHash,HP_HASHVAL, output,&out_len,0)) throw GetLastError();

        // получаем tsp-запрос
        if (!CryptEncodeObjectEx(MY_ENCODING_TYPE, "1.3.6.1.4.1.6801.11.1.2", (LPVOID)output,0,NULL, val, &val_len)) throw GetLastError();
        val = (unsigned char*)malloc(val_len);
        if (!CryptEncodeObjectEx(MY_ENCODING_TYPE, "1.3.6.1.4.1.6801.11.1.2", (LPVOID)output,0,NULL, val, &val_len)) throw GetLastError();

        hLdap = ldap_init("localhost",62222);
        if (!hLdap) throw -1;
        ldap_set_option(hLdap,LDAP_OPT_PROTOCOL_VERSION,(void*)&version);
        res_code = ldap_bind_s(hLdap,(char*)"",(char*)"",LDAP_AUTH_SIMPLE);
        if (res_code) {ldap_unbind_s(hLdap); throw res_code;}
        bv_res.bv_len = val_len;
        bv_res.bv_val = (char*)val;
        //отправляем его на сервер и получаем ответ
        res_code = ldap_extended_operation_s(hLdap,"1.3.6.1.4.1.6801.11.1.2",&bv_res,NULL,NULL,NULL,&bv_res1);
        ldap_unbind_s(hLdap);
        // преобразуем tsp-ответ в структуру
        if (!CryptDecodeObject(MY_ENCODING_TYPE, "1.3.6.1.4.1.6801.11.1.2",bv_res1->bv_val,bv_res1->bv_len,0,NULL,&resp_size)) throw GetLastError();
        resp = (TSPRESPONCE*)malloc(resp_size);
        if (!CryptDecodeObject(MY_ENCODING_TYPE, "1.3.6.1.4.1.6801.11.1.2",bv_res1->bv_val,bv_res1->bv_len,0,resp,&resp_size)) throw GetLastError();

        printf("OID агоритма хэширования = %s\n", resp->hashOID);
        printf("Время = \n", resp->TSATime);
        printf("Имя поставщика метки времени", resp->TSAName);
}
catch(DWORD err)
{
  
}
return 0;
}
//---------------------------------------------------------------------------
 