Статус: Участник
Группы: Участники
Зарегистрирован: 09.07.2020(UTC) Сообщений: 11  Сказал(а) «Спасибо»: 4 раз Поблагодарили: 1 раз в 1 постах
|
Пообщался с тех поддержкой, они говорят вот чего. Цитата:По представленным кускам кода , предполагается, что в используемой обертке над CriptoPRO , вызывается функция, производящая операцию, отличную от требуемой. Скинули пример, у них подпись такая получается Цитата:_I\F3Aq Gn!3լAIwpg x{]rhމr6gb# У меня, по процедурам выше явно другой формат Цитата:FC3054F94299653582DFA04F998E8C06FCD5A929CA5B64861A5528C4A84AC97AA8C1911641EDF7D2195B435727C97015AA56AEEEF06B9E92C79FDDBAB09918E5 Ещё скинули файл на Си, но я его не особо знаю, как и функции в библиотеке крипто про, чтоб понять как сделать аналогично Цитата:#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdarg.h>
#include <WinCryptEx.h>
#define GR3411LEN 64
#define LANGUAGE 1033
char* Signature(BYTE* bdata, DWORD lenData) { char* result = NULL;
BYTE* sigData = NULL; BYTE * tempSig = NULL; PCCERT_CONTEXT pCertCtx = NULL; HCERTSTORE hCertStore = NULL; CERT_PUBLIC_KEY_INFO* pubKeyInfo = NULL;
HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0;
if(!CryptAcquireContext( &hProv, "\\\\.\\HDIMAGE\\test", NULL, PROV_GOST_2012_256, CRYPT_SILENT)) { goto Finish; }
DWORD kiLen = 0; if(CryptExportPublicKeyInfo(hProv,AT_KEYEXCHANGE, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, NULL, &kiLen)) { pubKeyInfo = (CERT_PUBLIC_KEY_INFO*)malloc(kiLen); if(!CryptExportPublicKeyInfo(hProv,AT_KEYEXCHANGE, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pubKeyInfo, &kiLen)) { goto Finish; } } else { goto Finish; }
if(pubKeyInfo == NULL) { goto Finish; }
if(!CryptCreateHash(hProv, CALG_GR3411_2012_256, 0, 0, &hHash)) { goto Finish; }
if(!CryptHashData(hHash, bdata, lenData, 0)) { goto Finish; }
DWORD sigLen = 0; if(!CryptSignHash( hHash, AT_KEYEXCHANGE, NULL, 0, NULL, &sigLen)) { goto Finish; }
sigData = (BYTE*)malloc(sigLen*sizeof(BYTE)); if(!CryptSignHash( hHash, AT_KEYEXCHANGE, NULL, 0, sigData, &sigLen)) { goto Finish; }
tempSig = (BYTE*) malloc(sigLen); DWORD j; for(j = 0; j < sigLen; j++) { tempSig[j] = sigData[sigLen - j - 1]; }
DWORD nLenOut=0; char* tmpString = NULL; if(CryptBinaryToString( tempSig, sigLen, CRYPT_STRING_BASE64, NULL, &nLenOut) ) { tmpString = (char*)malloc(nLenOut*sizeof(char)); if(!CryptBinaryToString(tempSig, sigLen, CRYPT_STRING_BASE64, tmpString, &nLenOut)) { goto Finish; } } else { goto Finish; }
result = tmpString;
Finish: if(hHash) CryptDestroyHash(hHash); if(hProv) CryptReleaseContext(hProv, 0); if(tempSig) free(tempSig); if(bdata) free(bdata); if(sigData) free(sigData);
hHash = 0; hProv = 0;
return result; }
char* Verify(BYTE* bData, DWORD dataLen,BYTE* bcert, DWORD lenCert, BYTE* bSign, DWORD signLen){ char* result = NULL; BYTE* tempSig = NULL; PCCERT_CONTEXT ppCertCtx = NULL;
HCRYPTPROV hProv = 0; HCRYPTHASH hHash = 0; if(!CryptAcquireContext( &hProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT)) { goto Finish; }
if(!CryptCreateHash(hProv, CALG_GR3411_2012_256, 0, 0, &hHash)) { CryptReleaseContext(hProv, 0); goto Finish; }
ppCertCtx = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, bcert,lenCert); if (ppCertCtx == NULL) { goto Finish; }
HCRYPTKEY hPubKey = 0; CERT_PUBLIC_KEY_INFO kInf = ppCertCtx->pCertInfo->SubjectPublicKeyInfo; if(!CryptImportPublicKeyInfo(hProv, (DWORD) ppCertCtx->dwCertEncodingType, &kInf, &hPubKey)) { goto Finish; }
tempSig = (BYTE*) malloc(signLen); DWORD j; for(j = 0; j < signLen; j++) { tempSig[j] = bSign[signLen - j - 1]; }
if(!CryptHashData(hHash, bData, dataLen, 0)) { goto Finish; }
if(CryptVerifySignature(hHash,tempSig,signLen,hPubKey,NULL, 0)) { result = "true"; } else { result = "false"; }
Finish: if(tempSig) free(tempSig); if(bData) free(bData); if(bSign) free(bSign);
if(hProv) CryptReleaseContext(hProv, 0); if(hHash) CryptDestroyHash(hHash); if(ppCertCtx) CertFreeCertificateContext(ppCertCtx);
return result; }
int main(const int argc, const char **argv) { return 1; } Отредактировано пользователем 31 июля 2020 г. 11:05:03(UTC)
| Причина: Не указана
|