PKCS нужна в любом случае. а 2 подписи хранить не хочется, если можно обойтись.
получаю хеш
CryptAcquireContext( &hProv, NULL, CP_GR3410_2001_PROV_A, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT );
CryptCreateHash(hProv,CALG_GR3411,NULL,0,&hHash);
CryptHashData(hHash,pBuffer,cbBuffer,0);
CryptGetHashParam(hHash,HP_HASHVAL,pbData,&dwDataLen,0);
// pbData - ab 67 17 c7 1c 5a 80 d0 5b bb c5 53 f6 ff 32 32 f9 e6 a4 d3 04 39 2b 86 98 34 6e b4 a1 f4 8e ef
// "cpverify.exe -mk testfile.dmp" - BA76717CC1A5080DB5BB5C356FFF23239F6E4A3D4093B2688943E64B1A4FE8FE
// полубайты поменяны... это нормально?
...
//скопировали в pDerP7S содержимое файла detached подписи в der кодировке, dwDerP7S - размер файла
...
HCRYPTMSG hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,CMSG_DETACHED_FLAG,0,0,NULL,NULL);
CryptMsgUpdate(hMsg,pDerP7S,dwDerP7S,true);
CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST, 0, pSign, &cbSign);
...
HCERTSTORE hStoreHandle = CertOpenSystemStore(NULL,"MY");
PCCERT_CONTEXT pSignerCert = CertFindCertificateInStore(hStoreHandle,X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,0,CERT_FIND_SUBJECT_STR,L"Тестовый",NULL);
CryptImportPublicKeyInfoEx( hProv, X509_ASN_ENCODING,&(pSignerCert->pCertInfo->SubjectPublicKeyInfo), CALG_GR3410EL, 0, NULL,&hPubKey);
CryptVerifySignature(hHash, pSign, cbSign, hPubKey, NULL, 0);
---
GetLastError() == NTE_BAD_SIGNATURE
что-то пропустил? CryptMsg что-то дополнительно делает? :)