20.03.2006 21:02:24Длина подписи созданной в КриптоАРМ больше созданной программно Ответов: 4
Дмитрий
Программно создаётся подпись (PKCS7) в отдельном файле, всё отлично, подпись проверена - всё ок, но подпись над этим же файлом этим же ключом сделанная с помощью КриптоАРМ на 101 байт длиннее! Почему?
 
Ответы:
21.03.2006 9:27:26Дмитрий
Добавлю как я делаю подпись, вот:

HCERTSTORE hSystemStore;

if (!(hSystemStore = CertOpenSystemStore(NULL, "MY")))
{
return;
}

// System store is opened
PCCERT_CONTEXT pCert = NULL;

bool found = false;

while (pCert = CertEnumCertificatesInStore(hSystemStore, pCert))
{
if(!strcmp(pCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId, "1.2.643.2.2.19"))
{
DWORD dwKeySpec;
HCRYPTPROV hProv;
if(CryptAcquireCertificatePrivateKey(pCert, 0, NULL, &hProv, &dwKeySpec, NULL))
{
CryptReleaseContext(hProv, 0);
found = true;
break;
}
}
}

CRYPT_SIGN_MESSAGE_PARA SignPara;
ZeroMemory(&SignPara, sizeof(SignPara));
(CRYPT_SIGN_MESSAGE_PARA));

SignPara.cbSize = sizeof(SignPara); // = 68
SignPara.dwMsgEncodingType = PKCS_7_ASN_ENCODING;
SignPara.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411; SignPara.HashAlgorithm.Parameters.cbData = 0;
SignPara.pSigningCert = pCert;
SignPara.cMsgCert = 1;
SignPara.rgpMsgCert = &pCert;
SignPara.pvHashAuxInfo = NULL;
SignPara.cMsgCrl = 0;

const BYTE* DataArray[] = { (BYTE*)data };
DWORD SizeArray[] = { Len }; // Len = 269

DWORD *count = new DWORD();
*count = 0;

if(!CryptSignMessage(&SignPara, true, 1, DataArray, SizeArray, NULL, count)) // count становится равным 1152 !!!
{
return;
}

BYTE *signature = static_cast<BYTE*>(malloc(*count));

if(!CryptSignMessage(&SignPara, true, 1, DataArray, SizeArray, signature, count))
{
return;
}

// сохраняем подпись

так в чём же разница между этой подписью и подписью КриптоАРМ?
21.03.2006 9:54:25Kirill Sobolev
Насколько я знаю, КриптоАРМ добавляет различный атрибуты к подписи - например время. А вообще есть замечательная утилита dumpasn1, с помощью которой Вы сможете сравнить результаты и обнаружить отличия сами :)
21.03.2006 11:20:42Дмитрий
Много букав выдаёт dumpasn1! Но всё-же что-то я нашёл, в подписи от КриптоАРМ есть такие строки:

SEQUENCE {
OBJECT IDENTIFIER contentType (xxxxx)
SET {
OBJECT IDENTIFIER data (xxxxxxx)
}
}
SEQUENCE {
OBJECT IDENTIFIER messageDigest (xxxxx)
SET {
OCTET STRING
xxxxxxxx
}
}
}

хотелось бы узнать что это такое и как это добавить... спасибо.
21.03.2006 11:22:45Kirill Sobolev
для того чтобы это добавить надо знать какой OID скрывается под символами ххххх