//------------------------------------------------------------------------------
// Tumar CSP
// Copyright (c) 2011 Scientific Lab. Gamma Technologies. All rights reserved.
// SDK
// Verify CRL
//------------------------------------------------------------------------------
#include "ex_util.h"
//------------------------------------------------------------------------------
#define CMP_CRL "cmp_crl.crl"
#define CA_CERT "ca.cer"
//------------------------------------------------------------------------------
unsigned char *CRL;
unsigned char CA  [8196];
//------------------------------------------------------------------------------
// Пользователь не имеет ключей
// Задача:
// 1. Проверить подлинность СОС
//------------------------------------------------------------------------------
int main(void)
{
 int code;
 HCRYPTPROV hProv=0;
 HCRYPTKEY  hKey=0;
 DWORD sz,sa;

 // Загружаем криптопровайдер
 code=LoadTumarCSP((char*)CSP_LIB); if (code) {printf("Load CSP error: %d\n",code); return 1;}
 //
 // Загружаем сертификат УЦ
 if (getFileLen(CA_CERT,  &sa)) {printf("getFileLen error\r\n"); return 1;}
 if (readFile  (CA_CERT,CA,sa)) {printf("readFile error\r\n");   return 1;}
 // Загружаем проверяемый СОС
 if (getFileLen(CMP_CRL,   &sz)) {printf("getFileLen error\r\n"); return 1;}
 CRL=(unsigned char*) calloc(sz+1,sizeof(unsigned char));
 if (readFile  (CMP_CRL,CRL,sz)) {printf("readFile error\r\n");   return 1;}
 //
 // Создаем контекст CSP
 if (!CPAcquireContext(&hProv,NULL,CRYPT_VERIFYCONTEXT,NULL)) {
   printf("CPAcquireContext Error: %0X\n",GetLastErrorCSP(0));
   return 1;
 }
 // Загружаем сертификат
 if (!CPImportKey(hProv,CA,sa,0,0,&hKey)) {
   printf("CPImportKey Error: %0X\n",GetLastErrorCSP(hProv));
   return 1;
 }
 // Устанавливаем сертификат УЦ
 if (!CPSetKeyParam(hProv,hKey,KP_CERTIFICATE_CA,CA,0)) {
   printf("CPSetKeyParam KP_CERTIFICATE_CA Error: %0X\n",GetLastErrorCSP(hProv));
   return 1;
 }
 // Проверяем подлинность СОС
 if (!CPVerifySignature(hProv,0,CRL,sz,0,NULL,CRYPT_OBJECT_CRL)) {
   printf("CPVerifySignature Error: %0X\n",GetLastErrorCSP(hProv));
   return 1;
 }
 free(CRL);
 CPDestroyKey(hProv,hKey);
 // Закрываем контекст CSP
 CPReleaseContext(hProv,0);
 printf("OK\n");
 return 0;
}
//------------------------------------------------------------------------------
