Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Alerans  
#1 Оставлено : 24 ноября 2010 г. 19:05:38(UTC)
Alerans

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.11.2010(UTC)
Сообщений: 3

На HDIMAGE установил сертификат
Код:
=============================================================================
1-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : CN=Alex
Serial         : 0x5DC0000002006DB8221B
PrivateKey Link: Yes. Container: HDIMAGE\\alex.000\F493
2-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : CN="Borisov E=borisov@cg.ru"
Serial         : 0xDBBE00000200F68B3B16
PrivateKey Link: Yes. Container: HDIMAGE\\borisov2.000\C300
3-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : CN="Ivanov E=Ivanov_I@mail.ru"
Serial         : 0xD9BE0000020051C43016
PrivateKey Link: Yes. Container: HDIMAGE\\borisov.000\32C3
=============================================================================



Пытаюсь запустить под Linux простенький код:

Код:

#include "CSP_WinCrypt.h"

#define szOID_CP_GOST_R3411 "1.2.643.2.2.9";

#define CALG_GR3411 \
    (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_GR3411)

#define ALG_SID_GR3411				30
#define ALG_SID_GR3411_HASH			39
#define ALG_SID_GR3411_HASH34			40

int main ()
{
	HCRYPTPROV hProv;
	HCRYPTHASH hHash;
	HCRYPTKEY hKey;
	DWORD cbData;
        DWORD d_Keyspec;
	BYTE b_nameProv[100];


	if(!CryptAcquireContext(&hProv, "\\\\.\\HDIMAGE\\borisov2", /*"Crypto-Pro GOST R 34.10-2001 KC1 CSP"*/0, 75, 0))
	{
		printf("Error CryptAcquireContext() = %d\n", GetLastError());			
	}
        printf("CryptAcquireContext() %d\n", hProv);			
	

	if(!CryptGetProvParam(hProv,PP_NAME, NULL, &cbData,0))
	{
		printf("Error CryptGetProvParam() = %d\n", GetLastError());			
	}	
        printf("CryptGetProvParam() CSP NAME COOUNT= %d\n", cbData);			

	char* name_value = static_cast< char* >(malloc(cbData + 1));
	ZeroMemory(name_value, cbData + 1);


	if(!CryptGetProvParam(hProv,PP_NAME, (BYTE*)name_value, &cbData,0))
	{
		printf("Error CryptGetProvParam() = %d\n", GetLastError());			
	}	
        printf("CryptGetProvParam() CSP NAME = %s\n", name_value);			


	if(!CryptGetProvParam(hProv,PP_CONTAINER, b_nameProv, &cbData,0))
	{

	}	
        printf("CryptGetProvParam() CONTAINER NAME = %s\n", b_nameProv);			

        printf("CryptGetProvParam() KEYSPEC  = %d\n", d_Keyspec);			

		
	if(!CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, reinterpret_cast< const BYTE* >("12345678"), 0))
	{
		printf("Error CryptSetProvParam() = %d\n", GetLastError());			
	}


	
	printf("CryptSetProvParam()\n");				

	if(!CryptCreateHash(hProv,/* CALG_SHA1*/CALG_GR3411 /*CALG_MD5*/, 0, 0, &hHash))
	{
		printf("Error CryptCreateHash() = %d\n", GetLastError());			
	}

	printf("CryptCreateHash() %d\n", hHash);			

	if(!CryptHashData(hHash, (BYTE*)"12345", 5, 0))                                         
	{
		printf("Error CryptHashData() = %d\n", GetLastError());			
	}

	printf("CryptHashData()\n");				

        DWORD count = 0;

	if(!CryptGetHashParam(hHash, HP_HASHVAL, NULL, &count, 0))
	{
		printf("Error CryptGetHashParam() = %d\n", GetLastError());			
	}

	printf("CryptGetHashParam() count= %d\n", count);				


	char* hash_value = static_cast< char* >(malloc(count + 1));
	ZeroMemory(hash_value, count + 1);

	if(!CryptGetHashParam(hHash, HP_HASHVAL, (BYTE*)hash_value, &count, 0))
	{
		printf("Error CryptGetHashParam() = %d\n", GetLastError());			
	}

	printf("CryptGetHashParam() hash_value= %s\n", hash_value);				
	
	count = 0;

	if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &count))
	{
		printf("Error CryptSignHash() = %d\n", GetLastError());			
	}

	printf("CryptSignHash() count=%d\n", count);				

 
	char* sign_hash = static_cast< char* >(malloc(count + 1));
	ZeroMemory(sign_hash, count + 1);

	if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, (BYTE*)sign_hash, &count))
	{                               
		printf("Error CryptSignHash() = %d\n", GetLastError());			
	}


        if(hHash)
	{
		CryptDestroyHash(hHash);
		printf("CryptDestroyHash()\n");				
	}
        if(hProv)
	{
		CryptReleaseContext(hProv, 0);
		printf("CryptReleaseContext()\n");				
	}

	return 0;
}


Функция CryptSignHash() возвращает FALSE, причем GetLastError() ничего вразумительного не выдают.
Если поменять AT_SIGNATURE на AT_KEYEXCHANGE то всё работает, но ,как я понимаю, это не правильно.

Сам сертификат:
Код:
-----BEGIN CERTIFICATE-----
MIIDIjCCAtGgAwIBAgIKFjuL9gACAAC+2zAIBgYqhQMCAgMwZTEgMB4GCSqGSIb3
DQEJARYRaW5mb0BjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMRMwEQYDVQQKEwpD
UllQVE8tUFJPMR8wHQYDVQQDExZUZXN0IENlbnRlciBDUllQVE8tUFJPMB4XDTEw
MTEyMzExMzcwMFoXDTE0MTAwNDA3MDkwMFowOTE3MDUGA1UEAx4uAEIAbwByAGkA
cwBvAHYAIABFAD0AYgBvAHIAaQBzAG8AdgBAAGMAZwAuAHIAdTBjMBwGBiqFAwIC
EzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEBphQzbNXGosUDM8mxHLoWl4idHP1IU
P6R8J3vWLrgNV70+PNRXuIzudrjg7oh3i6azjHhGgP+WK+JSZZ8TZoAUo4IBizCC
AYcwEwYDVR0lBAwwCgYIKwYBBQUHAwQwCwYDVR0PBAQDAgTwMB0GA1UdDgQWBBSA
RQ8vsnDVC1idZE4KRZ5JHgfV9DAfBgNVHSMEGDAWgBRtj14F2V+skReUHpWaBTA4
N3oQKjBVBgNVHR8ETjBMMEqgSKBGhkRodHRwOi8vd3d3LmNyeXB0b3Byby5ydS9j
ZXJ0ZW5yb2xsL1Rlc3QlMjBDZW50ZXIlMjBDUllQVE8tUFJPKDIpLmNybDCBngYI
KwYBBQUHAQEEgZEwgY4wMwYIKwYBBQUHMAGGJ2h0dHA6Ly93d3cuY3J5cHRvcHJv
LnJ1L29jc3BuYy9vY3NwLnNyZjBXBggrBgEFBQcwAoZLaHR0cDovL3d3dy5jcnlw
dG9wcm8ucnUvQ2VydEVucm9sbC9DcnlwdG9fVGVzdCUyMENlbnRlciUyMENSWVBU
Ty1QUk8oMikuY3J0MCsGA1UdEAQkMCKADzIwMTAxMTIzMTEzNzAwWoEPMjAxMjAy
MjMxMTM3MDBaMAgGBiqFAwICAwNBACQyCosTGloiviZVBtoa9UJEE4TJbCUmujFc
QM0jzy55uE5EE75lXzj9+NL3m6EKxVBdMfkVR5OZmUhkH1vgux8=
-----END CERTIFICATE-----


При чем если использовать функции высого уровня с этим же сертификатом всё работает:
Код:

//#include "CSP_WinDef.h"
#include "CSP_WinCrypt.h"
#define szOID_CP_GOST_R3411 "1.2.643.2.2.9";

int main ()
{

	HCRYPTPROV hProv;
	HCRYPTKEY temp_key;
	DWORD cbData;
	BYTE b_nameProv[50];
	



        HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, hProv,0, L"MY");

	printf("CertOpenStore() %d | %d\n", hCertStore, GetLastError());

	PCCERT_CONTEXT pSignerCert = CertFindCertificateInStore(hCertStore,
					PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
					0,
					CERT_FIND_SUBJECT_STR, 
					L"Borisov E=borisov@cg.ru",
					NULL);

	
	printf("CertFindCertificateInStore() %d | %d\n", pSignerCert, GetLastError());

	char pszNameString[50];


	
	CRYPT_SIGN_MESSAGE_PARA		SignPara = {0};
	
	SignPara.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
	SignPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
	SignPara.pSigningCert = pSignerCert;
	SignPara.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411;
	SignPara.cMsgCert = 1;
	SignPara.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
	SignPara.rgpMsgCert = &pSignerCert;
        SignPara.pvHashAuxInfo = NULL;
	SignPara.cMsgCert = 0;
	SignPara.rgpMsgCert = NULL;
	SignPara.cMsgCrl = 0;
	SignPara.rgpMsgCrl = NULL;
	SignPara.cAuthAttr = 0;
	SignPara.rgAuthAttr = 0;
	SignPara.cUnauthAttr = 0;
	SignPara.rgUnauthAttr = 0;
	SignPara.dwFlags = 0;
	SignPara.dwInnerContentType = 0;
	
	
	DWORD cbEncryptedBlob;
	BYTE* pbMessage = (BYTE*)"123456";
 

	DWORD MessageSizeArray[1];
	MessageSizeArray[0] = 6;

 	                                                                        	
	const BYTE *message[] = {pbMessage};

	printf("message %s | %d\n", message[0], MessageSizeArray[0]);

	if (!CryptSignMessage(&SignPara, FALSE, TRUE, message, MessageSizeArray, NULL, &cbEncryptedBlob))
	{
		printf("Error CryptSignMessage()%d\n", GetLastError());
     	}		


        
	BYTE *signature =NULL;
	signature = static_cast< BYTE* >(malloc(cbEncryptedBlob));


	if (!CryptSignMessage(&SignPara, TRUE, TRUE, message, MessageSizeArray, signature, &cbEncryptedBlob))
	{
		printf("Error CryptSignMessage()%d\n", GetLastError());
     	}		
	
	FILE *f_OutFile;
	f_OutFile = fopen("sign.txt", "w");
	fwrite(signature, 1, cbEncryptedBlob, f_OutFile);
	fclose(f_OutFile);


	printf("cbEncryptedBlob = %d\n", cbEncryptedBlob);	

	if(pSignerCert)
		CertFreeCertificateContext(pSignerCert);
	

	if(hCertStore)
		CertCloseStore(hCertStore, 0);

	CryptAcquireContext(&hProv, "\\\\.\\HDIMAGE\\borisov2", "Crypto-Pro GOST R 34.10-2001 KC1 CSP", 75, 0);
	
	CryptReleaseContext(hProv, 0);

	return 0;
}
Offline Максим Коллегин  
#2 Оставлено : 24 ноября 2010 г. 19:25:33(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,408
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
Все зависит от того, какой в контейнере ключ: AT_SIGNATURE или AT_KEYEXCHANGE.
Знания в базе знаний, поддержка в центре поддержки
Offline Alerans  
#3 Оставлено : 24 ноября 2010 г. 19:37:17(UTC)
Alerans

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.11.2010(UTC)
Сообщений: 3

То есть в использовании AT_KEYEXCHANGE ничего страшного нет?
Offline Максим Коллегин  
#4 Оставлено : 24 ноября 2010 г. 19:39:39(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,408
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
конечно.
Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.